- List:一种有序列表的集合
- Set:一种保证没有重复元素的集合
- Map:一种通过键值(key-value)查找的映射表集合
Java集合的设计有几个特点:一是实现了接口和实现类相分离,例如,有序表的接口是List,具体的实现类有ArrayList,LinkedList等,二是支持泛型,我们可以限制在一个集合中只能放入同一种数据类型的元素, 例如:
List<String> list = new ArrayList<>(); // 只能放入String类型
最后,Java访问集合总是通过统一的方式——迭代器(Iterator)来实现,它最明显的好处在于无需知道集合内部元素是按什么方式存储的。
不应该继续使用的遗留类:
- Hashtable:一种线程安全的Map实现;
- Vector:一种线程安全的List实现;
- Stack:基于Vector实现的LIFO的栈。
List主要接口:
- 在末尾添加一个元素:void add(E e)
- 在指定索引添加一个元素:void add(int index, E e)
- 删除指定索引的元素:int remove(int index)
- 删除某个元素:int remove(Object e)
- 获取指定索引的元素:E get(int index)
- 获取链表大小(包含元素的个数):int size()
可以通过List接口提供的of()方法,根据给定元素快速创建List:
List<Integer> list = List.of(1, 2, 5);
始终坚持使用迭代器Iterator来访问List
原因:
- 代码复杂
- get(int)方法只有ArrayList的实现是高效的,换成LinkedList后,索引越大,访问速度越慢。
Iterator本身也是一个对象,但它是由List的实例调用iterator()方法的时候创建的。Iterator对象知道如何遍历一个List,并且不同的List类型,返回的Iterator对象实现也是不同的,但总是具有最高的访问效率。
Iterator对象有两个方法:boolean hasNext()判断是否有下一个元素,E next()返回下一个元素。
通过Iterator遍历List永远是最高效的方式
Array 与 List 转换
- List 转 Array:
-
- 调用 list.toArray() 方法直接返回一个Object[]数组,这种方法会丢失类型信息,所以实际应用很少。
- 给 list.toArray(T[]) 传入一个类型相同的Array,List内部自动把元素复制到传入的Array
- Array 转 List:
通过List.of(T…)方法
Integer[] array = { 1, 2, 3 };
List<Integer> list = List.of(array);