1. 遍历集合
1.1. 使用Iterator接口提供的默认方法forEach(Consumer action),该方法的参数是一个参数式接口
参见: 使用Iterator接口提供的forEachRemaining(Consumer action)类似与上面讲的forEach()方法 (都是consumer)
1.1.1. 用集合对象本身调用
1.2. 使用Iterator接口提供的方法访问集合
1.2.1. booleanhasNext()
1.2.2. Object next()
1.2.3. void remove()
参见: Iterator迭代器使用的是快速失败机制,一旦在迭代过程中发现集合元素被改变(比如在其他线程中修改该集合)就会立即报错,而不是输出更改后的结果。
使用这些函数遍历集合的时候,集合不能有修改,否则报错。例如:books.remove(book)(用集合元素本身修改,而不是修改由next拿到的值);
当修改由next方法得到的值时并不会影响到集合本身,这是值传递的;(booleanhasNext(),Object next(), void remove())
参见: 使用forEach()循环,就是用冒号访问,和访问数组类似(也具有这个特点)
1.3. 使用Iterator接口提供的forEachRemaining(Consumer action)类似与上面讲的forEach()方法
参见: 使用Iterator接口提供的默认方法forEach(Consumer action),该方法的参数是一个参数式接口 (都是consumer)
1.3.1. 用iterator对象调用
1.4. 使用forEach()循环,就是用冒号访问,和访问数组类似
参见: 使用这些函数遍历集合的时候,集合不能有修改,否则报错。例如:books.remove(book)(用集合元素本身修改,而不是修改由next拿到的值);
当修改由next方法得到的值时并不会影响到集合本身,这是值传递的; (也具有这个特点)
1.5. 使用Predicate操作集合
1.6. 使用Stream操作集合
1.7. 需要注意的地方
1.7.1. Iterator
概念
Iterator接口是collection接口的父接口
1.7.2. Iterator迭代器使用的是快速失败机制,一旦在迭代过程中发现集合元素被改变(比如在其他线程中修改该集合)就会立即报错,而不是输出更改后的结果。
参见: void remove()
1.7.3. 通过集合对象的.iterator()方法获取iterator对象
2. Set集合
2.1. HashSet类
2.1.1. 判断集合中俩个元素相等的规则
俩个对象的HashCode()方法返回值不同
equals()方法返回false
同时满足(俩个对象的HashCode()方法返回值不同,equals()方法返回false)
2.1.2. HashSet集合中的对象是可以被修改的即使修改之后其hash值和equals方法发生变化只是这样做可能使程序变得非常混乱
2.2. LinkedHashSet
2.2.1. 是HashSet的子类
2.2.2. 使用链表来维护元素的次序,所以会以元素的添加顺序来访问集合里的元素
2.3. TreeSet类
2.3.1. 概念
StreeSet是SortedSet接口的实现类,可以确保集合中的元素处于排序状态
TreeSet判断两个对象是否相同的唯一方法就是调用compareTo方法,如果这个方法返回是0,即这两个对象是相同的,那么无法将相同的对象放到集合中
使用红黑树来实现存储结构
2.3.2. 相比HashSet额外添加的方法
Object first()返回集合中的第一个元素
Object last()返回集合中的最后一个元素
Object lower(Object e)返回集合中小于e的最大元素
Object higher(Object e)和上面相反
SortedSet subSet(ObjectfromElement ,Object toElement)返回中间的子集
SortedSet headSet(Objecte)返回小于e的子集
SortedSet tailSet(Object e)和上面相反
2.3.3. TreeSet支持的排序方式
自然排序
使用集合元素的compareTo(Object e)方法,也就是说添加到该集合中的元素必须实现Comparable接口。CompareTo(Object e)方法决定了元素排序的位置
系统会调用新插入元素的compareTo(Object e)方法和已经存在的元素进行比较,以此来决定排序顺序,也就是说第一个不实现Comparable接口也是可以被成功添加的,但是如果这样第二个元素添加进来的时候调用compareTo方法就会报错
如果修改了集合中的元素,并且使得集合中两个元素相同(compareTo),那么这两个元素都不能被成功删除
只要是被修改了就不能被删除
定制排序
在实现TreeSet时可以将一个Comparator函数式接口放到TreeSet的构造器中使用lambda表达式实现排序,即可实现定制排序
3. Set实现类的性能分析
3.1. HashSet的性能要比TreeSet高,因为TreeSet要使用红黑树来维护顺序。
4. LIST集合
4.1. Java8为List接口新添加的默认方法
4.1.1. voidreplace(UnaryOperator operator)根据operator制定的计算规则重新设计List中的元素
4.1.2. voidsort(Comparator c)根据Compartorc 参数对List集合元素排序
都是函数式接口,可以直接用lambda表达式(voidreplace(UnaryOperator operator)根据operator制定的计算规则重新设计List中的元素, voidsort(Comparator c)根据Compartor c 参数对List集合元素排序)
4.2. List集合判断集合中元素是否相同是通过equals方法来的,比如说删除一个元素时系统从头开始调用equals方法,删除返回值为true的第一个元素
4.3. ListIterator
4.3.1. ListIterator是Iterator接口的子接口,在Iterator的基础上添加了一些方法,例如可以使集合向前迭代,在迭代的时候添加一个元素
4.4. ArrayList
4.4.1. List的典型实现类,完美继承List的所有方法。性能高,内部是用数组实现的。线程不安全
4.5. Vector
4.5.1. Vector非常古老的类,不推荐使用。它的子类Stack实现了栈的功能,但是古老依旧,不推荐使用依旧
4.5.2. 子类Stack
4.6. 固定长度的List
4.6.1. Arrays类提供的asList方法可以把一个数组或指定个数的对象转换为一个List集合,这个list集合不是Arraylist的实现类也不是vector的实现类,而是Arrays的内部类,是一个固定长度的类,不可以增删。
5. Queue集合
5.1. Queue接口
5.1.1. Deuqe接口
ArrayDeque实现类
参见: ArrayDeque
LinkedList实现类
参见: LinkedList
5.1.2. PriorityQueue实现类
自然排序,每个要装入集合中的元素都要实现Comparable接口
定制排序,在创建PriorityQueue对象时在构造器中传入Compartor接口对象
类似TresSet集合(自然排序,每个要装入集合中的元素都要实现Comparable接口,定制排序,在创建PriorityQueue对象时在构造器中传入Compartor接口对象)
5.1.3. ArrayDeque
参见: ArrayDeque实现类
ArrayList和ArrayDequeue实现机制类似,底层都是采用了一个动态的、可重新分配的数组,这个数组默认容量是16,容量也可以在创建是指定。集合元素超出底层数组容量时系统会重新分配一个数组
5.1.4. LinkedList
参见: LinkedList实现类