Java中String类的intern()方法深入理解。
2017-09-21 11:01
288 查看
我们很少用到intern()这个方法,那么这个方法有什么用呢?
先看一段代码:
这一段的输出结果为:
falsetrue
false
通过注释我们理解到,intern()方法是把对象的引用添加到常量池(jdk1.7之后运行时常量池被移动到了Java堆里(Java Heap))。
所以上段代码是吧字符串"RD"放到常量池中一份,并返回引用指向s2。s3这种直接赋值的声明方法,是看常量池中存不存在"RD",若不存在,在常量池中创建并引用,若存在,直接引用。所以第第二行输出为true。
因为s1的引用是java堆中的对象,所以第一行和第三行输出false。
再看一段代码:
String s0 = "RD";
String s1 = new String("RD");
String s2 = s1.intern();
String s3 = "RD";
System.out.println(s1 == s2);
System.out.println(s3 == s2);
System.out.println(s3 == s1);
System.out.println(s0 == s2);
这一段输出结果为:
falsetrue
falsetrue
这段代码第四行输出了true,可见intern()方法再放入常量池时会判断常量池中是否已经存在"RD",如果存在,直接返回常量池中"RD"的引用。
再看下边三段代码:
代码1:
String s1 = new String("RD");
String s2 = s1.intern();
System.out.println(s2 == s1);输出为:
代码2:
String s1 = new String("RD") + new String("_Lee");
String s2 = s1.intern();
System.out.println(s2 == s1);
输出为:
代码3:
通过1,2,3段代码对比我们发现,当一个组合声明的字符串时,intern()方法不仅把s1的字符串放进常量池中并返回引用给s2,且同时把引用返回给了s1;所以推测intern还会把组合字符串的引用从堆中指到常量池,为了验证此想法,我们试验如下代码。
代码1:
String s1 = new String("RD") + new String("_Lee");
s1.intern();
String s2 = "RD_Lee";
System.out.println(s2 == s1);其返回值为:
String s1 = new String("RD");
s1.intern();
String s2 = "RD";
System.out.println(s2 == s1);其返回值为:
通过代码1和代码2我们了解到,确实是intern()方法起了作用,并不是这种“+”创建方式会直接在常量池中创建字符串。
测试版本:jdk1.8.
欢迎指正错误~
先看一段代码:
String s1 = new String("RD");// 指向堆对象引用 String s2 = s1.intern(); // 向常量池添加s1 并且S2引用常量池 String s3 = "RD"; System.out.println(s1 == s2); System.out.println(s3 == s2); System.out.println(s3 == s1);
这一段的输出结果为:
falsetrue
false
通过注释我们理解到,intern()方法是把对象的引用添加到常量池(jdk1.7之后运行时常量池被移动到了Java堆里(Java Heap))。
所以上段代码是吧字符串"RD"放到常量池中一份,并返回引用指向s2。s3这种直接赋值的声明方法,是看常量池中存不存在"RD",若不存在,在常量池中创建并引用,若存在,直接引用。所以第第二行输出为true。
因为s1的引用是java堆中的对象,所以第一行和第三行输出false。
再看一段代码:
String s0 = "RD";
String s1 = new String("RD");
String s2 = s1.intern();
String s3 = "RD";
System.out.println(s1 == s2);
System.out.println(s3 == s2);
System.out.println(s3 == s1);
System.out.println(s0 == s2);
这一段输出结果为:
falsetrue
falsetrue
这段代码第四行输出了true,可见intern()方法再放入常量池时会判断常量池中是否已经存在"RD",如果存在,直接返回常量池中"RD"的引用。
再看下边三段代码:
代码1:
String s1 = new String("RD");
String s2 = s1.intern();
System.out.println(s2 == s1);输出为:
false
代码2:
String s1 = new String("RD") + new String("_Lee");
String s2 = s1.intern();
System.out.println(s2 == s1);
输出为:
true
代码3:
String s0 = "RD_Lee"; String s1 = new String("RD") + new String("_Lee"); String s2 = s1.intern(); System.out.println(s2 == s1);输出为:
false
通过1,2,3段代码对比我们发现,当一个组合声明的字符串时,intern()方法不仅把s1的字符串放进常量池中并返回引用给s2,且同时把引用返回给了s1;所以推测intern还会把组合字符串的引用从堆中指到常量池,为了验证此想法,我们试验如下代码。
代码1:
String s1 = new String("RD") + new String("_Lee");
s1.intern();
String s2 = "RD_Lee";
System.out.println(s2 == s1);其返回值为:
true代码2:
String s1 = new String("RD") + new String("_Lee"); String s2 = "RD_Lee"; System.out.println(s2 == s1);其返回值为:
false代码3:
String s1 = new String("RD");
s1.intern();
String s2 = "RD";
System.out.println(s2 == s1);其返回值为:
false通过代码1和代码3我们可以了解到,intern()可以将通过"+"声明的这种字符串从常量池中创建,并返回引用给自身。对单独的new的字符串不可以。
通过代码1和代码2我们了解到,确实是intern()方法起了作用,并不是这种“+”创建方式会直接在常量池中创建字符串。
测试版本:jdk1.8.
欢迎指正错误~
相关文章推荐
- java-String类深入剖析和 intern()方法解析
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量(转)
- JAVA中String类的intern()方法的作用
- 深入理解Java String#intern() 内存模型
- java-String类intern()方法
- 深入理解Java虚拟机笔记---方法表集合
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- 深入理解Java方法调用的参数传递
- 深入理解Java虚拟机笔记---方法调用http://www.tuicool.com/articles/vQVzIje
- Java学习笔记之一(深入理解Object类中方法)
- Java的String类中的intern()方法
- Java String之intern()方法深入分析
- 对Java方法内部使用this访问成员变量的深入理解
- 对java synchronized方法的深入理解
- Java中关于Arrays.asList方法的深入学习与理解
- 深入理解Java的方法调用二(多态性)
- 深入理解Java的方法调用
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)
- 深入理解Java 8 Lambda(语言篇——lambda,方法引用,目标类型和默认方法)