學(xué)習(xí)了解
- 什么是Java的字符串
- Java字符串的不變性
- Java中Stirng類的常用方法1
- Java中String類的常用方法2
- 認(rèn)識(shí)Java中的StringBuilder類
- Java 中的 StringBuilder 類的常用方法
具體內(nèi)容
1、什么是Java的字符串
在程序開發(fā)中字符串無(wú)處不在昧狮,如用戶登陸時(shí)輸入的用戶名景馁、密碼等使用的就是字符串。其實(shí)逗鸣,在前面的章節(jié)中我們就已經(jīng)使用了字符串合住,例如我們?cè)诳刂婆_(tái)中輸出的 "Hello World" 、 "imooc" 等撒璧。
在 Java 中透葛,* 字符串被作為 String 類型的對(duì)象 * 處理。 String 類位于 java.lang 包中卿樱。默認(rèn)情況下僚害,該包被自動(dòng)導(dǎo)入所有的程序。
創(chuàng)建String對(duì)象的3種方法
- 創(chuàng)建一個(gè)字符串對(duì)象imooc繁调,名為s1
String s1 = "imooc"; - 創(chuàng)建一個(gè)空字符串對(duì)象萨蚕,名為s2
String s2 = new String(); - 創(chuàng)建一個(gè)字符串對(duì)象imooc,名為s3
String s3 = new String("imooc");
2蹄胰、Java中字符串的不變性
String 對(duì)象創(chuàng)建后則不能被修改岳遥,是不可變的,所謂的修改其實(shí)是創(chuàng)建了新的對(duì)象裕寨,所指向的內(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)建一個(gè),所以返回true
System.out.println(s1==s1);
//s1和s3是不同的對(duì)象捻艳,所以返回false
System.out.println(s1 == s3);
//s3和s4是不同的對(duì)象驾窟,所以返回false
System.out.println(s3 == s4);
s1 = "歡迎您來(lái):"+ s1;
System.out.println(s1);
System.out.println(s1==s2);
}
}
輸出
true
false
false
歡迎您來(lái):psj
false
** 代碼解釋 **
1、 通過(guò) String s1="psj"; 聲明了一個(gè)字符串對(duì)象讯泣, s1 存放了到字符串對(duì)象的引用纫普,在內(nèi)存中的存放引用關(guān)系如下圖所示:
然后通過(guò) s1="歡迎您來(lái):"+s1; 改變了字符串 s1 阅悍,其實(shí)質(zhì)是創(chuàng)建了新的字符串對(duì)象好渠,變量 s1 指向了新創(chuàng)建的字符串對(duì)象,如下圖所示:
2节视、 一旦一個(gè)字符串在內(nèi)存中創(chuàng)建拳锚,則這個(gè)字符串將不可改變。如果需要一個(gè)可以改變的字符串寻行,我們可以使用StringBuffer或者StringBuilder
3霍掺、 每次 new 一個(gè)字符串就是產(chǎn)生一個(gè)新的對(duì)象,即便兩個(gè)字符串的內(nèi)容相同拌蜘,使用 ”==” 比較時(shí)也為 ”false” ,如果只需比較內(nèi)容是否相同杆烁,應(yīng)使用 ”equals()” 方法
Java中String類的常用方法 1
String類提供了許多用來(lái)處理字符串的方法,例如简卧,獲取字符出啊長(zhǎng)度兔魂,最字符串進(jìn)行截取,將字符串轉(zhuǎn)換為大寫或小寫举娩,字符分割等析校。
** 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) {
//定義一個(gè)字符串“學(xué)習(xí)JAVA編程”
String str = "學(xué)習(xí)了JAVA 編程";
//打印除字符串長(zhǎng)度
System.out.println("字符串長(zhǎng)度:"+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"));
//按空格將字符串分為一個(gè)數(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));
}
}
** 輸出 **
字符串長(zhǎng)度:10
字符‘編’的位置:8
字符串'JAVA'的位置:3
字符串‘psj’的位置:-1
按空格拆分成數(shù)組:[學(xué)習(xí)了JAVA, 編程]
獲取位置[3芙代,7)之間的字符串:JAVA
Java中的String類常用方法2
** 示例 **
public class NomalMethedTest02 {
public static void main(String[] args) {
//定義一個(gè)字符串“學(xué)習(xí)JAVA編程”
String str = "學(xué)習(xí)了JAVA 編程";
//將字符串轉(zhuǎn)為小寫
System.out.println("轉(zhuǎn)換為小寫:"+str.toLowerCase());
//獲取索引位置為1的字符
System.out.println("獲取索引位置為1位置的字符:"+str.charAt(1));
//將字符串轉(zhuǎn)換為byte[]吊奢,并打印輸出
byte[] b = str.getBytes();
System.out.println("轉(zhuǎn)換為字節(jié)數(shù)組: ");
for (byte o:b) {
System.out.println(""+o);
}
System.out.println();
//和另外一個(gè)字符串“學(xué)習(xí)JAVA 編程”進(jìn)行比較
String str2 = new String("學(xué)習(xí)JAVA 編程");
System.out.println("str和str2的內(nèi)存地址相同?"+(str==str2));
System.out.println("str和str2的內(nèi)容相同纹烹?"+str.equals(str2));
}
}
輸出
轉(zhuǎn)換為小寫:學(xué)習(xí)了java 編程
獲取索引位置為1位置的字符:習(xí)
轉(zhuǎn)換為字節(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é)是計(jì)算機(jī)存儲(chǔ)信息的基本單位滔韵,1個(gè)字節(jié)等于8個(gè)位逻谦,gbk編碼中1個(gè)漢字字符存儲(chǔ)需要2個(gè)字節(jié),1個(gè)英文字符需要一個(gè)1節(jié)陪蜻。所以我們看到上面的程序運(yùn)行結(jié)果中邦马,每個(gè)漢字對(duì)應(yīng)兩個(gè)字節(jié)值,如“學(xué)”對(duì)應(yīng)“-47 -89”,而因?yàn)樽址癑”對(duì)應(yīng)“74”滋将。同時(shí)邻悬,我們還發(fā)現(xiàn)漢字對(duì)應(yīng)的字節(jié)值為負(fù)數(shù),原因在于每個(gè)每隔字節(jié)是8位随闽,最大值不能超過(guò)127父丰,而漢字轉(zhuǎn)換為字節(jié)后超過(guò)127,如果超過(guò)就會(huì)溢出掘宪,以負(fù)數(shù)的形式顯示蛾扇。
認(rèn)識(shí)Java 中的StringBuilder類
在Java中,除了可以使用String類來(lái)存儲(chǔ)字符串魏滚,還可以使用StringBuilder類或StringBuffer類存儲(chǔ)字符串镀首,它們之間的區(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
從運(yùn)行結(jié)果中我們可以看到,程序運(yùn)行時(shí)會(huì)額外創(chuàng)建一個(gè)對(duì)象鼠次,保存 "helloworld"更哄。當(dāng)頻繁操作字符串時(shí),就會(huì)額外產(chǎn)生很多臨時(shí)變量腥寇。使用 StringBuilder 或 StringBuffer 就可以避免這個(gè)問題成翩。至于 StringBuilder 和StringBuffer ,它們基本相似赦役,不同之處麻敌,StringBuffer 是線程安全的,而 StringBuilder 則沒有實(shí)現(xiàn)線程安全功能扩劝,所以性能略高庸论。因此一般情況下,如果需要?jiǎng)?chuàng)建一個(gè)內(nèi)容可變的字符串對(duì)象棒呛,應(yīng)優(yōu)先考慮使用 StringBuilder 類聂示。
** 范例 **
/**
* Created by 99479 on 2017/7/4.
*/
public class BuilderOrBufferTest {
public static void main(String[] args) {
//創(chuàng)建一個(gè)空的StringBuilder對(duì)象
StringBuilder str1 = new StringBuilder();
//創(chuàng)建一個(gè)字符串“psj”
StringBuilder str2 = new StringBuilder("psj");
System.out.println(str2);
}
}
** 輸出 **
psj
Java中的StringBuilder類的常用方法
StringBuilder類提供了很多方法來(lái)操作字符串:
例如:在下面的示例代碼中,創(chuàng)建了StringBuilder對(duì)象簇秒,來(lái)存儲(chǔ)字符串鱼喉,并對(duì)其做了追加和插入操作。這些操作修改了str對(duì)象的值 趋观,而沒有創(chuàng)建新的對(duì)象扛禽,這就是StringBuilder和String最大的區(qū)別。
** 范例 **
public class BuilderNomalMethed {
public static void main(String[] args) {
//創(chuàng)建StringBuilder對(duì)象皱坛,存儲(chǔ)字符串
StringBuilder str = new StringBuilder("hello");
str.append( " psj");//在字符串后面追加字符串
str.append(520);//在字符串后面追加整數(shù)
System.out.println("字符串長(zhǎng)度:"+str.length());
System.out.println("插入前:"+str);
str.insert(12,"!");
String str2 = str.toString();
System.out.println("插入后:"+str2);
}
}
輸出
字符串長(zhǎng)度:12
插入前:hello psj520
插入后:hello psj520!