本文参考了JAVA中Stack和Heap的区别
首先将所有的variable分成三类
第一类 基本类型(primitive types), 共有8种,即int, short, long, byte, float, double, boolean, char
第二类 String(String是一个特殊的包装类数据)
第三类 其他包装类数据
基本类型
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找有没有字面值为3的地址,没找到,就开辟一个存放3这个字面值的地址,然后将a指向3的地址。接着处理int b = 3;在创建完b的引用变量后,由于在栈中已经有3这个字面值,便将b直接指向3的地址。这样,就出现了a与b同时均指向3的情况。
包装类数据
就是在stack里面建一个地址然后指向heap(其实我一直好奇它是如何指向的)
特殊包装类数据 String
String是一个特殊的包装类数据。即可以用String str = new String("abc");的形式来创建,也可以用String str = "abc";
假如我们是按照String str =new String (“abc”)来的话 那等于将它当作一个包装类数据
如果我们用的是String str = "abc"; 那么Java具体是这样执行的
- 先定义一个名为str的对String类的对象引用变量:String str;
- 在栈中查找有没有存放值为"abc"的地址,如果没有,则开辟一个存放字面值为"abc"的地址,接着创建一个新的String类的对象o,并将o 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象o。如果已经有了值为"abc"的地址,则查找对象o,并返回o的地址。
- 将str指向对象o的地址。值得注意的是,一般String类中字符串值都是直接存值的。但像String str = "abc";这种场合下,其字符串值却是保存了一个指向存在栈中数据的引用!
String a = "abc";
String b = new String "abc";
String c = "abc";
System.out.println(a == b); //false
System.out.println(b == c); //false
System.out.println(a == c); //true