`
暗夜骑士0376
  • 浏览: 81298 次
  • 性别: Icon_minigender_1
  • 来自: 信阳
社区版块
存档分类
最新评论

关于Java String 的 offset 问题。

 
阅读更多
今天写了一段代码,大致如下文所示,

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.match(content);//注意这里的content变量

while (matcher.find()) {
    String outlink = matcher.group(1);
    set.add(outlink);//其中set 是HashSet的类型
}


这段代码,很好理解,就是我们使用正则去匹配, 得到内容,将匹配的东东放到一个Hashset中。

然后尝试运行, 运行一个小时左右,通过Jconsole发现内存消耗很快,使用mat工具将堆内存分析之后,得出就是这个set占用了太多的内存, 对set对象中的string分析,发现了一个问题,
如果一个string 输出是aaaa, 但是这个string的对象里面的value字段并不是4个a的char[], 而是和content的value字段相同,这就是说,outlink里面的value字段是和content里面的value字段是相同长度的char[], 相当于复制了一遍?,只不过outlink变量的offset和count决定了最后outlink是aaaa,而不是content的输出。

不知道,童鞋门到这里看到了什么问题,是的,set表面上是存了一个outlink的内存,实际上set存了一个content的内存,如果content的长度远远大于outlink的话,就出现了上诉的情况。

晚上查查资料,发现在linux环境下7.0.17版本的String不会出现问题,查看源码, 发现这个版本的String remove掉了count和offset字段,为什么remove掉呢, 肯定不是因为我的原因,官方解释link:
http://mail.openjdk.java.net/pipermail/core-libs-dev/2012-May/010257.html

好了,事情到了这一步,应该是万事大吉了,

如果是以前版本的话,我这么写了以下,虽然看上去怪怪的,但是总比内存泄露好阿!
String link = new String(matcher.group(1).getByte());


分享到:
评论

相关推荐

    Java的String类

    ### Java的String类详解 #### 引言 在Java编程中,`String`类是最常用的数据类型之一,用于处理文本数据。它是一个不可变类,意味着一旦创建了一个`String`对象,其内容就不能更改。这使得`String`类在多线程环境...

    javastring.pdf

    Java中的`String`类是Java语言中最常用的数据类型之一,用于表示不可变的字符序列。在Java中,字符串被视为对象,它们的实例是由`String`类创建的。下面我们将详细探讨`String`类的一些关键构造方法和方法。 1. **...

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

    `String`类提供了多种构造方法,如`String()`用于创建空字符串,`String(char[] value)`通过字符数组初始化,`String(String original)`用于复制已有字符串,以及`String(char[] value, int offset, int count)`用于...

    JAVA string函数总结.docx

    ### JAVA String 类函数总结 #### 一、字符串创建与初始化 在 Java 中,`String` 类是最常用的字符串处理工具之一。它可以用来表示一系列字符,并且提供了丰富的方法来操作这些字符。下面通过示例代码展示了如何...

    Java常用类与基础API-String的构造器与常用方法

    ### Java常用类与基础API-String的构造器与常用方法 #### 一、String的常用API-1 ##### (1)构造器 1. **介绍** - `public String()`: - 初始化新创建的 `String` 对象,以使其表示空字符序列。即创建了一个...

    深入探讨Java中的String类.pdf

    3. 使用 String 的构造方法:例如,String s = new String(byte[] bytes, int offset, int length); 三、String 对象的比较 Java 中有两种方式可以比较 String 对象: 1. 使用 "==" 操作符:例如,s1 == s2; 2. ...

    Java中的String、StringBuffer和Math类

    ### Java中的String、StringBuffer和Math类 #### String类详解 **String类**在Java中扮演着极其重要的角色,主要用于处理不可变的字符序列。它不仅功能强大而且使用广泛,几乎所有的Java应用程序都会涉及到字符串...

    全面解析Java中的String类的使用

    - 部分转换:使用构造函数`String(char[] value, int offset, int count)`,如`new String(charArray, start, length)`,从`offset`开始,截取`length`个字符。 例如: ```java String str1 = "hello word"; char...

    String类创建对象问题

    ### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...

    Java中String类的方法及说明.pdf

    7. `static String copyValueOf(char[] data, int offset, int count)`:类似于上述方法,但只包含数组从`offset`开始的`count`个字符。 8. `boolean endsWith(String suffix)`:检查字符串是否以指定的后缀结尾。 ...

    Java中String的常用方法.pdf

    Java中的`String`类是处理文本数据的核心工具,它提供了丰富的功能来操作和管理字符串。字符串在Java中是不可变的,这意味着一旦创建了一个`String`对象,就不能更改它的内容。以下是对`String`类中一些常用方法的...

    关于String类的一些方法

    - `String(char[] value, int offset, int count)`:从字符数组的一部分创建字符串。 2. **获取字符串信息**: - `length()`:返回字符串的长度,即字符个数。 - `charAt(int index)`:返回指定索引处的字符。 ...

    java string类的常用方法详细介绍

    Java中的String类是编程中最常用的类之一,它用于表示不可变的字符序列。在Java中,字符串被视为对象,因此我们可以通过调用String类的各种方法来处理字符串。以下是一些常用的String类方法的详细说明: 1. 构造...

    java常用char,string函数

    ### Java中的Char与String函数详解 #### 一、概述 在Java编程语言中,`char`类型用于表示单个字符,而`String`类则用于处理字符串数据。这两种类型是进行文本处理时不可或缺的基础工具。本文将详细介绍Java中与`...

    java 中关于字符串的笔记,超级详细

    `String(char[] value, int offset, int count)`构造函数:** 使用字符数组的一部分创建字符串。例如: ```java char[] a = {'s', 't', 'u', 'd', 'y'}; String str = new String(a, 1, 3); // 结果为 "tud" ...

    易语言JAVA对象模块

    易语言JAVA对象模块源码,JAVA对象模块,NewString,NewString_bytes,NewString_bytes_charset,NewString_bytes_offset_length,NewString_bytes_offset_length_charset,NewString_bytes_offset_length_charsetName,New...

    java常用类java常用类

    3. `String(char[] value, int offset, int count)`:从字符数组的指定偏移量 `offset` 开始,取 `count` 个字符创建新的 `String` 对象。 在示例代码中,我们看到: ```java String s1 = "hello"; String s2 = ...

    java String 可变性的分析

    在Java编程语言中,String对象的不可变性是一个核心概念,也是面试中常见的问题。通常我们认为,一旦创建了一个String对象,其内容就不能更改。然而,通过深入源码,我们可以揭示String的可变性背后的机制。 首先,...

Global site tag (gtag.js) - Google Analytics