随记——String和ArrayList一些问题。

1.前言

看设计模式的时候看见遇到了一些我不能理解的事情,就去问了度娘,现在把我得到的结果记录下来,以免忘记。

2.具体问题

        //创建了两个对象,先是new String()一个对象放入堆中,又创建一个对象“123”放入常量池中,也就是字符缓冲区。
        String s = new String("123");//1
        StringBuffer sb = new StringBuffer();
        //这是一个简单的对象,属性就只有Value
        Cell cell = new Cell("123");
        sb.append("123");
        ArrayList list1 = new ArrayList();
        list1.add(s);
        list1.add(sb);
        list1.add(cell);
        //string的值在常量池
        String b = s;//2
        System.out.println(b == s);
        s += "";//3
        System.out.println(b == s);
        sb.append("123");//4
        cell.setValue("456");
        for (Object object : list1) {
            System.out.println(object.toString());
        }

结果是

true
false
123
123123
Cell [value=456]
这几个地方我想说说我的理解(不一定是对的,我错了,请告诉我)。
首先我说下String s = new String(“123”);我上面注释页写了,先是创建了一个String对象放入堆中,然后这”123”其实也是一个String,被创建放入了常量池中,下次用123时只需要去常量池中去就好了,不需要在创建一个对象。
其次第二个结果为false,因为s +=”“;这语句执行完,s的指向已经不是那个堆内存了,+在字符串拼接后,会创建一个拼接好的对象放入常量池中。这时候,s和b指向的已经不是一个对象了。
最后这个ArrayList中添加的是这个变量的内存指向,不管是先后添加,只要最后内存指向不变就可以了,在添加后内存中的值发生变化,list中也同样发生变化
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值