Java通過程序中建立String類可以輕松管理字符串歹颓。字符串是一個(gè)或多個(gè)字符組成的連續(xù)序列,程序需要存儲(chǔ)的大量文字亡鼠,字符都使用字符串進(jìn)行表示處理。
Java中定義了String和StringBuffer兩個(gè)類來封裝對(duì)字符串的各種操作,它們都放到了Java.lang包中,不需要用import java.lang這個(gè)語(yǔ)句導(dǎo)入該包就可以直接使用他們。
String類用于比較兩個(gè)字符串,查找和抽取串中的字符或字串怎憋,進(jìn)行字符串與其他類型之間的相互轉(zhuǎn)換等。String類對(duì)象內(nèi)容一旦初始化就不能再改變九昧,對(duì)于String類的每次改變(例如字符串連接等)都會(huì)生成一個(gè)新的字符串绊袋,比較浪費(fèi)內(nèi)存赠橙。
StringBuffer類用于內(nèi)容可以改變的字符串,可以將其他各種類型的數(shù)據(jù)增加愤炸,插入到字符串中期揪,也可以轉(zhuǎn)置字符串中原來的內(nèi)容。一旦通過StringBuffer生成了最終想要的字符串规个,就應(yīng)該使用StringBuffer.toString()方法將其轉(zhuǎn)換成String類凤薛,隨后就可以使用String類的各種方法操縱這個(gè)字符串了。StringBuffer每次都改變自身诞仓,不生成新的對(duì)象缤苫,比較節(jié)約內(nèi)存。
String s; 墅拭。聲明一個(gè)字符串s分配一個(gè)內(nèi)存空間活玲,因?yàn)闆]初始化,所以沒有存入任何對(duì)象谍婉。s作為局部變量是不會(huì)自動(dòng)初始化的舒憾,必須顯式地賦初始值,在用System.out.println(s)時(shí)會(huì)報(bào)錯(cuò)穗熬。
用戶可以通過創(chuàng)建String類來創(chuàng)建字符串镀迂,String對(duì)象既可以隱式的創(chuàng)建,也可以顯式地創(chuàng)建唤蔗,具體創(chuàng)建形式取決于字符串在程序中的用法探遵,為了隱式地創(chuàng)建一個(gè)字符串,用戶只要將字符串放在程序中妓柜,Java則會(huì)自動(dòng)的創(chuàng)建String對(duì)象箱季。
String類的兩種實(shí)例化方式
1,使用字符串常量直接初始化棍掐,String對(duì)象名稱="字符串";
String s="有志者事竟成";
2藏雏,使用構(gòu)造方法創(chuàng)建并初始化(public String(String str)),String 對(duì)象名稱=new String("字符串");
String s=new String("有志者事竟成");
通過String類實(shí)例化方式
class jdjd
{
public static void main(String args[])
{
String str1="Hello"; //直接賦值建立對(duì)象str1
System.out.println("ste1:"+str1); //輸出
String str2=new String("有志者事竟成"); //構(gòu)造方法創(chuàng)建并初始化對(duì)象str2
System.out.println("str2:"+str2);
String str3="new"+"String"; //采用串聯(lián)方式生成新的字符串str3
System.out.println("str3:"+str3);
}
}
//三種方式都完成了String對(duì)象的創(chuàng)建及初始化
String對(duì)象也可以先聲明在賦值
String str1; //聲明字符串對(duì)象str1
str1=“hello”; //字符串對(duì)象str1賦值為“hello”塌衰。
2诉稍,構(gòu)造方法先聲明在賦值
String sre2 =new String(); 構(gòu)造方法創(chuàng)建一個(gè)字符串str2蝠嘉,內(nèi)容為空字符串最疆。等同于String str2=new String(" ");
str2="有志者事竟成"; //字符串對(duì)象str2賦值為"有志者事竟成"
String內(nèi)容的比較
方法名稱 | 類型 | 描述 |
---|---|---|
public boolean equals(String anObject) | 普通 | 區(qū)分大小寫比較 |
public boolean equalsIgnoreCase(String anotherString) | 普通 | 不區(qū)分大小寫比較 |
public int compareTo(String anotherString) | 普通 | 比較字符串大小關(guān)系 |
Java中判斷字符串一致方法有兩種
1,調(diào)用equals(object)方法蚤告。
String1.equals(String2)努酸,比較當(dāng)前對(duì)象(String1)包含的值與參數(shù)對(duì)象(String2)包含的值是否相等,若相等則equals()返回true杜恰,否則false获诈,equals()比較時(shí)考慮字符中字符大小寫的區(qū)別仍源。**equalslgnoreCase()可以忽略大小寫的進(jìn)行兩個(gè)字符串的比較。
String str1="Hello Java"; //直接賦值實(shí)例化對(duì)象str1舔涎。
Boolean result=str1.equals("Hello Java"); //result=true
Boolean result=str1.equals("Hello java"); //result=false
Boolean result=str1.equalslgnoreCase("Hello java"); //result=true
2笼踩,使用運(yùn)算符==
運(yùn)算符==比較兩個(gè)對(duì)象是否引用一個(gè)實(shí)例。
String str1="Hello"; //直接賦值實(shí)例化對(duì)象str1
String str2="Hello"; //直接賦值實(shí)例化對(duì)象str2
Boolean result=(str1==str2); //result=true
String str3=new String("Hello"); //構(gòu)造方法賦值
Boolean result2=("str1==str3"); //result=false
解析1亡嫌,如果說String是一個(gè)類嚎于,那么str1一定是這個(gè)類的對(duì)象,對(duì)象名稱一定要保存在棧內(nèi)存之中挟冠,那么字符串"Hello"一定保存在棧內(nèi)存之中于购;
2,任何情況下使用關(guān)鍵字new都會(huì)開辟一個(gè)新的堆內(nèi)存空間知染;
3肋僧,String本身是一個(gè)類,所以String類的對(duì)象是一定可以進(jìn)行引用傳遞的控淡,引用傳遞的最終結(jié)果就是不同的棧內(nèi)存將保存在同一塊堆內(nèi)存空間的地址;
4嫌吠,棧內(nèi)存像int型數(shù)據(jù),里面保存的是數(shù)值掺炭,每一個(gè)棧內(nèi)存只能夠保存一塊堆內(nèi)存的物理地址數(shù)值居兆。
"=="是對(duì)兩個(gè)對(duì)象的堆內(nèi)存地址的相等進(jìn)行判斷;對(duì)字符串內(nèi)容判斷使用equals()竹伸。
//判斷字符串是否相同
class jdjd
{
public static void main(String args[])
{
String str1="Hello"; //直接賦值
String str2=new String("Hello"); //構(gòu)造方法賦值
String str3=str2; //引用傳遞
System.out.println(str1==str2); //false
System.out.println(str1==str3); //false
System.out.println(str2==str3); //true
System.out.println(str1.equals(str2)); //true
System.out.println(str1.equals(str3)); //true
System.out.println(str2.equals(str3)); //true
}
}
Java中判斷字符串大小
如果希望知道字符串大小情況泥栖,需要調(diào)用compareTo()方法
字符串對(duì)象小于給定字符串:compareTo()方法返回小于0的值;
字符串對(duì)象等于給定字符串:compareTo()方法返回小于0的值勋篓;
字符串對(duì)象大于給定字符串:compareTo()方法返回大于0的值吧享;
比較是根據(jù)字母順序,嚴(yán)格來講是根據(jù)字符的ASCII碼值進(jìn)行比較的譬嚣,返回結(jié)果是第一個(gè)不同字符ASCII碼的差值钢颂。
class jdjd
{
public static void main(String args[])
{
String str1="This is a string"; //直接賦值建立對(duì)象str1
String str2=new String("this is a string"); //構(gòu)造方法建立對(duì)象str2
int result=str1.compareTo("That is another string"); // result=8
int result1=str1.compareTo("This is a string"); //result=0
int result2=str1.compareTo(str2); //resutl=-32
System.out.println(result);
System.out.println(result1);
System.out.println(result2);
}
}
字符串常量是String類的匿名對(duì)象
任何語(yǔ)言實(shí)際上都不會(huì)提供字符串類型,但是在Java里面為了簡(jiǎn)化用戶開發(fā)難度專門提供了String類和使用“ " ”定義的字符串拜银,但實(shí)際上每一個(gè)字符串嚴(yán)格來講都是String類的匿名對(duì)象殊鞭。
匿名對(duì)象特點(diǎn):沒有名字,而且可以調(diào)用類中相關(guān)方法
String str="Hello";
System.out.println(str.equals("Hello")); //true尼桶,字符串對(duì)象調(diào)用equals()
System.out.println("Hello".equals(str)); //true操灿,字符串常量調(diào)用equals(),"Hello"是String類的匿名對(duì)象泵督。
判斷某一用戶輸入的字符串內(nèi)容是否等于指定的字符串內(nèi)容趾盐,若采用字符串對(duì)象.equals("內(nèi)容")的方式,如果用戶沒輸入字符串,會(huì)出現(xiàn)NullPointerException警告救鲤,可以采用"字符串".equals(字符串對(duì)象)的方式解決這個(gè)問題久窟。
String str=null; //假設(shè)這個(gè)字符串由用戶輸入
if(str.equals("Hello")) //true,字符串對(duì)象調(diào)用equals()
{
System.out.println("驗(yàn)證通過");
}
if("Hello".equals(str)) //equals()可自動(dòng)處理null問題本缠,正常判斷
{
System.out.println("驗(yàn)證通過");
}
兩種字符串實(shí)例化方式的區(qū)別
實(shí)例化字符串對(duì)象可以采用兩種方式完成斥扛,不同方式在內(nèi)存中呈現(xiàn)的方式不同的分配形式。
1丹锹,直接賦值方式
如果采用直接賦值形式犹赖,那么就好比將一個(gè)字符串的常量賦給了指定的字符串變量,而且每一個(gè)字符串都屬于String的匿名對(duì)象卷仑。 ** String str="Hello";** //直接賦值
以直接賦值方式創(chuàng)建對(duì)象str峻村,僅開辟一塊堆內(nèi)存和一塊棧內(nèi)存空間。
2锡凝,構(gòu)造方法實(shí)例化
此時(shí)會(huì)開辟兩塊堆內(nèi)存空間粘昨,其中一塊堆內(nèi)存將會(huì)成為垃圾,通過構(gòu)造方法進(jìn)行的String類對(duì)象也無法進(jìn)入自動(dòng)入池的操作窜锯,即张肾,數(shù)據(jù)無法共享。
在String類中提供了一個(gè)方法锚扎,可以幫助用戶手工入池吞瞪。
手工入池:public String intern();
class ffff
{
public static void main(String args[])
{
String str1="Hello"; //直接賦值
String str2=new String("Hello").intern(); //手工入池
String str3="Hello"; //直接賦值
String str4=new String("Hello"); //構(gòu)造方法賦值
System.out.println(str1==str2); //true
System.out.println(str1==str3); //true
System.out.println(str2==str3); //true
System.out.println(str1==str4); //false
}
}
字符串一旦聲明則不可改變
改變也只會(huì)改變String對(duì)象的引用。
-----------------------------分割線---------------------------
String類常用方法
方法名稱 | 類型 | 描述 |
---|---|---|
public String(char[] value) | 構(gòu)造 | 將接收到的字符變?yōu)樽址?/td> |
public Stringchar[] value,int offset,int count) | 構(gòu)造 | 將部分字符數(shù)組變?yōu)樽址?/td> |
public char charAt(int index) | 普通 | 返回指定索引位置上的字符內(nèi)容 |
public char[] toCharArray() | 普通 | 將字符串變?yōu)樽址麛?shù)組 |
//求字符串中的指定字符
public class Main
{
public static void main(String[] args)
{
String str="hellojava"; //直接賦值
System.out.println(str.charAt(0)); //取出字符串中的第一個(gè)字符
System.out.println(str.charAt(3)); //取出字符串中的第4個(gè)字符
}
}
字符串與字符數(shù)組互相轉(zhuǎn)換
public class Main
{
public static void main(String[] args)
{
String str="hellojava";
char data[]=str.toCharArray(); //將字符串變?yōu)樽址當(dāng)?shù)組
for(int x=0;x<data.length;x++)
{
System.out.print(data[x]+" ");
data[x]-=32;//小寫變大寫(str字符串中的內(nèi)容為小寫字符驾孔,同一個(gè)小寫的ASCII碼比大寫大32)
}
System.out.println();
System.out.println("將全部字符數(shù)組變?yōu)樽址?"+new String(data));
//取得部分內(nèi)容的時(shí)候需要設(shè)置起始點(diǎn)和長(zhǎng)度(5為起始點(diǎn)芍秆,4為長(zhǎng)度)
System.out.println("將部分字符數(shù)組變?yōu)樽址?"+new String(data,5,4));
}
}
字節(jié)與字符串
方法名稱 | 類型 | 描述 |
---|---|---|
public String(byte[] bytes) | 構(gòu)造 | 將全部字節(jié)數(shù)組變?yōu)樽址?/td> |
public String(byte[] bytrs,int offset,int length) | 構(gòu)造 | 將部分字節(jié)數(shù)變?yōu)樽址?/td> |
public byte[] getBytes() | 普通 | 將字符串變?yōu)樽止?jié)數(shù)組 |
public byte[] getBytes(String charsetName)throws UnsupportedEncodingException | 普通 | 將字符串轉(zhuǎn)碼 |
//字符串與字節(jié)相互轉(zhuǎn)換
public class Main
{
public static void main(String[] args)
{
String str="hellojava";
byte data[]=str.getBytes(); // 將字符串變?yōu)閎yte數(shù)組
for(int i=0;i<data.length;i++)
{
data[i]-=32;
}
System.out.println(new String(data)); //將全部byte數(shù)組變?yōu)樽址? System.out.println(new String(data,5,4)); //將部分byte數(shù)組變?yōu)樽址? }
}
字符串查找方法
由一個(gè)字符串中若干字符按順序形成的連續(xù)字符片段,就是字符串的子串
從一個(gè)指定的字符串之中查找某一個(gè)子字符串是否存在操作翠勉,稱為字符串查找妖啥。查找操作方法如下
方法名稱 | 類型 | 描述 |
---|---|---|
public boolean contains(String s) | 普通 | 判斷某一個(gè)子字符串是否存在 |
public int indexOf(String str) | 普通 | 由前向后查找指定子字符串的位置,找不到返回-1 |
public int indexOf(String str,int fromIndex) | 普通 | 由指定位置查找子字符串位置对碌,找不到返回-1 |
public int lastIndexOf(String str) | 普通 | 由后向前查找制定字符串位置荆虱,找不到返回-1 |
public int lastIndexOf(String str,int fromIndex) | 普通 | 由指定位置從后向前查找 |
public boolean startsWith(String prefix) | 普通 | 判斷是否以指定字符串開頭 |
public boolean startsWith(String prefix,int toffset | 普通 | 從指定位置開始判斷是否以指定字符串開頭 |
public boolean endsWith(String suffix) | 普通 | 判斷是否以指定字符串結(jié)尾 |
//字符串查找方法
public class Main
{
public static void main(String[] args)
{
String str="**hello$$world##";
if(str.contains("hello")) //查找hello是否存在
{
System.out.println("內(nèi)容存在,已經(jīng)查到");
}
if(str.indexOf("r")!=-1) //查找hello是否存在
{
System.out.println("內(nèi)容存在朽们,字符串位置:"+str.indexOf("r"));
}
if(str.indexOf("o",6)!=-1) //由指定位置開始查找
{
System.out.println("內(nèi)容存在怀读,字符串位置:"+str.indexOf("o",6));
}
if(str.lastIndexOf("w",12)!=-1) //由指定位置從后向前開始查找
{
System.out.println("內(nèi)容存在,字符串位置:"+str.lastIndexOf("w",12));
}
System.out.println(str.startsWith("**"));//判斷字符串的起始內(nèi)容
System.out.println(str.startsWith("$$",7)); //判斷從索引7位置是否以$$開始
System.out.println(str.endsWith("##")); //判斷是否以##結(jié)束
}
}
字符串替換
方法名稱 | 類型 | 描述 |
---|---|---|
public String replaceAll(String regex,String replacement) | 普通 | 字符串全部替換為指定內(nèi)容 |
public String replaceFirst(String regex,String replacement) | 普通 | 替換掉首個(gè)內(nèi)容 |
//字符串替換方法
public class Main
{
public static void main(String[] args)
{
String str="helloworld";
System.out.println(str.replaceAll("o","***")); //所有子串出現(xiàn)的位置都替換
System.out.println(str.replaceFirst("l","_")); //替換第一次出現(xiàn)字符子串
}
}
字符串截取
從一個(gè)字符串中取出里面部分內(nèi)容骑脱,即子串菜枷。從字符串截取子串方法如下
方法名稱 | 類型 | 描述 |
---|---|---|
public String substring(int beginIndex) | 普通 | 由指定位置截取到結(jié)尾 |
public String substring(int beginIndex) | 普通 | 截取指定范圍字符串 |
//字符串中取子串方法
public class Main
{
public static void main(String[] args)
{
String str="Hellojava";
System.out.println(str.substring(5)); //截取從指定位置到末尾的子串
System.out.println(str.substring(0,5)); //截取從指定位置到結(jié)束位置子串
}
}
字符串拆分
字符串拆分指的是將一個(gè)字符串按照指定的字符串regex拆分為字符串,返回一個(gè)字符型數(shù)組惜姐,regex不作為任何數(shù)組元素的部分返回犁跪。操作方法如下
方法名稱 | 類型 | 描述 |
---|---|---|
public String[] split(String regex) | 普通 | 按照指定的字符串全拆分 |
public String[] split(String regex int limit) | 普通 | 將字符串拆分為指定元素個(gè)數(shù)的字符數(shù)組 |
//字符串拆分方法
public class Main
{
public static void main(String[] args)
{
String str="hello world hello java";
String data[]=str.split(" "); // 按照空格拆分
for(int i=0;i<data.length;i++)
{
System.out.println(data[i]);
}
System.out.println("------我是分割線------");
String data1[]=str.split(" ",3); //按照空格拆分為3個(gè)字符數(shù)組元素
for(int x=0;x<data1.length;x++)
{
System.out.println(data1[x]);
}
}
}
如果用“.”或“|”作為分隔的話必須寫法如下String split("\.") 或String split("\|")椿息。如果用“\”作為分隔必須寫成String split("\\")歹袁。如果在一個(gè)字符中有多個(gè)分隔符坷衍,可以用“|”作為連接符,比如str="account=8 and uu=45 or n=25"条舔,把三個(gè)都分隔出來可以用Str.splitz"and|or)"枫耳,即用and或or進(jìn)行分隔。
方法名稱 | 類型 | 描述 |
---|---|---|
public String concat(String str) | 普通 | 字符串連接孟抗,功能與“+”操作一樣 |
public String intern() | 普通 | 入池 |
public int length | 普通 | 取得字符串長(zhǎng)度 |
public boolean isEmpty() | 普通 | 判斷是否為空字符串(但不是NULL) |
public String toLowerCase() | 普通 | 字符串轉(zhuǎn)小寫 |
public String toUpperCase | 普通 | 字符串轉(zhuǎn)大寫 |
public String trim | 普通 | 去掉字符串前后空格 |
其他方法
方法名稱 | 類型 | 描述 |
---|---|---|
public String concat(String str) | 普通 | 字符串連接迁杨,功能與“+”操作一樣 |
public String intern() | 普通 | 入池 |
public int length | 普通 | 取得字符串長(zhǎng)度 |
public boolean isEmpty() | 普通 | 判斷是否為空字符串(但不是NULL) |
public String toLowerCase() | 普通 | 字符串轉(zhuǎn)小寫 |
public String toUpperCase | 普通 | 字符串轉(zhuǎn)大寫 |
public String trim | 普通 | 去掉字符串前后空格 |
//字符串常用方法
public class Main
{
public static void main(String[] args)
{
String str="Hello World...";
System.out.println("原始字符串內(nèi)容【"+str+"】"+",長(zhǎng)度:"+str.length()); //求字符串長(zhǎng)度
System.out.println("原始字符串內(nèi)容【"+str+"】"+"凄硼,長(zhǎng)度:"+str.trim().length()); //去掉字符串前后空格的長(zhǎng)度
System.out.println("".isEmpty()); //判斷字符串是否為空
System.out.println(str.isEmpty()); //判斷str字符串是否為空
System.out.println("Hello World!!".toUpperCase()); //字符串字符全變大寫
System.out.println("Hello World!!".toLowerCase()); //字符串字符全變小寫
System.out.println(str.concat("java")); //字符串連接
}
}
總結(jié)
String str=new String("java");
1铅协,創(chuàng)建String對(duì)象的個(gè)數(shù)是兩個(gè)對(duì)象,一個(gè)是“java”摊沉,一個(gè)是指向“java”的引用對(duì)象str狐史。
2,java中堆內(nèi)容和棧內(nèi)存區(qū)別
堆內(nèi)容是一個(gè)子集说墨。棧內(nèi)存存取速度僅次于寄存器骏全,棧內(nèi)存里面的數(shù)據(jù)可共享,但其中數(shù)據(jù)大小和生存期必須在運(yùn)行前確定尼斧。堆內(nèi)容是運(yùn)行時(shí)可動(dòng)態(tài)分配的數(shù)據(jù)區(qū)姜贡,從速遞看比堆內(nèi)存慢,堆內(nèi)容里面數(shù)據(jù)不共享棺棵,大小和生存期都可以運(yùn)行時(shí)在確定楼咳。new關(guān)鍵字是運(yùn)行時(shí)在堆內(nèi)容里面創(chuàng)建對(duì)象。每new一次都一定會(huì)創(chuàng)建新對(duì)象烛恤,因?yàn)槎褦?shù)據(jù)不共享爬橡。