JDK1.6 和JDK1.7中substring的原理及区别
?
substring()作用
String x = "abcdef"; x = x.substring(1,3); System.out.println(x); 输出内容:
然而,这个图不是完全正确的表示堆中发生的事情。因为在jdk6 和 jdk7中调用substring时发生的事情并不一样。 JDK 6中的substringString是通过字符数组实现的。在jdk 6 中,String类包含三个成员变量: 当调用substring方法的时候,会创建一个新的string对象,但是这个string的值仍然指向堆中的同一个字符数组。这两个对象中只有count和offset 的值是不同的。 下面是证明上说观点的Java源码中的关键代码:
JDK 6中的substring导致的问题如果你有一个很长很长的字符串,但是当你使用substring进行切割的时候你只需要很短的一段。这可能导致性能问题,因为你需要的只是一小段字符序列,但是你却引用了整个字符串(因为这个非常长的字符数组一直在被引用,所以无法被回收,就可能导致内存泄露)。在JDK 6中,一般用以下方式来解决该问题,原理其实就是生成一个新的字符串并引用他。 x = x.substring(x,y) + "" 关于JDK 6中subString的使用不当会导致内存系列已经被官方记录在Java Bug Database中:
JDK 7 中的substring上面提到的问题,在jdk 7中得到解决。在jdk 7 中,substring方法会在堆内存中创建一个新的数组。 Java源码中关于这部分的主要代码如下: //JDK 7 public String(char value[],int offset,int count) { //check boundary this.value = Arrays.copyOfRange(value,offset,offset + count); } public String substring(int beginIndex,int endIndex) { //check boundary int subLen = endIndex - beginIndex; return new String(value,beginIndex,subLen); } 以上是JDK 7中的subString方法,其使用 所以,如果你的生产环境中使用的JDK版本小于1.7,当你使用String的subString方法时一定要注意,避免内存泄露。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 浅谈java 面对对象(抽象 继承 接口 多态)
- java – XMPP:原始请求者离线时建立相互订阅的R
- java.net.SocketException: Broken pipe 异常可能
- [LeetCode] 170. Two Sum III - Data structure
- java – 隐藏JComBox框箭头
- Java游戏Hitbox检测和圆角
- 如何通过函数注释指示函数需要函数作为参数,还是
- java – 使用OAuth-Signpost和Apache HttpCompon
- spring boot请求异常处理并返回对应的html页面
- java-为什么JRuby不能识别BigNums而Ruby却不能识