初级程序员必懂jdk1.6和1.8版本中关于String类面试官关心的问题
首先伙伴们回答一下关于JavaString类在面试中经常遇到的问题 , 如果你能完全回答正确并且明白其实现逻辑 , 接下来的内容你可以忽略 , 跟你已经没有关系了 。 publicclassStringTest{publicstaticvoidmain(String[]args){//运行环境jdk1.8Strings1="a";Strings2="b";Strings3=s1+s2;Strings4="a"+"b";Strings5="ab";Strings6=s3.intern();//问:System.out.println(s3==s4);System.out.println(s5==s4);System.out.println(s6==s4);Stringstr1=newString("s")+newString("tr");Stringstr2="str";str1.intern();//问:如果25、26行代码交换位置输出结果是?如果将jdk换成1.6输出结果是?System.out.println(str1==str2);}}//请说出你的答案 , 评论区里见
当程序运行的时候 , 会把字符串常量加载到运行时常量池 , 见图3 。 加载完成后这些常量还并不是java字符串对象 , 当程序执行Strings1="a"这行代码时 , 就会把s1变成字符串"a"的对象 。 同时会准备一块空间 , 也就是串池(stringTable) 。 初始化串池后就会把字符串"a"当做key , 去串池中查找是否已经存在 , 如果不存在就会把字符串"a"放入串池 , 如果存在就不放入 。
System.out.println(s3==s5);//看到这里就应该知道结果了吧 , 是的没错就是:false//原因就是s3在已经在串池中而s5是在堆中 。 Jvm编译期优化Strings4="a"+"b";//此行代码在编译器会是如何执行的呢?
jdk1.8的str1.intern();尝试将字符串对象放入串池中 , 如果串池中没有就会放入 , 如果串池中存在则不会放入 , 并且会返回串池中的对象 。
jdk1.6的str1.intern();尝试将字符串对象放入串池中 , 如果串池中没有就会复制一份此对象 , 并把复制后的对象放入串池中 , 如果串池中存在则不会放入 , 并且会返回串池中的对象 。
看到这里是不是完全明白了关于String对象的各种面试问题了 , 赶紧尝试着再去回答一下开始的问题吧!
推荐阅读
- 雷军|7000多万人次观看!雷军带货首秀金额破亿,因没秃顶被质疑是假程序员
- 雷军|雷军上热搜:因头发保养得好被质疑是假程序员
- 直播带货|雷军直播带货两小时销售额破亿!自曝因头发浓密被质疑是假程序员
- 程序员|黑爵K870T三模RGB机械键盘,你想要的它都有
- 计算机视觉|一个兴趣使然的程序员,偶然锻造了互联网的基石,没有秃头
- 通宵赶项目不慎睡在公司,被领导指责,这届程序员怎么了?
- 程序员|让我们遍体鳞伤的“程序员思维”
- “我”拍了拍‘’郑州人”,初级职称评定有新举措
- 一加科技|一加手机系统氢听会 一加程序员:就这?
- 为在深圳买房,90后程序员“梭哈”炒股,血亏后坐副驾上垂泪
