`

java的substring,split,trim容易出错——内存长期占用不回收

    博客分类:
  • java
阅读更多

 

注:本文当时写的是基于jdk6或者更早版本;jdk7版本无此问题,但substring操作过多,可能会造成性能问题。

-----------------------------------------------------------------------------------------------------------------------------------

使用以下方法需要注意:

trim()

split()

substring()

实际上,这个很容易造成对整个字符串的引用,从而不回收数据对象。以substring为例

strDate= text.substring(1);

 这个strDate将直接引用这个text,而不仅仅是date的字符串,如果text是很长的字符串,或者甚至是文本,那么strDate将间接引用text对象,这显然容易造成内存巨大占用。特别是吧strDate当做Map的key时,那么内存占用将会是巨大的。

上面代码改成

strDate = new String(text.substring(1));

 new String方法,将会重新生成String对象,而不是直接引用text对象。

以jsoup为例,jsoup是类似jquery查询方法接口的html/xml解析前,很好用的

	public void execute(File f, String encoding) {
		logger.debug("正在处理" + f.getName());
		try {
			Document doc = Jsoup.parse(f, encoding);
			Elements elems = doc.select("body >table > tbody > tr[id]");// 选择标签table,属性带id的
			for (org.jsoup.nodes.Element elem : elems) {
				Stat stat = new Stat();
				String id = elem.attr("id");
				stat.id = new String(id);// (1)需要特别注意这个new String
				// .........................
				results.add(stat);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

 

 

上述代码,如果不用new String的话,那么results引用了stat,每个stat有引用了一个String类型的id,而id是从整个文件,也就是说,每个stat引用了一整个文件,如果results很大,那么整个代码都将是巨大的。

 

 这个类似的情况还包含如下库gson(一个json库,也非常好用),举例如下:

JsonReader reader = new JsonReader(new StringReader(json));

if (token.equals("license")) {
	String license = reader.nextString();
	data.setLicense(new String(license))
} 

 如果jsonreader传入的是字符串,那么

data.setLicense(new String(license))//注意这里必须用new String(),这样才不会导致data会引用整个json text,而只是引用final String lincene
分享到:
评论
1 楼 chj_li 2013-04-18  
以前经常看到类似的写法,一直没注意为什么,现在终于知道了,哈哈

相关推荐

    Java中由substring方法引发的内存泄漏详解

    主要介绍了Java中由substring方法引发的内存泄漏详解,涉及substring方法引发的内存泄漏简介,substring的作用和实现原理等相关内容,具有一定借鉴价值,需要的朋友可以参考下

    Java如何获取系统cpu、内存、硬盘信息

     前段时间摸索在Java中怎么获取系统信息包括cpu、内存、硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插件进行获取。下面列举出...

    java 如何使用substring()方法截取子串

    java 如何使用substring()方法截取子串 java 如何使用substring()方法截取子串

    Java substring方法实现原理解析

    主要介绍了Java substring方法实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    js substr,substring与java substring和C# substring的区别解析

    js substring(start,end)表示从start,到end之间的字符串,包括start位置的字符但是不包括end位置的字符 java sbustring(start,end)表示从start,到end之间的字符串,包括start位置的字符它包括end位置的字符 c# ...

    Substring字符串截取-kaic

    substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 ...

    Java substring原理及使用方法实例

    主要介绍了Java substring原理及使用方法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    新版Java为什么要修改substring的实现

    然而正好相反,修改后的substring的效率变低了,并且占用了更多的内存,无论是从时间上还是空间上都比不上原有的实现。下面我们来做一个比较,看看到底哪一个更好,以及为什么新版Java中要对其进行修改。  原有...

    JavaScript几个函数 - split()、join()、substring()和indexOf()

    JavaScript几个函数 - split()、join()、substring()和indexOf()的用法!

    java中substring与substr的用法.pdf

    java中substring与substr的用法.pdf

    浅谈Java的String中的subString()方法

    下面小编就为大家带来一篇浅谈Java的String中的subString()方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    java中substring与substr的用法实用.pdf

    java中substring与substr的用法实用.pdf

    java中substring与substr的用法参考.pdf

    java中substring与substr的用法参考.pdf

    Java截取(提取)子字符串(substring()).pdf

    substring截取字符串 在 String 中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。 1. substring(int beginIndex) 形式 此方式用于...

    Java中substring的使用方法

    str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str;  str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex?始至endIndex结束时的...

    类似subString

    疯狂java讲义第四章作业题,按字节截取一个字符串,遇到汉字的时候会告诉你是哪个汉字的哪个字节

    JAVA中截取字符串substring用法详解

    substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 例如: "unhappy".substring(2) returns "happy" ...

    Java中substring的参数及字符串的相等判断

    字符串操作无疑在各种编程语言及平台上都是必不可少的,功能相通,但用法却存在微妙的区别,比如java中取子串及相等的判断,切入正题。  1. substring  常用的用法包括:  (1)取索引为startidx之后(包括...

Global site tag (gtag.js) - Google Analytics