ArrayList中是允许出现重复的数据的
ArrayList<> AbstractList<> List<>RandomAccessCloneablejava.io.Serializable
List<E>是一个接口
AbstractList<E>是一个抽线方法,定义了hashCode方法和equals方法
hashCode:
public int hashCode() { int hashCode = 1; for (E e : this) hashCode = 31*hashCode + (e==null ? 0 : e.hashCode()); return hashCode; }
equals:基本数据类型直接判断,引用数据类型根据hashCode判断
public boolean equals(Object o) { if (o == this) return true; if (!(o instanceof List)) return false; ListIteratore1 = listIterator(); ListIterator e2 = ((List) o).listIterator(); while (e1.hasNext() && e2.hasNext()) { E o1 = e1.next(); Object o2 = e2.next(); if (!(o1==null ? o2==null : o1.equals(o2))) return false; } return !(e1.hasNext() || e2.hasNext()); }
Example :
Listl1=new ArrayLlist ();l1.add(0);List l2=new ArrayList ();l2.add(0);System.out.println(l1.equals(l2); //true
因为: 由于Integer的hashCode计算方法是直接返回value,所以0的hashCode就是0,再根据AbstractList的hashCoded的计算方法可以计算出:
l1.hashCode=31
l2.hashCode=31
所以相等,可以在AbstractList的hashCode方法中加个断点,debug一下。或者
List<Integer> l1=new ArrayLlist<Interger>(){
override public int hashCode(){
可以在这里观察
}
}