學習了解
- 什么是Java的字符串
- Java字符串的不變性
- Java中Stirng類的常用方法1
- Java中String類的常用方法2
- 認識Java中的StringBuilder類
- Java 中的 StringBuilder 類的常用方法
具體內(nèi)容
1、什么是Java的字符串
在程序開發(fā)中字符串無處不在,如用戶登陸時輸入的用戶名、密碼等使用的就是字符串。其實,在前面的章節(jié)中我們就已經(jīng)使用了字符串,例如我們在控制臺中輸出的 "Hello World" 、 "imooc" 等。
在 Java 中,* 字符串被作為 String 類型的對象 * 處理。 String 類位于 java.lang 包中。默認情況下,該包被自動導入所有的程序。
創(chuàng)建String對象的3種方法
- 創(chuàng)建一個字符串對象imooc,名為s1
String s1 = "imooc"; - 創(chuàng)建一個空字符串對象,名為s2
String s2 = new String(); - 創(chuàng)建一個字符串對象imooc,名為s3
String s3 = new String("imooc");
2、Java中字符串的不變性
String 對象創(chuàng)建后則不能被修改,是不可變的,所謂的修改其實是創(chuàng)建了新的對象,所指向的內(nèi)存空間不同。
示例
/**
* Created by 99479 on 2017/7/1.
*/
public class NeverChangeTest {
public static void main(String[] args) {
String s1 = "psj";
String s2 = "psj";
String s3 = new String("psj");
String s4 = new String("psj");
//多次出現(xiàn)的字符串常量,Java編譯程序只創(chuàng)建一個,所以返回true
System.out.println(s1==s1);
//s1和s3是不同的對象,所以返回false
System.out.println(s1 == s3);
//s3和s4是不同的對象,所以返回false
System.out.println(s3 == s4);
s1 = "歡迎您來:"+ s1;
System.out.println(s1);
System.out.println(s1==s2);
}
}
輸出
true
false
false
歡迎您來:psj
false
** 代碼解釋 **
1、 通過 String s1="psj"; 聲明了一個字符串對象, s1 存放了到字符串對象的引用,在內(nèi)存中的存放引用關系如下圖所示:

然后通過 s1="歡迎您來:"+s1; 改變了字符串 s1 ,其實質(zhì)是創(chuàng)建了新的字符串對象,變量 s1 指向了新創(chuàng)建的字符串對象,如下圖所示:

2、 一旦一個字符串在內(nèi)存中創(chuàng)建,則這個字符串將不可改變。如果需要一個可以改變的字符串,我們可以使用StringBuffer或者StringBuilder
3、 每次 new 一個字符串就是產(chǎn)生一個新的對象,即便兩個字符串的內(nèi)容相同,使用 ”==” 比較時也為 ”false” ,如果只需比較內(nèi)容是否相同,應使用 ”equals()” 方法
Java中String類的常用方法 1
String類提供了許多用來處理字符串的方法,例如,獲取字符出啊長度,最字符串進行截取,將字符串轉換為大寫或小寫,字符分割等。
** String類常用方法 **

