Java集合

基本概念:

数组可以储存基本类型和数组,集合类只能储存引用对象,不能储存基本类型

Collection接口和Iterator接口

  • Iterator接口是Collection接口的父接口
  • Iterator接口提供hasNext、next、remove等迭代器方法
  • 集合的迭代器遍历:
List strings = new ArrayList<>();

Iterator iterator = strings.iterator();//集合.iterator返回迭代器
if (iterator.hasNext()) { //hasNext判断有无下一个元素
    System.out.println(iterator.next()); //next()返回下一项
    iterator.remove(); //remove删除上一次next的元素
}
  • Collection接口是Set、List、Queue的父接口,提供add、remove、contain、clear、isEmpty、size、toArray等集合的增删改查方法

Set接口

  • HashSet
    • HashSet使用数组来维护,通过hashCode来确定存储位置
    • HashSet先hashCode判断元素存储位置,再通过equals判断是否是同一元素(替换或者追加链表元素)
    • 尽量不要去修改set中可变对象的实例变量,尤其是参与hashCode计算的实例变量,这会导致set元素混乱
  • LinkedHashSet是有序set,记录元素的插入顺序
    • 使用链表来维护,其查找速度比HashSet慢,优势在于遍历很快
  • TreeSet是自动排序的set
    • TreeSet调用元素的compareTo方法自动升序排序
    • 内部通过红黑树维护元素顺序,其查找和插入速度都是O(logn)
    • 元素必须实现Comparable方法,否则会抛出异常
    • 与HashSet不同,TreeSet判断相等的唯一标准是compareTo方法返回0,如果与现有元素相等,将无法插入
    • TreeSet只在插入时排序,之后如果修改元素,不会重新排序
  • TreeSet的特殊方法:
    • first、last
    • lower、higher,返回大于/小于参数的第一个元素
    • subSet、headSet、tailSet,返回大于/小于/一个范围的set子集
  • 性能比较
    • HashSet总是比TreeSet性能好,因为TreeSet需要维护红黑树来保持排序
    • LinkedHashSet比HashSet遍历更快,但插入、删除稍慢

List接口

  • List是带索引的有序集合,因此提供的方法大多与索引有关
  • 根据index,可以add、remove、get、set、indexOf、subList

队列接口Queue、双向队列Deque接口

  • Deque接口是Queue的子接口
  • Deque接口的实现类:ArrayDeque、LinkedList
  • ArrayDeque以数组形式保存,随机访问速度更快
  • LinkedList以链表形式保存,实现了List接口、Deque接口,可以作为List、队列、栈使用

你可能感兴趣的:(Java集合)