第6章 - Java集合

6集合

 

15 Java集合类(集合框架)

15.1 集合类概述

1.集合类的由来

    对象用于封装特有数据对象多了需要存储如果对象的个数不确定就使用集合容器进行存储

    Java语言的java.util包中提供了一些集合类这些集合类又被称为容器(数组也是个容器)

2.特点

    1).用于存储对象的容器

    2).集合的长度是可变的

    3).集合中不可以存储基本数据类型值

3.集合与数组不同之处

    1).数组的长度是固定的集合的长度是可变的

    2).数组用来存放基本类型的数据集合用来存放对象的引用

    集合容器因为内部的数据结构不同有多重具体容器不断的向上抽取就形成了集合框架

    常见的集合有List集合, Set集合, Map集合其中ListSet实现了Collection接口

如图所示:

1).集合接口: 8个接口(短虚线表示), 表示不同集合类型是集合框架的基础

    Iterator, ListIterator, Collection, List, Set, Map, SortedSet, SortedMap

2).抽象类: 5个抽象类(长虚线表示), 对集合接口的部分实现可扩展为自定义集合类

    AbstractCollection, AbstractList, AbstractSet, AbstractMap. AbstractSequentialList

3).实现类: 13个实现类(实线表示), 对接口的具体实现

    Vector, Stack, ArrayList, LinkedList

    HashSet, TreeSet, LinkedHashSet

    HashMap, LinkedHashMap, TreeMap, Hashtable, Properties, WeakHashMap, IdentityHashMap

4.接口详解:

1).Collection接口是一组允许重复的对象

2).Set接口继承Collection, 但不允许重复使用自己内部的一个排列机制

3).List接口继承Collection, 允许重复以元素插人的次序来放置元素.不会重新排列

4).Map接口是一组成对的键-值对象即所持有的是key-value(键值对). Map中不能有重复的key. 拥有自己的内部排列机制

5.关于null对象:

1).ArrayList, LinkedList, Vector允许所有对象包括null

2).HashSet, LinkedHashSet可以添加null, 但是TreeSet不能添加null

3).HashMap, linkedHashMap, 可以添加null.

   TreeMap不能添加键为null, 可以添加值为null的元素

   Hashtable不能添加null(无论是键还是值)

6.集合的特点对比

1.接口对比

    1).Set子接口:无序,不允许重复。检索元素效率低删除和插入效率高插入和删除不会引起元素位置改变. <对应类有HashSet, TreeSet>

    2).List子接口:有序,可以有重复元素。和数组类似, List可以动态增长查找元素效率高插入删除元素效率低因为会引起其他元素位置改变. <相应类有ArrayList, LinkedList, Vector>

2.实例比较

    1).HashSet: 以哈希表的形式存放元素插入删除速度很快

    2).TreeSet: 以二叉树的形式存放元素

    3).ArrayList: 动态数组

    4).LinkedList: 链表、队列、堆栈

    5).Vector是一种老的动态数组是线程同步的效率很低一般不赞成使用

7.Java容器的线程安全与非线程安全?

1).可以谈谈哪些是线程安全的容器哪些非线程安全的容器

    线程安全:VectorHashTableStringBuffer

    非线程安全:ArrayListLinkedListHashMapTreeMapStringBuilder

2).线程安全有什么好处有什么坏处

    线程安全即在多线程操作同一个VectorHashTable对象时不会有任何问题但是线程安全必须要使用很多synchronized关键字来同步控制所以必然会导致性能的降低. Java后续版本出才出现了众多非线程安全的容器

3).安全与性能如何取舍

    如果是多个线程操作同一个对象那么使用线程安全的Vector; 否则就使用效率更高的ArrayList

4).补充说明非线程安全!= 不安全

    有人在使用过程中有一个不正确的观点我的程序是多线程的不能使用ArrayList要使用Vector, 这样才安全非线程安全并不是多线程环境下就不能使用注意我上面有说到多线程操作同一个对象注意是同一个对象如果是每个线程中new一个ArrayList, 而这个ArrayList只在这一个线程中使用那么肯定是没问题的

 

 

15.2 Collection

    Collection(单列集合): 一次添加一个元素<T>

    Collection接口是层次结构中的根接口构成Collection的单位被称之为元素. Collection接口通常不能直接使用但该接口提供了添加和删除元素管理数据的方法.

    由于List接口与Set接口都实现了Collection接口因此这些方法对List集合和Set集合是通用的

Collection

    |-- List有序(存入和取出的顺序一致), 元素都有索引(角标), 元素可以重复

    |-- Set元素不能重复,无序

【不用<>就是Object类型】

 

15.2.1 框架顶层Collection接口

(示例: basic.coll.collection.CollectionDemo)

Collection<E>的常用方法:

分类

方法

说明

添加

boolean add(E e)

添加元素

boolean addAll(Collection<?> c)

添加元素集合

boolean addAll(Collection<? extends E> c)

添加继承该类的子类元素集合

删除

boolean remove(Object o)

删除元素

boolean removeAll(Collection<?> c)

删除元素集合

void clear()

清空集合

判断

boolean contains(Object obj)

判断是否包含某个元素

boolean containsAll(Collection c)

判断是否包含某个元素集合

boolean isEmpty()

判断集合是否有元素

boolean equals(Object o)

比较hashCode是否相同

获取

int hashCode()

获取该集合对象的hashCode

int size()

获取该集合元素的大小(数量)

Iterator<E> iterator()

取出元素的方式迭代器

其他

boolean ratianAll(Collection<?> c)

取交集

Object[] toArray()

将集合转成Object数组

<T> T[] toArray(T[] a)

将集合转成自定义对象数组

JDK1.8

boolean removeIf(Predicate<? super E> filter)

 

Spliterator<E> spliterator()

 

Stream<E> stream()

 

Stream<E> parallelStream()

 

void forEach(Consumer<? super T> action)

遍历

说明:

    Iterator接口就是对所有的Collection容器进行元素取出的公共接口,它的对象必须依赖于具体容器因为每一个容器的数据结构都不同所以该迭代器对象是在容器中进行内部实现的对于使用容器者而言具体的实现不重要只要通过容器获取到该实现的迭起的对象即可也就是iterator方法. (迭代器模式)

    JDK1.8 forEach(action)方法:

       c1.forEach((str) -> {

           System.out.println(str);

       });

 

15.2.2 List接口的常用方法

