这篇文章也是我对StringBuffer的一点看法,若有不妥之处,还请大家指出
估计Java初学者都知道,String是不可变字符串,StringBuffer是可变字符串,之前我也是这样理解的,但是今天下午,发现了一个奇怪的现象,发现StringBuffer并非完全可变,所以我将之称为非完全可变字符串。
先看看下面这段
public static void main(String[] args) {
String str = new String("Hello");
str.concat("World");
System.out.println(str);
str.substring(0, 3);
System.out.println(str);
System.out.println("<=========================>");
StringBuffer sb = new StringBuffer("Hello");
sb.substring(0, 3);
System.out.println(sb);
sb.append("World");
System.out.println(sb);
}
其输出结果如下:
Hello
Hello
<=========================>
Hello
HelloWorld
通过对比String的substring和StringBuffer的substring方法可以看出,他们都没有改变原来字符串的值,String很好理解,由于是不可变字符串,所以原字符串肯定不会变,但是为何StringBuffer也没变呢??它不是号称可变字符串嘛,那就应该和其他方法一样啊(比如代码中的append方法),改变原来字符串的值啊,但是这里完全没变嘛,再看看StringBuffer的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);
}
由此可见,其他该方法也是产生一个新的字符串,并不会更改原字符串的值。
那这里本人就觉得很不理解,为什么StringBuffer的这个方法更String的一样呢??难道这是一个Bug??应该不是,如果要是,SUN早就应该改过来了,那这里SUN到底是出于什么目的要将StringBuffer的substring这样实现呢??不理解
分享到:
相关推荐
首先,`String`是最基本的字符串类,它代表的是不可变的字符序列。一旦创建了一个`String`对象,其内容就不能改变。这是因为`String`对象存储在常量池中,每次对`String`对象的操作都会创建一个新的`String`对象,而...
【JAVA精华】在Java编程语言中,String类和StringBuffer类是处理字符串的重要工具,但它们之间存在显著的差异。 1. **String类**:一旦String对象被创建,它的内容就不能更改。这是因为String对象在Java中是不可变...
而StringBuffer类提供了可变的字符串操作,可以对字符串进行修改。例如,使用StringBuffer类可以将多个字符串连接起来,或者在字符串中插入新的字符。 下面是一个使用StringBuffer类连接多个字符串的示例代码: ``...
因此,我们在生成新字符串时,可能需要使用StringBuilder或StringBuffer类,它们提供了动态构建字符串的能力,这对于大量操作字符串时的性能至关重要。 总的来说,解决这个问题需要对字符串操作、排序算法、条件...
- Java中的字符串是不可变的,这意味着一旦创建了字符串对象,就不能更改其内容。这由`final`关键字确保,提高了线程安全性。 - 创建字符串的方式有两种:通过字面量(如`String str = "Hello"`)或通过构造函数...
根据不同的应用场景和需求,Java提供了多种处理字符串的方式,其中最为常见且重要的三种方式分别为:`String`(字符串常量)、`StringBuffer`(线程安全的字符串变量)以及`StringBuilder`(非线程安全的字符串变量...
以上就是关于"Java创建字符串类"这一主题的详细阐述,包括`String`类的基本使用、可变字符串类`StringBuilder`和`StringBuffer`,以及相关的操作方法。理解并熟练运用这些知识点对于编写高效且功能丰富的Java程序至...
1. **String类**:Java中的`String`类用于表示不可变的字符序列。一旦创建了一个`String`对象,其值就不能被更改。 2. **StringBuffer/StringBuilder类**:`StringBuffer`和`StringBuilder`类都用于表示可修改的字符...
在Java中,字符串是不可变的。一旦创建,就不能改变其内容。所有看起来改变字符串的方法(如`append()`)都会返回一个新的字符串对象。 3. 字符串比较: - `equals()`方法:用于比较字符串内容是否相同,不区分大...
StringBuffer类是Java语言中一个可变的字符串处理类,该类提供了许多有用的字符串处理函数,例如 append()、insert()、replace()等。这些函数可以用于字符串的连接、插入和替换等。 StringBuilder类 StringBuilder...
而StringBuffer类是可变的,可以使用`append()`方法添加内容,而不必每次都创建新对象,因此在处理大量字符串拼接时,StringBuffer的效率更高。 总结来说,这个实验旨在帮助我们理解和掌握Java中字符串的基本操作,...
- `StringBuffer`类则设计用于处理可变字符串,如果需要频繁地修改字符串内容,使用`StringBuffer`会更高效,因为它允许在原对象上进行修改,避免了创建新的对象。 2. **字符串声明与初始化**: - 声明字符串常量...
- 这两个类提供了字符串可变的能力,它们主要用于在需要频繁修改字符串内容的情况下,以提高性能。因为它们内部维护了一个字符数组,可以修改数组的内容,而无需每次都创建新的对象。 - 当涉及到多线程环境时,...
这时,StringBuilder和StringBuffer类就派上用场了,它们提供了可变的字符串操作,适合在循环中进行字符串拼接,性能优于使用"+"运算符。 Java异常处理也是编程中的重要组成部分。在处理字符串相关的问题时,可能会...
在Java编程语言中,`StringBuffer`是一个非常重要的类,它提供了一种高效的方式来处理可变字符串数据。与不可变的`String`类不同,`StringBuffer`对象可以在创建后进行修改,这使得它非常适合在需要频繁修改字符串...
因为Java中的字符串是不可变的,所以每次修改都会创建新的对象,可能导致内存消耗增加。在这种情况下,使用`StringBuilder`或`StringBuffer`可以提高效率。 7. **异常处理**:在实际应用中,我们需要考虑到可能的...
首先,我们要理解Java中的字符串是不可变对象,这意味着一旦创建了字符串对象,就不能更改它的值。因此,反转字符串通常涉及创建一个新的字符串,该字符串包含原始字符串的反向字符顺序。有多种方法可以实现这个目标...
String, StringBuffer 与 StringBuilder 的区别 ...String 是不可变类,StringBuffer 是可变类,而 StringBuilder 是线程不安全的可变类。根据不同的使用场景,我们可以选择合适的类来实现字符操作。
2. **内部实现**:由于字符串不可变,因此Java使用了高效的内部存储结构(如字符数组)来存储字符串的内容,同时提供了多种构造方法以满足不同的使用场景。 #### 三、String类的构造方法 `String`类提供了多种构造...
字符串是不可变的,这意味着一旦创建,就不能更改其内容。本实例源码集主要关注Java中的字符串和文本处理,提供了多种实际应用的示例,帮助开发者深入理解和运用相关功能。 1. **字符串创建与初始化** - `String`...