String 和 new String的区别

知识点:栈区存引用和基本类型,不能存对象,而堆区存对象。==是比较地址,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;进行了+连接地址不一样
    }
}

三、总结;通过对象在内存中执行的分析,自己更加明白对象在内存中是如何运作的,以前的迷惑到现在的清晰,对对象的执行过程又
         有了新的认识这是我最大的收获。学习得一步一步来,不能急于求成,滴水穿石,慢慢积累!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值