List与Set接口

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方法从而确定该类对象的排序方式

原文地址:https://www.cnblogs.com/YC-L/p/14209468.html