在翻《深入理解Java虚拟机》的书时,又看到了2-7的 String.intern()返回引用的测试。其实要搞明白String.intern(),我总结了下面几条规则:一、new String都是在堆上创建字符串对象。当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTa ...
分类:
其他好文 时间:
2021-05-24 08:12:47
阅读次数:
0
new String("a"); 这个方法会创建两个对象 一个String对象 一个"a"常量放到字符串常量池中 new String("a") + new String("b") 这个方法会创建相当于new String("ab")当时不会创建"ab"到字符串常量池 在1.7之前 intern方法 ...
分类:
编程语言 时间:
2021-05-24 06:06:52
阅读次数:
0
JDK的String类有一个intern方法: public native String intern(); 方法的注释: /** * Returns a canonical representation for the string object. * <p> * A pool of string ...
分类:
其他好文 时间:
2021-01-11 10:45:52
阅读次数:
0
作者:Mazin 来源:my.oschina.net/u/3441184/blog/887152 首先我们来看一段代码: public class InternTest { public static void main(String[] args) { String str1 = new Stri ...
分类:
其他好文 时间:
2020-12-30 11:23:27
阅读次数:
0
##String ###存储空间 ###结论 1.常量与常量的拼接结果在常量池中。且常量池中不会存在相同内容的常量 2.只要其中有一个时变量,结果就在堆中 3.如果拼接的结果调用intern()方法,返回值就在常量池中 ###面试题 String,StringBuffer,StringBuilder ...
分类:
其他好文 时间:
2020-11-01 10:11:52
阅读次数:
15
一、概述 常量池大体可分为两类: 静态常量池: 即 .class文件中的常量池,class文件中的常量池不仅仅包含 字符串(数字)字面量 ,还包含 类、方法的信息 ,占用class文件绝大部分空间。 主要用于存放两大类常量: 字面量(Literal) :相当于Java语言层面常量的概念,如 文本字符 ...
分类:
编程语言 时间:
2020-05-20 14:28:36
阅读次数:
52
众所周知,JDK1.8版本中, String常量池 已经从 方法区 中的 运行时常量池 分离到堆中了,那么在堆中的 String常量池 里存的是String对象还是引用呢?直接查看API: 翻译:String类的intern()方法:一个初始为空的字符串池,它由类String独自维护。当调用 int ...
分类:
其他好文 时间:
2020-04-26 18:48:25
阅读次数:
171
jdk7之后 String s = new String("a") 如果执行intern方法时 字符串常量池中已有字符串"a"的引用 那么intern不执行任何操作 s的指向不变 intern方法返回"a"的引用 String s2 = new String("a") + new String("a ...
分类:
其他好文 时间:
2020-03-18 09:40:36
阅读次数:
58
我们用如下代码来证明两个版本intern方法的区别。 jdk1.6 String ab = new String("a") + new String("b"); //在堆中创建"a","b","ab"; String ab2 = ab.intern();//先判断常量池中是否有"ab",如果有直接返 ...
分类:
其他好文 时间:
2020-02-17 14:11:17
阅读次数:
165
在了解这一块知识的时候,需要知道jdk1.8之前与jdk1.8及之其之后的区别 新生代: 刚创建的对象, 有可能经历过几次GC 老年代: 经历过多次GC之后,仍然存活的对象 永久代: 比如intern()方法入池的对象实际上就进入了永久代, 永久代不会被回收。因为其本身属于一个bug性的存在,所以在 ...
分类:
编程语言 时间:
2020-01-18 14:55:32
阅读次数:
103