java集合框架概述
Java的集合类主要由两个接口派生而出:Collection 和 Map
-
Collection接口
- List接口和Set接口继承自Collection接口
- ArrayList和LinkedList以及Vector是List接口的实现类
- HashSet和TreeSet是Set接口的实现类
- LinkedHashSet 是HashSet的子类
- List接口和Set接口继承自Collection接口
-
Map接口
- HashMap,TreeMap和HashTable是Map接口的实现类
- LinkedHashMap 是HashMap的子类
- Properties 是 HashTable的子类
- HashMap,TreeMap和HashTable是Map接口的实现类
List :元素有序,可重复的集合
ArrayList:作为List接口的主要实现类;线程不安全的,效率高;底层使用(数组)Object[] elementData存储,查询快,增删慢;
LinkedList:对于频繁插入,删除操作,使用此类效率给ArrayList高;底层使用双向链表存储,查询慢,增删快;
Vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData(数组)存储,查询快,增删慢;
Set : 元素无序,不可重复的数据
HashSet:作为Set接口的主要实现类:线程不安全的;可以存储null值
LinkedHashSet:作为HashSet子类,遍历其内部数据时,可以按照添加的顺序遍历,对于频繁的遍历操作,LinkedHashSet效率高于HashSet
TreeSet: 可以按照添加对象的指定属性,通过自然排序,定制排序 进行排序
Map: 双列数据,保存具有映射关系的"key-value对"的集合
HashMap:作为Map主要实现类:线程不安全的,效率高:能存储null的key和value
LinkedHashMap:保证在遍历Map元素时,可以按照添加的顺序实现遍历
原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。对于频繁的遍历操作,此类执行效率高于HashMap。
TreeMap:保证按照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序和定制排序;底层使用红黑树
Hashtable:作为古老的实现类:线程是安全的,效率低;不能存储null的key和value
Properties:常用来处理配置文件,key和value都是String类型
void add(int index, Object ele) | 在index位置插入ele元素 |
boolean addAll(int index, Collection eles) | 从index位置开始将eles中的所有元素添加进来,若不写index,默认添加到最后 |
Object get(int index) | 获取指定index位置的元素 |
int indexOf(Object obj) | 返回obj在集合中首次出现的位置,如果不存在,返回-1 |
int lastIndexOf(Object obj) | 返回obj在集合中末次出现的位置,如果不存在,返回-1 |
Object remove(int index) | 移除指定index位置的元素,并返回此元素 |
Object set(int index, Object ele) | 设置指定index位置的元素为ele |
List subList(int formIndex, int toIndex) | 返回从fromIndex到toIndex位置(左闭右开)的子集 |
以HashSet为例
– 1.无序性:不等于随机性,存储的数据在底层数组中并非按照数组索引的顺序添加,而是根据数据的哈希值决定的
– 2.不可重复性:保证添加的元素按照equals()判断时,不能返回true,即:相同的元素只能添加一个
添加元素的过程:
以HashSet为例:
我们向HashSet中添加元素,首先调用元素所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置是个上是否已经有元素:
– 如果此位置上没有其他元素,则元素a添加成功。—>情况1
– 如果位置上有其他元素b(或以链表形式存在多个元素),则比较元素a与元素b的hash值:
– 如果hash值不相同,则元素a添加成功。—>情况2
– 如果hash值不相同,进而需要调用元素a所在类的equals()方法:
– equals()方法返回true,元素a添加失败
– equals()方法返回false,则元素a添加成功。—>情况3
对于添加成功的情况2和情况3而言:元素a 与已经存在指定索引位置上数据以链表的方式存储:
– jdk7:元素a放到数组中,指向原来的元素(新元素指老元素)
– jdk8:原来的元素在数组中,指向元素a 简记([新元素的位置]七上八下)
HashSet底层:数组 + 链表的结构
Object put(Object key, Object value) | 将指定key-value添加到(或修改)当前map对象中 |
void putAll(Map m) | 将m中的所有key-value对存放到当前map中 |
Object remove(Object key) | 移除指定key的key-value对,并返回value |
void clear() | 清空当前map中的所有数据 |
元素查询的操作: | 作用 |
---|---|
Object get(Object key) | 获取指定key对应的value |
boolean containsKey(Object key) | 是否包含指定的key |
boolean containsValue(Object value) | 是否包含指定的value |
int size() | 返回map中key-value对的个数 |
boolean isEmpty() | 判断当前map是否为空 |
boolean equals(Object obj) | 判断当前map和参数对象obj是否相等 |
Set keySet() | 返回所有key构成的set集合 |
Collection values() | 返回所有value构成的Collection集合 |
Set entrySet() | 返回所有key-value对构成的Set集合 |
======================== Collection接口 ========================
=========================== List接口 ===========================
=========================== Set接口 ===========================
=========================== Map接口 ===========================