`

为什么Java的string类要设成immutable(不可变的)

阅读更多

        最流行的Java面试题之一就是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?

        不可变对象,顾名思义就是创建后不可以改变的对象,典型的例子就是Java中的String类。

String s = "ABC";
s.toLowerCase();

        如上s.toLowerCase()并没有改变“ABC“的值,而是创建了一个新的String类“abc”,然后将新的实例的指向变量s。
        相对于可变对象,不可变对象有很多优势:

        1).不可变对象可以提高String Pool的效率和安全性。如果你知道一个对象是不可变的,那么需要拷贝这个对象的内容时,就不用复制它的本身而只是复制它的地址,复制地址(通常一个指针的大小)需要很小的内存效率也很高。对于同时引用这个“ABC”的其他变量也不会造成影响。

        2).不可变对象对于多线程是安全的,因为在多线程同时进行的情况下,一个可变对象的值很可能被其他进程改变,这样会造成不可预期的结果,而使用不可变对象就可以避免这种情况。

        当然也有其他方面原因,但是Java把String设成immutable最大的原因应该是效率和安全。

分享到:
评论

相关推荐

    java基础String类选择题练习题

    - **知识点**:解释为什么`String`类是不可变的(immutable),以及不可变性带来的好处。 - **例题**:选择题中可能会问到关于字符串池的概念以及如何利用这一点来提高程序性能。 #### 2. 字符串比较 - **知识点**...

    JAVA不可变类(immutable)机制与String的不可变性(推荐)

    Java中的不可变类(immutable)是一种特殊的类,其对象一旦创建后,其状态就不能再发生变化。这类类在Java中有着重要的地位,特别是String类,它是Java中最常用的不可变类之一。不可变类的设计旨在提高安全性、效率...

    为什么Java字符串是不可变对象?

     流行的Java面试题之一是:什么是不可变对象(immutable object),不可变对象有什么好处,在什么情况下应该用,或者更具体一些,Java的String类为什么要设成immutable类型?  不可变对象,顾名思义是创建后不可以...

    正确使用String类的几点注意

    这种方式创建的String对象位于常量池中,具有不可变性(immutable),即一旦创建后其内容就不能改变。 **1.2 使用new关键字** 另一种常见的初始化方法是使用`new`关键字: ```java String s = new String("hello")...

    Java String不可变性实现原理解析

    String 类是 Java 语言中一个典型的不可变对象,下面是 JDK 1.8 中 String 类的部分源码: ```java public final class String implements java.io.Serializable, Comparable<String>, CharSequence { / The value...

    Java String对象的经典问题

    `String`类是不可变的(immutable),这意味着一旦一个`String`对象被创建,它的内容就不能被改变。这种特性使得`String`类非常适合在多线程环境中使用,因为不需要担心其内容被多个线程同时修改。 #### 二、String...

    不可变对象ImmutableXXX:Collection、List、Set、Map…

    Guava库是Google提供的一款强大的Java工具集,其中包含了丰富的不可变集合类,如`ImmutableCollection`、`ImmutableList`、`ImmutableSet`和`ImmutableMap`等。 `ImmutableCollection`是所有不可变集合的父接口,它...

    ImmutableObjects

    - **String**: `String` 类是不可变的,这意味着一旦一个字符串对象被创建,它的内容就不能被改变。这使得字符串对象非常适合用作键值或其他需要唯一标识符的场景。 - **Character**: `Character` 类同样也是不可变...

    Java_String_的方法

    字符串一旦创建后不可改变,这是因为它被设计成不可变对象(`immutable object`)。Java中主要有两种方式来创建字符串: 1. **使用字符串常量直接初始化**: ```java String s = "hello!"; ``` 这种方式简单...

    java面试笔试题String 和StringBuffer的区别

    `String`对象是不可变的(immutable),这意味着一旦一个`String`对象创建后,其内容不能被修改。这带来了几个关键的优势: 1. **线程安全**:由于`String`对象不可变,多个线程可以安全地共享同一个`String`对象,...

    有关Java String常用方法的总结.docx

    `String`类是Java中最基础也是最重要的数据类型之一,在Java中被定义为一个不可变类(immutable class),这意味着一旦一个`String`对象创建之后,其内容就不能再被修改。`String`类提供了丰富的内置方法来操作字符...

    通过实例解析java String不可变性

    Java 中的 String 类是一种不可变对象,它的不可变性是通过实例解析来实现的。下面我们将通过实例解析来详细介绍 Java 中 String 的不可变性。 一、不可变模式(Immutable Pattern) 在并行软件开发过程中,同步...

    String类的笔记

    它被设计为不可变(immutable),这意味着一旦创建了一个`String`对象,其内容不能被改变,这对于多线程环境下的安全性至关重要。 #### `String`类的关键特性与方法 1. **字符串初始化**:可以通过多种方式创建`...

    JAVA 工具类 项目

    4. **设计原则**:在编写工具类时,通常遵循单例模式(Singleton)和不可实例化( Immutable)的原则。这意味着工具类只有一个全局访问点,且不允许通过构造函数创建实例,以确保其静态方法的独立性。 5. **线程...

    高效安全的Immutable List好处.docx

    Immutable List 是一种特殊的列表数据结构,它遵循不可变对象的原则,即一旦创建,其内容就不能进行添加、删除或修改操作。这种设计模式在多线程环境和安全性需求较高的场景下非常有用,因为它天然具备线程安全性和...

    String类型两种不同实例化方式

    在Java中,String被设计成不可变(immutable)的对象,这意味着一旦一个String对象被创建,其内容就不能被修改。这种设计带来了线程安全、缓存效率以及垃圾回收的优化等优势。 ### 一、String实例化的两种方式 ###...

Global site tag (gtag.js) - Google Analytics