黑马程序员技术交流社区

标题: 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方法
  1. public boolean contains(Object o) {
  2.         return indexOf(o) >= 0;
  3.     }
复制代码
再来看indexOf方法:
  1.     public int indexOf(Object o) {
  2.         if (o == null) {
  3.             for (int i = 0; i < size; i++)
  4.                 if (elementData[i]==null)
  5. return i;
  6.         } else {
  7.             for (int i = 0; i < size; i++)
  8.                 if (o.equals(elementData[i]))
  9.                     return i;
  10.         }
  11.         return -1;
  12.     }
复制代码
显然走的是equals方法,而这个o是Object父类,所以,要看实际传进来的是那种类型了,如果是String,那equals比较的字面值

如果是StringBuffer,看一哈API就知道,StringBuffer继承了java.lang.Object类的equals方法,再看Object的equals源码:
  1.     public boolean equals(Object obj) {
  2.         return (this == obj);
  3.     }
复制代码
一切都真相大白了。








欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2