(示例: basic.coll.collection.list.ListDemo)

    List接口继承了Collection接口,因此包含Collection中的所有方法,又因为List是列表类型(线性方式存储元素),所以List接口还提供了适合于自身的常用方法(通过对象的索引来操作元素)

    要使用List集合通常情况下需要声明为List类型然后通过List接口的实现类来对集合进行实例化, List接口的实现类常用的有ArrayListLinkedList

    特点有序(存入和取出的顺序一致), 元素都有索引(角标), 元素可以重复

List:(是有序的

    |-- ArrayList内部是数组数据结构是不同步的替代了Vector. 查询的速度快.

    |-- LinkedList:内部是链表数据结构是不同步的增删元素的速度很快

    |-- Vector内部是数组数据结构是同步的增删查询都很慢

List的常用方法:

分类

方法

说明

添加

boolean add(E e)

添加对象

void add(int index, E element)

在索引位置插入元素(索引从0开始

boolean addAll(Collection<?> c)

添加元素集合

boolean addAll(Collection<? extends E> c)

添加继承该类的子类元素集合

boolean addAll(int index, Collection<? extends E> c)

在指定索引位置插入Collection子类元素集合(索引从0开始)

修改

E set(int index, E element)

指定元素替换列表中指定索引位置的元素返回被替换的元素

删除

E remove(int index)

移除指定索引位置的元素返回被移除的元素

boolean remove(Object o)

删除元素

boolean removeAll(Collection<?> c)

删除元素集合

void clear()

清空集合

判断

boolean contains(Object obj)

判断是否包含某个元素

boolean containsAll(Collection c)

判断是否包含某个集合

boolean isEmpty()

判断集合是否有元素

boolean equals(Object o)

比较hashCode是否相同

获取

E get(int index)

用于获取指定索引位置的元素

int indexOf(Object o)

该方法返回列表中对象最后一次出现的索引位置如果集合中不包含该元素则返回-1

int lastIndexOf(Object o)

该方法返回列表中对象最后一次出现的索引位置如果集合中不包含该元素则返回-1

ListIterator<E> listIterator()

用来获取一个包含所有对象的ListIterator列表迭代器

ListIterator<E> listIterator(int index)

 

List<E> subList(int fromIndex, int toIndex)

获取从索引fromIndextoIndex之间的元素对象

int hashCode()

获取该集合对象的hashCode

int size()

获取该集合元素的大小(数量)

Iterator<E> iterator()

取出元素的方式迭代器

其他

boolean ratianAll(Collection<?> c)

取交集

Object[] toArray()

将集合转成Object数组

<T> T[] toArray(T[] a)

将集合转成自定义对象数组

JDK1.8

void replaceAll(UnaryOperator<E> operator)

 

void sort(Comparator<? super E> c)

 

boolean removeIf(Predicate<? super E> filter)

 

Spliterator<E> spliterator()

 

Stream<E> stream()

 

Stream<E> parallelStream()

 

void forEach(Consumer<? super T> action)

遍历

 

15.2.2.1 ArrayList

(示例: basic.coll.collection.list.ListIteratorDemo)

    该类实现了可变的数组允许所有元素包括null.

    底层实现:数组实现, Object[]保存数据

    优点:可以根据索引位置对集合进行快速的随机访问

    缺点:向指定的索引位置插入对象或删除对象的速度较慢

    语法ArrayList<Object> list = new ArrayList<Object>();

方法(只列出基于List扩展的): 

分类

方法

说明

构造

ArrayList()

初始一个初始容量为10的空列表

ArrayList(int initialCapacity)

构造一个包含指定collection的元素的列表这些元素是按照该collection的迭代器返回它们的顺序排列的

ArrayList(Collection<? extends E> c)

构造一个具有指定初始容量的空列表

数量

void trimToSize()

将此 ArrayList 实例的容量调整为列表的当前大小

void ensureCapacity(int minCapacity)

如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数

复制

Object clone()

返回此 ArrayList 实例的浅表副本(浅克隆)

 

15.2.2.2 LinkedList

(示例: basic.coll.collection.list.LinkedListDemo)

    该类采用链表结构保存对象允许所有元素包括null

    底层实现:Node<E> first, last(存储当前的数值添加时加入到last.next), 用链表实现

    优点:便于向集合中插入和删除对象经常需要向集合中插入删除对象时使用LinkedList类实现的List集合的效率较好

    缺点:对于随机访问集合中的对象效率较慢

    语法:List<String> list = new LinkedList<String>();

    场景:可以拿来实现堆栈和队列

方法(只列出基于List扩展的): 

分类

方法

说明

构造

LinkedList()

构造一个空列表

LinkedList(Collection<? extends E> c)

构造一个包含指定collection中的元素的列表这些元素按其collection的迭代器返回的顺序排列

添加

void addFirst(E e)

将指定元素插入此列表的开头

void addLast(E e)

将指定元素添加到此列表的结尾

boolean offer(E e)

将指定元素添加到此列表的末尾(最后一个元素)

boolean offerFirst(E e)

在此列表的开头插入指定的元素

boolean offerLast(E e)

在此列表末尾插入指定的元素

void push(E e)

将元素推入此列表所表示的堆栈

获取

E element()

获取但不移除此列表的头(第一个元素)

E getFirst()

返回此列表的第一个元素

E getLast()

返回此列表的最后一个元素

E peek()

获取但不移除此列表的头(第一个元素)

E peekFirst()

获取但不移除此列表的第一个元素如果此列表为空则返回 null

E peekLast()

获取但不移除此列表的最后一个元素如果此列表为空则返回 null

E poll()

获取并移除此列表的头(第一个元素)

E pollFirst()

获取并移除此列表的第一个元素如果此列表为空则返回 null

E pollLast()

获取并移除此列表的最后一个元素如果此列表为空则返回 null

E pop()

从此列表所表示的堆栈处弹出一个元素

删除

E remove()

获取并移除此列表的头(第一个元素)

E removeFirst()

移除并返回此列表的第一个元素

boolean removeFirstOccurrence(Object o)

从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)

E removeLast()

移除并返回此列表的最后一个元素

boolean removeLastOccurrence(Object o)

从此列表中移除最后一次出现的指定元素(从头部到尾部遍历列表时)

遍历

Iterator<E> descendingIterator()

返回以逆向顺序在此双端队列的元素上进行迭代的迭代器

克隆

Object clone()

返回此 LinkedList 实例的浅表副本(浅克隆)

 

15.2.2.3 Vector

(示例: basic.coll.collection.list.VectorDemo)

    该类实现了可变的数组允许所有元素包括null.

    底层实现:数组实现, Object[]保存数据所有方法均加了synchronized(即同步)

    优点:保证数据的同步性在访问的性能上比ArrayList

    缺点:在向指定的索引位置插入对象或删除对象的性能上比ArrayList

    语法Vector<Object> list = new Vector<Object>();

方法(所有方法均加了synchronized关键字只列出基于List扩展的): 

分类

方法

说明

构造

Vector()

构造一个空向量使其内部数据数组的大小为10, 其标准容量增量为零

Vector(int initialCapacity)

使用指定的初始容量和等于零的容量增量构造一个空向量

Vector(int initialCapacity, int capacityIncrement)

使用指定的初始容量和容量增量构造一个空的向量

Vector(Collection<? extends E> c)

构造一个包含指定collection中的元素的向量这些元素按其collection的迭代器返回元素的顺序排列

添加

synchronized void addElement(E obj)

将指定的组件添加到此向量的末尾将其大小增加 1

synchronized void insertElementAt(E obj, int index)

将指定对象作为此向量中的组件插入到指定的 index 

获取

synchronized int capacity()

返回此向量的当前容量

synchronized E elementAt(int index)

返回指定索引处的组件

Enumeration<E> elements()

返回此向量的组件的枚举

synchronized E firstElement()

返回此向量的第一个组件(位于索引0)处的项

synchronized E lastElement()

返回此向量的最后一个组件

synchronized int lastIndexOf(Object o, int index)

返回此向量中最后一次出现的指定元素的索引 index 处逆向搜索如果未找到该元素则返回 -1

删除

synchronized void removeElementAt(int index)

删除指定索引处的组件

synchronized boolean removeElement(Object obj)

从此向量中移除变量的第一个(索引最小的)配项

synchronized void removeAllElements()

从此向量中移除全部组件并将其大小设置为零

设置

synchronized void setSize(int newSize)

设置此向量的大小

synchronized void setElementAt(E obj, int index)

将此向量指定 index 处的组件设置为指定的对象

synchronized void trimToSize()

对此向量的容量进行微调使其等于向量的当前大小

synchronized void ensureCapacity(int minCapacity)

增加此向量的容量(如有必要), 以确保其至少能够保存最小容量参数指定的组件数

复制

synchronized void copyInto(Object[] anArray)

将此向量的组件复制到指定的数组中

synchronized Object clone()

返回向量的一个副本浅克隆

 

15.2.3 Set接口的常用方法

(示例: basic.coll.collection.set.SetDemo)

    Set集合由Set接口和Set接口的实现类组成也包含Collection接口的所有方法

Set:元素不可以重复是无序. (根据算法排序,所以无序)

    Set接口中的方法和Collection一致

    |-- HashSet内部数据结构是哈希表是不同步的

       |-- LinkedHashSet

    |-- TreeSet:可以对Set集合中的元素进行排序是不同步的.  

    要使用Set集合需要声明为Set类型实现类常用的有HashSetTreeSet 

    由于Set集合中不允许存在重复值因此可以使用Set集合中的addAll()方法Collection集合添加到Set集合中并除掉重复值

    由于Set集合中的对象时无序的遍历Set结合的结果与插入Set集合的顺序并不相同

Set接口中的常用方法

分类

方法

说明

添加

boolean add(E e)

如果此Set集合尚未保存在指定的集合则添加此元素

boolean addAll(Collection<?> c)

将参数集合中所有元素添加到此Set集合的尾部

boolean addAll(Collection<? extends E> c)

添加继承该类的子类元素集合

删除

boolean remove(Object o)

删除元素

boolean removeAll(Collection<?> c)

删除元素集合

void clear()

清空集合

判断

boolean contains(Object obj)

判断是否包含某个元素

boolean containsAll(Collection c)

判断是否包含某个元素集合

boolean isEmpty()

判断集合是否有元素

boolean equals(Object o)

比较hashCode是否相同

获取

int hashCode()

获取该集合对象的hashCode

int size()

获取该集合元素的大小(数量)

Iterator<E> iterator()

取出元素的方式迭代器

其他

boolean ratianAll(Collection<?> c)

取交集

Object[] toArray()

将集合转成Object数组

<T> T[] toArray(T[] a)

将集合转成自定义对象数组

JDK1.8

boolean removeIf(Predicate<? super E> filter)

 

Spliterator<E> spliterator()

 

Stream<E> stream()

 

Stream<E> parallelStream()

 

void forEach(Consumer<? super T> action)

遍历

1.如何保证该集合的元素唯一性呢?

    是通过对象的hashCodeequals方法来完成对象唯一性的

        1).如果对象的hashCode值不同那么不用判断equals方法就直接存储到哈希表中.  

        2).如果对象的hashCode值相同那么要再次判断对象的equals方法是否为true. 

    如果为true, 视为相同元素不存如果为false, 那么视为不同元素就进行存储

