`
edwardpro
  • 浏览: 310129 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

StringBuilder和String中的subString方法的细微差别

 
阅读更多

昨天改了一个很小的地方,但是在线上跑的时候突然感觉内存消耗差别很多,而代码中仅仅增加了这么一句话:

int indexOfNocheck = linkBuffer.indexOf(NOCHECK_TAG);
ret.append(linkBuffer.substring(0, indexOfNocheck));

 ret也是一个Stringuilder,实际上我的直觉问题就应该出在了subString上。

 

于是翻出了StringBuilder和String中的subString的实现差别:

StringBuilder.subString:

    public String substring(int start, int end) {
	if (start < 0)
	    throw new StringIndexOutOfBoundsException(start);
	if (end > count)
	    throw new StringIndexOutOfBoundsException(end);
	if (start > end)
	    throw new StringIndexOutOfBoundsException(end - start);
        return new String(value, start, end - start);
    }

String.subString:

    public String substring(int beginIndex, int endIndex) {
	if (beginIndex < 0) {
	    throw new StringIndexOutOfBoundsException(beginIndex);
	}
	if (endIndex > count) {
	    throw new StringIndexOutOfBoundsException(endIndex);
	}
	if (beginIndex > endIndex) {
	    throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
	}
	return ((beginIndex == 0) && (endIndex == count)) ? this :
	    new String(offset + beginIndex, endIndex - beginIndex, value);
    }

  看起来差别不大,他们都是采用了new String对象的方法,但是差别就在这里,这里使用的String的构造函数是完全不同的,我们就来看看这两个代码:

StringBuilder:
    public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // Note: offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.offset = 0;
        this.count = count;
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }
String:
    // Package private constructor which shares value array for speed.
    String(int offset, int count, char value[]) {
	this.value = value;
	this.offset = offset;
	this.count = count;
    }

 原来差别在这里,StringBuilder是“外人”所以他使用的是copy的方法,而String内部的方法则调用了一个本地的构造函数,它返回的依然是它自己,只是修改了offset!

那么我的问题也得到了解答,实际上Stringbuilder中的subString在高并发系统里性能会差一些因为他会多分配对象,特别是当你反复使用subString方法的时候一定要记得使用String对象否则你会死得很难看。

分享到:
评论

相关推荐

    String StringBuffer和StringBuilder区别之源码解析

    在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间的区别。 String类 String类是Java中最基本的字符串类,它是final类,意思是它不能被继承。String类的字符串是不...

    String、StringBuilder和StringBuffer的区别

    在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...

    String和StringBuilder类的区别

    综上所述,`String` 和 `StringBuilder` 类在.NET框架中的使用有着明显的区别。选择合适的类取决于具体的应用场景:如果需要处理静态或变化较小的数据,`String` 是更好的选择;而在需要频繁修改或拼接字符串的情况...

    String、StringBuffer、StringBuilder的使用方法

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...

    C#中StringBuilder类的使用方法

    StringBuilder类的出现是为了解决String类的不可变性问题,每次使用String类中的方法时,都需要在内存中创建一个新的字符串对象,这增加了系统开销。StringBuilder类的出现解决了这个问题,提供了高效的字符串操作...

    String及StringBuffer和StringBuilder的区别

    String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...

    String、StringBuffer与StringBuilder之间区别

    String:字符串常量  StringBuffer:字符创变量  StringBuilder:字符创变量  从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段...

    String和StringBuilder效率测试

    在Java编程语言中,`String`和`StringBuilder`都是用于处理字符串的重要类,但它们在处理方式和效率上有显著的区别。本资源中的代码是针对这两种类的效率进行测试的实例,旨在帮助开发者理解它们在不同场景下的性能...

    测试string的+和String.Format()和StringBuilder.Append()性能差距|TestForString.7z

    在循环或大量拼接场景下,`StringBuilder.Append()`方法的性能显著优于`+`和`String.Format()`。这是因为`StringBuilder`在内存中维护一个缓冲区,直到最后才一次性生成字符串,减少了不必要的内存分配和垃圾回收。 ...

    String ,StringBuffer与StringBuilder

    在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String 对象,就不能修改它的值。每次对 String 对象的...

    StringBuffer、StringBuilder、String

    在Java中,有几种不同的方式可以用来创建和修改字符串,其中最常用的是`String`、`StringBuffer`和`StringBuilder`。本文将详细介绍这三种类型的字符串及其区别,特别是`StringBuffer`和`StringBuilder`之间的差异。...

    字符串、String类和StringBuilder类

    总结一下,字符串是编程中基础且关键的数据类型,理解String类和StringBuilder类的特性及其应用场景至关重要。了解它们的差异和用法,有助于编写出更加高效、易维护的代码。在.NET框架中,String类提供了丰富的字符...

    ajax string StringBuilder理论和示例

    在IT行业中,尤其是在Web开发领域,Ajax(Asynchronous JavaScript and XML)技术和字符串处理是不可或缺的部分。StringBuilder类在.NET框架中扮演着重要的角色,特别是在大量字符串操作时提高性能。以下是对这些...

    String-StringBuffer-StringBuilder

    在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...

    String&StringBuffer&StringBuilder三者之间的区别-经典解析.doc

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...

    你知道String、StringBuffer和StringBuilder的区别吗

    在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自具有不同的特性和使用场景。下面将详细解析这三个类的区别。 首先,`String`类是最基础的字符串处理类,它被设计为不...

    Java中String,StringBuffer与StringBuilder的区别

    最后,让我们总结一下 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别和用法。String 类型是不可变的对象,性能不好,适合不需要修改的字符串对象。StringBuffer 类型是可变的对象,性能好,...

    String、StringBuilder、StringBuffer的区别

    在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这三者进行比较和分析。 首先,从执行速度方面来...

    java String、StringBuilder和StringBuffer的区别详解

    Java中的`String`、`StringBuilder`和`StringBuffer`都是用来处理字符串的类,它们各自有不同的特性和适用场景。在理解它们之间的区别之前,我们首先要知道它们的共同点。 **共同点:** 1. **都是字符串类**:这三...

Global site tag (gtag.js) - Google Analytics