String 和 new String的区别

来源:互联网 发布:b2b发布信息软件 编辑:程序博客网 时间:2024/06/11 23:38

知识点:栈区存引用和基本类型,不能存对象,而堆区存对象。==是比较地址,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;进行了+连接地址不一样    }}
三、总结;通过对象在内存中执行的分析,自己更加明白对象在内存中是如何运作的,以前的迷惑到现在的清晰,对对象的执行过程又
         有了新的认识这是我最大的收获。学习得一步一步来,不能急于求成,滴水穿石,慢慢积累!

原创粉丝点击