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)
bytechar、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()最后生成的结果,确保相同对象有相同的散列码;

 

posted @ 2015-12-31 11:41  chenyizh  阅读(142)  评论(0)    收藏  举报