`
shi007
  • 浏览: 1734 次
  • 性别: Icon_minigender_2
  • 来自: NSW
文章分类
社区版块
存档分类
最新评论

为什么 String 的内容不可不变 StringBuffer 内容可变

 
阅读更多

研读了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、StringBuffer、StringBuilder的使用方法

    `String`是不可变的类,意味着一旦创建了`String`对象,就不能更改其内容。它在内存中的表现形式是字符数组,所以每次对`String`对象进行修改(如拼接)都会创建一个新的`String`对象,这可能导致大量的内存开销。...

    String-StringBuffer-StringBuilder

    此外,由于`String`对象是不可变的,多个线程可以安全地共享同一个`String`对象,而不用担心数据竞争问题。 接着,`StringBuffer`是在多线程环境下处理字符串的首选。它提供了一个可变的字符序列,允许在已有字符串...

    StringBuffer和String_区别

    - 如果不需要修改字符串内容,则建议使用 **String**,因为它不可变且具有更好的性能。 3. **频繁的字符串拼接**: - 在频繁进行字符串拼接操作时,使用 **StringBuilder** 或 **StringBuffer** 更合适。例如,在...

    String&Stringbuffer

    1. **可变性**:`String`对象是不可变的,而`StringBuffer`对象是可变的。 2. **性能**:对于频繁修改的字符串,使用`StringBuffer`会比不断创建新`String`对象更加高效。 3. **线程安全性**:`StringBuffer`的所有...

    String总概况及其特性并与StringBuffer的区别详解

    - **不可变性 vs 可变性**:`String`是不可变的,而`StringBuffer`是可变的。 - **性能考量**:在单线程环境中,频繁使用字符串拼接时`StringBuilder`(`StringBuffer`的一个非同步版本)通常比`StringBuffer`更...

    String和StringBuffer详细用法总结

    在Java中,`String` 类表示不可变的字符序列,也就是说一旦创建了一个字符串对象后,其内容就不能被更改。这使得`String`对象非常适合于处理固定不变的数据。当需要对字符串进行频繁修改时,使用`String`会带来性能...

    String和StringBuffer 的区别 .txt

    1. **不可变性**:由于`String`对象是不可变的,因此多个对象可以共享相同的字符串内容,从而节省内存空间。 2. **性能**:由于每次修改都会创建新对象,频繁地修改字符串可能会导致性能问题。 3. **线程安全**:...

    Java中的String为什么是不可变的?-String源

    在Java编程语言中,String类是一个非常特殊且...总的来说,Java中的String设计为不可变对象是出于性能、安全和并发控制的考虑,这种设计在许多场景下都是有利的。理解这一特性对于编写高效、安全的Java代码至关重要。

    一篇讲清楚String、StringBuffer和StringBuild.doc

    3、为什么 String 是不可变的? 我们看看源码,发现 value 这个字符数组被 final 修饰了,怪不得 String 是不可变的。 4、String 的继承图以及父类介绍 * Serializable:public interface Serializable 类的序列...

    Java中的String为什么是不可变的共7页.pdf.z

    Java中的字符串类`String`是不可变的,这个特性在编程实践中有着深远的影响。了解其不可变性,有助于我们更好地理解和优化代码。以下是对这一核心概念的详细解释: 1. **不可变性定义**:不可变对象是指一旦创建,...

    Java String 与 StringBuffer 用法区别

    总结一下,`String`适用于创建不可变的、不需要修改的字符串,而`StringBuffer`(或`StringBuilder`)则适合于需要频繁修改字符串内容的场景。在进行字符串拼接时,特别是涉及大量拼接操作时,应优先考虑使用`...

    stringbuffer和string的区别.pdf

    这意味着一旦String对象被创建后,它所包含的字符序列就不可更改。当我们对String对象进行修改(如拼接、替换等操作)时,实际上是在生成新的String对象,而原有的对象则保持不变。例如: ```java String str = ...

    Java常用类与基础API-String的理解与不可变性

    这段代码是错误的,因为 `String` 对象的字符内容是不可变的,不能通过 `charAt` 或其他方法直接修改其内容。 ##### (3) 举例3 利用 `StringBuilder` 或 `StringBuffer` 修改字符串: ```java String s = "abc"; ...

    JAVA中StringBuffer与String的区别解析

    首先,String类是一个不可变对象,这意味着一旦String对象被创建,其内容就不能更改。这是因为String被声明为final类,不允许被继承。因此,对于任何试图修改String对象的操作,如添加、删除或替换字符,Java都会...

    【独家高薪面试题库】与【实战配套练习演练】7.优先级可变与不可变1

    Java中的`String`类被认为是不可变的,这意味着一旦创建了一个`String`对象,其内容就不能被修改。这是因为在Java中,字符串是通过字符数组实现的,并且`String`对象在创建后其引用指向的字符数组是固定的。尝试改变...

    Java-Java String和StringBuilder

    在这个例子中,所有的字符串操作都在同一个StringBuilder对象上进行,只在最后需要时通过`toString()`方法转换为不可变的String对象。 值得注意的是,虽然StringBuilder在单线程环境下表现优秀,但在多线程环境中,...

    Java String、StringBuffer与StringBuilder的区别

    - **可变性**:与String不同,StringBuffer对象的内容是可以改变的。通过append、insert等方法,可以在已有字符串的基础上进行操作,而不会创建新的对象。 - **性能**:在单线程环境下,由于线程安全的开销,...

    java String类常用方法练习小结

    `String`类的实例是不可变的,这意味着一旦创建了一个`String`对象,就不能更改它的内容。所有改变字符串的操作(如添加字符、删除字符等)都会返回一个新的`String`对象,而原始对象保持不变。 ### 5. 常见面试题 ...

    java中String类型变量的赋值问题介绍_.pdf

    理解Java中的String不可变性和引用传递的概念非常重要,这有助于避免潜在的错误,提高程序的效率,并有助于理解内存管理。在实际编程中,如果需要频繁修改字符串,可以考虑使用`StringBuilder`或`StringBuffer`类,...

Global site tag (gtag.js) - Google Analytics