【记住如果元素要存储到HashSet集合中必须覆盖hashCode方法和equals方法

    一般情况下如果定义的类会产生很多对象比如人学生通常都需要覆盖equals, hashCode方法

2.建立对象判断是否相同的依据

    if (this.hashCode() == obj.hashCode() && this.equals(obj))

3.哈希表确定元素是否相同

1).判断的是两个元素的哈希值是否相同

    如果相同在判断两个对象的内容是否相同

2).判断哈希值相同其实判断的是对象的hashCode的方法判断内容相同用的是equals方法

[注意:如果哈希值不同是不需要判断equals]

4.判断元素唯一性的方式:

    就是根据比较方法的返回结果是否是0, 0, 就是相同元素不存.  

TreeSet对元素进行排序的两种

1).方式一:让元素自身具备比较功能元就需要实现Comparable接口覆盖compareTo方法如果不要按照对象中具备的自然顺序进行排序如果对象中不具备自然顺序怎么办?

2).方式二:让集合自身具备比较功能定义一个类实现Comparator接口覆盖compare方法将该类对象作为参数传递给TreeSet集合的构造函数

 

15.2.3.1 HashSet

(示例: basic.coll.collection.set.HashSetDemo)

    该类实现了HashMap, 允许所有元素包括null. 但是不允许重复的键

    底层实现:底层使用HashMap保存数据其中对象作为mapkey, 所以不允许存在重复的键所以Set不可重复. HashSet集合数据结构是哈希表所以存储元素的时候使用的元素的hashCode方法来确定位置如果位置相同在通过元素的equals来确定是否相同

    语法HashSet<Object> list = new HashSet<Object>();

