注:本文当时写的是基于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
相关推荐
主要介绍了Java中由substring方法引发的内存泄漏详解,涉及substring方法引发的内存泄漏简介,substring的作用和实现原理等相关内容,具有一定借鉴价值,需要的朋友可以参考下
前段时间摸索在Java中怎么获取系统信息包括cpu、内存、硬盘信息等,刚开始使用Java自带的包进行获取,但这样获取的内存信息不够准确并且容易出现找不到相应包等错误,所以后面使用sigar插件进行获取。下面列举出...
java 如何使用substring()方法截取子串 java 如何使用substring()方法截取子串
主要介绍了Java substring方法实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
js substring(start,end)表示从start,到end之间的字符串,包括start位置的字符但是不包括end位置的字符 java sbustring(start,end)表示从start,到end之间的字符串,包括start位置的字符它包括end位置的字符 c# ...
substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 substring截取字符串 ...
主要介绍了Java substring原理及使用方法实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
然而正好相反,修改后的substring的效率变低了,并且占用了更多的内存,无论是从时间上还是空间上都比不上原有的实现。下面我们来做一个比较,看看到底哪一个更好,以及为什么新版Java中要对其进行修改。 原有...
JavaScript几个函数 - split()、join()、substring()和indexOf()的用法!
java中substring与substr的用法.pdf
下面小编就为大家带来一篇浅谈Java的String中的subString()方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
java中substring与substr的用法实用.pdf
java中substring与substr的用法参考.pdf
substring截取字符串 在 String 中提供了两个截取字符串的方法,一个是从指定位置截取到字符串结尾,另一个是截取指定范围的内容。下面对这两种方法分别进行介绍。 1. substring(int beginIndex) 形式 此方式用于...
str=str.substring(int beginIndex);截取掉str从首字母起长度为beginIndex的字符串,将剩余字符串赋值给str; str=str.substring(int beginIndex,int endIndex);截取str中从beginIndex?始至endIndex结束时的...
疯狂java讲义第四章作业题,按字节截取一个字符串,遇到汉字的时候会告诉你是哪个汉字的哪个字节
substring public String substring(int beginIndex) 返回一个新的字符串,它是此字符串的一个子字符串。该子字符串始于指定索引处的字符,一直到此字符串末尾。 例如: "unhappy".substring(2) returns "happy" ...
字符串操作无疑在各种编程语言及平台上都是必不可少的,功能相通,但用法却存在微妙的区别,比如java中取子串及相等的判断,切入正题。 1. substring 常用的用法包括: (1)取索引为startidx之后(包括...