** 示例 **
import java.lang.reflect.Array;
import java.util.Arrays;
/**
* Created by 99479 on 2017/7/4.
*/
public class NomalMethedTest {
public static void main(String[] args) {
//定義一個字符串“學習JAVA編程”
String str = "學習了JAVA 編程";
//打印除字符串長度
System.out.println("字符串長度:"+str.length());
//查找字符‘編的位置’
char c = '編';
System.out.println("字符‘編’的位置:"+str.indexOf(c));
//查找字符串‘JAVA’的位置
System.out.println("字符串'JAVA'的位置:"+str.indexOf("JAVA"));
//查找字符串‘psj’的位置,找不但返回‘-1’
System.out.println("字符串‘psj’的位置:"+str.indexOf("psj"));
//按空格將字符串分為一個數(shù)組,并輸出數(shù)組元素
String [] arr = str.split(" ");
System.out.println("按空格拆分成數(shù)組:"+ Arrays.toString(arr));
System.out.println();
//獲取索引位置[3,7)之間的字符串
System.out.println("獲取位置[3,7)之間的字符串:"+str.substring(3,7));
}
}
** 輸出 **
字符串長度:10
字符‘編’的位置:8
字符串'JAVA'的位置:3
字符串‘psj’的位置:-1
按空格拆分成數(shù)組:[學習了JAVA, 編程]
獲取位置[3,7)之間的字符串:JAVA
Java中的String類常用方法2
** 示例 **
public class NomalMethedTest02 {
public static void main(String[] args) {
//定義一個字符串“學習JAVA編程”
String str = "學習了JAVA 編程";
//將字符串轉為小寫
System.out.println("轉換為小寫:"+str.toLowerCase());
//獲取索引位置為1的字符
System.out.println("獲取索引位置為1位置的字符:"+str.charAt(1));
//將字符串轉換為byte[],并打印輸出
byte[] b = str.getBytes();
System.out.println("轉換為字節(jié)數(shù)組: ");
for (byte o:b) {
System.out.println(""+o);
}
System.out.println();
//和另外一個字符串“學習JAVA 編程”進行比較
String str2 = new String("學習JAVA 編程");
System.out.println("str和str2的內(nèi)存地址相同?"+(str==str2));
System.out.println("str和str2的內(nèi)容相同?"+str.equals(str2));
}
}
輸出
轉換為小寫:學習了java 編程
獲取索引位置為1位置的字符:習
轉換為字節(jié)數(shù)組:
-27
-83
-90
-28
-71
-96
-28
-70
-122
74
65
86
65
32
-25
-68
-106
-25
-88
-117
str和str2的內(nèi)存地址相同?false
str和str2的內(nèi)容相同?false
** PS **
字節(jié)是計算機存儲信息的基本單位,1個字節(jié)等于8個位,gbk編碼中1個漢字字符存儲需要2個字節(jié),1個英文字符需要一個1節(jié)。所以我們看到上面的程序運行結果中,每個漢字對應兩個字節(jié)值,如“學”對應“-47 -89”,而因為字符“J”對應“74”。同時,我們還發(fā)現(xiàn)漢字對應的字節(jié)值為負數(shù),原因在于每個每隔字節(jié)是8位,最大值不能超過127,而漢字轉換為字節(jié)后超過127,如果超過就會溢出,以負數(shù)的形式顯示。
認識Java 中的StringBuilder類
在Java中,除了可以使用String類來存儲字符串,還可以使用StringBuilder類或StringBuffer類存儲字符串,它們之間的區(qū)別是:
- String類具有是不可變性
** 范例 **
public class BuilderOrBufferTest {
public static void main(String[] args) {
String str = "hello";
System.out.println(str + "world !");
System.out.println(str);
}
}
輸出
helloworld !
hello
從運行結果中我們可以看到,程序運行時會額外創(chuàng)建一個對象,保存 "helloworld"。當頻繁操作字符串時,就會額外產(chǎn)生很多臨時變量。使用 StringBuilder 或 StringBuffer 就可以避免這個問題。至于 StringBuilder 和StringBuffer ,它們基本相似,不同之處,StringBuffer 是線程安全的,而 StringBuilder 則沒有實現(xiàn)線程安全功能,所以性能略高。因此一般情況下,如果需要創(chuàng)建一個內(nèi)容可變的字符串對象,應優(yōu)先考慮使用 StringBuilder 類。
** 范例 **
/**
* Created by 99479 on 2017/7/4.
*/
public class BuilderOrBufferTest {
public static void main(String[] args) {
//創(chuàng)建一個空的StringBuilder對象
StringBuilder str1 = new StringBuilder();
//創(chuàng)建一個字符串“psj”
StringBuilder str2 = new StringBuilder("psj");
System.out.println(str2);
}
}
** 輸出 **
psj
Java中的StringBuilder類的常用方法
StringBuilder類提供了很多方法來操作字符串:

例如:在下面的示例代碼中,創(chuàng)建了StringBuilder對象,來存儲字符串,并對其做了追加和插入操作。這些操作修改了str對象的值 ,而沒有創(chuàng)建新的對象,這就是StringBuilder和String最大的區(qū)別。
** 范例 **
public class BuilderNomalMethed {
public static void main(String[] args) {
//創(chuàng)建StringBuilder對象,存儲字符串
StringBuilder str = new StringBuilder("hello");
str.append( " psj");//在字符串后面追加字符串
str.append(520);//在字符串后面追加整數(shù)
System.out.println("字符串長度:"+str.length());
System.out.println("插入前:"+str);
str.insert(12,"!");
String str2 = str.toString();
System.out.println("插入后:"+str2);
}
}
輸出
字符串長度:12
插入前:hello psj520
插入后:hello psj520!