这道Java基础面试题你真的会吗?

你咱不往下看,先想一想你的答案是什么?java

这里先来聊聊String的intern()方法是干什么的?ide

intern方法是一个native方法,空口无凭,我们仍是能够看看Stirng的源码ui

从方法的注释我们能够知道,它的做用:对象

1:若是字符串常量池中已经包含一个等于此Stirng对象的字符串,则返回表明池中的这个字符串的String对象,blog

2:第一条不成立。则将此String对象包含的字符串添加到常量池中,而且返回此String对象的引用字符串

再回到上面的题目,答案有两种,源码

1:若是jdk版本为1.6时,会打印出两个falseit

2:若是jdk版本是大于等于1.7的话,打印出来的是true和false各一个class

为何会这样呢????jdk

第一,jdk1.6中intern方法会把首次遇到的字符串实例复制到永久代,返回的也是永久代中这个字符串的引用,而且StringBuilder建立字符串实例是在堆上,因此必然不是同一个引用,因此致使都是false。

第二,jdk1.7中intern方法的实现不会再复制实例,只是在常量池中记录首次出现的实例引用,所以intern方法返回的引用和StirngBuilder建立的那个字符串实例是同一个,对于str2中比较返回false是由于"java"这个字符串在执行StirngBuilder.toString()以前已经出现过了,字符串常量池中已经有它的引用了,不符合首次出现的原则,而"计算机软件"这个字符串则是首次出现的,所以返回true。

在上面的第二条中的"java"字符串的解释貌似有些牵强,下面再来证明一下。

相关文章
相关标签/搜索