再看Java集合

来源:互联网 发布:杭州锐智软件 编辑:程序博客网 时间:2024/06/06 19:05

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实现类

既实现了List接口也实现了Deque接口

可以根据索引随机访问
可以当成双端队列,可以当成栈

6.       MAP集合

6.1.        Map集合需要注意的地方

6.1.1.         Map集合有相应的方法来拿到key集合和value集合

6.1.2.         可以通过拿到key可以集合,然后遍历这个集合来遍历Map

6.1.3.         类似于HashSet  HashMap判断key相同的方法也是hashCode+equals方法

6.1.4.         HashMap判断value是否相同仅通过equasl方法就可以了

6.1.5.         类似于HashSet程序修改了已经装入集合的对象,并导致key发生了变化,那么程序将无法正常的访问到这些被修改了的对象

6.1.6.         Java8为Map集合新增了forEach方法可以通过lambda表达式来方便的遍历Map集合

6.2.        LinkHashMap

6.2.1.         使用双向链表来维护集合的插入顺序,也是因此,LinkedHashMap性能低于HashMap

6.3.        Properties

6.3.1.         Hash Map的子类

6.3.2.         实现了将Map集合和属性文件联系起来,可以读取可以写入

6.4.        TreeMap

6.4.1.         类似于TreeSet,TreeMap也是实现了SortedMap接口

6.4.2.         类似于TreeSet,TreeMap就是一个红黑书数据结构

6.4.3.         定制排序

6.4.4.         自然排序

6.5.        WeakHashMap

6.5.1.         用法和HashMap差不多,不同之处在于,WeakHashMap只保留key对象的强引用,比如说直接在放入集合时才new出来的对象,没有外界引用,这就是个弱引用,在下一波垃圾回收的时候就被回收了

6.6.        IdentityHashMap

6.6.1.         用法类似HashMap,但是在比较key对象是否相等时,只看== ,无视包括hashCode和equals在内的其他所有方法

0 0