基本概念:
数组可以储存基本类型和数组,集合类只能储存引用对象,不能储存基本类型
Collection接口和Iterator接口
- Iterator接口是Collection接口的父接口
- Iterator接口提供hasNext、next、remove等迭代器方法
- 集合的迭代器遍历:
List<String> strings = new ArrayList<>();
Iterator<String> 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、队列、栈使用
网友评论