intern()方法:把堆中的引用丢入常量池中,然后返回这个引用。当常量池中已经存在这个引用,就直接返回这个引用。(jdk1.8)

由于jdk1.7中将字符串常量池改为存放在堆中,因此intern()方法的实现原理相对以前的版本也有所改变。

我们根据jdk的版本来进行一些分析:

  jdk1.6中字符串常量池存放在永久代中:

    当使用intern()方法时,查询字符串常量池是否存在当前字符串,若不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。

  jdk1.7中字符串常量池存放在堆中:

    当使用intern()方法时,先查询字符串常量池是否存在当前字符串,若字符串常量池中不存在则再从堆中查询,然后存储并返回相关引用;

    若都不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。

从上面叙述中,可以得出其中的区别:

  jdk1.6中只能查询或创建在字符串常量池;

  jdk1.7中会先查询字符串常量池,若没有又会到堆中再去查询并存储堆的引用,然后返回。

例子:

 public class Test {
public static void main(String[] args) { String s1 = new String("he") + new String("llo");//s1堆地址
String s2 = new String("h") + new String("ello");//s2堆地址,s1!=s2 //在常量池中找hello地址,没找到。
//故将当前字符串的地址(s1堆的地址)复制到字符串常量池中,并返回字符串常量池中的引用,也就是s1的地址。
String s3 = s1.intern(); //s3等于s1的堆地址 //从字符串常量池中找,发现已经有hello地址,所以直接返回hello的地址,也就是s1
String s4 = s2.intern(); //s4等于s1的堆地址 System.out.println(s1 == s3);// true
System.out.println(s1 == s4);// true
}
}

更多例子与详情:https://www.cnblogs.com/aloenfs/p/9127353.html

最新文章

  1. Github初学者教程(一)
  2. OD调试17
  3. 【云计算】Docker云平台—Docker基础
  4. ubuntu 12.04安装jdk1.8
  5. JAVA 文本框、密码框、标签
  6. pageX,clientX,offsetX,layerX的区别
  7. IOS iphone 4inch上应用没有全屏,上下有黑边(转)
  8. C#中操作WMI的类库-实现远程登录共享
  9. CBV进阶(一)
  10. java 7K交通灯管理系统面试题
  11. CSS学习笔记之CSS的继承、层叠和特殊性
  12. UWP锁、解屏后无法响应操作
  13. 不要怂,就是GAN (生成式对抗网络) (四):训练和测试 GAN
  14. sql serve 数据库游标的使用
  15. 说一说MVC的过滤器(一)
  16. Windows守护进程简单示例
  17. 使用Jmeter进行http接口做功能、性能测试
  18. UIImageView - BNR
  19. java中级——二叉树比较冒泡和选择排序
  20. 第二篇:SpringBoot2.0整合ActiveMQ

热门文章

  1. 安装部署及升级到Exchange Server 2010
  2. cf 498 B. Name That Tune
  3. Django--评论功能实现和用户登录
  4. 吴裕雄--天生自然C++语言学习笔记:C++ 数字
  5. oracle11g数据库的安装
  6. P 1027 打印沙漏
  7. 每天一点点之vue框架开发 - 引入bootstrap
  8. tx2的一些系统命令
  9. java登录以及连接数据库的温习
  10. 五、SAP中定义变量和给变量赋值