JAVA String对象和字符串常量的关系解析
来源:互联网 发布:js将字符串转换成数字 编辑:程序博客网 时间:2024/05/22 13:25
JAVA String对象和字符串常量的关系解析
1 字符串内部列表
JAVA中所有的对象都存放在堆里面,包括String对象。字符串常量保存在JAVA的.class文件的常量池中,在编译期就确定好了。虚拟机为每个被装载的类型维护一个常量池。常量池就是该类型所用常量的一个有序集合,包括直接常量(string、integer和float point常量)和对其他类型、字段和方法的符号引用。
例如,
String s = new String( "myString" );
其中字符串常量是"myString",在编译时被存储在常量池的某个位置。在解析阶段,虚拟机发现字符串常量"myString",它会在一个内部字符串常量列表中查找,如果没有找到,那么会在堆里面创建一个包含字符序列[myString]的String对象s1,然后把这个字符序列和对应的String对象作为名值对( [myString], s1 )保存到内部字符串常量列表中。如下图所示:
如果虚拟机后面又发现了一个相同的字符串常量myString,它会在这个内部字符串常量列表内找到相同的字符序列,然后返回对应的String对象的引用。维护这个内部列表的关键是任何特定的字符序列在这个列表上只出现一次。
例如,String s2 = "myString",运行时s2会从内部字符串常量列表内得到s1的返回值,所以s2和s1都指向同一个String对象。但是String对象s在堆里的一个不同位置,所以和s1不相同。
JAVA中的字符串常量可以作为String对象使用,字符串常量的字符序列本身是存放在常量池中,在字符串内部列表中每个字符串常量的字符序列对应一个String对象,实际使用的就是这个对象。
2 字符串截留intern
在某些上下文环境下,仅仅保留某个字符串的一份copy能够提高内存的使用和效率。String类的intern()方法可以截留字符串,如果String对象包含的字符序列不在字符串常量内部列表中,那么就把这个String对象包含的字符序列和String对象的引用作为名值对保存到内部列表中,最后intern()返回一个指向String对象本身的引用;如果String对象包含的字符序列在字符串常量内部列表中,那么就返回列表的名值对中的对应的字符串对象引用,而String对象本身的就会被丢弃。
例如,s.intern()就会返回和s2相同的引用,而以前的s对象就会被垃圾回收。
使用intern()要注意,被放到字符串内部列表中的字符串对象是不会被垃圾回收的,生命周期和整个程序相同,所以如果使用不当会造成内存泄露。
转载地址
- JAVA String对象和字符串常量的关系解析
- JAVA String对象和字符串常量的关系解析
- JAVA String对象和字符串常量的关系解析
- JAVA String对象和字符串常量的关系解析
- JAVA String对象和字符串常量的关系解析
- Java String类对象引用、字符串常量和String Pool 相互关系的学习
- String字符串常量相加和new对象
- java String类字符串常量的理解
- 关于 String对象 常量池 字符串常量
- String常量和String对象
- String类的内存解析——字符串常量池
- Java字符串String的解析
- 字符串与字符串常量和指针的关系
- Java常量字符串String理解
- Java常量字符串String理解
- Java常量字符串String理解
- Java String常量字符串理解
- String和字符串常量池
- 最高人民法院研究室关于王某…
- 最高人民法院关于审理拒不支…
- 最高人民法院关于解除劳动合…
- 关于审理劳动争议案件适用法…
- R笔记3:ggplot绘制商务图表…
- JAVA String对象和字符串常量的关系解析
- html转jsp编码乱码问题
- 建模网址
- 市场研究中的多变量分析技术…
- 门店经营指标数据分析!(独家秘笈…
- 水题——洛谷P2661 信息传递
- 热力学 第一定律 和&nbs…
- 工伤社保网址
- yum 源配置