一.Collection接口:
其两个子接口是List和Set接口,即意味着List和Set的实现类都含有Collection接 口含有的方法。
二、List接口:List是指有顺序,可重复的容器;
1.LIst增加和顺序(索引)相关的方法,其实现类有3个:ArrayList,LinkedList和Vector;
例如:
LIst<String> strList = new ArrayList<String>();
注意:
ArrayList的底层是用数组实现的,故其特点是查询效率高,增删效率低;
数组的长度是有限的,ArrayList可以存放任意数量长度的对象,其扩容的本质上是因为先定义一个更大的数组,然后将就数组的内容复制到新数组中来实现的;
2. LinkedList:底层是双向链表实现的,其增删效率高,查询效率低
3. Vector:底层是一个长度可动态增长的对象数组,它的相关方法都加了线程同步方法因次“线程安全,但效率低”。
三、Map接口:用来存储“键(Key)-值(Value)”对的,其存储的键值对是通过键来标识的,所以键不能 重复。
1. Map接口的实现类有HashMap, TreeMap,HashTable 和 Properties;
2. 常用方法有:
put(), get(), remove(),
boolean containsKey(Object key),
boolean containsValue(Object Value),
void putAll(Map t)
3.HashMap采用散列算法实现的,是Map接口常用的实现类,其底层采用哈希表存储数据,如果键重复,新值会覆盖旧值,其在查找,删除和修改方面的效率都非常的高。
4.HashTable类和HashMap类用法几乎一样,底层实现也一样,只是HashTable类的方法添加了synchronized关键字以确保线程安全,效率低;
注意:
HashTable: 线程安全,效率低,不允许key或value为null;
HashMap: 线程不安全,效率高,允许key或value为null;
5.哈希表:本质就是“数组+单向链表”,故融合两者优点:查询效率和增删效率都高;
Entry[ ] table 是HashMap的核心数组结构,也称为“位桶数组”,这个位桶数组中的每个数组对象就是一个单向链表,如下表所示:
--> | hash值 | key | value | next |
--> | hash值 | key | value | next |
要将“key-value”两个对象成对存入HashMap的Entry[ ]数组中,步骤如下:
(1)获得key的hashcode,通过调用hashcode()方法;
(2)由hashcode计算hash值(要求在[0, 数组长度-1]区间内)
a.其中一种极其简单和低下的算法:hash值=hashcode/hashcode,意味着将所有键值对对象全部存储到Entry[]索引为1的位置上,形成一个非常长的单向链表;
b. 一种简单和常用的算法:hash值=hashcode%数组长度,缺点:使用除法,效率会低;
c.JDK改进的算法:首先约定数组长度必须为2的整数幂,然后采用位运算实现取余:hash值 =hashcode&(数组长度-1)。
(3)存放键值对对象的过程以及如何取值过程如下图所示:
6.TreeMap底层是用红黑二叉树实现的,HashMap的效率高于TreeMap,在需要key按照自然顺序排序时才使用TreeMap。
更多知识可关注微信公众号noodcoders