方法(所有方法均加了synchronized关键字只列出基于Set扩展的): 

分类

方法

说明

构造

HashSet()

造一个新的空set, 其底层HashMap实例的默认初始容量是 16, 加载因子是0.75

HashSet(Collection<? extends E> c)

构造一个包含指定collection中的元素的新 set

HashSet(int initialCapacity, float loadFactor)

构造一个新的空set, 其底层HashMap实例具有指定的初始容量和指定的加载因子

HashSet(int initialCapacity)

构造一个新的空set, 其底层HashMap实例具有指定的初始容量和默认的加载因子(0.75)

克隆

Object clone()

返回此HashSet实例的浅表副本并没有复制这些元素本身浅克隆

 

15.2.3.2 LinkedHashSet(HashSet的子类)

(示例: basic.coll.collection.set.LinkedHashSetDemo)

    该类实现了HashMap, 允许所有元素包括null. 但是不允许重复的键(有序)

    底层实现:底层使用HashMap保存数据其中对象作为mapkey, 所以不允许存在重复的键所以Set不可重复. HashSet集合数据结构是哈希表所以存储元素的时候使用的元素的hashCode方法来确定位置如果位置相同在通过元素的equals来确定是否相同

    具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现此实现与HashSet的不同之外在于后者维护着一个运行于所有条目的双重链接列表此链接列表定义了迭代顺序即按照将元素插入到set中的顺序(插入顺序)进行迭代

    优点:删除和插入效率高

    缺点:检索元素效率低

    语法LinkedHashSet<Object> list = new LinkedHashSet<Object>();

方法(只列出基于Set扩展的): 

分类

方法

说明

构造

LinkedHashSet()

构造一个带默认初始容量(16)和加载因子(0.75)的新空链接哈希set

LinkedHashSet(int initialCapacity)

构造一个带指定初始容量和默认加载因子(0.75)的新空链接哈希set

LinkedHashSet(int initialCapacity, float loadFactor)

构造一个带有指定初始容量和加载因子的新空链接哈希set

LinkedHashSet(Collection<? extends E> c)

构造一个与指定collection中的元素相同的新链接哈希set

 

15.2.3.3 TreeSet

(示例: basic.coll.collection.set.TreeSetDemo)

    该类基于TreeMapNavigableSet实现允许所有元素不允许包括null. 但是不允许重复的键

    底层实现:底层基于TreeMapNavigableSet保存数据其中对象作为mapkey, 所以不允许存在重复的键所以Set不可重复. HashSet集合数据结构是哈希表所以存储元素的时候使用的元素的hashCode方法来确定位置如果位置相同在通过元素的equals来确定是否相同

    优点:删除和插入效率高

    缺点:检索元素效率低

    语法TreeSet<Object> list = new TreeSet<Object>();

方法(只列出基于Set扩展的): 

分类

方法

说明

构造

TreeSet()

构造一个新的空set, set根据其元素的自然顺序进行排序

TreeSet(NavigableMap<E,Object> m)

 

TreeSet(Comparator<? super E> comparator)

构造一个新的空TreeSet, 它根据指定比较器进行排序

TreeSet(Collection<? extends E> c)

构造一个包含指定collection元素的新 TreeSet, 它按照其元素的自然顺序进行排序

TreeSet(SortedSet<E> s)

构造一个与指定有序set具有相同映射关系和相同排序的新TreeSet

获取

Iterator<E> descendingIterator()

返回在此set元素上按降序进行迭代的迭代器

NavigableSet<E> descendingSet()

返回此set中所包含元素的逆序视图

NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)

返回此set的部分视图其元素范围从fromElementtoElement

NavigableSet<E> headSet(E toElement, boolean inclusive)

返回此set的部分视图其元素小于(或等于如果inclusivetrue)toElement

NavigableSet<E> tailSet(E fromElement, boolean inclusive)

返回此set的部分视图其元素大于(或等于如果inclusivetrue)fromElement

SortedSet<E> subSet(E fromElement, E toElement)

返回此set的部分视图其元素从fromElement(包括)toElement(不包括)

SortedSet<E> headSet(E toElement)

返回此set的部分视图其元素严格小于toElement

SortedSet<E> tailSet(E fromElement)

返回此set的部分视图其元素大于等于fromElement

Comparator<? super E> comparator()

返回对此set中的元素进行排序的比较器如果此set使用其元素的自然顺序则返回null

E first()

返回此set中当前第一个(最低)元素

E last()

返回此set中当前最后一个(最高)元素

E lower(E e)

返回此set中严格小于给定元素的最大元素如果不存在这样的元素则返回 null

E floor(E e)

返回此 set 中小于等于给定元素的最大元素如果不存在这样的元素则返回 null

E ceiling(E e)

返回此 set 中大于等于给定元素的最小元素如果不存在这样的元素则返回 null

E higher(E e)

返回此 set 中严格大于给定元素的最小元素如果不存在这样的元素则返回 null

E pollFirst()

获取并移除第一个(最低)元素如果此set为空则返回null

E pollLast()

获取并移除最后一个(最高)元素如果此set为空则返回 null

Object clone()

返回TreeSet实例的浅表副本浅克隆

 

15.2.4 Collection泛型

jdk1.5出现的安全机制不用<>就是Object类型

好处:1).将运行时期的问题ClassCastException转到了编译时期(编写代码时期)

      2).避免了强制转换的麻烦

泛型<>什么时候用?(泛型类同理

    当操作的引用数据类型不确定的时候就使用<>. 将要操作的引用数据类型传入即可其实<>就是一个用于接收具体引用数据类型的参数范围

在程序中,只要用到了带有<>的类或者接口就要明确传入的具体引用数据类型】

    泛型技术是给编译器使用的技术用于编译时期确保了类型的安全运行时会将泛型去掉生成的class文件中是不带泛型的这个称为泛型的擦除为了兼容运行的类加载器所以擦除

    泛型的补偿在运行时通过获取元素的类型进行转换动作不用使用者再强制转换了

泛型的通配符未知类型(定义泛型函数时候)

    ? extends E:接收E类型或者E的子类型对象(上限). 一般存储对象的时候用比如添加元素addAll

    ? super E:接收E类型或者E的父类型对象(下限). 一般取出对象的时候用比如比较器

 

15.2.7 使用集合的技巧

需要唯一吗?

    |-- 需要: set

        |--需要制定顺序吗?

           |-- 需要: TreeSet

           |--不需要: HashSet, 但是想要一个和存储一致的顺序(有序) : LinkedHashSet

    |-- 不需要: List

        |--需要频繁增删吗?

           |--需要: LinkedList

           |-- 不需要: ArrayList

前缀名集合的数据结构: array, linked, hash, tree

后缀名集合所属的体系: List, Set

记忆方法

    array: 数组查询快有角标

    linked: 链表增删快, add get remove + first last方法

    hash: 哈希表唯一性元素需要覆盖hashcode方法和equals方法

    tree: 二叉树排序两个接口: Comparable, Comparator

而且通常这些常用的集合容器都是不同步的

显示的2种方式

1).迭代器: Iterator(3个方法) [Collection子类用的]

    1).hasNext()  是否还有下一个元素.
    2).next()  
