乐趣区

关于java:java源码解读String类的不可变特性

String 类不可变的含意

String 对象创立之后便不会再扭转,任何看起来的变动都是通过创立新的 String 对象来实现的。

举例:

String a = new String("abc");
a = a + "d";

第一个语句创立了一个 String 对象 abc,a 是指向这个对象的援用

第二个语句左边创立了另外一个 String 对象 abcd;

执行第二个语句时,并不会批改原先的对象 abc;

不可变是如何实现的

这里有三个关键点:

1、String 类被 final 润饰,不可被继承;因为一旦容许继承的化,那么办法就有可能被重写,也就有可能会毁坏不可变性,这就是为什么用 final 润饰的起因;

2、private final 润饰 char[] 数组;字符串底层应用字符数组来存储,这个字符数组通过 private final 润饰,避免内部对字符串做出扭转;

3、String 类种的任何办法都不会对字符串进行改变;

为什么设计为不可变的

次要还是为了性能方面的思考,因为在 java 语言设计之初,就认为 String 将会被频繁的应用,所以设定了常量池,目标是为了尽可能的复用已有对象,这就要求已有对象是不可变的;

当然设计成不可变对象,肯定水平上也能够减少代码的安全性,比方可变对象作为 hashMap 的 key 时,如果先放入 map 之后,再扭转对象,那么可能就会毁坏 Map 对 key 的唯一性要求;

零根底学习 Java 编程,更多 Java 技巧能够退出我的十年 Java 学习园地,技术交换,资源共享,问题答疑,开发教训分享。

退出移动版