Java 從入門到精通(第4版)第5章 字元串

来源:https://www.cnblogs.com/zwwhnly/archive/2018/12/07/10034156.html
-Advertisement-
Play Games

開始講解之前,先列出本章的提綱,如下圖所示: 5.1 String類 5.1.1 聲明字元串 5.1.2 創建字元串 輸出結果如下圖所示: 5.2 連接字元串 5.2.1 連接多個字元串 註意事項:Java中一句相連的字元串不能分開在兩行中寫,如下圖所示 可以看出,這種寫法是錯誤,無法編譯通過,如果 ...


開始講解之前,先列出本章的提綱,如下圖所示:

5.1 String類

5.1.1 聲明字元串

String str;

5.1.2 創建字元串

String str1 = new String("student");
System.out.println(str1);

char a[] = {'s', 't', 'u', 'd', 'e', 'n', 't'};
String str2 = new String(a);
System.out.println(str2);

char b[] = {'s', 't', 'u', 'd', 'e', 'n', 't'};
String str3 = new String(b, 2, 4);
System.out.println(str3);

// 字元串常量
String str4 = "We are students";
String str5 = "We are students";
System.out.println(str4 == str5); // str4與str5引用相同的記憶體地址

 輸出結果如下圖所示:

5.2 連接字元串

5.2.1 連接多個字元串

String str1 = new String("hello");
String str2 = new String("world");
String str = str1 + " " + str2;
System.out.println(str);    // 輸出hello world

註意事項:Java中一句相連的字元串不能分開在兩行中寫,如下圖所示

可以看出,這種寫法是錯誤,無法編譯通過,如果一個字元串過長,為了便於閱讀,想將這個字元串分在兩行上書寫,此時可以使用“+”將兩個字元串連接起來,之後在加號處換行,如下麵語句所示:

System.out.println("I like " +
                "Java");

5.2.2 連接其他數據類型

int booktime = 4;
float practice = 2.5f;
System.out.println("我每天花費" + booktime + "小時看書;" + practice + "小時上機練習");

 輸出結果如下圖所示:

5.3 獲取字元串信息

5.3.1 獲取字元串長度

String str = "We are students";
int size = str.length();

System.out.println(size);   // 輸出15

5.3.2 字元串查找

indexOf():返回搜索的字元或者字元串在字元串中首次出現的位置,如果沒有檢索到,則返回-1。

lastIndexOf():返回搜索的字元或者字元串在字元串中最後一次出現的位置,如果沒有檢索到,則返回-1。

String str = "We are students";
int size = str.indexOf("a");
System.out.println(size);   // 輸出3

size = str.indexOf("o");
System.out.println(size);   // 輸出-1

size = str.indexOf("");
System.out.println(size);   // 輸出0
String str = "We are students";
int size = str.lastIndexOf("s");
System.out.println(size);   // 輸出14

size = str.lastIndexOf("o");
System.out.println(size);   // 輸出-1

size = str.lastIndexOf("");
System.out.println(size);   // 輸出15

 註意事項:如果lastIndexOf()方法中的參數是空字元串""(註意沒有空格),則返回的結果與調用該字元串的length()方法的返回結果相同。

5.3.3 獲取指定索引位置的字元

String str = "hello world";
char myChar = str.charAt(6);
System.out.println("字元串str中索引位置是6的字元為:" + myChar);

輸出結果如下圖所示:

 

5.4 字元串操作

5.4.1 獲取子字元串

String str = "hello world";
String substr = str.substring(3);   // lo world

System.out.println(substr);

substr = str.substring(0, 3);
System.out.println(substr); // hel,不包括endIndex

 註意事項:在字元串中空格占用一個索引位置。

5.4.2 去除空格

String str = "  Java  class   ";
System.out.println("字元串原來的長度:" + str.length());
// 去掉str的前導和尾部的空格
System.out.println("去掉空格後的長度:" + str.trim().length());

輸出結果如下圖所示:

5.4.3 字元串替換

String str = "address";
String newStr = str.replace("a", "A");

System.out.println(newStr); // 輸出Address

 說明:

  1.如果要替換的字元在字元串中沒有出現,則將原字元串返回

  2.如果要替換的字元在字元串中重覆出現多次,會將要替換的字元全部替換為新字元

  3.要替換的字元的大小寫要與原字元串中字元的大小寫保持一致,否則不能成功的替換

String str = "address";
String newStr = str.replace("b", "B");

System.out.println(newStr); // 輸出address

newStr = str.replace("d", "D");

System.out.println(newStr); // 輸出aDDress

newStr = str.replace("A", "B");

System.out.println(newStr); // 輸出address

5.4.4 判斷字元串的開始與結尾

String num1 = "22045612";
String num2 = "21304578";
boolean b1 = num1.startsWith("22");
boolean b2 = num1.endsWith("78");
boolean b3 = num2.startsWith("22");
boolean b4 = num2.endsWith("78");

