??鍵盤敲爛,年薪30萬??
目錄
一、字符串
1.字符串在內(nèi)存中的存儲方式
2.創(chuàng)建字符串對象的兩種方式
3.兩種創(chuàng)建方式的區(qū)別
4.字符串對象一旦創(chuàng)建不可改變 - 為什么???
5.字符串的拼接
6.字符串的拼接原理
二、鍵盤錄入
三、總結(jié)
一、字符串
1.字符串在內(nèi)存中的存儲方式
??在java中,內(nèi)存中有兩個地方可以存儲字符串,一個是字符串池,一個是堆內(nèi)存,串池中的字符串不會重復(fù),而堆中的字符串每次都會開辟一塊新的空間,因為維護(hù)串池的是一個hashtable,以字符串hashcode作為建,引用作為值。
2.創(chuàng)建字符串對象的兩種方式
第一種 "" 直接賦值
String s1 = "123";
第二種 new關(guān)鍵字創(chuàng)建
String里面可以是字符串 可以是byte類型的數(shù)組,還可以指定數(shù)組區(qū)間
String s2 = new String("123"); //傳字符串
byte[] bytes = {'1', '2', '3'};
String s3 = new String(bytes); //傳數(shù)組
String s2 = new String(bytes, 0, 3);//從0索引開始拷貝,長度為3
3.兩種創(chuàng)建方式的區(qū)別
用 "" 直接賦值先從串池中查找,有直接用串池里的(字符串的復(fù)用,可節(jié)省空間),沒有在串池里創(chuàng)建一個新對象
new關(guān)鍵字創(chuàng)建是直接在堆內(nèi)存開辟一塊空間保存字符串,然后返回該空間的地址
加強(qiáng)理解示例:
String s1 = new String("aaa");
String s2 = new String("aaa");
String s3 = "aaa"
String s4 = "aaa"
System.out.println(s1 == s2); // true or false
System.out.println(s1 == s3); // true or false
System.out.println(s3 == s4); // true or false
解析:
引用數(shù)據(jù)類型 == 號比較的是地址值
s1 s2是new關(guān)鍵字創(chuàng)建的,每次都會在堆內(nèi)存中開辟新空間, 故s1 != s2
s3 在串池中查找,沒有,所以會將它保存到串池里,串池的內(nèi)存和堆肯定不一樣 s1 != s3
s4 在串池中查找,有,直接返回串池中的地址,s3 == s4
4.字符串對象一旦創(chuàng)建不可改變 - 為什么???
??先說一下final關(guān)鍵字
修飾基本數(shù)據(jù)類型 -> 變量的值不可被修改
修飾引用數(shù)據(jù)類型 -> 變量的地址值不可被修改
舉例:
final int a = 10;
a = 20; //報錯
final int[] arr = {1,2,3};
arr = new int[3]; //報錯
arr[0] = 10; //可以
??字符串用final和private兩個關(guān)鍵字修飾
字符串的底層是用一個字符數(shù)組保存的,而這個字符數(shù)組又是用final和private關(guān)鍵字修飾的,用final關(guān)鍵字修飾代表該數(shù)組的地址不能發(fā)生變化,但是你可以修改數(shù)組里面的內(nèi)容啊,這時private發(fā)揮作用了,限制這個數(shù)組只能在String類中使用,你壓根拿不到這個地址。
注意:String s = "aaa"; s = "bbb";這是又創(chuàng)建一個新對象把它的地址賦給了s
5.字符串的拼接
+操作符可以實現(xiàn)字符串的拼接操作
如何拼接:
String s1 = "aaa";
String s2 = "aaa"+"bbb"; //aaabbb
String s3 = new String(s1+"bbb"); //aaabbb
String s4 = ""+123; //123
就這??就這??不不不? 上才藝
String s1 = "123";
String s2 = "1"+"2"+"3";
s1 == s2 // true or false
String s3 = "1";
String s4 = s3+"2"+"3";
s1 == s3 // true or false
不會沒關(guān)系 因為我們不知道它怎么拼接的
6.字符串的拼接原理
分兩種情況:
1.沒有變量參與:
在編譯階段會將兩個字符串合并為一個,不會創(chuàng)建新的字符串對象,也就是說"1" + "2"在編譯時被替換為了"12"
2.有變量參與
有變量參與的拼接底層會創(chuàng)建StringBuilder對象拼接,這個對象也是new出來的,簡單來說就是將要拼接的字符串放到一個容器里面,拼接完最后在轉(zhuǎn)化為字符串返回。
再看這兩組題
String s1 = "123";
String s2 = "1"+"2"+"3";
s1 == s2 // true or false
沒有變量參與,s2在編譯階段就被替換為了"123",所以s1 == s2
String s3 = "1";
String s4 = s3+"2"+"3";
s1 == s3 // true or false
有變量參與,s3+“2”+“3” 會先創(chuàng)建一個StringBuilder容器,而這個容器是new出來的,拼接完再轉(zhuǎn)為字符串返回,故s1 != s3
二、鍵盤錄入
java一起 皆對象,要想錄入先獲取它的對象,固定格式
1.創(chuàng)建Scanner的對象?? 2.鍵盤錄入
Scanner sc = new Scanner(System.in);//sc就是獲取的對象
//調(diào)用sc的成員方法
int num = sc.nextInt();//錄入一個整數(shù)
String s = sc.next();//錄入一串字符串
String line = sc.nextLine();//錄入一行數(shù)據(jù)
………………
說一下小細(xì)節(jié):
回車的作用是結(jié)束本次錄入
scanner可以錄入不同數(shù)據(jù)類型的數(shù)據(jù),如果數(shù)據(jù)類型與之不匹配,直接報錯
除了nextLine 其他遇到空格 回車 制表位(tab鍵)會停止錄入,其他沒有讀取的內(nèi)容會放到緩沖區(qū),下一次讀取會讀緩沖區(qū)里面的第一個非空格 回車 制表位 字符
nextLine錄入一行數(shù)據(jù),遇到回車停止
比如說下面這個代碼
解析:
1空格11回車 遇到回車停止錄入,下一次讀取非空格 回車 制表位字符
就說你輸入???????? 1????????? 11???? 回車 還是輸出1, 11,
但如果你 1 中間加了回車 那他就會輸出1, 2
鍵盤錄入對象在內(nèi)存中的位置
鍵盤錄入對象也是new出來的,所以是在堆上開辟空間的,就這么簡單
來 考你考?。。?/p>
String s = sc.next(); //我輸入aaa
s == “aaa”? // true or false
答案是false啦
三、總結(jié)
字符串的兩種創(chuàng)建方式是什么?有什么區(qū)別?
字符串為什么不可改變?
+操作是如何拼接字符串的???文章來源:http://www.zghlxwxcb.cn/news/detail-714667.html
鍵盤錄入對象再內(nèi)存中的位置???文章來源地址http://www.zghlxwxcb.cn/news/detail-714667.html
到了這里,關(guān)于[正式學(xué)習(xí)java③]——字符串在內(nèi)存中的存儲方式、為什么字符串不可變、字符串的拼接原理,鍵盤錄入的小細(xì)節(jié)。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!