集合的概念
在我们的开发实践中,经常需要保存一些变长的数据集合,于是,我们需要一些能够动态增长长度的容器来保存我们的数据。Java中对于各种数据结构的实现,就是我们用到的集合。
集合体系概述
Collection 接口-定义了存取一组对象的方法,其子接口Set和List分别定义了存储方式。
- Set 中的数据对象没有顺序且不可以重复。
- List 中的数据对象有顺序且可以重复。
List 接口及实现类
List继承了Collection接口,有三个实现的类
- ArrayList
数组列表,数据采用数组方式存储。 - LinkedList
链表 - Vector
数组列表,添加同步锁,线程安全的
ArrayList实现了长度可变的数组,在内存中分配连续的空间。
遍历元素和随机访问元素的效率比较高
LinkedList采用链表存储方式。插入、删除元素时效率比较高
ArrayList需要注意的使用方法
removeRange(int fromIndex, int toIndex) 删除指定区间的元素(子类继承使用)
List接口集合迭代
for循环遍历
通过索引值获取所对应的数据信息
增强for循环的遍历
也是通过迭代器的方法获取信息
迭代器遍历(Iterator)
通过集合返回迭代器。
Iterator iter = list.iterator();
while(iter.hasNext()){
iter.next();
}
注意:迭代时删除元素
泛型
为什么会有泛型呢?
早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
如果没有定义具体类型,默认为Object.
泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。
参数化类型,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。
public class Demo<T> {
private T p;
public T getP() {
return p;
}
public void setP(T p) {
this.p = p;
}
1、泛型的类型参数只能是类类型(包括自定义类
2、泛型的类型参数可以有多个。
如果没有定义具体类型,默认为Object
Set 接口
Set接口继承了Collection接口。
Set中所存储的元素是不重复的,但是是无序的, Set中的元素是没有索引的
Set接口有两个实现类
HashSet
HashSet类中的元素不能重复,即彼此调用equals方法比较,都返回false。
底层数据结构是哈希表+链表
哈希表依赖于哈希值存储
TreeSet
可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
TreeSet底层数据结构是二叉树(红黑树是一种自平衡的二叉树)
Map 接口
Map接口概述
将键映射到值的对象
键不能重复
键和值一一对应
HashMap
HashMap中元素的key值不能重复,即彼此调用equals方法,返回为false。排列顺序是不固定的。
TreeMap
TreeMap中所有的元素都保持着某种固定的顺序,如果需要得到一个有序的Map就应该使用TreeMap,key值所在类必须实现Comparable接口。
HashTable
实现了同步。
Map集合遍历
方式1:根据键找值
获取所有键的集合
遍历键的集合,获取到每一个键
根据键找值
方式2:根据键值对对象找键和值
获取所有键值对对象的集合
遍历键值对对象的集合,获取到每一个键值对对象
根据键值对对象找键和值
TreeMap
适用于按自然顺序或自定义顺序遍历键(key)。
TreeMap根据key值排序,key值需要实现Comparable接口,
重写compareTo方法。TreeMap根据compareTo的逻辑,对
key进行排序。
键是红黑树结构,可以保证键的排序和唯一性
Collections类
- 是集合类的工具类,与数组的工具类Arrays类似
- 定义了大量静态方法( 同步集合对象的方法 对List排序的方法)