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中也同样发生变化