Collection接口存储一组不唯一,无序对象
List接口存储一组不唯一,有序对象
Set接口存储一组唯一,无序对象
Map接口存储一组键值对象,提供key到value的映射
LIst接口实现(有序,不唯一)
ArrayList(顺序表)
- 实现了长度可变的数组,在内存中分配连续的空间
- 优点,遍历元素和随机访问元素的效率比较高
- 缺点,添加和删除需要大量移动元素,效率低,按内容查询效率低
LinkedList(链表)
- 采用链表的形式
- 优点,插入、删除元素效率较高
- 缺点,遍历和随机访问元素效率较低
ArrayList与Vector
- ArrayList线程不安全,效率高,Vector是线程安全的,效率低
- ArrayList在进行扩容的时候,是扩容1.5倍(OldCapacity + OldCapacity>>1)
- Vector在进行扩容的时候,是扩容2倍(oldCapacity + ((capacityIncrement > 0)?capacityIncrement:oldCapacity))
Iterator接口
- 所有实现了Collection接口的容器类都有一个iterator方法用以返回一个实现了Iterator接口的对象
- Iterator对象称作迭代器,用以方便实现对容器内元素的遍历操作
增强for循环(本质上用的iterator功能)
for(Object i:list){ System.out.println(i) }
所有集合类都默认实现了Iterable的接口,实现此接口意味着具备了增强for循环的能力
iterator方法,返回一个Iterator的接口子类实例对象
- 在使用iterator进行迭代的过程中如果删除其中的某个元素会报错,并发操作异常
- 如果遍历的同时需要修改元素,建议使用listIterator()
- ListIterator迭代器提供了向前和向后两种遍历方式
- 始终通过cursor和lastret指针获取元素值及向下的遍历索引
- 使用向前遍历时必须保证指针在迭代器的结果,否则无法获取结果值
Set接口中的实现类
- Set接口存储一组唯一,无序的对象
- 存入和取出的顺序不一定一致
- 操作数据的方法与List类似,Set接口不存在get()方法
Hashset( 采用Hashtable存储结构,即散列的链地址法)
- 优点,添加速度快,查询速度快,删除速度快
- 缺点,无序
- LinkedHashSet,采用哈希表存储结构,同时使用链表维护次序
- 有序(添加顺序)
TreeSet
- 采用二叉树(红黑树)的存储结构
- 优点,有序(排序后的升序)查询速度比List快
- 缺点,查询速度没有HashSet快
红黑树,特殊的平衡树
- 自平衡二叉查找树
- 结点是红色或黑色
- 根结点是黑色
- 每个叶结点是黑色
- 每个红色结点两个子结点都是黑色
- 任一结点到每个叶子所有路径都包含相同数目的黑色结点
- 最长路径不超过最短路径两倍
HashSet如何保证元素的唯一性
- 通过元素的两个方法,hashCode和equals方法来完成
- 如果元素的HashCode值相同,才会判断equals是否为true
- 如果元素的hashCode值不同,不会调用equals方法
TreeSet
- 采用二叉树的存储结构
- 优点,有序(排序后的升序)查询速度比list快
- 缺点,查询速度比HashSet慢
Comparable接口
所有可以"排序"的类都实现了java.lang.Comparable接口,Comparable接口中只有一个方法
// 非源码,大概流程 public int compareTo(Object obj){ int a, b; if(this == obj){ return 0; } if(this > obj){ return a;// 正数 } if(this < obj){ return b;// 负数 } }
实现了Comparable接口的类通过实现comparaTo方法从而确定该类对象的排序方式