(详情见复习(十)string)
//S2 与S3 在编译时期就已经知道其是常量,已经在常量池中进行标记;new之后会指向堆空间新的char数组,每次new都生成新的;
而字面值赋值的形式,会直接存入常量池,并且都指向唯一的一个char型数组;
在常量池存入字符串对象的应用
-----
intern的使用如下:
java关键字已经缓存了
-------------
Interger :-128-127已经缓存;
String :字面值常量,是去常量池;生成的变量在堆空间;
-------------------------------
字面值直接赋值的,存放在常量池之中;
而new的,强行开辟的了新空间;
在Java源代码中的每一个字面值字符串,都会在编译成class文件阶段,形成标志号为8(CONSTANT_String_info)的常量表 。
当JVM加载 class文件的时候,会为对应的常量池建立一个内存数据结构,并存放在方法区中。同时JVM会自动为CONSTANT_String_info常量表中 的字符串常量的字面值在堆中创建新的String对象(intern字符串对象 ,又叫拘留字符串对象)。
然后把CONSTANT_String_info常量表的入口地址转变成这个堆中String对象的直接地址(常量池解析)。
这句话我的理解现在变成这样了: 在.class文件加载到JVM虚拟机里的时候经过加载,链接,初始化,使用,卸载的过程。在加载的过程将.class文件所代表的静态存储结构转化为方法区的运行时数据结构,具体就是体现在在方法区的运行时常量池里面。 jdk1.6的的运行时常量池在永久代(PermGen),而jdk1.7的运行时常量池在堆(heap)内存里面,而在jdk1.8会在一个叫做元空间(Metaspace)里面 最后回到上面的问题,我使用的是jdk1.7其实就是在运行时常量池只是一个引用表,吧堆里面的对象的引用放到这个表里。加载链接初始化并没有在常量池里面放引用,只有调用new关键字,intern()方法的时候会把引用放到运行时常量池里面,以上一切都可以解释的通了。如果我说的有问题可以私聊我改正,希望给后面的人一些参考