今天重新看了一点周志明大佬的《深入理解Java虚拟机》,发现这个地方讲的不是很透彻,在网络上看到一些博客基本也都是在搬运原文,搞得一头雾水。弄了半天算是彻底明白了,做一下笔记。

搬运一下原文对intern()方法的说明:String::intern()是一个本地方法,它的作用是如果字符串常量池中已经包含一个等于此String对象的字符串,则返回代表池中这个字符串的String对象的引用(指的是常量池中的实例);否则,会将此String对象包含的字符串添加到常量池中,并且返回此String对象的引用(指的是堆中的实例)。括号中是我的个人理解,由于作者两种情况说的结果都是"String对象的引用",让我错误地理解为都是堆中实例的引用。接下来我们看几段代码。

String a = "a";
String b = new String("a");
System.out.println(a == b);

上面这段代码结果显然是false,虽然两者值相等,但是a是字面量(常量池中),b在堆中(因为b是通过new创建)。

接下来我们看书中的这个例子:

String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
String str2 = new StringBuilder("ja").append("va").toString();
System.out.println(str2.intern() == str2);

结果是true,false。解释如下:"计算机软件"从未出现在常量池,因此str1.intern()的结果为堆中的值为"计算机软件"的String对象,同时也会将"计算机软件"这个字符串加入到常量池中;"java"曾出现在sun.misc.Version这个类中,因此早就存在于常量池里,所以str2.intern()的结果为常量池中的值为"java"的字面量。

再看看以下代码段:

String str1 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str1.intern() == str1);
String str2 = new StringBuilder("计算机").append("软件").toString();
System.out.println(str2.intern() == str2);

结果是true,false。这说明第一个intern()将"计算机软件"这个字符串加入到了常量池中,导致str2.intern()实际上是在常量池中,而str2在堆中。

String str1 = new String("计算机软件");
System.out.println(str1.intern() == str1);

这个结果是false,因为这样的构建String的方法会做两件事:在常量池中创建一个实例,再复制到堆中创建一个对象。这就导致str1.intern()实是在常量池中,而str1在堆中。

String str1 = new String("计算机软件");
System.out.println(str1.intern() == "计算机软件");

而这个结果是true,就很好理解了。

最新文章

  1. 计算机视觉之《OpenCV开发环境搭建》
  2. javax.mail 发送邮件异常
  3. C# 后台获取WebApi 方法
  4. IOS8解决获取位置坐标信息出错(Error Domain=kCLErrorDomain Code=0)
  5. CSS画出的各种形状图
  6. 通过继承nsoperation的方法--处理复杂任务
  7. 网站WAF的检测
  8. Java基础知识强化08:将字符串倒序输出(包括空格)的几种方法
  9. test_wifi
  10. SoapUI调用Web服务
  11. easy-ui 有依赖关系的下拉列表(省市区县)
  12. Quartz的cron表达式
  13. 【RL-TCPnet网络教程】第22章 RL-TCPnet之网络协议IP
  14. 深入Session2
  15. iptables常用规则
  16. 37mysql 表操作
  17. 视差滚动(Parallax Scrolling)插件补充
  18. 原型模式(GOF23)
  19. 「Python」7个不一样的代码写法
  20. phpquery中文手册

热门文章

  1. TextCNN论文解读
  2. Leetcode(29)-两数相除
  3. spring-cloud-eureka-client-consumer
  4. hdu2333-贪心,如何去后效性,背包太大怎么办,如何最大化最小值,从无序序列中发掘有序性质
  5. u-boot 移植 --->5、友善之臂Tiny210底板王网卡驱动移植
  6. docker部署LNMP架构
  7. Google PageSpeed Insights : 网站性能优化检测工具
  8. CSS multi colors circle
  9. Flutter in DartPad
  10. Flutter for Desktop