System.out.println("字元串num1是以'22'開始的嗎?" + b1);
System.out.println("字元串num1是以'78'結束的嗎?" + b2);
System.out.println("字元串num2是以'22'開始的嗎?" + b3);
System.out.println("字元串num2是以'78'結束的嗎?" + b4);

輸出結果如下圖所示:

5.4.5 判斷字元串是否相等

對字元串對象進行比較不能簡單地使用比較運算符"==",因為比較運算符比較的是兩個字元串的地址是否相同。即使兩個字元串的內容相同,兩個對象的記憶體地址也可能是不同的,使用比較運算符仍然會返回false。

因此,要比較兩個字元串內容是否相等,應使用equals()方法和equalsIgnoreCase()方法。

String s1 = new String("abc");
String s2 = new String("ABC");
String s3 = new String("abc");
String s4 = "abc";
String s5 = "abc";

boolean b1 = s1.equals(s2);
boolean b2 = s1.equalsIgnoreCase(s2);
boolean b3 = s1.equals(s3);
boolean b4 = s1 == s3;
boolean b5 = s4 == s5;

System.out.println(s1 + " equals " + s2 + ":" + b1);
System.out.println(s1 + " equalsIgnoreCase " + s2 + ":" + b2);
System.out.println(s1 + " equals " + s3 + ":" + b3);
System.out.println(s1 + " == " + s3 + ":" + b4);
System.out.println(s4 + " == " + s5 + ":" + b5);

輸出結果如下圖所示:

5.4.6 按字典順序比較兩個字元串

compareTo()方法為按字典順序比較兩個字元串,該比較基於字元串中各個字元的Unicode值,按字典順序將此String對象表示的字元序列與參數字元串所表示的字元序列進行比較。

如果按字典順序此String對象位於參數字元串之前,則比較結果為一個負整數。

如果按字典順序此String對象位於參數字元串之後,則比較結果為一個正整數。

如果這兩個字元串相等,則比較結果為0。

String str = new String("b");
String str2 = new String("a");
String str3 = new String("c");
String str4 = new String("b");

System.out.println(str + " compareTo " + str2 + ":" + str.compareTo(str2));
System.out.println(str + " compareTo " + str3 + ":" + str.compareTo(str3));
System.out.println(str + " compareTo " + str4 + ":" + str.compareTo(str4));

輸出結果如下圖所示:

說明:compareTo()方法只有在equals(Object)方法返回true時才返回0。

5.4.7 字母大小寫轉換

String str = new String("abc DEF");
String newStr = str.toLowerCase();
String newStr2 = str.toUpperCase();

System.out.println(newStr); // abc def
System.out.println(newStr2); // ABC DEF

 說明:使用toLowerCase()方法和toUpperCase()方法進行大小寫轉換時,數字或非字元不受影響。

5.4.8 字元串分割

String str = "192.168.0.1";
String[] firstArray = str.split("\\.");
String[] secondArray = str.split("\\.", 2);

System.out.println("str的原值為:[" + str + "]");
System.out.println("全部分割的結果:");
for (String a : firstArray) {
      System.out.print("[" + a + "]");
}
System.out.println();

System.out.println("分割兩次的結果:");
for (String a : secondArray) {
      System.out.print("[" + a + "]");
}
System.out.println();

 輸出結果如下圖所示:

5.5 格式化字元串

5.5.1 日期和時間字元串格式化

Date date = new Date();

String year = String.format("%tY", date);
String month = String.format("%tB", date);
String day = String.format("%td", date);
String hour = String.format("%tH", date);
String minute = String.format("%tM", date);
String second = String.format("%tS", date);
String form = String.format("%tF", date);

System.out.println("今年是:" + year + "年");
System.out.println("現在是:" + month);
System.out.println("今天是:" + day + "號");
System.out.println("現在是:" + hour + "時" + minute + "分" + second + "秒");
System.out.println("年-月-日格式:" + form);

輸出結果如下圖所示:

5.5.2 常規類型格式化 

String str = String.format("%d", 400 / 2);
String str2 = String.format("%b", 3 > 5);
String str3 = String.format("%x", 200);

System.out.println("400的一半是:" + str);
System.out.println("3 > 5正確嗎:" + str2);
System.out.println("200的十六進位數是:" + str3);

 輸出結果如下圖所示:

5.6 使用正則表達式

正則表達式通常被用於判斷語句中,用來檢查某一字元串是否滿足某一格式,正則表達式是含有一些具有特殊意義字元的字元串,這些特殊字元稱為正則表達式的元字元

以下表格為常用的元字元:

元字元 正則表達式中的寫法 意義
. . 代表任意一個字元
\d \\d 代表0~9的任何一個數字
\D \\D 代表任何一個非數字字元
\s \\s 代表空白字元,如'\t','\n'
\S \\S 代表非空白字元
\w \\w 代表可用作標識符的字元,但不包括"$"
\W \\W 代表不可用於標識符的字元
\p{Lower} \\p{Lower} 代表小寫字母a~z
\p{Upper} \\p{Upper} 代表大寫字母A~Z
\p{ASCII} \\p{ASCII} ASCII字元
\p{Digit} \\p{Digit} 十進位數字,即0~9
\p{Blank} \\p{Blank} 空格或製表符\t

 

 

 

 

 

 

 

 

 

 


 

