博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java String类的intern()方法
阅读量:4945 次
发布时间:2019-06-11

本文共 969 字,大约阅读时间需要 3 分钟。

该方法的作用是把字符串加载到常量池中(jdk1.6常量池位于方法区,jdk1.7以后常量池位于堆)

在jdk1.6中,该方法把字符串的值复制到常量区,然后返回常量区里这个字符串的值;

在jdk1.7里,该方法在常量区记录该字符串首次出现的实例引用,然后返回该地址,常量区可以保存字面量也可以保存字符串对象在堆中的引用

String s3 = new String("123") + new String("123");        s3.intern();        String s4 = "123123";        System.out.println(s3 == s4);

在jdk6中,输出false,因为intern方法将字符串复制到常量区,然后返回一个该字符串在常量区中的引用。但是s3并没有接收这个引用,因此s3指向的还是堆,但是s4指向的是常量区,因此这两个地址不一样。

在jdk7 中,输出true,因为jdk7中intern方法是(在常量区找不到该字符串时)将该字符串对象在堆里的引用注册到常量区,以后使用相同字面量(双引号形式)声明的字符串对象都指向该地址,也就是该字符串在堆中的地址。所以,调用s3的intern方法后返回的引用就是s3本身的引用,而使用字面量声明的s4也是指向这个引用的,所以这两个地址相同。

总结:

  • 使用双引号声明的字符串总是放在常量区,必须显式使用双引号,例如String s1="abc",s2="123"+"abc";,两个字面量连接只会在常量区保存连接后的一个字面;如果赋值掺杂了String对象的引用,则不符合本条
  • 使用new String("字符串")形式生命的String对象是分配在堆里的,例如String s3="hhh"+s1;,但是"hhh"这个字面量会放到常量池
  • new String会生成两个对象,一个是分配在堆里的String对象,另一个是放在常量区的字面量
  • jdk6总是将字面值放在常量区(将其字面值复制到常量区),常量区位于方法区
  • jdk7常量区还能保存String对象在堆里的引用(将其在堆中的引用复制到常量区),常量区位于堆

感谢

转载于:https://www.cnblogs.com/darknessplus/p/10432064.html

你可能感兴趣的文章
linux dup()\dup2()函数
查看>>
Java反射的几个小实例
查看>>
iOS开发之理解iOS中的MVC设计模式
查看>>
2017年07月05号课堂笔记
查看>>
10.14
查看>>
zedboard开发板上移植opencv代码(立体匹配)
查看>>
PTA 模拟【string以及字母->数组下标】
查看>>
POJ 3067【树状数组】
查看>>
JNI和NDK编程
查看>>
spring boot+mybatis搭建项目
查看>>
PHP Cookies
查看>>
点击放大图片预览
查看>>
最大熵原理
查看>>
Maven最佳实践:划分模块
查看>>
内容样式
查看>>
JAVA从局域网共享文件夹中下载上传文件以及java访问共享文件夹
查看>>
DAY19 面向对象三大特性之多态、封装
查看>>
管理信息系统的开发与管理
查看>>
JMeter的学习笔记(一):JMeter的入门使用
查看>>
jap页面获取struts2中action中变量的值
查看>>