String为什么被设计为是不可变的?


字符串

字符串顾名思义就是一串连续的字符,也就是一串连续的char。在C语言中,就是使用char数组来表示字符串

char string[] = {'o', '0', 'u', '0', 'o', '\0'}
char string[] = "o0u0o"

在Java的源码里,Java使用面向对象的思想,将char数组封装成了String, 使用String类型来表示字符串。如下面String源码所示:

//Java 8源码  部分截取
public final class String {
    private final char value[];
}

String源码中,char数组被final关键字修饰,并且是私有成员变量。

什么是String的不可变性???

一个对象创建后,我们可以修改这个对象的属性,我们就说这个对象是可变的,反之是不可变的。 代码示例:

//Person类
public class Person {
    public int  age;

    public Person(int age) {
        this.age = age;
    }
}

p的年龄可以进行修改,但是str无法修改

//Person属性可以修改,是可变的
Person p = new Person(10);
p.setAge(20);

//String 是不可变的
String str = "o0u0o";

为什么String不可变???

  • 1、String类本身是被final关键字修饰的,不可以被继承。
  • 2、String类内部通过private final char value[]实现,从而保证了引用的不可见和对外的不可见。
  • 3、String内部通过良好的封装,不去改变value数组的值。

String

字符串不可变的优点:

  • 1、保证常量池复用的可靠
  • 2、哈希码只需要计算一次
  • 3、不可变的是线程安全的

Tips:

可以通过一种手段去改变String中的value的值,就是使用反射,所以严格意义上来说String不一定是不可变的


分类:Java
标签: String
文章目录