`

为什么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不可变类(immutable)机制与String的不可变性(推荐)

    主要介绍了JAVA不可变类(immutable)机制与String的不可变性(推荐)的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下

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

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

    Java进阶教程之String类

    主要介绍了Java进阶教程之String类,String类对象是不可变对象(immutable object),String类是唯一一个不需要new关键字来创建对象的类,需要的朋友可以参考下

    Java初学者都必须理解的六大问题

     至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想...

    Java的六大问题你都懂了吗

    至于为什么要把String类设计成不可变类,是它的用途决定的。其实不只String,很多Java标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的...

    javabiginteger源码-SoftwareEngineerChallenge:软件工程师挑战赛

    中包含了很多不可变类,包括String、装箱的原始类、BigInteger 等。基本上不可变类是不太容易出错的。 请使用以下 api 实现不可变队列: Scala版本: trait Queue [ T ] { def isEmpty : Boolean def enQueue ( t : ...

    Practical Java(中文版(繁体+简体))

    實踐63:審慎㆞定義和實現immutable classes(不可變類) 213 實踐64:欲傳遞或接收mutable objects(可變對象)之object references 時,請實施clone() 215 實踐65:使用繼承(inheritance)或委託(delegation)來...

    javabiginteger源码-MultiThreadMode:多线程模式

    标准类中Immutable类:String、BigInteger、BigDecimal、Pattern、基本类型的包装类 java.util.ArrayList非线程安全的类,可用Collections.synchronizedList()进行包装 List list = Collections.synchronizedList...

    程序员为什么还要刷题-cs2030s:新加坡国立大学的CS2030S编程方法模块

    不可变对象是在完全创建后其内部状态保持不变的对象。 这意味着不可变对象的公共 API 向我们保证它在其生命周期内将以相同的方式运行。 可变性(可以改变)的一个例子是: String name = " i love cs2030? " ; ...

    Guava 16.0 API (CHM格式)

    Immutable collections(不变的集合): 防御性编程, 不可修改的集合,并且提高了效率。  2. New collection types(新集合类型):JDK collections 没有的一些集合类型,主要有:multisets,multimaps,tables, ...

    不可变的:注释处理器,用于创建不可变的对象和构建器。 感觉像番石榴的不可变集合,但对于常规值对象。 包括JSON,Jackson,Gson,JAX-RS集成

    阅读完整的文档,为 // Define abstract value type using interface, abstract class or annotation@Value . Immutablepublic interface ValueObject extends WithValueObject { // extend not-yet-generated ...

    Immutables-Android-Example:在Android和GSON上使用Immutables 2.0的示例

    不可变的Android示例 在Android和GSON上使用小示例。 您还可以按照《 的 使用以下User模型: @Gson.TypeAdapters @Value.Immutable public abstract class User { public abstract int id(); public abstract ...

    cpp-算法精粹

    市场上讲解算法的书已经汗牛充栋,为什么还要写这本书呢?主要原因是我对目前市场上的大部分算法书都不太满意。 本书有如下特色: 背后有强大的AlgoHub支持。 本书的所有题目,都可以在 www.algohub.org(即将上线)...

Global site tag (gtag.js) - Google Analytics