容 器
Collectiion接口
Collection接口声明了以下方法:
1 | boolean add(Object element); |
注:List和Set是Collection的子接口
List接口
List特点:有序、元素可重复
- 有序:每个元素都有索引标记
- List通常允许满足
e1.equals(e2)
的元素重复加入容器
相比Collection接口,List中多了一些与索引有关的方法
1 | void add(int index, Object element); |
ArrayList类
ArrayList底层是用【数组】实现的存储。特点:查询效率高,增删效率低,线程不安全。
我们知道,数组长度是有限的,而ArrayList是可以存放任意数量的对象,长度不受限制,那么它是怎么实现的呢?
本质上就是通过定义新的更大的数组,将旧数组中的内容拷贝到新数组,来实现扩容。
ArrayList的Object数组【初始化长度为10】,如果我们存储满了这个数组,需要存储第11个对象,就会定义新的长度更大的数组,并将原数组内容和新的元素一起加入到新数组中
LinkList类
LinkList底层用【双向链表】实现
特点:查询效率低、增删效率高,线程不安全
双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。
所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。
Vector类
Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。
如何选用ArrayList、LinkedList、Vector
-
需要线程安全时,用Vector。
-
不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。
-
不存在线程安全问题时,增加或删除元素较多用LinkedList。
Map接口
Map就是用来存储“键(key)-值(value) 对”的。 Map类中存储的“键值对”通过键来标识,所以“键”不能重复。
Map接口常用方法:
1 | Object put(Object key, Object value); |
Map 接口的实现类有HashMap、TreeMap、HashTable、Properties等。
HashMap类
HashMap采用哈希算法实现,是Map接口最常用的实现类。
由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对
HashMap在查找、删除、修改方面都有非常高的效率
HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。
HashMap与HashTable的区别
HashMap: 线程不安全,效率高。允许key或value为null
HashTable: 线程安全,效率低。不允许key或value为null
Set接口与HashSet类
Set接口继承自Collection,Set接口中没有新增方法,方法和Collection保持完全一致。
Set容器特点:无序、不可重复
新元素如果和Set中某个元素通过
equals()
方法对比为true,则不能加入;甚至,Set中也只能放入一个null元素,不能多个。
Set常用的实现类有:HashSet、TreeSet等,我们一般使用HashSet
HashSet基本用法
1 | public class Test { |
迭代器
将容器转为迭代器:
1 | Iterator<E> iter = aList.iterator() |
使用Iterator迭代器遍历容器元素(List/Set/Map)
- 迭代器遍历ArrayList
1 | List<String> aList = new ArrayList<String>(); |
- 迭代器遍历Map 【1】
1 | public class Test{ |
- 迭代器遍历Map 【2】
1 | public class Test { |
Collections工具类
类 java.util.Collections 提供了对Set、List、Map进行排序、填充、查找元素的辅助方法。
- void sort(List) //对List容器内的元素排序,排序的规则是按照升序进行排序。
- void shuffle(List) //对List容器内的元素进行随机排列。
- void reverse(List) //对List容器内的元素进行逆续排列 。
- void fill(List, Object) //用一个特定的对象重写整个List容器。
- int binarySearch(List, Object) //对于顺序的List容器,采用折半查找的方法查找特定对象。