【问题标题】:String's substring function vs StringBuffer's substring function字符串子字符串函数 vs StringBuffer 子字符串函数
【发布时间】:2015-04-02 15:10:41
【问题描述】:

我查看了StringStringBuffer API,当您调用substring 方法时,它们的内部工作方式似乎相同。 两者都有原始 char 数组 (char[] original) 的引用,因此两者都使用相同的空间。 那为什么首选StringBuffer? stringbuffer.substring(2,4) 与 string.substring(2,4) 有何不同。

StringBuffer的子串方法:

public String substring(int start, int end) {
    return new String(value, start, end - start);  
}

String的子串方法:

public String substring(int beginIndex, int endIndex) {
    return ((beginIndex == 0) && (endIndex == value.length)) ? this
       : new String(value, beginIndex, subLen);
}

两个子字符串变体然后调用 String 构造函数:

public  String(char value[], int offset, int count) {
    this.value = Arrays.copyOfRange(value, offset, offset+count);
}

调用Arrays类的以下方法:

public static char[] copyOfRange(char[] original, int from, int to) {
    // **char[] original**
   return copy;
}

【问题讨论】:

    标签: java string substring stringbuffer


    【解决方案1】:

    单点判断StringStringBuffer 的值是错误的。是的,它们在获取子字符串时在功能上非常相似。不,这不会促成关于是否使用其中一个的争论。

    您应该始终使用最佳结构。 String 是不可变的,应该在需要不可变性和某些边缘情况时使用。如果您需要对CharSequence 进行更改,那么使用StringBuilder 会更好/更安全/更快/内存效率更高。

    考虑删除字符串的一部分。比较使用 String 和使用 StringBuilder 的方法 - 看看它是多么容易。它不仅更容易,而且更有效率。 String 机制创建两个新对象,然后将它们加在一起以形成第三个。 StringBuilder 只是删除了字符串的一部分。

    public void test() {
        String a = "0123456789";
        StringBuilder b = new StringBuilder(a);
        System.out.println("a=" + a + " b=" + b);
        a = a.substring(0, 2) + a.substring(5);
        b.delete(2, 5);
        System.out.println("a=" + a + " b=" + b);
    }
    

    【讨论】:

    • 没错,但仅适用于子字符串情况- String 和 Stringbuffer 的子字符串完全相同?
    • @Naruto_Uzumaki - 他们被允许是相同的 - 但他们在许多其他方面是不同的。比较从StringStringBuffer删除子字符串。
    • 是的,这正是我想知道的。stringbuffer.substring(2,4) 与 string.substring(2,4) 有何不同
    • @Naruto_Uzumaki - 并没有明显不同 - 为什么会这样?
    • @OldCurmudgeon - 我的意思是内存空间,两者都是一样的?假设原始字符串(应该说 char 值)是 1 gb 长,所以即使我使用 stringbuffer.sustring(2,4) 或 string.Substring(2,4) 仍然都使用 1 gb 空间,因为它仍然引用原始数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-14
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多