String类:
java源码中,对string的成员变量定义,private final char value[],因此String类是不可变,不可继承的!String s = "ABCabc";打印结果为s = ABCabc ,s = 123456 是因为s并非对象,而是对象的引用,实际在内存中又new了一个 “123456”的字符串。
System.out.println("s = " + s);
s = "123456";
System.out.println("s = " + s);
String不可变的好处? (为什么String要设计成不可变的):
1.性能 常量池的 运行 string不可变的设计出于性能考虑,当然背后的原理是string pool,当然string pool不可能使string类不可变,不可变的string更好的提高性能。2.安全 首要原因是安全,不仅仅体现在你的应用中,而且在JDK中,Java的类装载机制通过传递的参数(通常是类名)加载类,这些类名在类路径下,想象一下,假设String是可变的,一些人通过自定义类装载机制分分钟黑掉应用。如果没有了安全,Java不会走到今天
3线程安全 当多线程访问时,不可变对象是线程安全的,不需要什么高深的逻辑解释,如果对象不可变,线程也不能改变它。
4.允许了String对象缓存HashCode
java中String对象的哈希码被频繁的使用,比如在HashMap的容器中。
字符串不变性保证了hash码的唯一性,因此可以放心的进行缓存,这也是一种性能优化手段,意味着不必每次都取计算新的哈希码,在String类的定义中有如下代码:
private int hash;//用来缓存HashCode