String的深入解析
?
1.String和StringBuilder、StringBuffer的區(qū)別?
答:Java平臺提供了兩種類型的字符串:String和StringBuffer/StringBuilder,它們可以儲存和操作字符串。其中String是只讀字符串,也就意味著String引用的字符串內(nèi)容是不能被改變的。而StringBuffer/StringBuilder類表示的字符串對象可以直接進行修改。StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,區(qū)別在于它是在單線程環(huán)境下使用的,因為它的所有方面都沒有被synchronized修飾,因此它的效率也比StringBuffer要高。
?
2.String str=new String("hello");
上面的語句中變量str放在棧上,用new創(chuàng)建出來的字符串對象放在堆上,而"hello"這個字面量是放在方法區(qū)的(常量池)。
?
3.以下題目博大精深
package com.etc.dao;public class dd {public static void main(String[] args) {// TODO Auto-generated method stubString s1 = "Programming";String s2 = new String("Programming");String s3 = "Program";String s4 = "ming";String s5 = "Program" + "ming";//java自動拼接成ProgrammingString s6 = s3 + s4;System.out.println(s1 == s2);//字符串引用==字符串System.out.println(s1 == s5);//字符串==字符串/*** 字符串的+操作其本質(zhì)是創(chuàng)建了StringBuilder對象進行append操作,* 然后將拼接后的StringBuilder對象用toString方法處理成String對象,返回的是引用*/System.out.println(s1 == s6);//字符串==引用//intern方法返回 如果常量池在字符串返回字符串,不存在,存入,返回引用System.out.println(s1 == s6.intern());//字符串==字符串System.out.println(s2 == s2.intern());//字符串引用==字符串 }} 結果:falsetruefalsetruefalse
補充:解答試題需要清楚兩點:
1. String對象的intern方法會得到字符串對象在常量池中對應的版本的引用(如果常量池中有一個字符串與String對象的equals結果是true,返回該字符串),如果常量池中沒有對應的字符串,則該字符串將被添加到常量池中,然后返回常量池中字符串的引用;
2. 字符串的+操作其本質(zhì)是創(chuàng)建了StringBuilder對象進行append操作,然后將拼接后的StringBuilder對象用toString方法處理成String對象,這一點可以用javap -c StringEqualTest.class命令獲得class文件對應的JVM字節(jié)碼指令就可以看出來。
這是我的新博客,以后文章都會放在上面,歡迎來訪。http://blog.shadowwu.club
?
轉(zhuǎn)載于:https://www.cnblogs.com/wuxinyiwu/p/7485788.html
總結
以上是生活随笔為你收集整理的String的深入解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下一代防火墙市场高速增长,年复合增长率为
- 下一篇: 自研DevOps实践