集合略坑:
一、关于List
实现List的两种常用类:
1)ArrayList,该实现实际上是将对象放置到了ArrayList底层维护的数组当中;
2)LinkedList,该类内部会生成一个Entry对象,里面的结构类似:
Entry{
Entry pre; //指向前一个
Object element; //当前元素
Entry next; //指向下一个
}
ArrayList内存中线性排列,适合查找,不适合删除插入; Linked List适合删除插入,不适合查找;
二、关于set
1)HashSet,每次往里面添加东西时,先会调用hashCode()方法,判断新增加的对象的hashCode是否与集合中的hashCode值一样,如果不一致,就加进去;如果一致,就会调用equals()方法进行比较,equals方法返回true就表示对象已经添加进去了,不需要新增加,否则加进去。
eg:
class Person{
}
HashSet set = new HashSet();
set.add(new Person());
set add(new Person());
//此时set的长度为2
HashSet set2 = new HashSet();
set2.add("a");
set2.add("a");
//此时set2长度为1
String s1 = new String("a");
String s2 = new String("a");
HashSet set3 = new HashSet();
set3.add(s1);
set3.add(s2);
//此时长度为1
2)TreeSet的构造方法可以带一个实现Comparator接口的类的实例,该类必须重写compare方法,实现特定集合元素的“有序”。
三、关于Map
1)Map的keySet()方法返回key的集合,返回类型时Set; values()方法返回值的集合,类型时Collection{因为键不能重复}
2)HashMap遍历的两种方式:
①keySet()方法,该方法返回值组成的Set集合,遍历Key查找值
②entrySet()方法,返回一个内部类(Map.Entry)的对象的集合,由该内部类的实例调用getKey()和getValue()方法,查找键值。
补充:关于equals()方法和hashCode()方法:
Object类的equals()方法的特点:
a)自反性:obj.equals(obj);----true
b)对称性:obj1.equals(obj2) == true ----->obj2.euqals(obj1)==true;
c)传递性:obj.equals(obj2)==true;obj2.equals(obj3)==true;----->obj1.equals(obj3)==true;
d)一致性:在obj1,obj2没被修改的前提的下,obj1.equals(obj2) 为固定值
e)obj!=null;obj.equals(null) == false;
关于Object的hashCode()方法
a)对于两个对象来说,调用equals()方法返回true,两个对象的hashCode一定相同
b)对于两个对象,调用equals()方法返回false,hashCode可能相同,也可能不同
//具体看实现对象的类有没有重写hashCode()和equals()方法
-------------------------
如果重写hashCode()就必须重写equals(),vice versa。