groovy 字符串截取最后一个_Java基础篇——字符串详解
字符串的聲明
字符串是內存中連續排列的0個或多個字符。不變字符串是指字符串一旦創建,其內容就不能改變,Java中使用String類來處理不變字符串,在對String類的實例進行查找、比較、拼接等操作時,既不能輸入新字符,又不能改變字符串的長度。
Java程序中的字符串分為常量和變量兩種,其中,字符串常量使用雙引號括起來的一串字符,系統為程序中出現的字符串常量自動創建一個String對象。例如:
System.out.println("hello world!");
這句話將創建一個String對象,值為“hello world!”。
對于字符串變量,在使用之前要顯式聲明,并進行初始化。
字符串的聲明方式有三種:
- 直接創建: String str1 = "Hello";
字符串是對象,雖然我們在這里沒有用new創建對象,其實是編譯器給我們做了這些操作。這種創建的字符串對象有一個特點,如果同樣的對象如果存在了,就不會創建一個新的對象,而是指向了同樣的對象。例如String str2 = "Hello";,則str1和str2是指向了字符串池中同樣的內存地址,即 str1 == str2。
- 使用字符串連接創建: String str = "Hello" + "World";
這種形式其實可以看做是第一種的形式的特殊形式。 "Hello" + "World"在編譯期會被自動折疊為常量“HelloWorld”,所以,最后只會創建一個對象:String str = "HelloWorld";
JDK1.7開始,javac會進行常量折疊,全字面量字符串相加是可以折疊為一個字面常量,而且是進入常量池的。這個問題涉及到了字符串常量池和字符串拼接。String a="a"+"b"+"c";
通過編譯器優化后,得到的效果是:
String a="abc";
- new創建字符串: String str1 = new String("Hello");
用new關鍵字創建的字符串每次都會創建一個新的對象。即使這時創建一個字符串
String str2 = new String("Hello");
str1與str2是兩個對象,str1 != str2。
注意點:String str = new String("Hello"); 會產生幾個對象?如果字符串池里面沒有“Hello”對象,會在字符串池里面生成一個對象,然后再生成一個字符串對象,str指向這個對象;如果字符串池里面已經有了“Hello”對象,則只會生成一個對象,str指向這個對象。
字符串的操作
字符串創建以后,可以使用字符串類中的方法對它進行操作。日常開發中常用的操作字符串的方法有:
- String當中與獲取相關的常用方法
public int length():獲取字符串當中含有的字符個數,拿到字符串長度。
public String concat(String str):將當前字符串和參數字符串**拼接**成為返回值新的字符串。
public char charAt(int index):獲取指定索引位置的單個字符。(索引從0開始。)
public int indexOf(String str):查找參數字符串在本字符串當中首次出現的索引位置,如果沒有返回-1值。
- 字符串的截取方法
public String substring(int index):截取從參數位置一直到字符串末尾,返回新字符串。
public String substring(int begin, int end):截取從begin開始,一直到end結束,中間的字符串。
備注:[begin,end),包含左邊,不包含右邊。
- 字符串轉換的方法
public char[] toCharArray():將當前字符串拆分成為字符數組作為返回值。
public byte[] getBytes():獲得當前字符串底層的字節數組。
public String replace(CharSequence oldString, CharSequence newString):
將所有出現的老字符串替換成為新的字符串,返回替換之后的結果新字符串。
備注:CharSequence意思就是說可以接受字符串類型。
- 分割字符串
public String[] split(String regex):按照參數的規則,將字符串切分成為若干部分。
注意事項:
split方法的參數其實是一個“正則表達式”。
轉義必須寫"."(兩個反斜杠)
如果split失敗則返回一個空字符串數組,比如split(".")就會失敗,正則不明確,程序不知道怎么切了。
字符串的比較
String字符串可以使用“==”和equals()方法比較。當兩個字符串使用“==”進行比較時,比較的是兩個字符串在內存中的地址。當兩個字符串使用equals方法比較時,比較的是兩個字符串的值是否相等。
上面例子中,s1 和 s2 使用相同的字符串常量來定義,相同的字符串常量在系統內部只存在一個,即 s1 和 s2 都指向這同一個常量,所以使用 “==” 或 “equals”方法來判斷時,結果都是相等的。而 s3 是使用字符串常量創建的另一個對象,雖然它與 s1 所含的字符是一樣的,但卻是不同的對象,故使用 “==” 判斷時,s1 和 s3 是不相等的。類似的,s4 也是另一個對象,使用 “==” 判斷時,s3 和 s4 頁是不相等的。而 s5 與 s1 指向同一個實例,所以他們在兩種方式下的比較都是相等的。
String、StringBuffer和StringBuilder的關系
String類的對象實例是不可變的,一旦創建就確定下來,對字符串施加操作后并不改變字符串本身,而是有生成了一個實例。對于那些需要改變內容并有許多操作的字符串,可以使用StringBuffer類或者StringBuilder類。它們之間的區別如下:
- String是字符串常量,一旦創建就不能修改。對于已經存在的String對象的修改都是重新創建一個新的對象,然后把新的值保存進去。String類是final修飾的,不能被繼承。覆蓋了equals方法和hashCode()方法。
- StringBuffer是字符串可變對象,可以對字符串進行操作,修改字符串原有值時不會新建一個對象。執行效率較慢,但是線程安全。StringBuffer沒有覆蓋equals方法和hashCode()方法。可以動態的拼接字符換,使用 append() 方法。
- StringBuilder也是字符串可變對象,同StringBuffer一樣,可以對字符串進行操作,也不會新建對象。執行效率高效,但是線程不安全。
點個關注吧,我會持續更新,下期更精彩哦~~
總結
以上是生活随笔為你收集整理的groovy 字符串截取最后一个_Java基础篇——字符串详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何通过 iPhone “查找”功能定位
- 下一篇: iPhone 14动作模式有什么用iPh