1、对象和对象引用:在Java中,不能直接操作对象,所以就有了对象引用,对象引用存储对象在内存中的地址;
2、JVM在执行程序时会把内存区域划分为若干个不同的数据区域:方法区、栈、堆;
方法区:运行时的常量池;
栈:基本类型变量,对象引用,方法调用;
堆:创建的对象和数组;
例子:对象存储在堆中,而对象的引用存储在栈中;
3、字符串不可变:指字符串对象不可变,而不是字符串引用不可变;
源码层面分析:
Java8,String是使用char数组实现;
public final class String implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
/** Cache the hash code for the string */
private int hash; // Default to 0
}
Java9,String是使用byte数组实现,同时使用coder标识使用哪种编码;
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final byte[] value;
/** The identifier of the encoding used to encode the bytes in {@code value}. */
private final byte coder;
}
从源码中可知,String其实是通过操作value数组实现的;
value数组被private修饰且未提供修改方法,被final修饰意味着一旦被初始化就无法改变;
4、不可变优势
线程安全:可以在多线程之间共享
hash值不变:String类中重要字段hash,用来保存字符串对象的hashcode,由于字符串对象的不可变性,所以一旦字符串被 创建,其hash值就不会被改变,非常适合做为hashmap的key值,极大提高效率
5、参考文章