`

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 String处理(csdn)————程序.pdf

    在这个程序中,主要展示了`String`类的一些常见方法,如`substring()`、`split()`等。下面将详细解释这些方法的使用和原理。 首先,`substring()`方法用于从字符串中提取一部分子串。有两个重载版本,一种是只接受...

    Java 基本语法(四)——字串和数组

    ### Java基本语法(四)—— 字串和数组 #### 字串(String) 在Java中,`String` 是一种非常重要的数据类型,它代表一系列字符。Java中的字符串是不可变的,这意味着一旦创建了一个字符串对象,其内容就不能更改。...

    动力节点老杜Java基础入门学习教程分享——常用类

    ### 动力节点老杜Java基础入门学习教程分享——常用类 #### String 类 - **不可变性**:`String` 类是不可变的,这意味着一旦一个 `String` 对象被创建,它的值就不能被更改。例如,如果你有一个 `String s = ...

    JAVA课程设计报告 心得体会——计算器、文本编辑器.doc

    【JAVA课程设计报告心得体会——计算器、文本编辑器】 在JAVA课程设计中,我参与了计算器与文本编辑器的开发,这是一次深入理解和实践JAVA编程的宝贵经历。这两个项目不仅涵盖了JAVA的基础语法,还涉及到了面向对象...

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

    Java 中由 substring 方法引发的内存泄漏详解 Java 中的 substring 方法是一个非常常用的字符串操作方法,但是在 JDK 1.6 中,如果不当使用该方法,可能会导致严重的内存泄漏问题。下面我们将详细介绍 Java 中由 ...

    java面试——南京-软通动力-Java中级.zip

    - **常用方法**:熟悉indexOf、substring、trim、concat、split等字符串操作。 6. **IO流** - **流的分类**:了解字节流和字符流的区别,以及输入流和输出流的使用。 - **缓冲流与转换流**:BufferedReader、...

    Java substring方法实现原理解析

    在 JDK 6 中,使用 substring 方法可能会出现的问题是,如果你只需要使用很短的一段字符串,但是你实际上引用了整个字符串,这个很长的字符串无法被回收,造成了存储空间的浪费,甚至可能造成内存泄漏。这是一个已知...

    Java类库复习——java.lang.String

    还有`toLowerCase()`和`toUpperCase()`用于转换字符串为小写或大写,`trim()`去除两端的空白字符,以及`split(String regex)`根据正则表达式分割字符串。 `String`类与`StringBuilder`和`StringBuffer`的区别在于,...

    java中截取带汉字的字符串

    ### Java中截取带汉字的字符串 在Java编程语言中,处理包含中文字符的字符串时,经常遇到的一个问题是如何正确地截取这些字符串。如果直接按照字节(byte)来进行分割,很容易导致中文字符被截断一半,从而形成乱码。...

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

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

    java的String[] split 示例

    在Java编程语言中,`String`类提供了许多用于操作字符串的方法,其中之一便是`split`方法。这个方法在处理文本数据时极为有用,特别是在需要根据特定的分隔符将字符串分割成多个子串的情况下。下面,我们将深入探讨`...

    Java JDK 6学习笔记——ppt简体版

    Java JDK 6是Java开发工具集的一个重要版本,它为开发者提供了广泛的编程工具和技术支持,使得Java应用程序的开发、编译、调试和运行变得更加高效。本篇学习笔记将围绕Java JDK 6的关键特性进行深入探讨。 一、Java...

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

    在Java编程语言中,`substring()`方法是字符串类(String)的一个重要成员,它用于从原始字符串中提取子串。这个方法非常实用,特别是在处理文本数据时,我们需要根据特定的需求截取字符串的一部分。下面我们将详细...

    Java源码解析——看优秀源码最能使人进步

    Java.lang.String类是Java语言中的一种基本数据类型,该类的定义、字段属性、构造方法、equals方法、hashCode方法、charAt方法、compareTo方法、concat方法、indexOf方法、replace方法、split方法、substring方法、...

    BAT 115个Java面试题和答案——终极(下)

    在Java面试中,掌握核心知识点和能够解决实际问题的能力至关重要,特别是对于想在BAT(百度、阿里巴巴、腾讯)这样的顶级互联网公司工作的求职者而言。以下是一些基于标题和描述所暗示的Java面试知识点的详细说明: ...

    java常用工具类——个人总结

    在Java编程语言中,工具类(Util)是程序员日常开发中不可或缺的一部分,它们提供了一些预定义的方法,方便处理各种常见的任务。以下是我个人对Java中常用工具类的总结,主要涉及了加密、文件上传和日期处理等核心...

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

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

    Java string.trim()究竟去掉了什么

    Java中的String.trim()方法是一个用于移除字符串两端空白字符的标准方法,然而,它所移除的不仅仅是空格字符。trim()方法真正的作用是移除字符串首尾的所有空白字符,包括空格、制表符(tab)、换行符等。在编程中,...

    剑指offer计划13(双指针简单)---java(csdn)————程序.pdf

    本文主要分析了三个使用双指针技术解决的题目,分别来自剑指Offer计划13的Java实现,包括调整数组顺序使奇数位于偶数前面、寻找和为s的两个数字以及翻转单词顺序。 1. **调整数组顺序使奇数位于偶数前面** 题目...

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

    在Java编程语言中,`substring()`方法是`String`类的一个非常重要的成员,它用于从一个给定的字符串中截取或提取出一部分新的子字符串。`substring()`提供了两种主要的使用形式,这两种形式都在处理字符串时发挥着...

Global site tag (gtag.js) - Google Analytics