java String的intern()方法
intern()方法用于将字符串对象加入常量池中。
public native String intern();
intern()方法返回的是一个常量池中的String对象(即常量池中某个String对象的引用)。
String s = new String("1");
s.intern();
s是一个位于堆中的String对象,其字符串值为 "1" , 调用s的intern()方法,可在常量池中创建一个字符串值与s相同的String对象。
创建过程为:
首先查找常量池中是否已存在值为 "1" 的String对象,若存在则返回该对象。
若不存在,在JDK1.6及之前,会在常量池中创建一个新的值为 "1" 的String对象,并返回该对象。
在JDK1.7及之后,会将s的引用添加至常量池中,堆中的String对象s间接的成为了常量池中的一员,此时返回的是对象s。
示例:
public static void main(String[] args) {
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);
}
jdk1.6下输出结果为 false false
jdk1.7下输出结果为 false true
jdk1.6下解释:
jdk6中的常量池是放在 Perm 区中的,Perm区和正常的 JAVA Heap 区域是完全分开的。使用引号声明的字符串都是会直接在字符串常量池中生成,而 new 出来的 String 对象是放在 JAVA Heap 区域。
String s = new String("1"); 创建了两个String对象,一个位于堆中即是s,一个位于常量池中,值为"1"。
String s2 = "1"; 由于常量池中已经存在值为"1"的String对象,所以s2指向的是常量池中的String对象。 所以s == s2 结果为false,s与s2指向的并不是同一个对象。
String s3 = new String("1") + new String("1"); 在堆中创建了一个值为"11"的String对象即是s3。
s3.intern();由于常量池中没有值为"11"的String对象,所以在池中创建了一个。
String s4 = "11";常量池中已经存在值为"11"的String对象,所以s4指向了常量池中的String对象。
所以s3 == s4 结果为false,s3与s4指向的并不是同一个对象。

jdk1.7下解释:
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);
System.out.println(s3.intern() == s3);
在 jdk7 及以后的版本中,字符串常量池从Perm区移到Java Heap区域。
String s = new String("1"); 创建了两个String对象,一个位于堆中即是s,一个位于常量池中,值为"1"。
String s2 = "1"; 由于常量池中已经存在值为"1"的String对象,所以s2指向的是常量池中的String对象。 所以s == s2 结果为false,s与s2指向的并不是同一个对象。
String s3 = new String("1") + new String("1"); 在堆中创建了一个值为"11"的String对象即是s3。
s3.intern();由于常量池中没有值为"11"的String对象,所以在常量池中添加对象s3的引用。
String s4 = "11";常量池中已经存在值为"11"的String对象(这个对象实际是s3),所以s4指向了s3指向的String对象。
所以s3 == s4 结果为true,s3与s4指向的是同一个对象,都是堆中值为 "11" 的String对象。