返回下一个元素.
    3).remove()  
删除当前元素.

       Iterator<String>ltss.iterator();

       while(lts.hasNext()) {

           System.out.println(lts.next());

       }

2).枚举: Enumeration(2个方法) [Vector使用的]

    1).boolean hasMoreElements()        

    2).Object nextElement()

       Enumeration<String>env.elements();

       while(en.hasMoreElements()){

           System.out.println("en.nextElement(): "en.nextElement());

       }

3).IteratorEnumeration的区别

    Iterator是用来替代Enumeration, Enumeration中只定义了两个方法不具备删除功能.

4).调用next()方法后才可以调用remove()方法

    而且每次调用next()后最多只能调用一次remove()方法否则抛出IllegalStateException异常.

 

 

15.3 Map

    Map(双列集合): 一次添加一对元素<K,V>, 存储的是键值对保证键的唯一性

    Map接口提供了将键映射到值得对象一个映射不能包含重复的键每个键最多只能映射到一个值

    由于Map集合中的元素是通过key, value进行存储的要获取集合中指定的key值或value需要先通过相应的方法获取key集合或value集合再遍历key集合或value集合获取指定值

 

15.3.1 框架的顶层Map接口

(示例: basic.coll.map.MapDemo)

Map常用的子类

    |-- Hashtable内部结构是哈希表是同步的不允许null作为键, null作为值

       |-- Properties用来存储键值对型的配置文件的信息可以和IO技术相结合.  

    |-- HashMap内部结构是哈希表不是同步的允许null作为键, null作为值无序

       |-- LinkedHashMap有序哈希Map

    |-- TreeMap内部结构是二叉树不是同步的可以对Map集合中的键进行排序

Map接口中的常用方法

分类

方法

说明

添加

V put(K key, V value)

向集合中添加指定的keyvalue的映射关系

void putAll(Map<? extends K, ? extends V> m)

添加一个map集合进去

删除

V remove(Object key)

根据指定的key删除这个键值对

boolean remove(Object key, Object value)

JDK1.8, 子类实现

void clear()

清空map集合

判断

boolean containsKey(Object key)

如果此映射包含指定键的映射关系则返回true

boolean containsValue(Object value)

如果此映射将一个或多个键映射到指定值则返回true

boolean equals(Object o)

比较的是元素是否相同

boolean isEmpty()

判断集合是否有元素

获取

int size()

获取键值对的个数

V get(Object key)

如果存在指定的键对象则返回该对象对应的值否则返回null

V getOrDefault(Object key, V defaultValue)

JDK1.8, 子类实现

Set<K> keySet()

返回该集合中的所有键对象组成的Set集合

Collection<V> values()

返回该集合中所有值对象形成的Collection集合

Set<Map.Entry<K, V>> entrySet()

 

void forEach(BiConsumer<? super K, ? super V> action)

JDK1.8, 子类实现

JDK1.8

子类实现

V replace(K key, V value)

 

boolean replace(K key, V oldValue, V newValue)

 

void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

 

V putIfAbsent(K key, V value)

 

V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

 

V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

 

V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

 

V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

 

遍历Map数据总结:

    1).Collection方法只遍历value

    Collection<String>valuesm1.values();

    Iterator<String>it1values.iterator();

    while(it1.hasNext()) {

       System.out.println(it1.next());

    }

    2).keySet方法(取出map中的所有元素)

    原理:通过keySet方法获取map中所有的键所在的Set集合在通过Set的迭代器获取到每一个键再对每一个键通过map集合的get方法获取其对应的值即可

    Set<Integer>keySetm1.keySet();

    Iterator<Integer>itskeySet.iterator();

    while(its.hasNext()) {

       Integer keyits.next();

       String valuem1.get(key);

       System.out.print("{key="key", value="value"},");

    }

    3).entrySet方法,效率最高

    通过Map转成set就可以迭代找到了另一个方法. entrySet。该方法将键和值的映射关系作为对象存储到了Set集合中而这个映射关系的类型就是Map.Entry类型

    Set<Map.Entry<Integer, String>> entrySetm1.entrySet();

    Iterator<Map.Entry<Integer, String>> itentrySet.iterator();

    while(it.hasNext()) {

       Map.Entry<Integer, String> meit.next();

       Integer keyme.getKey();

       String valueme.getValue();

       System.out.print("{key="key", value="value"},");

    }

    4).JDK1.8新特性, forEach方法

    m1.forEach((keyvalue) -> {

       System.out.print("{key="key", value="value"},");

    });

 

15.3.2 Map接口的实现类

    Map接口常用的实现类有HashMapTreeMap, 通常建议使用HashMap实现类实现Map集合因为由HashMap类实现的Map集合对于添加和删除映射关系效率更高.

    HashMap是基于哈希表的Map接口的实现, HashMap通过哈希吗对其内部的映射关系进行快速查找HashMap类实现的Map集合对于添加或删除映射关系效率较高TreeMap中的映射关系存在一定的顺序如果希望Map集合中的对象存在一定的顺序应该使用TreeMap类实现Map集合.

 

15.3.2.1 HashMap

(示例: basic.coll.map.HashMapDemo)

    该类基于哈希表的Map接口的实现此实现提供所有可选的映射操作并允许使用null值和null但必须保证键的唯一性. HashMap通过哈希对其内部的映射关系进行快速查找此类不保证映射的顺序特别是不保证该顺序恒久不变(无序).

    底层实现:Node<K, V> implements Map.Entry<K,V>, 内置对象实现(链表) + 数组的方式

    语法HashMap<K, V> list = new HashMap<K, V>();

方法(只列出基于Map扩展的, JDK1.8方法均由该类实现): 

