A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Queen123 中级黑马   /  2014-6-18 23:34  /  1196 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

我们都知道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没有覆盖两个方法!

评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

2 个回复

倒序浏览
lz,我想弱弱的问一句,
al.add(new StringBuffer("haha"));
al中是存储的什么类型,String类型吗?如果是,那么是不是调用了toString方法,如果不是,那么很显然就是存储的是StringBuffer类型了,那么if里面调用什么contains(new StringBuffer())..................................
回复 使用道具 举报
楼主,这好像跟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.     }
复制代码
一切都真相大白了。



评分

参与人数 1技术分 +1 收起 理由
轻语。 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马