java学习随笔2
String不可变的理解
查看String的源码,可以发现String的class的修饰词是fianl,各个变量的修饰词也是final,表明它并不能改变(其实可以改变value的值对String进行改变,但是Java中并没有可以实现改变一个String的value数组的方法,所以可以理解为Strng是不可变的):
public final class String implements java.io.Serializable, Comparable, CharSequence
{
/** The value is used for character storage. */
private final char value[];
/** The offset is the first index of the storage that is used. */
private final int offset;
/** The count is the number of characters in the String. */
private final int count;
/** Cache the hash code for the string */
private int hash; // Default to 0
/** use serialVersionUID from JDK 1.0.2 for interoperability */
private static final long serialVersionUID = -6849794470754667710L;
........
}
一个小小的证明
下面代码的输出结果是“22”,没有报错。
String str=“11”;
str=“22”;
System.out.println(str);
但是改成以下的代码
String str=“11”;
System.out.println(str.hashCode());
str=“22”;
System.out.println(str.hashCode());
System.out.println(str);
可以发现两次输出的hashCode是不一样的,证明两个str不是同一个对象。所以改变String的操作是新实例化了一个String对象,而不是改变员String的值。