JAVA复习(十)String补充_intern方法补充

(详情见复习(十)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()方法的时候会把引用放到运行时常量池里面,以上一切都可以解释的通了。如果我说的有问题可以私聊我改正,希望给后面的人一些参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值