其它示例:
// 在堆中创建了一个值为"11"的String对象即是s3
String s3 = new String("1") + new String("1"); // 常量池中没有值为"11"的String对象
// 所以在池中创建了一个新的String对象
String s4 = "11"; // 常量池中存在值为"11"的String对象,即是s4指向的对象
// intern返回s4指向的对象
s3.intern(); // intern返回的是s4指向的对象
System.out.println(s3.intern() == s4); // true // s3指向的是堆中的对象
// s4指向的是常量池中新建的对象
// 故结果为false
System.out.println(s3 == s4); // false
String str1 = new String("Hello") + new String("World");
System.out.println(str1.intern() == str1); // true
String str2 = "HelloWorld";
System.out.println(str1 == str2); // true
String str2 = "HelloWorld";
String str1 = new String("Hello") + new String("World");
System.out.println(str1.intern() == str1); // false
System.out.println(str1 == str2); // false
java String的intern()方法的更多相关文章
- java String 中 intern方法的概念
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- String 的intern() 方法说明
1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...
- 通过反编译深入理解Java String及intern(转)
通过反编译深入理解Java String及intern 原文传送门:http://www.cnblogs.com/paddix/p/5326863.html 一.字符串问题 字符串在我们平时的编码工作 ...
- 通过反编译看Java String及intern内幕--费元星站长
通过反编译看Java String及intern内幕 一.字符串问题 字符串在我们平时的编码工作中其实用的非常多,并且用起来也比较简单,所以很少有人对其做特别深入的研究.倒是面试或者笔试的时候,往 ...
- String 的 intern() 方法解析
一.概述 JDK7 之前和之后的版本,String 的 intern() 方法在实现上存在差异,本文的说明环境是 JDK8,会在文末说明 intern() 方法的版本差异性. intern() 方法是 ...
- String中intern方法的作用
前言 读完这篇文章你可以了解,String对象在虚拟机内存中的存放,intern的作用,这么多String对象的创建到底有什么区别,String 创建的对象有几个!! 正题 先科普几个知识点1.常量池 ...
- String的intern方法的使用场景
在讲intern方法前,我们先简单回顾下Java中常量池的分类. 常量池的分类 Java中常量池可以分为Class常量池.运行时常量池和字符串常量池. 1. Class文件常量池 在Class文件中除 ...
- Java - 记录String中intern()方法的学习与理解
intern()方法:把堆中的引用丢入常量池中,然后返回这个引用.当常量池中已经存在这个引用,就直接返回这个引用.(jdk1.8) 由于jdk1.7中将字符串常量池改为存放在堆中,因此intern() ...
- String的intern方法的用处
今天第一次翻看Effective java,在其第一个item中讲静态工厂方法的有点的时候说到“它们每次被调用 的时候,不要非得创建一个新的对象”并在结尾处提到---"String.inte ...
随机推荐
- Day6作业及默写
1.使⽤循环打印以下效果: 1: * ** *** **** ***** for num in range(1,6): print('*' * num) 2: ***** **** *** ** * ...
- css 纸张效果 666
css /*内外阴影添加*/ .tool-intro { width: 1020px; height: 100px; margin: 0 auto; margin-bottom: 50px; padd ...
- system v共享内存与信号量综合
ipc.h #include <sys/types.h> #include <unistd.h> #include <sys/ipc.h> #include < ...
- 2.5 SeleniumBuilder辅助定位元素
前言对于用火狐浏览器的小伙伴们,你还在为定位元素而烦恼嘛?上古神器Selenium Builder来啦,哪里不会点哪里,妈妈再也不用担心我的定位元素问题啦!(但是也不是万能,基本上都能覆盖到) 2.5 ...
- [LeetCode&Python] Problem 350. Intersection of Two Arrays II
Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...
- K - FatMouse and Cheese
最近一直在写dp,然后别的就啥也不管了(wtcl),很明显的最简单的搜索题竟然卡了,一开始的思路是每一个格子都只能是从四周的格子转化过来的,只要找到四周最大的那个那么dp[i][j]=max+a[i] ...
- transition的用法以及animation的用法
http://www.cnblogs.com/xiaohuochai/p/5347930.html transiton: 过渡属性 过渡所需要时间 过渡动画函数 过渡延迟时间: 触发过渡 单纯的代码不 ...
- POJ3090 Visible Lattice Points (数论:欧拉函数模板)
题目链接:传送门 思路: 所有gcd(x, y) = 1的数对都满足题意,然后还有(1, 0) 和 (0, 1). #include <iostream> #include <cst ...
- inner join 与一般笛卡尔积的区别
inner join 与一般笛卡尔积的区别:inner join是笛卡尔积的特殊形式.如果有表a和表b,表a有m条记录,表b有n条记录,则一般笛卡尔积后得到的记录条数是m*n条,记录之间的组合是随意的 ...
- L3-019 代码排版 (30 分)
某编程大赛中设计有一个挑战环节,选手可以查看其他选手的代码,发现错误后,提交一组测试数据将对手挑落马下.为了减小被挑战的几率,有些选手会故意将代码写得很难看懂,比如把所有回车去掉,提交所有内容都在一行 ...