集合
Collection
Collection接口表示一个容器,容器中只能存储引用数据类型,建议存同一类型的引用类型,方便后续遍历等操作。
容器中的元素可以是有序的、可重复的,称为List接口
也可能是无序的、唯一的,称为Set接口。
List接口
List 接口中的元素时有序的、可重复的。List接口中的元素通过索引(index)来确定元素的顺序。
ArrayList
ArrayList是List接口的实现类,底层数据结构是数组,实现大小可变的数组。线程不安全 jdk1.2
ArrayList底层数据结构是数组,默认数组容量为10,如果超过容量会自动拓容,拓容:新容量=旧容量+旧容量/2
Vector
Vector 是List接口的实现类,底层数据结构是数组,是大小可变的数组。线程安全 jdk1.0
Vector底层数据结构是数组,默认数组大小是10,如果超过容量会自动拓容,拓容:新容量=旧容量+增长因子,增长因子可设定
LinkedList
LinkedList是List接口的实现类,底层数据结构是链表。线程不安全 jdk1.2
Iterator和ListIterator
Iterator在迭代过程中不允许向集合中添加元素
ListIterator允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置
泛型(generic)
泛型就是将类型参数化
表示声明了一个列表list,列表的元素是E类型
ArrayList<E> list
声明了一个列表list,列表的元素只能是String类型。
ArrayList<String> list = new ArrayList<String>();
泛型在编译器起作用,运行时jvm察觉不到泛型的存在。运行时已经被擦除了
泛型类
public class 类名<T>{
}
泛型方法 一定程度上优化了方法重载
public <T> void 类名(T a) {
System.out.println(a);
}
泛型接口
如果接口中的方法的参数(形参、返回值)不确定时,可以考虑使用泛型接口
public interface 类名<T>{
public void showInfo(T t);
}
在实现类中确定泛型接口的类型,若是无法确定泛型接口的类型则继续使用泛型
public class 实现类名<T> implements xxx<T>{
@Override
public void showInfo(T t) {
}
}
泛型的上限和下限
泛型的上限ArrayList(? extends xxx) list 声明了一个容器,容器中的元素类型一定要继承于xxx,我们称这种形式叫做泛型的上限。
泛型的下限ArrayList(? super xxx) list 声明了一个容器,容器中的元素类型一定要是xxx的父类,我们称这个形式为泛型的下限。
Set接口
Set接口表示一个唯一、无序的容器(和添加顺序无关)
HashSet
HashSet是Set接口的实现类,底层数据结构是哈希表。线程不安全,不同步 jdk1.2
如果向HashSet中添加元素时,一定要实现hashCode方法和equals方法。
优点:添加、删除、查询效率高;缺点:无序
LinkedHashSet
LinkedHashSet是Set接口的实现类,底层数据结构哈希表+链表,哈希表用于散列元素;链表用于维持添加顺序。线程不安全,不同步 jdk1.4
添加元素,需要实现hashCode和equals方法。
TreeSet
TreeSet 是Set接口的实现类,底层数据结构是二叉树。线程不安全,不同步 jdk1.2
TreeSet 存储的数据按照一定的规则存储。存储规则让数据表现出自然顺序。本质上是无序的
添加自定义元素一定要提供比较策略,比较策略分两种:内部比较器和外部比较器
Map接口
Map接口称为键值对集合或者映射集合,其中的元素(entry)是以键值对(key-value)的形式存在。
Map 容器接口中提供了增、删、改、查的方式对集合进行操作。
Map接口中都是通过key来操作键值对,一般key是已知。通过key获取value。
HashMap
HashMap 是Map的实现类,key以HashSet存储。线程不安全,不同步 jdk1.2
存储元素时,key一定要实现hashCode和equals,一般建议使用String作为Map接口的key
LinkedHashMap
LinkedHashMap是Map接口的实现类,key以LinkedHashSet存储。线程不安全,不同步 jdk1.4
哈希表散列key,链表维持key的添加顺序。
TreeMap
TreeMap是Map的实现类,key以TreeSet存储。线程不安全,不同步 jdk1.2