分类

方法

说明

构造

HashMap()

构造一个具有默认初始容量(16)和默认加载因子(0.75)的空HashMap

HashMap(int initialCapacity)

构造一个带指定初始容量和默认加载因子(0.75)的空HashMap

HashMap(int initialCapacity, float loadFactor)

构造一个带指定初始容量和加载因子的空HashMap

HashMap(Map<? extends K, ? extends V> m)

构造一个映射关系与指定Map相同的新HashMap

获取

V getOrDefault(Object key, V defaultValue)

JDK1.8

void forEach(BiConsumer<? super K, ? super V> action)

JDK1.8

删除

boolean remove(Object key, Object value)

JDK1.8

JDK1.8

V replace(K key, V value)

 

boolean replace(K key, V oldValue, V newValue)

 

void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

 

V putIfAbsent(K key, V value)

 

V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

 

V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

 

V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

 

V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

 

克隆

Object clone()

浅克隆

 

15.3.2.2 TreeMap

(示例: basic.coll.map.TreeMapDemo)

    该类不仅实现了Map接口还实现了java.util.SortedMap接口因此集合中的映射关系具有一定的顺序但在添加、删除和定位映射关系上, TreeMap类比HashMap性能差一点

    由于TreeMap类实现的Map集合中的映射关系是根据键对象按照一定的顺序排列的因此不允许键对象是null

    可以通过HashMap类创建Map集合当需要顺序输出时再创建一个完成相同映射关系的TreeMap类实例

方法(只列出基于Map扩展的, JDK1.8方法均由该类实现): 

分类

方法

说明

构造

TreeMap ()

使用键的自然顺序构造一个新的、空的树映射

TreeMap(Comparator<? super K> comparator)

构造一个新的、空的树映射该映射根据给定比较器进行排序

TreeMap(Map<? extends K, ? extends V> m)

构造一个与给定映射具有相同映射关系的新的树映射该映射根据其键的自然顺序进行排序

TreeMap(SortedMap<K, ? extends V> m)

构造一个与指定有序映射具有相同映射关系和相同排序顺序的新的树映射

获取

Map.Entry<K,V> firstEntry()

返回一个与此映射中的最小键关联的键-值映射关系如果映射为空则返回null

K firstKey()

返回此映射中当前第一个(最低)

Map.Entry<K,V> lastEntry()

返回与此映射中的最大键关联的键-值映射关系如果映射为空则返回null

K lastKey()

返回映射中当前最后一个(最高)

Map.Entry<K,V> pollFirstEntry()

移除并返回与此映射中的最小键关联的键-值映射关系如果映射为空则返回null

Map.Entry<K,V> pollLastEntry()

移除并返回与此映射中的最大键关联的键-值映射关系如果映射为空则返回null

Map.Entry<K,V> floorEntry(K key)

返回一个键-值映射关系它与小于等于给定键的最大键关联如果不存在这样的键则返回 null

K floorKey(K key)

返回小于等于给定键的最大键如果不存在这样的键则返回null

Map.Entry<K,V> ceilingEntry(K key)

返回一个键-值映射关系它与大于等于给定键的最小键关联如果不存在这样的键则返回 null

K ceilingKey(K key)

返回大于等于给定键的最小键如果不存在这样的键则返回null

Map.Entry<K,V> higherEntry(K key)

返回一个键-值映射关系它与严格大于给定键的最小键关联如果不存在这样的键则返回null

K higherKey(K key)

返回严格大于给定键的最小键如果不存在这样的键则返回null

Map.Entry<K,V> lowerEntry(K key)

返回一个键-值映射关系它与严格小于给定键的最大键关联如果不存在这样的键则返回null

K lowerKey(K key)

返回严格小于给定键的最大键如果不存在这样的键则返回nul

Comparator<? super K> comparator()

返回对此映射中的键进行排序的比较器如果此映射使用键的自然顺序则返回null

NavigableSet<K> navigableKeySet()

返回此映射中所包含键的NavigableSet视图

NavigableSet<K> descendingKeySet()

返回此映射中所包含键的逆序NavigableSet视图

NavigableMap<K, V> descendingMap()

返回此映射中所包含映射关系的逆序视图

SortedMap<K,V> headMap(K toKey)

返回此映射的部分视图其键值严格小于toKey

NavigableMap<K,V> headMap(K toKey, boolean inclusive)

返回此映射的部分视图其键小于(或等于如果inclusivetrue)toKey

SortedMap<K,V> tailMap(K fromKey)

返回此映射的部分视图其键大于等于fromKey

NavigableMap<K,V> tailMap(K fromKey, boolean inclusive)

返回此映射的部分视图其键大于(或等于如果inclusivetrue)fromKey

SortedMap<K,V> subMap(K fromKey, K toKey)

返回此映射的部分视图其键值的范围从fromKey(包括)toKey(不包括)

NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)

返回此映射的部分视图其键的范围从fromKeytoKey

void forEach(BiConsumer<? super K, ? super V> action)

JDK1.8

JDK1.8

V replace(K key, V value)

 

boolean replace(K key, V oldValue, V newValue)

 

void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

 

克隆

Object clone()

返回此TreeMap实例的浅表副本,  浅克隆

 

15.3.2.3 Hashtable

(示例: basic.coll.map.HashtableDemo)

    此类实现一个哈希表该哈希表将键映射到相应的值任何null对象都可以用作键或值为了成功地在哈希表中存储和获取对象用作键的对象必须实现hashCode方法和equals方法所有方法均加了synchronized(即同步

    底层实现:Node<K, V> implements Map.Entry<K,V>, 内置对象实现(链表) + 数组的方式

方法(只列出基于Map扩展的, JDK1.8方法均由该类实现): 

分类

方法

说明

构造

Hashtable()

用默认的初始容量(11)和加载因子(0.75)构造一个新的空哈希表

Hashtable(int initialCapacity)

用指定初始容量和默认的加载因子(0.75)构造一个新的空哈希表

Hashtable(int initialCapacity, float loadFactor)

用指定初始容量和指定加载因子构造一个新的空哈希表

Hashtable(Map<? extends K, ? extends V> t)

构造一个与给定的Map具有相同映射关系的新哈希表

获取

synchronized Enumeration<K> keys()

返回此哈希表中的键的枚举

synchronized Enumeration<V> elements()

返回此哈希表中的值的枚举

synchronized Object clone()

创建此哈希表的浅表副本浅克隆

synchronized String toString()

返回此Hashtable对象的字符串表示形式其形式为ASCII字符","(逗号加空格)分隔开的、括在括号中的一组条目

synchronized boolean equals(Object o)

按照Map接口的定义比较指定Object与此Map是否相等

synchronized int hashCode()

按照Map接口的定义返回此Map的哈希码值

JDK1.8

synchronized V getOrDefault(Object key, V defaultValue)

 

synchronized void forEach(BiConsumer<? super K, ? super V> action)

 

synchronized void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)

 

