字符串常见方法总结: 构造方法、静态方法、 其它方法
? ? ? 1、? 字符串的創(chuàng)建
????????首先,我們需要明確在Java中,String是一個引用類型,它本身也是一個class類。
在一個Java程序中,我們一般通過這幾種方式來定義一個字符串:
public static void main(String[] args){String str1 = "我創(chuàng)建了一個字符串";String str2 = new String("我又創(chuàng)建了一個字符串");String str3 = new String(new char[] {'我','創(chuàng)','建','了','第','三','個','字','符','串'}); }????????在第一種方式中,Java編譯器對String有特殊處理,即可以直接用"xxx"來表示xxx這個字符串。在此創(chuàng)建過程中我們直接用str1來指向它。
????????而在第二種方式中,我們使用str2這個變量來指向為"我又創(chuàng)建了一個字符串"這個字符串新開辟的內(nèi)存地址。
????????第三種的方式我們并不常見,但實際上字符串在String內(nèi)部是通過一個char[]數(shù)組表示的,因此,按上面的第三種寫法也是可以的:因為String太常用了,所以Java提供了"..."這種字符串字面量表示方法(第一種)。
? ? ? ?2、字符串的性質(zhì)
????????在明白字符串的創(chuàng)建后我們來看一下它的一個最重要的性質(zhì):
????????Java的字符串除了是一個引用類型外,還有個重要特點,就是字符串不可變:
public class Main {public static void main(String[] args) {String s = "hello";System.out.println(s); // 顯示 hellos = "world";System.out.println(s); // 顯示 world} }????????觀察執(zhí)行結(jié)果,字符串s變了嗎?其實變的不是字符串,而是變量s的“指向”。請按步驟觀察變量s的變化:
s│ /*首先,執(zhí)行String s = "hello";時,JVM虛擬機(jī)先創(chuàng)建字符串"hello",然 ▼ 后,把字符串變量s指向它:*/ ┌───┬───────────┬───┐ │ │ "hello" │ │ └───┴───────────┴───┘s ──────────────┐│ /*然后,執(zhí)行s = "world";時,JVM虛擬機(jī)先創(chuàng)建字符 ▼ 串"world",然后,把字符串變量s指向它:*/ ┌───┬───────────┬───┬───────────┬───┐ │ │ "hello" │ │ "world" │ │ └───┴───────────┴───┴───────────┴───┘/*原來的字符串"hello"還在,只是我們無法通過變量s訪 問它而已。因此,字符串的不可變是指字符串內(nèi)容不可變。*/? ? ? ? 而事實上這種不可變性是通過內(nèi)部的private final char[]字段,以及沒有任何修改char[]的方法實現(xiàn)的
3、字符串的常用方法
? ? ? ? 當(dāng)我們點進(jìn)去String類的內(nèi)部去看時會發(fā)現(xiàn)它里面定義了很多方法,其中包括構(gòu)造方法、靜態(tài)方法、普通方法、還有一些重寫接口的抽象方法,其中最常用的有這幾個:
? ? ? ? 字符串的比較
????????當(dāng)我們想要比較兩個字符串是否相同時,要特別注意,我們實際上是想比較字符串的內(nèi)容是否相同,必須使用equals()方法而不能用==關(guān)系運算符。關(guān)于這個前面的文章中做過解釋,不清楚的小伙伴可以點這里去了解Java中“==”和equals的區(qū)別。
? ? ? ? 字符串的搜索
? ? ? ? 字符串中常用的搜索方式有以下幾種:
? ? ? ? 1、普通方法indexOf()方法可以從字符串的首部進(jìn)行搜索當(dāng)前字符串中指定子字符串的下標(biāo)位置,返回值為int類型。如果存在,則返回該子字符串的下標(biāo)位置。如果不存在,則返回-1;
public static void main(String[] args) {String str = "just do it do what i want to do";int v1 = str3.indexOf("do"); // 查找"do"出現(xiàn)的第一次的位置元素下標(biāo)System.out.println(v1); // 結(jié)果返回5}? ? ? ?2、 那我們?nèi)绻胝夷硞€子字符串最后一次出現(xiàn)在當(dāng)前字符串中是哪個位置該怎么辦呢?lastIndexOf()方法是從字符串的尾部進(jìn)行搜索,返回所查找元素下標(biāo),返回值與indexOf()方法一致;
public static void main(String[] args) {String str3 = "just do it do what i want to do";int v2 = str3.lastIndexOf("do"); System.out.println(v2); //結(jié)果輸出 29 }? ? ? ? 3、此外,indexOf()方法還被重載了另一種用法,這個方法允許我們從當(dāng)前字符串的任意一個位置開始搜索我們想要的子字符串,返回從此位置開始搜索到的第一個子字符串的下標(biāo)
public static void main(String[] args) {String str3 = "just do it do what i want to do";//從字符串str3的第二個位置開始查找"do"并返回找到的第一個的位置下標(biāo)int v3 = str3.indexOf("do",2); System.out.println(v3); //結(jié)果輸出 11 }? ? ? ? 4、還有這三種方法我們放在一起來看,因為他們參數(shù)一樣,返回值類型都為boolean值,其中startsWith()和endsWith()方法是用于判斷字符串是否以指定字符串開頭或結(jié)尾,返回值boolean類型; contains()方法用于查找當(dāng)前字符串中是否存在指定子字符串,返回值為boolean類型。
"Hello".startsWith("He"); // true "Hello".endsWith("lo"); // true "Hello".contains("lo"); // true?????????截取子字符串
????????使用substring()方法可以從當(dāng)前字符串中,截取指定下標(biāo)區(qū)間的子字符串:
????????例:從下標(biāo)為2的字符開始截取到字符串尾;截取字符串下標(biāo)0-2之間的子字符串(但不包括下標(biāo)為2的字符)
"大漠孤煙直".substring(2); // 孤煙直 "大漠孤煙直".substring(0,2); // 大漠????????String這個類為我們提供了一個自己重載的構(gòu)造方法:該方法的參數(shù)是傳進(jìn)去一個字符數(shù)組和該數(shù)組的一個下標(biāo)位置和一個int類型整數(shù),從一個字符數(shù)組的指定位置開始截取指定長度的字符得到一個字符串:
//public String(char value[], int offset, int count) { //} public static void main(String[] args) {char[] c1 = new char[]{'a','b','c','d','e','f'};//從指定位置(2)開始截取指定長度(3)的字符串String str2 = new String(c1,2,3);System.out.println(str2); //結(jié)果為cde? ? ? ? ? ? ?去除首位空白字符
????????使用trim()方法可以移除字符串首尾空白字符。空白字符包括空格,\t,\r,\n
" \tHello\r\n ".trim(); // 返回 "Hello"????????注意:trim()并沒有改變字符串的內(nèi)容,而是返回了一個新字符串。 String還提供了isEmpty()判斷字符串是否為空字符串:
"".isEmpty(); // true,因為字符串長度為0 " ".isEmpty(); // false,因為字符串長度不為0? ? ? ? 替換字符串
????????要在字符串中替換子串,有兩種方法。一種是根據(jù)字符或字符串替換:
String s = "hello"; s.replace('l', 'w'); // "hewwo",所有字符'l'被替換為'w' s.replace("ll", "~~"); // "he~~o",所有子串"ll"被替換為"~~"????????另一種是通過正則表達(dá)式替換:下面的代碼通過正則表達(dá)式,把匹配的子串統(tǒng)一替換為","
String s = "A,,B;C ,D"; s.replaceAll("[\\,\\;\\s]+", ","); // "A,B,C,D"? ? ? ? 分割字符串
????????要分割字符串,使用split()方法,并且傳入的也是正則表達(dá)式:
String s = "A,B,C,D"; String[] ss = s.split("\\,"); // {"A", "B", "C", "D"}? ? ? ? 拼接字符串
????????拼接字符串使用靜態(tài)方法join(),它用指定的字符串連接字符串?dāng)?shù)組:
String[] arr = {"A", "B", "C"}; String s = String.join("***", arr); // "A***B***C"? ? ? ? 格式化字符串
????????字符串提供了format()靜態(tài)方法,可以傳入其他參數(shù),替換占位符,然后生成新的字符串:
public static void main(String[] args) {String s = "Hi %s, your score is %d!";System.out.println(String.format(s,"Alice",80)); // 字符串對象調(diào)用System.out.println(String.format("Hi %s, your score is %.2f!", "Bob", 59.5)); // 字符串類調(diào)用}? ? ? ? 類型轉(zhuǎn)換
????????要把任意基本類型或引用類型轉(zhuǎn)換為字符串,可以使用靜態(tài)方法valueOf()。這是一個重載方法,編譯器會根據(jù)參數(shù)自動選擇合適的方法:
String.valueOf(123); // "123" String.valueOf(45.67); // "45.67" String.valueOf(true); // "true" String.valueOf(new Object()); // 類似java.lang.Object@636be97c????????要把字符串轉(zhuǎn)換為其他類型,就需要根據(jù)情況。例如,把字符串轉(zhuǎn)換為int類型或boolean類型
int n1 = Integer.parseInt("123"); // 123 int n2 = Integer.parseInt("ff", 16); // 按十六進(jìn)制轉(zhuǎn)換,255boolean b1 = Boolean.parseBoolean("true"); // true boolean b2 = Boolean.parseBoolean("FALSE"); // false? ? ? ? 轉(zhuǎn)換為char[] 類型字符數(shù)組
????????String和char[]類型可以互相轉(zhuǎn)換,方法是:
char[] cs = "Hello".toCharArray(); // String -> char[] String s = new String(cs); // char[] -> String????????如果修改了char[]數(shù)組,String并不會改變,這是因為通過new String(char[])創(chuàng)建新的String實例時,它并不會直接引用傳入的char[]數(shù)組,而是會復(fù)制一份,所以,修改外部的char[]數(shù)組不會影響String實例內(nèi)部的char[]數(shù)組,因為這是兩個不同的數(shù)組。
總結(jié)
以上是生活随笔為你收集整理的字符串常见方法总结: 构造方法、静态方法、 其它方法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 偏度和峰度存在的意义
- 下一篇: 哥哥与弟弟的游戏故事