黑马程序员技术交流社区
标题:
String和StringBuffer的不同
[打印本页]
作者:
Queen123
时间:
2014-6-18 23:34
标题:
String和StringBuffer的不同
我们都知道String和StringBuffer是不同的,因为String类是内容不可变的字符串,而StringBuffer类表示内容可以被改的字符串。更进一步我们就不知道了。
其实,还有String覆盖了equals方法和hashCode方法,而StringBuffer没有,所以将StringBuffer对象存进集合类中会出现问题。
一时不解,以为存进集合会有什么问题,结果代码测试了一遍没有发生错误。
ArrayList al = new ArrayList();
al.add(new StringBuffer("haha"));
System.out.print(al.remove(0));
顺利执行了,接着我就想了,原来是集合里面的比较会发生错误,测试代码如下
ArrayList al = new ArrayList();
al.add(new StringBuffer("haha"));
if(!al.contains(new StringBuffer("haha"))){
System.out.println("看样子StringBuffer没有覆盖equals方法和hashCode方法!");
}
这下就发生错误了,本来集合里面就有“haha”这个字符串了,当再new一个“haha”字符串出来的时候应该返回true,再取下反应该是syso语句不会被执行,可是语句打印出来了,这就说明了Stringbuffer没有覆盖两个方法!
作者:
love~陌
时间:
2014-6-19 00:00
lz,我想弱弱的问一句,
al.add(new StringBuffer("haha"));
al中是存储的什么类型,String类型吗?如果是,那么是不是调用了toString方法,如果不是,那么很显然就是存储的是StringBuffer类型了,那么if里面调用什么contains(new StringBuffer())..................................
作者:
iWilliam
时间:
2014-6-19 01:42
楼主,这好像跟StringBuffer没啥关系吧,源码如下:
ArrayList的
contains方法
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
复制代码
再来看
indexOf方法:
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
复制代码
显然走的是equals方法,而这个o是Object父类,所以,要看实际传进来的是那种类型了,如果是String,那equals比较的字面值
如果是StringBuffer,看一哈API就知道,StringBuffer继承了java.lang.Object类的equals方法,再看Object的equals源码:
public boolean equals(Object obj) {
return (this == obj);
}
复制代码
一切都真相大白了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2