synchronized V putIfAbsent(K key, V value)

 

synchronized boolean remove(Object key, Object value)

 

synchronized boolean replace(K key, V oldValue, V newValue)

 

synchronized V replace(K key, V value)

 

synchronized V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction)

 

synchronized V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

 

synchronized V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction)

 

synchronized V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)

 

 

15.3.2.4 Properties(Hashtable子类)

(示例: basic.coll.map.PropertiesDemo)

Map常用的子类

    |--Hashtable :内部结构是哈希表, 是同步的. 不允许null作为键, null作为值. 

       |--Properties:用来存储键值对型的配置文件的信息, 可以和IO技术相结合. 

    Properties类表示了一个持久的属性集. Properties可保存在流中或从流中加载

特点: 1.该集合中的键和值都是字符串类型

     2.集合中的数据可以保存到流中, 或从流中获取

通过该集合用于操作以键值对形式存在配置文件

分类

方法

说明

构造

Properties()

创建一个无默认值的空属性列表

Properties(Properties defaults)

创建一个带有指定默认值的空属性列表

操作

String getProperty(String key)

用指定的键在此属性列表中搜索属性

String getProperty(String key, String defaultValue)

用指定的键在属性列表中搜索属性

synchronized Object setProperty(String key, String value)

调用 Hashtable 的方法 put

获取

Enumeration<?> propertyNames()

返回属性列表中所有键的枚举如果在主属性列表中未找到同名的键则包括默认属性列表中不同的键

Set<String> stringPropertyNames()

返回此属性列表中的键集其中该键及其对应值是字符串如果在主属性列表中未找到同名的键则还包括默认属性列表中不同的键

其他

synchronized void load(Reader reader)

按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)

synchronized void load(InputStream inStream)

从输入流中读取属性列表(键和元素对)

void save(OutputStream out, String comments)

已过时如果在保存属性列表时发生I/O错误则此方法不抛出IOException. 保存属性列表的首选方法是通过store(OutputStream out, String comments)方法或storeToXML(OutputStream os, String comment)方法来进行

void store(Writer writer, String comments)

以适合使用load(Reader)方法的格式将此Properties表中的属性列表(键和元素对)写入输出字符

void store(OutputStream out, String comments)

以适合使用load(InputStream)方法加载到Properties表中的格式将此Properties表中的属性列表(键和元素对)写入输出流

synchronized void loadFromXML(InputStream in)

将指定输入流中由XML文档所表示的所有属性加载到此属性表中

void storeToXML(OutputStream os, String comment)

发出一个表示此表中包含的所有属性的XML文档

void storeToXML(OutputStream os, String comment, String encoding)

使用指定的编码发出一个表示此表中包含的所有属性的XML文档

void list(PrintStream out)

将属性列表输出到指定的输出流

void list(PrintWriter out)

将属性列表输出到指定的输出流

    因为Properties继承于Hashtable, 所以可对Properties对象应用putputAll方法不建议使用这两个方法因为它们允许调用者插入其键或值不是String的项相反应该使用setProperty方法如果在"不安全"Properties对象(即包含非String的键或值)上调用storesave方法则该调用将失败

    类似地如果在"不安全"Properties对象(即包含非String的键)上调用propertyNameslist方法则该调用将失败

    load(Reader)/store(Writer, String)方法按下面所指定的、简单的面向行的格式在基于字符的流中加载和存储属性除了输入/输出流使用ISO 8859-1字符编码外, load(InputStream)/store(OutputStream, String)方法与load(Reader)/store(Writer, String)对的工作方式完全相同可以使用Unicode转义来编写此编码中无法直接表示的字符转义序列中只允许单个'u'字符可使用native2ascii工具对属性文件和其他字符编码进行相互转换

    loadFromXML(InputStream)storeToXML(OutputStream, String, String)方法按简单的XML 格式加载和存储属性默认使用UTF-8字符编码但如果需要可以指定某种特定的编码. XML属性文档具有以下DOCTYPE声明: <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">

 

15.3.2.5 LinkedHashMap(HashMap子类)

(示例: basic.coll.map.LinkedHashMapDemo)

    Map 接口的哈希表和链接列表实现具有可预知的迭代顺序此实现与HashMap的不同之处在于该类维护着一个运行于所有条目的双重链接列表是有序的HashMap

方法(只列出基于Map扩展的, JDK1.8方法均由该类实现): 

分类

方法

说明

构造

LinkedHashMap()

构造一个带默认初始容量(16)和加载因子(0.75)的空插入顺序LinkedHashMap实例

LinkedHashMap(int initialCapacity)

构造一个带指定初始容量和默认加载因子(0.75)的空插入顺序LinkedHashMap实例

LinkedHashMap(int initialCapacity, float loadFactor)

构造一个带指定初始容量和加载因子的空插入顺序LinkedHashMap实例

LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

构造一个映射关系与指定映射相同的插入顺序LinkedHashMap实例

LinkedHashMap(Map<? extends K, ? extends V> m)

构造一个带指定初始容量、加载因子和排序模式的空LinkedHashMap实例

 

15.4 迭代器

    利用Iterator接口创建迭代器, Iterator接口位于java.util包下. Iterator接口有3个方法:

        1).hasNext(): 如果仍有元素可以迭代则返回true

        2).next(): 返回迭代的下一个元素

        3).remove(): 从迭代器指向的collection中移除迭代器返回的最后一个元素(可选操作)

    LisIterator接口继承了Iterator接口

 

15.5 Collections(集合框架工具类)

(示例: basic.demo15.CollectionsDemo)

    此类完全由在collection上进行操作或返回collection 的静态方法组成它包含在collection上操作的多态算法"包装器", 包装器返回由指定collection支持的新collection, 以及少数其他内容

: Collections工具类方法

方法(均为static静态方法)

说明

<T extends Comparable<? super T>> void sort(List<T> list)

根据元素的自然顺序对指定列表按升序进行排序

<T> void sort(List<T> list, Comparator<? super T> c)

