知识点:栈区存引用和基本类型,不能存对象,而堆区存对象。==是比较地址,equals()比较对象的内容。注意区分这几个知识点。
一、用语言简单表达对象在内存执行过程的实例:
1、String str1 = "abc"的实现过程,首先在栈区创建str引用(相当是名字),然后在String池(独立于栈和堆而存在,存储不可变量)
中找其指向的内容为"abc"的对象。结果有两种,一是存在,则直接将str1指向"abc";二是不存在,则创建一个"abc",然后str1指向
该对象。
2、接下来,我们创建一个对象str2,对象的值也是abc,String str2 = "abc";这个对象在内存里的实现过程是怎样的呢?
好,我们来分析一下。是这样的,String池中已经存在"abc",则str2直接指向String池中已经存在的"abc",不再重新创建对象。
3、当str1进行了赋值(str1 = "abcd")则str1不再指向"abc",而是指向String池中新创建的对象"abcd"。
4、当str2进行了字符串的+连接str2 = str2 + "d";此时str2指向的是在堆中新建的内容为"abcd"的对象。
二、下面给出代码,知道new跟不new的结果是怎么的。
public class StringAndNewString {
public static void main(String[] args) {
String str1 = "abcd";
String str2 = "abcd";
String str3 = new String("abcd");
String str4 = new String("abcd");
System.out.println(str1 = = str2);//ture,地址一样
System.out.println(str3 = = str4);//false,地址不一样
System.out.println(str2.equals(str1));//ture,值一样
System.out.println(str2.equals(str3));//ture,值一样
System.out.println((str1 + "a") == (str2 + "a"));//false;进行了+连接地址不一样
}
}
三、总结;通过对象在内存中执行的分析,自己更加明白对象在内存中是如何运作的,以前的迷惑到现在的清晰,对对象的执行过程又
有了新的认识这是我最大的收获。学习得一步一步来,不能急于求成,滴水穿石,慢慢积累!