研读了java代码 String.java 文件中实现
使用了 final 关键字 内容不可 over write
private final char value[];
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; /** Cache the hash code for the string */ private int hash; // Default to 0 /** use serialVersionUID from JDK 1.0.2 for interoperability */ private static final long serialVersionUID = -6849794470754667710L; /** * Class String is special cased within the Serialization Stream Protocol. * * A String instance is written into an ObjectOutputStream according to * <a href="{@docRoot}/../platform/serialization/spec/output.html"> * Object Serialization Specification, Section 6.2, "Stream Elements"</a> */ private static final ObjectStreamField[] serialPersistentFields = new ObjectStreamField[0]; /** * Initializes a newly created {@code String} object so that it represents * an empty character sequence. Note that use of this constructor is * unnecessary since Strings are immutable. */ public String() { this.value = "".value; }
StringBuffer 中 使用了transient 关键字 所以变量不会被序列化
public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence { /** * A cache of the last value returned by toString. Cleared * whenever the StringBuffer is modified. */ private transient char[] toStringCache; /** use serialVersionUID from JDK 1.0.2 for interoperability */ static final long serialVersionUID = 3388685877147921107L; /** * Constructs a string buffer with no characters in it and an * initial capacity of 16 characters. */ public StringBuffer() { super(16); }
相关推荐
`String`是不可变的类,意味着一旦创建了`String`对象,就不能更改其内容。它在内存中的表现形式是字符数组,所以每次对`String`对象进行修改(如拼接)都会创建一个新的`String`对象,这可能导致大量的内存开销。...
此外,由于`String`对象是不可变的,多个线程可以安全地共享同一个`String`对象,而不用担心数据竞争问题。 接着,`StringBuffer`是在多线程环境下处理字符串的首选。它提供了一个可变的字符序列,允许在已有字符串...
- 如果不需要修改字符串内容,则建议使用 **String**,因为它不可变且具有更好的性能。 3. **频繁的字符串拼接**: - 在频繁进行字符串拼接操作时,使用 **StringBuilder** 或 **StringBuffer** 更合适。例如,在...
1. **可变性**:`String`对象是不可变的,而`StringBuffer`对象是可变的。 2. **性能**:对于频繁修改的字符串,使用`StringBuffer`会比不断创建新`String`对象更加高效。 3. **线程安全性**:`StringBuffer`的所有...
- **不可变性 vs 可变性**:`String`是不可变的,而`StringBuffer`是可变的。 - **性能考量**:在单线程环境中,频繁使用字符串拼接时`StringBuilder`(`StringBuffer`的一个非同步版本)通常比`StringBuffer`更...
在Java中,`String` 类表示不可变的字符序列,也就是说一旦创建了一个字符串对象后,其内容就不能被更改。这使得`String`对象非常适合于处理固定不变的数据。当需要对字符串进行频繁修改时,使用`String`会带来性能...
1. **不可变性**:由于`String`对象是不可变的,因此多个对象可以共享相同的字符串内容,从而节省内存空间。 2. **性能**:由于每次修改都会创建新对象,频繁地修改字符串可能会导致性能问题。 3. **线程安全**:...
在Java编程语言中,String类是一个非常特殊且...总的来说,Java中的String设计为不可变对象是出于性能、安全和并发控制的考虑,这种设计在许多场景下都是有利的。理解这一特性对于编写高效、安全的Java代码至关重要。
3、为什么 String 是不可变的? 我们看看源码,发现 value 这个字符数组被 final 修饰了,怪不得 String 是不可变的。 4、String 的继承图以及父类介绍 * Serializable:public interface Serializable 类的序列...
Java中的字符串类`String`是不可变的,这个特性在编程实践中有着深远的影响。了解其不可变性,有助于我们更好地理解和优化代码。以下是对这一核心概念的详细解释: 1. **不可变性定义**:不可变对象是指一旦创建,...
总结一下,`String`适用于创建不可变的、不需要修改的字符串,而`StringBuffer`(或`StringBuilder`)则适合于需要频繁修改字符串内容的场景。在进行字符串拼接时,特别是涉及大量拼接操作时,应优先考虑使用`...
这意味着一旦String对象被创建后,它所包含的字符序列就不可更改。当我们对String对象进行修改(如拼接、替换等操作)时,实际上是在生成新的String对象,而原有的对象则保持不变。例如: ```java String str = ...
这段代码是错误的,因为 `String` 对象的字符内容是不可变的,不能通过 `charAt` 或其他方法直接修改其内容。 ##### (3) 举例3 利用 `StringBuilder` 或 `StringBuffer` 修改字符串: ```java String s = "abc"; ...
首先,String类是一个不可变对象,这意味着一旦String对象被创建,其内容就不能更改。这是因为String被声明为final类,不允许被继承。因此,对于任何试图修改String对象的操作,如添加、删除或替换字符,Java都会...
Java中的`String`类被认为是不可变的,这意味着一旦创建了一个`String`对象,其内容就不能被修改。这是因为在Java中,字符串是通过字符数组实现的,并且`String`对象在创建后其引用指向的字符数组是固定的。尝试改变...
在这个例子中,所有的字符串操作都在同一个StringBuilder对象上进行,只在最后需要时通过`toString()`方法转换为不可变的String对象。 值得注意的是,虽然StringBuilder在单线程环境下表现优秀,但在多线程环境中,...
- **可变性**:与String不同,StringBuffer对象的内容是可以改变的。通过append、insert等方法,可以在已有字符串的基础上进行操作,而不会创建新的对象。 - **性能**:在单线程环境下,由于线程安全的开销,...
`String`类的实例是不可变的,这意味着一旦创建了一个`String`对象,就不能更改它的内容。所有改变字符串的操作(如添加字符、删除字符等)都会返回一个新的`String`对象,而原始对象保持不变。 ### 5. 常见面试题 ...
理解Java中的String不可变性和引用传递的概念非常重要,这有助于避免潜在的错误,提高程序的效率,并有助于理解内存管理。在实际编程中,如果需要频繁修改字符串,可以考虑使用`StringBuilder`或`StringBuffer`类,...