Map接口 :映射,(key和value的方式存储)键映射到值的对象。接口Map<K,V>
k:此映射所维护的键的类型
v:映射值的类型
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。映射顺序 定义为迭代器在映射的 collection 视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如TreeMap 类;另一些映射实现则不保证顺序,如 HashMap 类。
Collection<E>接口
所有超级接口:Iterable<E>返回一个在一组T类型的元素上进行迭代的迭代器。
何为迭代器:可以被next()函数调用并不断返回下一值的对象称为迭代器。
·List:有序的 collection(也称为序列),允许含有重复元素。
1.ArrayList:List 接口的大小可变数组的实现,此实现不是同步的。
底层的数据结构是数组Array[]
快速查询,插入删除效率慢
构造方法摘要 | |
---|---|
ArrayList() 构造一个初始容量为 10 的空列表。 | |
ArrayList(Collection<? extendsE> c) 构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的。 | |
ArrayList(int initialCapacity) 构造一个具有指定初始容量的空列表。 |
2.LinkedList(): List 接口的链接列表实现, 此实现不是同步的。
链表: 插入删除效率快
构造方法摘要 | |
---|---|
LinkedList() 构造一个空列表。 | |
LinkedList(Collection<? extendsE> c) 构造一个包含指定 collection 中的元素的列表,这些元素按其 collection 的迭代器返回的顺序排列。 |
3.Vector (区别于ArrayList是线程安全,只允许一个线程进入):
Vector
类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,
Vector
的大小可以根据需要增大或缩小,以适应创建
Vector
后进行添加或移除项的操作。
底层结构为数组Array[]
构造方法摘要 | |
---|---|
Vector() 构造一个空向量,使其内部数据数组的大小为 10 ,其标准容量增量为零。 | |
Vector(Collection<? extendsE> c) 构造一个包含指定 collection 中的元素的向量,这些元素按其 collection 的迭代器返回元素的顺序排列。 | |
Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量构造一个空向量。 | |
Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量构造一个空的向量。 |
·Set:一组不包含重复元素的collection。也就是说equals()方法不适用于set内的元素对,在这里equals()方法比较 的是两个set集合是否相等(包括set的大小,set的所有成员),相等则返回true。
set 的hashcode: set 中所有元素的hashcode总和,其中null 元素的哈希码定义为零。
·Map
·HashMap :(除了非同步和允许使用 null 之外,HashMap 类与Hashtable 大致相同。)
基于哈希表的 Map 接口的实现:两个方法api:put(key,value) & get(key)
实现方式:数组+链表
新版本:数组+链表+树
key通常使用基本数据类型以降低碰撞
用key的hashcode用取余操作设置索引
hashcode碰撞时进行equals操作 equals相同时覆盖,不同时放入链表
Java7版本优化 链表层级达到8(可设置)时,链表升级为树(减少Hashcode碰撞)
·HashTable :(与HashMap没有本质区别,只区别于线程安全)此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null
对象都可以用作键或值。
·ConcurrentHashMap:
支持获取的完全并发和更新的所期望可调整并发的哈希表。此类遵守与 Hashtable
相同的功能规范,并且包括对应于 Hashtable 的每个方法的方法版本。不过,尽管所有操作都是线程安全的,但获取操作不 必锁定,并且不 支持以某种防止所有访问的方式锁定整个表。此类可以通过程序完全与Hashtable 进行互操作,这取决于其线程安全,而与其同步细节无关。
Hashtable
相似,但与
HashMap
不同,它
不
允许将
null
用作键或值。
equals
boolean equals(Object o)
-
比较此 collection 与指定对象是否相等。
当 Collection 接口没有对 Object.equals 的常规协定添加任何约定时,“直接”实现该 Collection 接口(换句话说,创建一个Collection,但它不是 Set 或 List 的类)的程序员选择重写 Object.equals 方法时必须小心。没必要这样做,最简单的方案是依靠Object 的实现,然而实现者可能希望实现“值比较”,而不是默认的“引用比较”。(List 和 Set 接口要求进行这样的值比较。)
Object.equals 方法的常规协定声称相等必须是对称的(换句话说,当且仅当存在 b.equals(a) 时,才存在a.equals(b))。List.equals 和 Set.equals 的协定声称列表只能与列表相等,set 只能与 set 相等。因此,对于一个既不实现List 又不实现 Set 接口的 collection 类,当将此 collection 与任何列表或 set 进行比较时,常规的equals 方法必须返回 false。(按照相同的逻辑,不可能编写一个同时正确实现 Set 和 List 接口的类。)
hashCode
int hashCode()
- 返回此 collection 的哈希码值。当 Collection 接口没有为 Object.hashCode 方法的常规协定添加任何约束时,为了满足 Object.hashCode 方法的常规协定,程序员应该注意任何重写 Object.equals 方法的类必须重写 Object.hashCode 方法。需要特别指出的是, c1.equals(c2) 暗示着 c1.hashCode()==c2.hashCode()。