java字符串
2016-04-26 00:00
274 查看
结构图:
结果:true,true,true
例2 :
结构图:
例3:
结构图:
结果:false,false,true
结果说明:
如果变量直接引用常量池的字符串,那么结果就会一致。但如果变量引用对象是一个字符串实例,而该实例才去引用常量池的字符串,那么比较的结果就不一致。而使用方法intern,就是去取得常量池中的引用
扩展:----------------------------------
第一点:
在jdk6中,字符串由三部分组成:char[] , offset , count。因为这样的结构导致在使用String.substring这个方法时可能发生内存泄漏例:
第二点:
在jdk6中String常量池是放在perm中,而jdk7中常量池是放在堆中。GC在进行Full GC(不经常触发)才会回收perm的内存空间,但是堆的回收(特指年轻代)却是比较经常发生的
public static void test1() { String str1 = "abc"; String str2 = "abc"; System.out.println(str1==str2); System.out.println(str1==str2.intern()); System.out.println(str1.intern()==str2.intern()); }
结果:true,true,true
例2 :
结构图:
public static void test1() { String str1 = "abc"; String str2 = new String("abc"); System.out.println(str1==str2); System.out.println(str1==str2.intern()); System.out.println(str1.intern()==str2.intern()); }结果:false,true,true
例3:
结构图:
public static void test3() { String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1==str2); System.out.println(str1==str2.intern()); System.out.println(str1.intern()==str2.intern()); }
结果:false,false,true
结果说明:
如果变量直接引用常量池的字符串,那么结果就会一致。但如果变量引用对象是一个字符串实例,而该实例才去引用常量池的字符串,那么比较的结果就不一致。而使用方法intern,就是去取得常量池中的引用
扩展:----------------------------------
第一点:
在jdk6中,字符串由三部分组成:char[] , offset , count。因为这样的结构导致在使用String.substring这个方法时可能发生内存泄漏例:
String str1 = "abcd...." //假设str1有1万个字符,同时char[]的长度也有1万 String str2 = str1.substring(0,1) //str2只想要一个字符,但substring方法并没有创建出一个新的字符串常量, //只是在str1基础上改变了它的偏移量,这似乎看起来很不错,因为str1与str2共用char[]节约了内存。 str1 = null; //这时释放了str1,但是str1的实例并不会被GC回收,因为str2占有着它,而str2理论上 //应该只有1字符大小的空间,但实际不是,它占着一万个字符大小的内存.而在jdk7中它的结构变了,去掉了offset 与count 两项,String内容由char[]决定,而数组本身也代表了String的值
第二点:
在jdk6中String常量池是放在perm中,而jdk7中常量池是放在堆中。GC在进行Full GC(不经常触发)才会回收perm的内存空间,但是堆的回收(特指年轻代)却是比较经常发生的
相关文章推荐
- ehcache缓存使用及与spring集成
- NCR字符编码(形如xx)转换为汉字 in JAVA
- java设计模式-代理模式
- MyEclipse 格式化代码调整每行长度
- 服务器搭建:2、构建java web运行环境
- java中的函数
- java内存分区
- JAVA反射获取T泛型子类构造方法
- Java中的日志——Java.util.logging、log4j、commons-logging
- Java事件处理机制
- java 添加事件4种方法
- java 布局
- Java jdbc 数据库操作
- struts2导出数据到excel并下载
- java线程安全问题之静态变量、实例变量、局部变量
- JAVA 实现支付宝接口
- Eclipse导入System Lib方法
- 20145222黄亚奇《Java程序设计》实验三实验报告
- RxJava 学习之(一)
- 关于CKEditor4.5.6的使用,自定义toolbar配置,上传图片案例(SpringMVC+MyBatis案例),自定义行高,去编辑器的中内容,将编辑器中内容设置到指定的位置等