根据指定比较器产生的顺序对指定列表进行排序

<T> int binarySearch(List<? extends Comparable<? super T>> list, T key)

使用二分搜索法搜索指定列表以获得指定对象

<T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)

使用二分搜索法搜索指定列表以获得指定对象

void reverse(List<?> list)

反转指定列表中元素的顺序

void shuffle(List<?> list)

使用默认随机源对指定列表进行置换

void shuffle(List<?> list, Random rnd)

使用指定的随机源对指定列表进行置换

void swap(List<?> list, int i, int j)

在指定列表的指定位置处交换元素

<T> void fill(List<? super T> list, T obj)

使用指定元素替换指定列表中的所有元素

<T> void copy(List<? super T> dest, List<? extends T> src)

将所有元素从一个列表复制到另一个列表

<T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)

根据元素的自然顺序返回给定collection的最小元素

<T> T min(Collection<? extends T> coll, Comparator<? super T> comp)

根据指定比较器产生的顺序返回给定collection的最小元素

<T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

根据元素的自然顺序返回给定collection的最大元素

<T> T max(Collection<? extends T> coll, Comparator<? super T> comp)

根据指定比较器产生的顺序返回给定collection的最大元素

void rotate(List<?> list, int distance)

根据指定的距离轮换指定列表中的元素

<T> boolean replaceAll(List<T> list, T oldVal, T newVal)

使用另一个值替换列表中出现的所有某一指定值

int indexOfSubList(List<?> source, List<?> target)

返回指定源列表中第一次出现指定目标列表的起始位置如果没有出现这样的列表则返回 -1

int lastIndexOfSubList(List<?> source, List<?> target)

返回指定源列表中最后一次出现指定目标列表的起始位置如果没有出现这样的列表则返回 -1

<T> Collection<T> unmodifiableCollection(Collection<? extends T> c)

返回指定collection的不可修改视图

<T> Set<T> unmodifiableSet(Set<? extends T> s)

返回指定set的不可修改视图

<T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)

返回指定有序set的不可修改视图

<T> NavigableSet<T> unmodifiableNavigableSet(NavigableSet<T> s)

 

<T> List<T> unmodifiableList(List<? extends T> list)

返回指定列表的不可修改视图

<K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m)

返回指定映射的不可修改视图

<K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m)

返回指定有序映射的不可修改视图

<K,V> NavigableMap<K,V> unmodifiableNavigableMap(NavigableMap<K, ? extends V> m)

 

<T> Collection<T> synchronizedCollection(Collection<T> c)

返回指定collection支持的同步(线程安全的)collection

<T> Set<T> synchronizedSet(Set<T> s)

返回指定set支持的同步(线程安全的)set

<T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)

返回指定有序 set 支持的同步(线程安全的)有序set

<T> NavigableSet<T> synchronizedNavigableSet(NavigableSet<T> s)

 

<T> List<T> synchronizedList(List<T> list)

返回指定列表支持的同步(线程安全的)列表

<K,V> Map<K,V> synchronizedMap(Map<K,V> m)

返回由指定映射支持的同步(线程安全的)映射

<K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)

返回指定有序映射支持的同步(线程安全的)有序映射

<K,V> NavigableMap<K,V> synchronizedNavigableMap(NavigableMap<K,V> m)

 

<E> Collection<E> checkedCollection(Collection<E> c, Class<E> type)

返回指定collection的一个动态类型安全视图

<E> Queue<E> checkedQueue(Queue<E> queue, Class<E> type)

 

<E> Set<E> checkedSet(Set<E> s, Class<E> type)

返回指定set的一个动态类型安全视图

<E> SortedSet<E> checkedSortedSet(SortedSet<E> s, Class<E> type)

返回指定有序set的一个动态类型安全视图

<E> NavigableSet<E> checkedNavigableSet(NavigableSet<E> s, Class<E> type)

 

<E> List<E> checkedList(List<E> list, Class<E> type)

返回指定列表的一个动态类型安全视图

<K, V> Map<K, V> checkedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType)

返回指定映射的一个动态类型安全视图

<K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K, V> m, Class<K> keyType, Class<V> valueType)

返回指定有序映射的一个动态类型安全视图

<K,V> NavigableMap<K,V> checkedNavigableMap(NavigableMap<K, V> m, Class<K> keyType, Class<V> valueType)

 

<T> Iterator<T> emptyIterator()

 

<T> ListIterator<T> emptyListIterator()

 

<T> Enumeration<T> emptyEnumeration()

 

<T> Set<T> emptySet()

返回空的set(不可变的)

<E> SortedSet<E> emptySortedSet()

 

<E> NavigableSet<E> emptyNavigableSet()

 

final <T> List<T> emptyList()

返回空的列表(不可变的)

final <K,V> Map<K,V> emptyMap()

返回空的映射(不可变的)

final <K,V> SortedMap<K,V> emptySortedMap()

 

final <K,V> NavigableMap<K,V> emptyNavigableMap()

 

<T> Set<T> singleton(T o)

返回一个只包含指定对象的不可变set

<T> List<T> singletonList(T o)

返回一个只包含指定对象的不可变列表

<K,V> Map<K,V> singletonMap(K key, V value)

返回一个不可变的映射它只将指定键映射到指定值

<T> List<T> nCopies(int n, T o)

返回由指定对象的n个副本组成的不可变列表

<T> Comparator<T> reverseOrder()

返回一个比较器它强行逆转实现了Comparable接口的对象collection的自然顺序

<T> Comparator<T> reverseOrder(Comparator<T> cmp)

返回一个比较器它强行逆转指定比较器的顺序

<T> Enumeration<T> enumeration(final Collection<T> c)

返回一个指定collection上的枚举

<T> ArrayList<T> list(Enumeration<T> e)

返回一个数组列表它按返回顺序包含指定枚举返回的元素

int frequency(Collection<?> c, Object o)

返回指定collection中等于指定对象的元素数

boolean disjoint(Collection<?> c1, Collection<?> c2)

如果两个指定collection中没有相同的元素则返回true

<T> boolean addAll(Collection<? super T> c, T... elements)

将所有指定元素添加到指定collection

<E> Set<E> newSetFromMap(Map<E, Boolean> map)

返回指定映射支持的 set

<T> Queue<T> asLifoQueue(Deque<T> deque)

以后进先出(Lifo) Queue的形式返回某个Deque的视图

 

 

 

转载于:https://my.oschina.net/vwFisher/blog/2209599

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值