黄色网址大全免费-黄色网址你懂得-黄色网址你懂的-黄色网址有那些-免费超爽视频-免费大片黄国产在线观看

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 學習攻略 Java學習 Java字符串面試題深度分析

Java字符串面試題深度分析

更新時間:2020-08-06 15:54:16 來源:動力節點 瀏覽2553次

Java面試中,字符串相關的知識是面試者比較青睞的,特別是在不同的情況下到底創建了幾個對象,很多人理解的并不透徹,例如String str=new String("abc")為什么會創建兩個對象,很多人只是知道,但是不知道為什么,接下來我已一個全面的例子作為開場,透徹的介紹String。

java字符串面試題

掌握下面的幾點,所有的字符串面試題就不在是什么問題了:

注:本文以JDK8說明,至于JVM在每個版本的變化會在JVM面試庫中詳細介紹,在這就不展開了。

第一點:字符串創建有兩種方式:字面量和利用new關鍵字

//1:字面量創建字符串對象
String?str1?=?"abc";
//2:利用new關鍵字創建字符串對象
String?str2?=?new?String("abc");

第二點:字符串使用非常的頻繁,從空間和性能方面考慮,JVM實例化字符串時進行了優化:添加了字符串常量池。

第三點:字符串常量池中的內容是類加載完成以后創建的,而字符串常量池保存的是字符串對象的引用,具體實例對象存放在堆中。

第四點:如果只是字面量進行拼接,JVM會將它們優化成一個字面量。

String?str?=?"a"+"b";

//JVM會對上面的拼接進行優化,優化后
String?str?=?"ab";

第五點:如果拼接中存在字符串變量,JVM會將它們優化成StringBuilder進行拼接,然后通過StringBuilder.toString()獲取。

String?str1?=?"ab";
String?str2?=?str1+"c";

//上面字符串拼接存在字符串變量str1,JVM會對其優化
String?str1?=?"ab";
StringBuilder?sb?=?new?StringBuilder();
sb.append(str1).append("c");
String?str2?=?sb.toString();

第六點:new關鍵字會在堆上創建一個新的對象。

第七點:intern()方法:返回常量池該字符串的引用

intern的作用:

1:如果字符串常量池中存在字符串對象的引用,則直接返回這個對象的引用

2:如果字符串常量池中不存在字符串對象的引用,則首先在堆中創建對象,然后將這個對象的引用存放在常量池中。

上面的這七點如果真正掌握了,我相信下面的面試就很容易了。

面試1:下面的一句代碼創建了幾個對象

String?str?=?new?String("abc");

答案:創建了兩個對象。

解析:此題主要考察了第三點和第六點。

1)創建的第一個對象(第三點):在類加載時,首先判斷字符串常量中是否存在"abc"對象的引用,沒有則創建一個"abc"對象,然后把這個對象的引用存放在字符串常量池中。

2)創建的第二個對象(第六點):new關鍵字會在堆中創建一個新的對象。

面試2:下面的代碼會輸出什么

String?str1?=?"abc";
String?str2?=?"a"+"b"+"c";
String?str3?=?new?String("abc");
System.out.println(str1==str2);
System.out.println(str1==str3);

答案:true,false

解析:此題主要考察了第三點,第四點和第六點

1)true:str2在編譯期JVM會優化成"abc",然后判斷字符串常量池中是否存在"abc"對象的引用,因為str1已經創建,所以str2從字符串常量池中獲取"abc"對象的引用。所以str1和str2都是指向同一地址的引用。

2)false:上面我們知道str1指向的時字符串常量池中"abc"的引用,而str3指向的時new String()創建的新對象的引用,所以str1和str3指向的不是同一個地址的引用。

面試3:下面的代碼會輸出什么

String?str1?=?"abc";
String?str2?=?"ab";
String?str3?=?str2+"c";
System.out.println(str1==str3);

答案:false

解析:此題主要考察第三點和第五點

1)str1指向的時字符串常量池中"abc"對象的引用。

2)str3在編譯時,JVM會將str3優化成如下代碼。

StringBuilder?sb?=?new?StringBuilder();
sb.append(str2).append("c");
String?str3?=?sb.toString();

從上面代碼中可以看出str3指向的時對象StringBuilder()對象的引用,所以str1和str3指向不同對象,所以false.

面試4:下面代碼會輸出什么

String?str1?=?"abc";
String?str2?=?"ab";
String?str3?=?(str2+"c").intern();
System.out.println(str1==str3);

答案:true

解析:考察第三點和第七點

1)如果字符串調用intern()方法,它會查看字符串常量池中是否存在"abc"的引用,存在直接返回它的引用。所以str1和str3指向同一個對象的地址。

面試5:為什么不要在循環中去拼接字符串

答案:因為字符串拼接在編譯時期JVM會將其優化成StringBuilder對象進行拼接,如果循環次數非常大的話,創建的StringBuilder對象非常的多,甚至可能會導致內存溢出的情況。

java字符串面試題

以上就是動力節點java培訓機構的小編針對“Java字符串面試題深度分析”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。

提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 国产二三区 | 在线天堂中文在线资源网 | 成年女人免费又黄又爽视频 | 亚洲成年人影院 | 日韩aⅴ片| 国产精品日本 | 天天操天天碰 | 国产精品人伦久久 | 最近中文字幕视频 | 国产成人a在一区线观看高清 | 国产精品久久久久久免费 | 午夜视| 男人女人真曰批视频大全免费观看 | 国产日韩欧美精品一区二区三区 | 666夜色666夜色国产免费看 | 天天躁夜夜躁狠狠躁2023 | 五月天婷婷免费视频 | 天天涩综合 | 花蝴蝶亚洲一区二区三区 | 日韩日韩 | 欧美综合亚洲 | 干欧美女人 | 日韩黄色影视 | 欧美大交乱xxxx | 亚洲精品自在线拍 | 成年日韩免费大片黄在线观看 | 国产精品入口麻豆免费观看 | 欧美国产大片 | 久久午夜宅男免费网站 | 黄色一毛片 | 香蕉视频黄色片 | 国产三级一区二区 | 成人三级图片 | 高清一级毛片免免费看 | 成人网mm视频在线观看 | 羞羞视频在线免费看 | 五月婷在线观看 | 日韩美女免费线视频 | 制服丝袜第一页在线 | 黄色爱情视频播放 | 美女被羞羞网站 |