关于intern()的面试难题

1、在jdk6中的运行结果

package string;

public class StringIntern {
    public static void main(String[] args) {

        String s = new String("1");
        s.intern();
        String s2 = "1";
        System.out.println(s == s2);//jdk6:  false

        String s3 = new String("1") + new String("1");
        s3.intern();
        String s4 = "11";
        System.out.println(s3 == s4);//jdk6:  false
    }
}

2、在jdk7/jdk8中的运行结果

package string;

public class StringIntern {
    public static void main(String[] args) {

        String s = new String("1");
        s.intern();
        String s2 = "1";
        System.out.println(s == s2);//jdk7/8:  false

        String s3 = new String("1") + new String("1");
        s3.intern();
        String s4 = "11";
        System.out.println(s3 == s4);//jdk7/8:  true
    }
}

D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=33581:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\jdk8;D:\develop\maven\repository\junit\junit\4.13.1\junit-4.13.1.jar;D:\develop\maven\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar string.StringIntern
false
true

Process finished with exit code 0
public class StringIntern {
    public static void main(String[] args) {
        String s = new String("1");
        String intern = s.intern();
        String s2 = "1";
        System.out.println(s == s2);//false
        System.out.println(intern == s2);//true
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=23941:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Thread com.atguigu.communication.StringIntern
false
true

Process finished with exit code 0

 

public class StringIntern {
    public static void main(String[] args) {
        String s3 = new String("1") + new String("1");
        String intern = s3.intern();
        String s4 = "11";
        System.out.println(s3 == s4);//true
        System.out.println(intern == s4);//true

    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=23752:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\Thread com.atguigu.communication.StringIntern
true
true

Process finished with exit code 0

 

3、面试的拓展问题

package string;

public class StringIntern {
    public static void main(String[] args) {
        
        String s3 = new String("1") + new String("1");
        String s4 = "11";
        s3.intern();
        String s5 = s3.intern();
        System.out.println(s3 == s4);//false
        System.out.println(s5 == s4);//true
    }
}
D:\Java\jdk-17\bin\java.exe "-javaagent:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\lib\idea_rt.jar=34367:D:\BaiduNetdiskDownload\IntelliJ IDEA 2023.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\JavaSenior\out\production\jdk8;D:\develop\maven\repository\junit\junit\4.13.1\junit-4.13.1.jar;D:\develop\maven\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar string.StringIntern
false
true

Process finished with exit code 0

4、intern()的使用:jdk6  vs  jdk7/8

  • jdk1.6中,将这个字符串对象尝试放入串池。
  1. 如果串池中有,则并不会放入。返回已有的串池中的对象的地址
  2. 如果没有,会把此对称复制一份,放入串池,并返回串池中的对象地址
  • jdk1.7起,将这个字符对象尝试放入串池。
  1. 如果串池中有,则并不会放入。返回已有的串池中的对象的地址
  2. 如果没有,则会把对象的引用地址复制一份,放入串池,并返回串池中的引用地址

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值