Java - 记录String中intern()方法的学习与理解
2023-09-27 14:29:13 时间
intern()方法:把堆中的引用丢入常量池中,然后返回这个引用。当常量池中已经存在这个引用,就直接返回这个引用。(jdk1.8)
由于jdk1.7中将字符串常量池改为存放在堆中,因此intern()方法的实现原理相对以前的版本也有所改变。
我们根据jdk的版本来进行一些分析:
jdk1.6中字符串常量池存放在永久代中:
当使用intern()方法时,查询字符串常量池是否存在当前字符串,若不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。
jdk1.7中字符串常量池存放在堆中:
当使用intern()方法时,先查询字符串常量池是否存在当前字符串,若字符串常量池中不存在则再从堆中查询,然后存储并返回相关引用;
若都不存在则将当前字符串复制到字符串常量池中,并返回字符串常量池中的引用。
从上面叙述中,可以得出其中的区别:
jdk1.6中只能查询或创建在字符串常量池;
jdk1.7中会先查询字符串常量池,若没有又会到堆中再去查询并存储堆的引用,然后返回。
例子:
1 public class Test { 2 public static void main(String[] args) { 3 4 String s1 = new String("he") + new String("llo");//s1堆地址 5 String s2 = new String("h") + new String("ello");//s2堆地址,s1!=s2 6 7 //在常量池中找hello地址,没找到。 8 //故将当前字符串的地址(s1堆的地址)复制到字符串常量池中,并返回字符串常量池中的引用,也就是s1的地址。 9 String s3 = s1.intern(); //s3等于s1的堆地址 10 11 //从字符串常量池中找,发现已经有hello地址,所以直接返回hello的地址,也就是s1 12 String s4 = s2.intern(); //s4等于s1的堆地址 13 14 System.out.println(s1 == s3);// true 15 System.out.println(s1 == s4);// true 16 } 17 }
相关文章
- java中反射机制通过字节码文件对象获取字段和函数的方法
- Java架构师-容器化(二):容器编排技术-Mesos + Marathon(架构简单,清晰;Docker集群的管理工具;占有20%的市场)
- 微信图片不可显示java解决方法
- 《JAVA与模式》之模板方法模式
- 2013-8-6 10:56:07 JAVA_WEB:员工号自动生成源代码
- Effective Java:Ch4_Class:Item14_在public类中应该使用访问方法而不是public域
- Java菜鸟学习笔记--面向对象篇(十六):Object类方法
- java启动服务
- Java打印九九乘法表
- Java学习笔记13---如何理解“子类重写父类方法时,返回值若为类类型,则必须与父类返回值类型相同或为其子类”
- 数据结构与算法——常用数据结构及其Java实现
- java十五个常用类学习及方法举例
- 【Java】Java-fastjson-基本使用方法
- json转java对象 和 java对象转json 的方法 (一个类renturn的数据 映射到另外一个类接收) ---阿里巴巴的库
- Java sqrt() 方法
- PHP与Java进行通信的实现方法
- 用java实现云计算的两种趋势性方法
- java随机生成简体中文取指定长度随机简体中文实用方法
- 已解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver异常的正确解决方法,亲测有效!!!
- Java 使用aspose.word多张图片转成pdf的方法及示例代码
- Java 8之后实现继承多个接口中方法名重名问题
- java复制文件的4种方式
- JAVA 注解的几大作用及使用方法详解
- 大数据必学Java基础(二十三):方法的定义/调用/重载
- 11.JAVA-Object类之finalize(),clone(),toString()等方法覆写
- 简单学JAVA-Java学习方法-费曼学习法
- 简单学JAVA-Java学习方法-JavaSE阶段
- Java连接mysql中遇到的一些问题及解决方法
- 我的Java开发学习之旅------>Java语言中方法的参数传递机制
- 【Mysql系列】jsqlparser学习-SQL转换为java类