Java - 集合
-- # 以下内容总结来自《Java编程思想》第四版 #--
1、Java容器类类库分为两大类:
-- Collection :一个独立元素的序列,派生出三个具体的子接口 List、Set 和 Queue ;
-- Map:一组成对的“键值对”对象;
2、常用的集合类:ArrayList、LinkedList、HashSet、HashMap ;
3、不应该使用过时的 Vector、HashTable 和 Stack ;
4、工具类:Collections、Arrays ; Arrays.asList(...) 产生的List对象会使用底层数组作为其物理实现,只要执行的操作会修改这个List,底层数组也将被修改;
5、Iterator:能够将遍历序列的操作与序列底层的结构分离,统一了对容器的访问方式;
6、散列与散列码:
散列是映射中存储元素时最常用的方式 (映射、散列、冲突、地址链接法、负载因子);
散列码:用来代表对象的int值,通过将该对象的某些信息进行转换而生成的,散列码不必独一无二,应该更关注生成速度与均匀分布;
7、自定义类作为HashMap键,必须同时重载 hashCode() 和 equals() ,Object的hashCode()默认使用对象的地址计算散列码;
hashCode :生成散列码
equals:用来判断当前的键是否与表中(hashMap)存在的键相同
8、hashCode() vs. equals()
如果两个对象相等(equal),那么它们一定有相同的hashcode;如果两个对象有相同的hashcode,但是它们未必相等;
9、正确的equals方法必须满足的5个条件:
1)自反性:对任意x,x.equals(x) 一定返回 true
2)对称性:对任意x和y,如果y.equals(x)返回true,x.equals(y)也返回true
3)传递性:对任意x、y、z,如果x.equals(y)返回true,y.equals(z)返回true,则x.equals(z)一定返回true
4)一致性:对任意x和y,如果对象中用于等价比较的信息没有改变,那么无论调用x.equals(y)多少次,返回结果应该保持一致
5)对任何不是null的x,x.equals(null)一定返回false
10、一份设计hashCode()的基本指导原则:
1)给int变量result赋予某个非零值常量
2)为对象内每个有意义的域f(即每个可以做equals()操作的域)计算出一个int散列码c
boolean c=(f?0:1) byte、char、short或int c=(int)f long c=(int)(f^(f>>32)) float c=Float.floatToIntBits(f) double long l=Double.doubleToLongBits(f) c=(int)(l^(l>>32)) Object c=f.hashCode() 递归调用 数组 为每个元素应用上述规则
3)合并计算得到的散列值: result = result * 37 + c ;
4)检查hashCode()最后生成的结果,确保相同对象有相同的散列码;