List接口:
存储任意类型的Object对象,有序、有下标、元素可以重复;
下标范围:0~元素个数-1 0~size()-1
Set集合:
无序、无下标、元素内容不允许重复;
Map集合:
(1) Map以键值对形式存储(key-value)。
(2) 键:无序、无下标、元素不允许重复(唯一)。
(3) 值:无序、无下标、元素内容允许重复。
a. ArrayList:
底层以数组实现,查询效率快,增删效率慢
JDK1.2版本,线程不安全,并发效率相对高
b. Vector:
底层以数组实现,查询效率快,增删效率慢
JDK1.0 版本,线程安全,并发效率低
a. ArrayList:
底层以数组实现,查询效率快,增删效率慢
JDK1.2版本,线程不安全,并发效率相对高
b LinkedList:
底层以链表实现,查询效率相对较低,增删效率相对快
扩充:数组在内存空间连续:内存空间利用率相对不高 (寻址方便) 链表在内存空间不连续:内存空间利用相对较高 (寻址相对麻烦)
I. 如果保证HashSet中存储内容不同的对象,需要做到以下两点:
a. 覆盖 hashCode方法
① 原则:必须保证内容相同的对象返回相同的哈希码值;
为了提高效率,尽可能做到内容不同的对象返回不同哈希码值
② 覆盖:将所有的属性值拼凑为一个 int 的整数作为返回值返回
b. 覆盖 equals方法
① 必须保证内容相同返回 true,拒绝添加元素
② 内容不同的对象返回值为false,则成功添加
II. 执行原理:当一个对象往 HashSet集合中存储时,先调用当前对象的
hashCode方法,获取对应存储下标(为了保证内容相同的对象不添加
到HashSet集合中,通常将 hashCode方法给与覆盖),存储下标位置
上没有任何元素,则直接将对象存储在对应下标位置上,但是如果下标
位置上已经存储了其他元素,则调用 该对象 equals方法(为了保证
内容不同通常覆盖 equals方法),equals方法返回值为true,代表
内容相同对象,则拒绝添加到集合中,如果返回值为false,则成功添
加到对应下标位置,此时采用数组+链表形式进行存储。
(1) HashMap:
JDK1.2版本,线程不安全,并发效率快,允许null作为
key/value
(2) Hashtable:
JDK1.0版本,线程安全,并发效率低,不允许null作为
key/value
HashMap: 存储元素时获取key的哈希码值(通过键对应对象的hashCode方法),
获取哈希码值与底层存储时数组取余得到存储下标,第一种情况存储
下标上没有元素,则直接添加(将key和value一起存储);第二种情
况,存储下标位置上如果有元素,则调用key对应存储对象的equals
方法,判断下标冲突的对象内容是否相同,equals方法结果为true,
代表内容相同,则拒绝添加,equals方法结果为false,代表内容不
同,此时采用数组+链表形式进行存储
HashMap应用注意细节: 如果自定类型的对象作为HashMap的键进行存储,为了
保证元素内容不重复,需要覆盖 hashCode和equals方法(规则等价于
HashSet);但是实际开发应用,通常使用 Integer、String作为
HashMap的key类型
注意:HashSet底层实际封装了一个 HashMap
Comparator是外置比较器,实现方法 compare(Tt1,T t2);
Comparable是内置比较器,实现方法 compareTo(Tt)方法;