美文网首页
什么是 String 的不可变性?

什么是 String 的不可变性?

作者: 会点代码的大叔 | 来源:发表于2019-11-28 14:40 被阅读0次

String 被声明为 final,是不可变的,它也不可被继承。

通过源码了解 String 的不可变性

在 Java 8 中,String 是使用 char 数组实现的。

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
}

到了 Java 9 ,String 类的实现改用 byte 数组实现,同时使用 coder 来标识使用了哪种编码。

public final class String 
   implements java.io.Serializable, Comparable<String>, CharSequence { 
        /** The value is used for   character storage. */ 
        private final byte[] value;
    /** The identifier of the encoding used to encode the bytes in {@code value}. */ 
        private final byte coder;
}

我们可以看到,value 数组被声明为 final,并且 String 内部也没有改变 value 数组的方法,因此 String 是不可变的。

不可变的优势

1. 线程安全

因为 String 的不可变性,所以在多线程的环境下,可以被安全使用。

2. hash 值不需要重复计算

一个 String 被创建后,那么它的 hash 值只需要计算一次;
比如使用 String 做为 HashMap 中的 key ,那么不需要重复计算 hash 值。

3. String Pool

一个 String 被创建后,被可以放入 String Pool 中,就可以被其他地方所引用;因为 String 是不可变的,所以才能实现 String Pool 。

String, StringBuffer, StringBuilder

1. 不可变性

String 不可变
StringBuffer 和 StringBuilder 可变

2. 线程安全

String 不可变,因此是线程安全的
StringBuilder 不是线程安全的
StringBuffer 是线程安全的,内部使用 synchronized 进行同步

image.png

相关文章

  • String,StringBuffer 和 StringBuil

    主要从三个方面谈这三个类的区别: 可变性 线程安全性 性能 可变性 String为什么是不可变的?String内部...

  • 什么是 String 的不可变性?

    String 被声明为 final,是不可变的,它也不可被继承。 通过源码了解 String 的不可变性 在 Ja...

  • 面试题汇总

    1. String, StringBuffer and StringBuilder 可变性String 不可变St...

  • Java基础与框架

    1.String、StringBuffer、StringBuilder的区别? 可变性:String不可变(字符串...

  • Java String相关知识点

    一、 String为什么是Final的 安全性1、因为不可变性可以保证线程安全。2、String很多功能都是依靠n...

  • Diagram to show Java String’s Im

    图解java中String的不可变性 翻译自 What is string immutability 定义字符串 ...

  • Java基础(四)

    Java基础4 JAVA字符 1.String的不可变性 String 是一个对象,一个封装了字符数组的对象。不可...

  • String不可变性

    1、什么是不可变 不可变对象是指对象在初始化后,在它的整个生命周期里,都是不可以被改变的。 2、为什么String...

  • String StringBuilder StringBuffe

    String的不可变性 1.首先String 是一个final类,也即意味着String类不能被继承,并且它的成员...

  • Android 面试要点之字符

    1. String的不可变性 参考资料一旦一个String对象在内存中创建,它将是不可改变的,所有的String类...

网友评论

      本文标题:什么是 String 的不可变性?

      本文链接:https://www.haomeiwen.com/subject/usrbwctx.html