【第 4 天】题目
final 的作用,与 String 的不变性!
参考答案
String 的不变性
HashMap 的 key 建议使用不可变类,什么叫不可变类呢?这里说的不可变指的是类值一旦被初始化,就不能再被改变了,如果被修改,将会是新的类。
比如说 String 这种不可变类,我们写个 demo 来演示一下。
String s ="hello";
s ="world";
从代码上来看,s 的值好像被修改了,但从 debug 的日志来看,其实是 s 的内存地址已经被修改了,也就说 s =“world” 这个看似简单的赋值,其实已经把 s 的引用指向了新的 String,debug 的截图显示内存地址已经被修改,两张截图如下:
我们从源码上查看一下原因:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
}
我们可以看出来两点:
以上两点就是 String 不变性的原因,充分利用了 final 关键字的特性,如果你自定义类时,希望也是不可变的,也可以模仿 String 的这两点操作。
因为 String 具有不变性,所以 String 的大多数操作方法,都会返回新的 String,如下面这种写法是不对的:
String str ="hello world !!";
// 这种写法是替换不掉的,必须接受 replace 方法返回的参数才行,这样才行:str = str.replace("l","dd");
str.replace("l","dd");
留言区