說明:在正則表達式中"."代表任何一個字元,因此在正則表達式中如果想使用普通意義的點字元".",必須使用轉義字元"\" 。

 在正則表達式中可以使用方括弧括起若幹個字元來表示一個元字元,該元字元可代表方括弧中的任何一個字元。

例如,[abc]4,字元串a4,b4,c4都是匹配的字元串。方括弧元字元還可以為其他格式,如:

[^456]:代表4、5、6之外的任何字元。

[a-r]:代表a~r中的任何一個字母。

[a-zA-Z]:代表任意一個英文字母。

在正則表達式中,允許使用限定修飾符來限定元字元出現的次數。

限定修飾符的用法如下表所示:

限定修飾符 意義 示例
? 0次或1次 A?
* 0次或多次 A*
+ 1次或多次 A+
{n} 正好出現n次 A{2}
{n,} 至少出現n次 A{3,}
{n,m} 出現n~m次 A{2,6}

 

 

 

 

 

 


 

String regex = "\\w+@\\w+(\\.\\w{2,3})*\\.\\w{2,3}";
String str1 = "aaa@";
String str2 = "aaaaa";
String str3 = "[email protected]";

if (str1.matches(regex)) {
    System.out.println(str1 + "是一個合法的E-mail地址格式");
}
if (str2.matches(regex)) {
    System.out.println(str2 + "是一個合法的E-mail地址格式");
}
if (str3.matches(regex)) {
    System.out.println(str3 + "是一個合法的E-mail地址格式");
}

 運行結果如下圖所示:

5.7 字元串生成器

String str = "";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
      str = str + i;
}
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
System.out.println("String消耗時間:" + time);

StringBuilder builder = new StringBuilder("");
startTime = System.currentTimeMillis();
for (int j = 0; j < 10000; j++) {
      builder.append(j);
}
endTime = System.currentTimeMillis();
time = endTime - startTime;
System.out.println("StringBuilder消耗時間:" + time);

運行結果如下圖所示:

通過運行的耗時可以看出,如果在程式中需要頻繁的附加字元串,建議使用StringBuilder。

StringBuilder bf = new StringBuilder("hello");
bf.insert(5, "world");
System.out.println(bf.toString());  // 輸出helloworld

bf = new StringBuilder("StringBuilder");
bf.delete(5, 10);
System.out.println(bf.toString());  // 輸出Strinder

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Python基礎知識(25):常用內建模塊 1、datetime:處理日期和時間 (1)獲取當前日期和時間 (2)獲取指定日期和時間 (3)datetime轉換為timestamp timestamp轉換為datetime timestamp也可以直接被轉換到UTC標準時區的時間 (4)str轉換為 ...
  • 給出一棵樹,問每一層各有多少葉子節點 dfs遍歷樹 bfs遍歷求樹 ...
  • 對象的創建 虛擬機遇到一條new指令時,首先檢查指令的參數能否在常量池中定位到一個類的符號引用,並且檢查這個符號引用代表的類是否已經被載入、解析和初始化過。如果沒有,必須先執行相應的類載入過程。 接下來虛擬機為新生對象分配記憶體。對象所需要的記憶體在類載入完成後可以被完全確定,所以只需要把一塊確定大小的 ...
  • 題意:給出倆個整數a,b(不超過10^9) ,求a+b的值 ,並按照xxx,xxx,xxx的格式輸出 ...
  • 實現分散式鎖目前有三種流行方案,分別為基於資料庫、Redis、Zookeeper的方案,其中前兩種方案網路上有很多資料可以參考,本文不做展開。我們來看下使用Zookeeper如何實現分散式鎖。 什麼是Zookeeper? Zookeeper(業界簡稱zk)是一種提供配置管理、分散式協同以及命名的中心 ...
  • logging 日誌模塊 一,級別的概念 二,修改配置信息 #format的多種格式 三,具體需求的實現 #暫時忽略,要用到面向對象的值是,而且可以通過生成器setlevel過濾 更改需求,實現對多個對象不同需求的實現 重點,四,引用配置模塊 #logging.config 專門用於配置loggin ...
  • 一、函數介面 |介面|參數|返回類型|描述| |: :|: :|: :|: :| |Predicate<T>|T|boolean|用來比較操作| |Consumer<T>|T|void|沒有返回值的函數| |Function|T|R|有返回值的函數| |Supplier< ...
  • #__author:Mifen #date: 2018/12/6 import time ''' 時間戳是一種用於表示時間的方式。從1970年1月1日0時0分0秒0毫秒開始到指定時間的秒數。世間戳也叫做unix時間戳,1970年1月1日成為unix元年。 作用:是為了方便時間的統一運算。 1.從19... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...