Java 黑馬程序員學習筆記(進階篇6)

常用的 API

1. 正則表達式

(1) 題目:貪婪爬取和非貪婪爬取

① 貪婪爬取:爬取數據的時候盡可能的多獲取數據
② 非貪婪爬取:爬取數據的時候盡可能的少獲取數據
③ Java中默認的是貪婪爬取
④ + 后面加上 ? 可以轉變為非貪婪爬取

(2) 捕獲分組

捕獲分組通過 (...)將部分正則表達式包裹,會保存該組的匹配結果;后續可通過 \\nn為分組編號,從1開始)反向引用這組結果,實現 “重復使用已匹配的內容”。

需求 1:單字符首尾一致(如?a123ab456b

正則表達式(. ).+\\1

① 邏輯分解:

  • (. ):第1個捕獲組,匹配任意一個字符.匹配任意字符,括號捕獲該字符)。
  • .+:匹配中間任意長度的字符(1個或多個)。
  • \\1:反向引用第1個捕獲組的內容,要求結尾字符必須和開頭捕獲的單個字符一致

②?示例驗證:

  • a123a?→ 開頭捕獲a,結尾a?→ 匹配成功。
  • a123b?→ 開頭a,結尾b?→ 匹配失敗。
需求 2:多字符首尾一致(如?abc123abc&|@abc&|@

正則表達式(.+).+\\1

① 邏輯分解:

  • (.+):第1個捕獲組,+表示 “1個或多個字符”,即匹配任意長度的開頭子串(至少1個字符)。
  • .+:匹配中間任意長度字符。
  • \\1:反向引用第1個捕獲組的內容,要求結尾子串必須和開頭捕獲的多字符子串完全一致

② 示例驗證:

  • abc123abc?→ 開頭捕獲abc,結尾abc?→ 匹配成功。
  • abc123abd?→ 開頭abc,結尾abd?→ 匹配失敗。
需求 3 :首尾多字符(內部字符一致),且中間至少有 1 個字符,且開頭內部至少重復 1 次

正則表達式((.)\\2+).+\\1

① 最內層:(.)(第 2 個捕獲組)
  • (.)(?表示創建捕獲組,.?匹配任意單個字符(比如?ab&?等)。
  • 這部分的作用:捕獲一個 “基礎字符”,后續會重復使用這個字符。
  • 編號:因為是第 2 個出現的左括號(第一個左括號是外層的?(),所以是第 2 組,后續用?\\2?引用。
② 中間層:\\2+
  • \\2:反向引用第 2 組捕獲的 “基礎字符”(比如第 2 組捕獲了?a\\2?就代表?a)。
  • +:量詞,表示 “至少出現 1 次”(和?*?不同,*?允許 0 次,+?必須 1 次及以上)。
  • 組合起來:\\2+?表示 “基礎字符至少重復 1 次”(比如基礎字符是?a,就匹配?aaaaaaaaa?等)。
③ 外層分組:((.)\\2+)(第 1 個捕獲組)
  • 把?(.)?和?\\2+?整體包裹,形成第 1 組。
  • 作用:捕獲 “由同一個基礎字符重復組成的子串”,且這個子串長度至少 2 個字符(因為基礎字符 1 個 + 至少重復 1 次 = 2 個及以上)。
    例如:
    • 基礎字符?a?+?\\2+a?重復 2 次)→ 第 1 組捕獲?aaa
    • 基礎字符?&?+?\\2+&?重復 1 次)→ 第 1 組捕獲?&&
④ 中間內容:.+
  • .?匹配任意字符,+?表示 “至少 1 次”。
  • 作用:要求開頭和結尾的子串之間,必須有至少 1 個字符(不能是空的)。
⑤ 結尾:\\1
  • 反向引用第 1 組捕獲的內容(即 “由同一個基礎字符重復組成的子串”)。
  • 作用:要求字符串結尾的子串,必須和開頭的子串完全一致
需求 4:“口吃” 字符去重

將包含重復字符的字符串(如?我要學學編編編編編程程程程程程),替換為單個重復字符,最終得到?我要學編編程

public class RegexDemo4 {public static void main(String[] args) {// 原始字符串:包含重復的“學”“編”“程”String str = "我要學學編編編編編程程程程程程";// 正則:匹配“單個字符 + 至少1個相同重復字符”String regex = "(.)\\1+";// 替換:用“基準字符($1)”替換“重復字符組”String result = str.replaceAll(regex, "$1");System.out.println(result); // 輸出:我要學編編程}
}

關鍵邏輯 1:拆解?(.)\\1+

① 處理?“學學”

  • (.)?捕獲第一個?“學”(組 1 存?“學”);
  • \\1+?匹配第二個?“學”(滿足 “至少 1 次”);
  • 匹配到?“學學”,替換成?“$1”(即?“學”)。

② 處理?“編編編”

  • (.)?捕獲第一個?“編”(組 1 存?“編”);
  • \\1+?匹配后面的?“編編”(至少 1 次);
  • 匹配到?“編編編”,替換成?“編”

③ 處理?“程”

  • 因為?“程”?沒有重復(\\1+?要求至少 1 次重復,不滿足),所以不匹配正則,保留原樣。

④ 最終結果就是?“學編程”

關鍵邏輯 2:$1 的作用

$1?是正則表達式替換操作中的反向引用語法,用于在「替換字符串」中,引用正則里第一個捕獲組(由圓括號?()?包裹的部分)所匹配到的具體內容

② 核心作用:在字符串替換時,用「捕獲組匹配到的內容」替換「整個正則匹配到的重復 / 復雜內容」,實現 “提取關鍵部分,簡化重復內容”?的效果。

③ 舉例理解:

比如要把字符串?"aaaabbbcc"?中連續重復的字符壓縮成單個

(1) 正則表達式:(.)\\1+

  • (.)?是第一個捕獲組,負責 “捕獲單個任意字符”(比如匹配?"aaaa"?時,捕獲組會抓到?'a');
  • \\1+?表示 “必須跟著至少一個和捕獲組內容相同的字符”(即重復的?'a')。

(2) 替換字符串:"$1"
當正則匹配到?"aaaa"?時,$1?會引用第一個捕獲組抓到的?'a',于是用?'a'?替換整個?"aaaa";同理,"bbb"?會被?'b'?替換,"cc"?會被?'c'?替換。

(3) 最終效果:"aaaabbbcc"?→?"abc"

關鍵總結:
  • (.):抓一個 “基準字符” 并記住(存到組 1);
  • \\1+:找 “和基準字符相同的、至少 1 個的后續字符”,湊成 “重復序列”;
  • replaceAll(..., "$1"):用 “基準字符” 替換整個 “重復序列”,實現 “去重”。

2. Date

JDK 8 之前的時間處理:在 Java 8 之前,日期和時間的處理主要依賴?DateSimpleDateFormatCalendar?三個核心類(但存在可操作性弱、線程不安全等局限性,因此 JDK 8 后被新的?java.time?包替代)。

java.util.Date?類

package demo2;import java.util.Date;
import java.util.Random;public class test4 {public static void main(String[] args) {Random r = new Random();Date d1 = new Date(Math.abs(r.nextInt()));Date d2 = new Date(Math.abs(r.nextInt()));long time1 = d1.getTime();long time2 = d2.getTime();if (time1 > time2) {System.out.println("第一個時間在前面,第二個時間在后面");} else if (time1 < time2) {System.out.println("第二個時間在前面,第二個時間在后面");} else {System.out.println("兩個時間一樣");}}
關鍵邏輯 1:Date d1 = new Date(參數);

Date?類的本質是?“封裝一個具體的時間點”,而它最核心的構造函數就是?Date(long date)—— 接收一個?long?類型的數字(稱為 “時間戳”),并以此創建對應的時間對象。

② 時間戳的定義:指?從 1970 年 1 月 1 日 00:00:00 GMT(格林威治標準時間)開始,到某個時間點的 “毫秒數”
比如:

  • 時間戳?0?→ 對應 1970-01-01 00:00:00 GMT;
  • 時間戳?1000?→ 對應 1970-01-01 00:00:01 GMT(比基準時間多 1 秒,1 秒 = 1000 毫秒);
  • 時間戳越大,代表的時間越靠后(越 “新”)。
  • 代碼中?new Date(參數)?的作用:
    用傳入的 “時間戳” 創建一個?Date?對象,這個對象就代表了該時間戳對應的 “具體時間點”。
    比如?d1?就是一個封裝了 “參數對應時間戳” 的時間對象,d2?同理。

關鍵邏輯 2:long time1 = d1.getTime();

Date?類的?getTime()?方法是上述構造函數的?反向操作

② 作用:返回當前?Date?對象所封裝的?時間戳(毫秒數)
簡單說:

  • 用?new Date(時間戳)?可以把 “數字” 變成 “時間對象”;
  • 用?getTime()?可以把 “時間對象” 變回 “數字(時間戳)”。

SimpleDateFormat 類

① 核心作用:實現?Date(日期對象)?與?String(字符串)?的雙向轉換:

  • 格式化:將?Date?轉換為自定義格式的字符串
  • 解析:將自定義格式的字符串轉換為?Date

② 構造方法

構造方法說明
public SimpleDateFormat()創建對象,使用默認日期格式
public SimpleDateFormat(String pattern)創建對象,使用指定的格式模板(如?yyyy-MM-dd

③ 常用方法

方法說明轉換方向
public final String format(Date date)將?Date?格式化為字符串Date?→?String
public Date parse(String source)將字符串解析為?DateString?→?Date

④ 常用符號

符號含義示例(日期?2000-11-11
yyyyy?→?2000
MMM?→?11
ddd?→?11
H時(24 小時制)HH?→?00(假設為 0 點)
mmm?→?00
sss?→?00
⑤ 練習:秒殺活動時間范圍校驗程序

題目描述:某平臺開展限時秒殺活動,活動時間為?2023年11月11日 0:0:0?至?2023年11月11日 0:10:0。請編寫程序,判斷某筆訂單的時間(2023年11月11日 0:01:00)是否在秒殺活動的有效時間范圍內,若在范圍內則提示 “參加秒殺活動成功”,否則提示 “參加秒殺活動失敗”。

package demo2;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class test8 {public static void main(String[] args) throws ParseException {String startStr = "2023年11月11日 0:0:0";String endStr = "2023年11月11日 0:10:0";String orderStr = "2023年11月11日 0:01:00";SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");Date startDate = sdf.parse(startStr);Date endDate = sdf.parse(endStr);Date orderDate = sdf.parse(orderStr);long startTime = startDate.getTime();long endTime = endDate.getTime();long orderTime = orderDate.getTime();if (orderTime >= startTime && orderTime <= endTime) {System.out.println("參加秒殺活動成功");} else {System.out.println("參加秒殺活動失敗");}}
}

Calendar 類

① 概論

  • Calendar?是代表系統當前時間的日歷對象,可單獨修改、獲取 “年、月、日、時、分、秒” 等時間字段。
  • 關鍵細節:Calendar?是抽象類不能直接通過?new?創建對象,需通過靜態方法獲取實例。

② 獲取 Calendar 實例的方法

通過靜態方法?getInstance()?獲取 “當前系統時間” 的日歷對象:

Calendar cal = Calendar.getInstance();

③ 常用方法及功能

方法簽名說明
public final Date getTime()將?Calendar?轉換為?Date?對象(用于和舊版?Date?類交互)。
public final void setTime(Date date)將?Date?對象設置到?Calendar?中(反向交互)。
public long getTimeInMillis()獲取當前?Calendar?對應的時間戳(毫秒數)(從 1970-01-01 00:00:00 GMT 起算)。
public void setTimeInMillis(long millis)通過 ** 時間戳(毫秒數)** 設置?Calendar?的時間。
public int get(int field)獲取日歷中指定字段的值(需配合?Calendar?常量,如?Calendar.YEAR)。
public void set(int field, int value)修改日歷中指定字段的值(如設置年份為 2025)。
public void add(int field, int amount)為日歷中指定字段“增加 / 減少” 指定值(如月份 + 1、天數 - 3)。
④?常用字段常量(配合?get/set/add?使用)

Calendar?定義了常量表示 “年、月、日” 等字段,常用的有:

  • Calendar.YEAR:年
  • Calendar.MONTH:月(注意:月份從 0 開始,0=1 月,11=12 月
  • Calendar.DAY_OF_MONTH:月中的日期
  • Calendar.HOUR_OF_DAY:24 小時制的 “時”
  • Calendar.MINUTE:分
  • Calendar.SECOND:秒

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/98040.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/98040.shtml
英文地址,請注明出處:http://en.pswp.cn/web/98040.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機網絡---數據鏈路層上

文章目錄1. 數據鏈路層的功能2. 組幀2.1 字符填充法2.2 字節填充法2.3 零比特填充法2.4 違規編碼2.5 總結3. 差錯控制3.1 檢錯編碼3.1.1 奇偶校驗3.1.2 循環冗余校驗碼&#xff08;CRC&#xff09;3.1.3 總結3.2 糾錯編碼&#xff08;海明校驗碼&#xff09;3.3 總結4. 流量控制…

機器學習實戰項目中,回歸與分類模型中該如何科學定義目標變量Y?

前言 在機器學習項目里&#xff0c;目標變量 (Y) 的定義決定了你能解答什么問題&#xff0c;以及模型能給業務帶來什么價值。選擇不當不僅可能導致模型誤差大、偏差嚴重&#xff0c;還可能讓業務決策方向偏離。 本文分兩大場景&#xff1a; 供應鏈項目中的 銷量預測&#xff08…

【 C/C++ 算法】入門動態規劃-----一維動態規劃基礎(以練代學式)

每日激勵&#xff1a;“不設限和自我肯定的心態&#xff1a;I can do all things。 — Stephen Curry” 緒論?&#xff1a; 本章是動態規劃算法的基礎入門篇&#xff0c;我將通過三道簡單題 一道中等難度的一維動態規劃題來帶你對動態規劃有個初認識&#xff0c;并基本了解動…

深入對比Tomcat與Netty:HTTP請求從網卡到Controller的全鏈路追蹤

我們日常用Spring Boot寫的RestController&#xff0c;感覺上就是一個簡單的方法&#xff0c;但它背后其實有一套復雜的網絡服務在支撐。一個HTTP請求到底是怎么從用戶的瀏覽器&#xff0c;穿過層層網絡&#xff0c;最終抵達我們代碼里的Controller方法的&#xff1f;理解這個過…

GO學習記錄十——發包

記錄下不同平臺的發包操作和期間遇到的問題 1.命令&#xff1a; $env:GOOSlinux $env:GOARCHamd64 go build -o release/HTTPServices-linux第一行&#xff0c;配置平臺&#xff0c;linux、windows 第二行&#xff0c;配置部署服務器的處理器架構 第三行&#xff0c;輸出目標文…

貪心算法與動態規劃

1. 什么是貪心算法&#xff1f; 貪心算法是一種在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望導致結果是全局最好或最優的算法。 核心思想&#xff1a;“每步都貪心地選擇眼前最好的&#xff0c;不去考慮整個未來的長…

學會“讀網頁”:生成式 AI 在足球賽事信息整理中的實戰

逐步教程&#xff08;Step-by-Step&#xff09; — 適合初學者與教學類文章 背景&#xff08;為什么要這樣做&#xff09; 對于足球迷、資訊編輯與數據分析師來說&#xff0c;最快、最準確把握一場比賽的核心信息至關重要&#xff1a;比分、關鍵事件&#xff08;進球、點球、紅…

BM3D 圖像降噪快速算法的 MATLAB 實現

BM3D 圖像降噪快速算法的 MATLAB 實現1. 快速 BM3D 算法流程&#xff08;概述&#xff09;步驟操作加速技巧① 分組塊匹配 堆疊FFT 互相關② 協同濾波3D 變換 硬閾值FFT 沿第三維③ 聚合加權平均稀疏矩陣累加 2. 核心函數&#xff08;單文件版&#xff09; 保存為 bm3d_fast.…

Go的schedt調度(runtime/proc.go)

1. 創建go的入口函數// Create a new g running fn. // Put it on the queue of gs waiting to run. // The compiler turns a go statement into a call to this. func newproc(fn *funcval) {gp : getg()pc : sys.GetCallerPC()systemstack(func() {newg : newproc1(fn, gp, …

Ubuntu 服務器配置轉發網絡訪問

配置文檔&#xff1a;Ubuntu 服務器轉發網絡訪問 一、網絡拓撲以以下網絡拓撲為示例Ubuntu 服務器&#xff08;兩個網卡&#xff09; eth1 10.66.71.222 &#xff08;接入內網&#xff09;eno1 192.168.2.100 &#xff08;直連相機&#xff09; 相機ip 192.168.2.1 Windows 客…

為什么企業需要高防IP

1. 抵御日益猖獗的DDoS攻擊 現代DDoS攻擊規模已突破Tbps級別 傳統防火墻無法應對大規模流量攻擊 高防IP采用分布式清洗中心&#xff0c;可輕松抵御300Gbps以上的攻擊流量 2. 保障業務連續性 網絡中斷1小時可能造成數百萬損失 高防IP確保服務99.99%可用性 智能切換機制實…

CSS基礎 - 選擇器備忘錄 --筆記5

目錄基礎選擇器組合器偽類選擇器屬性選擇器選擇器可以選中頁面上的特定元素并為其指定樣式。 CSS有多種選擇器。 基礎選擇器 標簽選擇器 – tagname&#xff1a;匹配目標元素的標簽名。優先級是0,0,1。如&#xff1a;p、h1、div類選擇器 – .class&#xff1a;匹配class屬性中…

自動駕駛中的傳感器技術46——Radar(7)

衛星雷達&#xff08;又稱為分布式雷達&#xff09;主要講當前雷達的雷達信號處理計算以及雷達目標相關的一些感知算法都遷移到中央域控進行&#xff0c;雷達端基本只負責數據采集&#xff0c;這樣做的影響如下&#xff1a; 雷達端成本與功耗降低&#xff1b; 雷達端采樣得到的…

【論文閱讀】Diff-Privacy: Diffusion-based Face Privacy Protection

基于擴散模型的人臉隱私保護方法——DiffPrivacy&#xff0c;解決了兩類人臉隱私任務&#xff1a;匿名化&#xff08;anonymization&#xff09;和視覺身份信息隱藏&#xff08;visual identity information hiding&#xff09;。1. 研究背景隨著人工智能和大數據技術的普及&am…

React 原理篇 - 深入理解虛擬 DOM

一、什么是虛擬 DOM&#xff1f; 在前端開發中&#xff0c;“虛擬 DOM” 是一個高頻出現的術語&#xff0c;尤其在 React 生態中被廣泛討論。但很多開發者對它的理解往往停留在 “JS 對象” 這個表層認知上。 實際上&#xff0c;虛擬 DOM 是一種編程概念—— 在這個概念里&…

對匯編的初理解

此處是一個簡單的函數&#xff0c;里面將調用了一個函數add&#xff08;&#xff09;函數這里是函數的原型這里是調用lcd函數產生的匯編語言&#xff0c;翻譯過來就是r11&#xff0c;r0cnt(r4cnt,前文有提及)&#xff0c;然后調用add函數&#xff0c;此處BL是指會回到指令的下一…

《Python 自動化實戰:從零構建一個文件同步工具》

《Python 自動化實戰:從零構建一個文件同步工具》 一、開篇引入:為什么我們需要文件同步? 你是否有過這樣的困擾: 公司電腦和家里電腦上都有工作項目,每次更新都要手動復制? U 盤頻繁傳輸文件,不僅麻煩還容易出錯? 項目文件夾動輒幾 G,每次同步都耗時長、效率低? 在…

工業相機與鏡頭的靶面尺寸詳解:選型避坑指南

在機器視覺系統中&#xff0c;相機與鏡頭的靶面尺寸匹配是一個非常關鍵卻又經常被忽略的細節。選錯了&#xff0c;不但影響圖像質量&#xff0c;還可能導致畫面“黑角”、視野不符、鏡頭浪費等問題。 今天我們就用通俗易懂的方式&#xff0c;聊一聊相機與鏡頭靶面尺寸的那些事兒…

使用 Go 和 go-commons 實現內存指標采集并對接 Prometheus

文章目錄一、準備工作二、編寫內存采集代碼三、運行 Exporter四、接入 Prometheus五、可擴展思路總結在運維和監控領域&#xff0c;資源指標采集 是必不可少的一環。CPU、內存、磁盤、網絡這些系統資源&#xff0c;需要實時采集并上報到監控系統中。 本文以 內存指標采集 為例&…

webrtc弱網-IntervalBudget類源碼分析與算法原理

一、核心功能 IntervalBudget 類用于基于時間窗口的帶寬預算管理。它根據設定的目標比特率&#xff08;kbps&#xff09;和一個固定時間窗口&#xff08;500ms&#xff09;&#xff0c;計算在該時間窗口內可用的字節數&#xff08;即“預算”&#xff09;&#xff0c;并支持預…