@
一,、前言(可忽略)
作者是一位自學(xué)JAVA的小白,,通過(guò)網(wǎng)上視頻學(xué)習(xí)和自己對(duì)String類(lèi)的理解,現(xiàn)將自己對(duì)String類(lèi)的認(rèn)知描述如下:(希望能與各位同行好友共同分享自己所學(xué)的java知識(shí),同時(shí),,也熱切期望各位同行前輩能夠幫助作者指出不足,,讓小白的編程技術(shù)能更上一層樓,感謝各位同行大佬,。
String是一種引用類(lèi)型,,通過(guò)存儲(chǔ),、引用方法區(qū)字符串常量池中對(duì)應(yīng)的字符串的地址來(lái)實(shí)現(xiàn)存儲(chǔ)、賦值等一系列相應(yīng)的操作,,字符串存儲(chǔ)在方法區(qū)字符串常量池中,,在已有的基礎(chǔ)上不會(huì)新建。垃圾回收器不會(huì)釋放常量,。
二、String變量的認(rèn)知
String引用變量直接字符串賦值
(深入原理:是將字符串的內(nèi)存地址賦值給變量,,然后String變量通過(guò)索引內(nèi)存地址找到位于字符串常量地址池中的字符串)
(小白理解:String是一種引用類(lèi)型,,通過(guò)引用字符串內(nèi)存地址來(lái)調(diào)用字符串,JVM不會(huì)在已有的基礎(chǔ)上新建或者釋放字符串)
例一:
public static void main(String[] args) {
String name="hello";
String name1="hello";
System.out.println(name==name1);//比較的是字符串內(nèi)存地址
輸出:
true
例二:
但這種情況不是
String i=new String("abc");
String j=new String("abc");
System.out.println(i==j);
輸出
false
因?yàn)閚ew是在堆內(nèi)存創(chuàng)建Sring對(duì)象來(lái)保存在字符串常量池中的String對(duì)象(字符串)的內(nèi)存地址
i和j保存的是在堆內(nèi)存中的String對(duì)象的內(nèi)存地址
并不是在字符串常量池中的String對(duì)象(字符串)的內(nèi)存地址
如要使new的對(duì)象輸出為true,,則必須調(diào)用String.equals方法
System.out.println(i.equals(j));//true,,但可能報(bào)空指針異常
//最好這樣寫(xiě):(來(lái)自一位資歷深厚的程序員,雖不是我)
System.out.println("abc".equals(j));
System.out.println(name);//注意:直接輸出String引用變量會(huì)直接調(diào)用重寫(xiě)toString方法
三,、String類(lèi)的構(gòu)造方法
String s=new String(""); //s1指向堆內(nèi)存中new的String對(duì)象,由該String對(duì)象保存字符串的內(nèi)存地址,,
String s1=""; 通過(guò)創(chuàng)建String對(duì)象來(lái)引用字符串
String s2=new String(char 數(shù)組); //將char數(shù)組內(nèi)的元素轉(zhuǎn)換成字符串
String s3=new String(char 數(shù)組,offset(起始下標(biāo)),coute(長(zhǎng)度));//將char數(shù)組內(nèi)起始下標(biāo)為i往后j個(gè)長(zhǎng)度的元素轉(zhuǎn)換為字符串
String s4=new String(byte 數(shù)組);//將byte數(shù)組內(nèi)的元素轉(zhuǎn)換成字符串
String s3=new String(byte 數(shù)組,起始下標(biāo),長(zhǎng)度); //將byte數(shù)組內(nèi)起始下標(biāo)為i往后j個(gè)長(zhǎng)度的元素轉(zhuǎn)換為字符串
以上是常用的,,實(shí)在不行,自己看源碼或者API(英文可以找英文,,中文不行找語(yǔ)文老師),。
四,、String類(lèi)的基本方法
4.1 toString()方法
? ?? public String toString()
? ?? 作用:將對(duì)象轉(zhuǎn)換成字符串,,
Exercise string=new Exercise();
System.out.println(string.toString());
? ?? 輸出:該對(duì)象的包名.類(lèi)名@該對(duì)象的內(nèi)存地址
一般使用的話(huà),是輸出該對(duì)象構(gòu)造函數(shù)的參數(shù),,改寫(xiě)toString()方法成我們想要輸出的格式
返回需求形式
public String toString()
{
return year+"年"+month+"月"+day+"日";
}
注意:輸出String對(duì)象不必重寫(xiě)toString()方法,,問(wèn)就是已經(jīng)寫(xiě)好了(看源碼)。
4.2 equals()方法
? ??public boolean equals(Object anObject)
? ??作用:比較兩個(gè)對(duì)象的內(nèi)存地址是否相等
一般使用的話(huà),,是比較兩個(gè)對(duì)象的內(nèi)容(構(gòu)造函數(shù)的參數(shù))是否相等
@Override
public boolean equals(Object obj) {
if (obj==null||!(obj instanceof Exercise)){
return false;
}
if (obj==this){
return true;
}
Exercise exercise=(Exercise)obj;
if (this.id==exercise.id&&this.name==exercise.name)//比較構(gòu)造函數(shù)的參數(shù)
{
return true;
}
return false;
}
注意:比較兩個(gè)對(duì)象不能用“==”,,因?yàn)閖ava中是看兩個(gè)對(duì)象的內(nèi)存地址,如比較兩個(gè)對(duì)象是否相同或內(nèi)容相同,,必須重寫(xiě)equals()方法,。
String string=new String();
String string1=new String();
System.out.println(string==string1);//false
4.3 equalsIgnoreCase()方法
? ??public boolean equalsIgnoreCase(String anotherString)
? ??參數(shù):anotherString - 與此 String 進(jìn)行比較的 String。
? ??作用: 忽略字母大小寫(xiě)比較字符串大小
System.out.println("ABC".equalsIgnoreCase("abc")); //忽略字母大小寫(xiě)比較字符串大小
4.4 getBytes()方法
? ??public byte[] getBytes()
? ??作用:將字符串的字符轉(zhuǎn)換成對(duì)應(yīng)的Byte組元素
String string3="abc";
byte []Byte=string3.getBytes();
//將字符串的字符轉(zhuǎn)換成對(duì)應(yīng)的Byte組元素
for (int i = 0; i <Byte.length ; i++) {
System.out.println( Byte[i]);
}
4.5 indexOf()方法
? ??作用:查找某個(gè)字符串在當(dāng)前字符串第一次出現(xiàn)的下標(biāo)
String string4="ABCDefG";
String string5="G";
System.out.println("ABCDefG".indexOf("G"));//6
//查找某個(gè)字符串在當(dāng)前字符串第一次出現(xiàn)的下標(biāo)
4.6 lastindexOf()方法
? ??作用:查找某個(gè)字符串在當(dāng)前字符串中最后一次出現(xiàn)的下標(biāo)
System.out.println("GABCDefG".lastIndexOf("G"));//7
4.7 charAt( )方法
? ??public char charAt(int index)
? ??參數(shù):index-索引,,下標(biāo)
? ??作用:字符串是一個(gè)String對(duì)象,,String對(duì)象能調(diào)用方法charAt(索引指定處的值)
char c="China".charAt(1);//字符串是一個(gè)String對(duì)象,String對(duì)象能調(diào)用方法charAt(索引指定處的值)
System.out.println(c);//h
4.8 compareTo()方法
? ??作用:compareTo方法比較字符串大小(拿著第一個(gè)字符串的第一個(gè)字符與后面字符串的第一個(gè)字符一一對(duì)應(yīng)比較
int result="abc".compareTo("abc");
//compareTo方法比較字符串大小(拿著第一個(gè)字符串的第一個(gè)字符與后面字符串的第一個(gè)字符一一對(duì)應(yīng)比較
System.out.println(result);//=0 前后一致
int result2="abc".compareTo("abcd");
System.out.println(result2);//=-1 前小后大
int result4="abcd".compareTo("abc");
System.out.println(result4);//=1 前大后小
int result3="abcd".compareTo("abce");
System.out.println(result3);//=-1
int result5="abce".compareTo("abcd");
System.out.println(result5);//=1
4.9 contains()方法
? ??作用:判斷第一個(gè)字符串中是否包含第二個(gè)字符串 true包含 false 不包含
System.out.println("Hello World!".contains("Hello"));
//判斷第一個(gè)字符串中是否包含第二個(gè)字符串 true包含 false 不包含
4.10 startsWith()方法
? ?? 作用:測(cè)試字符串是否以某字符串開(kāi)頭
System.out.println("2021-1-5".startsWith("2021"));//true
System.out.println("2021-1-5".startsWith("2020"));//false
4.11 endsWith()方法
? ?? 作用:判斷第一個(gè)字符串是否以后面的字符串結(jié)尾
System.out.println("I want to learn Java".endsWith("Java"));
//判斷第一個(gè)字符串是否以后面的字符串結(jié)尾 true 是
4.12 isEmpty()方法
? ?? 作用:判斷某個(gè)字符串是否為空
System.out.println("程序猿江小白".isEmpty());//false
String string8="";
System.out.println(string8.isEmpty());//true
4.13 replace()方法
? ?? 作用: 將當(dāng)前字符串中的某些字符串替換為指定字符串,,并重新生成子字符串
System.out.println("ABCGEF".replace("G","D"));//ABCDEF
4.14 split()方法
? ?? 作用:以某個(gè)字符串為分隔符將當(dāng)前字符串拆分成多個(gè)子字符串
String[]ymd="2021-1-2".split("-");
for (int i = 0; i <ymd.length ; i++) {
System.out.println(ymd[i]);
}
/**
* 2021
* 1
* 2
*/
String param="name=zhangliang&password=123&age=20";
//以"="或"|"為分隔符將當(dāng)前字符串拆分成多個(gè)子字符串
String[] string10=param.split("=|&");//| 或
for (int k = 0; k <string10.length ; k++) {
System.out.println(string10[k]);
}
/**
* name
* zhangliang
* password
* 123
* age
* 20
*/
4.15 substring( )方法
? ?? 作用:截取父字符串,,生成子字符串
System.out.println("How should I face with my lost future".substring(13));
//face with my lost future
//從beginIndex開(kāi)始截取,,截取endIndex-beginIndex個(gè)長(zhǎng)度,,到第endIndex-1位字符結(jié)束(不包括endIndex位字符)
System.out.println("How should I face with my lost future".substring(0,2));
//Ho
4.16 toCharArray()方法
? ?? 作用:將字符串轉(zhuǎn)換成char數(shù)組
char[]chars1="China".toCharArray();
for (int i = 0; i <chars1.length ; i++) {
System.out.println(chars1[i]);
}
/**
* C
* h
* i
* n
* a
*/
4.17 toLowerCase()方法
? ?? 作用:將字符串全部以小寫(xiě)字符表示
System.out.println("AMeriCAN".toLowerCase());//american
4.18 toUpperCase()方法
? ?? 作用:將字符串全部以大寫(xiě)字符表示
System.out.println("chIna".toUpperCase());//CHINA
4.19 trim()方法
? ?? 作用:去除字符串前后的空白
System.out.println(" time ".trim());//time
System.out.println(" love story ".trim());//love story//
4.20 valueof()方法
? ?? 作用:將非字符串轉(zhuǎn)換成字符串
/**
* String中唯一的靜態(tài)方法獨(dú)苗
* String.valueof
* 作用:將非字符串轉(zhuǎn)換成字符串
*/
String string1=String.valueOf(new StringTest02());
/**
* valueof方法,,在參數(shù)為一個(gè)對(duì)象時(shí),如果該對(duì)象沒(méi)有重寫(xiě)toString()底層會(huì)自
* 動(dòng)調(diào)用object.toString方法
* 為什么輸出引用的時(shí)候,,會(huì)調(diào)用toString()方法
* 因?yàn)閜rintln底層是調(diào)用的valueof(),,而valueof()底層調(diào)用的是obj的toString
* 方法
* System.out.println()打印輸出時(shí)都是先轉(zhuǎn)換成字符串
*/
System.out.println(string1);
4.21 StringBuffer()方法與StringBuilder()方法
? ?? 作用:拼接字符串
StringBuffer stringBuffer=new StringBuffer();
//指定初始化容量的StringBuffer對(duì)象(字符串緩沖區(qū)對(duì)象)默認(rèn)初始化16個(gè)長(zhǎng)度的byte數(shù)組
stringBuffer.append("A");//拼接字符串調(diào)用append進(jìn)行追加,如果byte數(shù)組滿(mǎn)了會(huì)自動(dòng)擴(kuò)容
stringBuffer.append("B");
stringBuffer.append("C");
System.out.println(stringBuffer);//ABC
StringBuilder stringBuilder=new StringBuilder();
stringBuilder.append("a");
stringBuilder.append("b");
stringBuilder.append("c");
System.out.println(stringBuilder);//abc
/**
* StringBuffer與StringBuilder的區(qū)別
* StringBuffer中的方法都有:synchronized關(guān)鍵字修飾,。表示StringBuffer在多線(xiàn)程環(huán)境下運(yùn)行是安全的
* StringBuilder中的方法沒(méi)有,,表示在多線(xiàn)程環(huán)境下是不安全的,但效率較高
*/
|