11 集合

 

1 Collection接口

  常用的方法:

    add(Object e) 确保此 collection 包含指定的元素(可选操作)。

    size(): 获取集合中元素的个数

    remove(Object e): 移除元素

    clear(): 清空集合中元素

    contains(Object e): 判断集合中是否包含指定的元素

    isEmpty(): 判断集合是否为空

    iterator(): 获取集合对应的迭代器。

  元素数组和集合的区别:

   数组:一旦声明了数组长度无法改变,只能保持指定的数据类型,元素的数据类型必须相同,不能混排。

   集合:长度和动态扩容类型可以是任何类型,可以混合使用。

2 List接口(Collection接口)

  LIst接口存储一组不唯一,有序(插入顺序)的对象。

   ----ArrayList:在内存中存储位置是连续的,线性结构(可变长度的数组),随机访问或遍历效率较高,但插入和删除元素效率较低.

   ----LinkedList:在内存中存储位置是不连续的,链表结构,插入和删除元素时效率较高,但随机访问或遍历效率较低。

2.1 ArrayList

  ArrayList可以看作可变长度的数组,本质上就是通过数组实现的,在内存中存储空间是连续的。

  优点:随机访问或遍历时效率较高。

  缺点:添加和删除元素时效率较低。

  常用的构造方法

    ArrayList()  构造一个初始容量为 10 的空列表。

    ArrayList(int initialCapacity)  构造一个具有指定初始容量的空列表。

    egCollection list = new ArrayList();

  常用的方法:

    add(Object e):将元素添加到集合中。

      --Object get(int index):获取指定下标位置的元素.

         *在调用add方法添加元素时,该元素会向上转型为Object类型,所有使用get方法获取是返回值为Object

   add(int index, E element) 将指定的元素插入此列表中的指定位置。

   get(int index) 返回此列表中指定位置上的元素。下标从0开始

   addAll(Collection<? extends E> c) 按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。

   set(int index, E element)用指定的元素替代此列表中指定位置上的元素。

   remove(int index)移除此列表中指定位置上的元素。

   remove(Object o) 移除此列表中首次出现的指定元素(如果存在)。

  泛型:限定集合中元素的类型。一旦对集合使用泛型,该集合中能容纳的元素类型就固定了。

   语法:List<E> list = new ArrayList<E>();  E为数据类型

   优点:1)可以避免强制转换

           2)可以消除黄色的警告。

2.2 LinkedList

  LinkedList: 采用的链表结构进行存储,在内存中存储位置是不连续的,插入和删除元素时效率较高,但随机访问或遍历效率较低。

  优点:添加和删除元素是效率较高

  缺点:随机访问或遍历时效率较低。

  常用方法:

   add(Object o):将指定元素添加到此列表的结尾。

   add(int index, E element)在此列表中指定的位置插入指定的元素。

   addFirst(E e) 将指定元素插入此列表的开头。(LinkedList特有的)

   addLast(E e)将指定元素添加到此列表的结尾。(LinkedList特有的)

   getFirst() 返回此列表的第一个元素。

   getLast() 返回此列表的最后一个元素。

   removeFirst() 移除并返回此列表的第一个元素。

   removeLast() 移除并返回此列表的最后一个元素。

2.3 Vector

     Vector类似与ArrayList的线性结构,Vector是基于线程安全的,在多线程中使用;ArrayList是非线程安全的,效率较高。

2.4 Stack/Quence

  StackLIFO/FILO:后进先出(Last In First Out),先进后出(First In Last Out)

  ---类似于玩具枪的弹夹,第一个压进去的子弹最后一个弹出

  ---入栈(压栈):将元素添加到栈中。

  ---出栈(弹栈):将元素从栈的顶部移除。

  Quence队列FIFO:先进先出(First In First Out)

2.5 Iterator接口

  java.util.Iterator接口:对 collection 进行迭代的迭代器。

    boolean hasNext()   如果仍有元素可以迭代,则返回 true

    next() 返回迭代的下一个元素。

  使用迭代器进行遍历:

  Iterator<String> iter = list.iterator();

  while(iter.hasNext()){

  String str = iter.next();

  System.out.println(str);

  }

3 Set接口(Collection接口)

  Set接口: 无序,唯一(不重复)

3.1HashSet

  HashSet:采用哈希表(散列表)的方式存储。

  优点:查询,添加,删除效率较高

  缺点:无序(添加顺序)

  常用的构造方法:

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

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

  常用的方法:

   add(E e)如果此 set 中尚未包含指定元素,则添加指定元素。

   clear() 从此 set 中移除所有元素。

   contains(Object o) 如果此 set 包含指定元素,则返回 true

   iterator()  返回对此 set 中元素进行迭代的迭代器。

   size()返回此 set 中的元素的数量(set 的容量)。

   remove(Object o)如果指定元素存在于此 set 中,则将其移除。

 

  HashSet如何保证其元素的唯一性?

  在添加元素时调用hashCode()获取元素的哈希码,判断要添加元素的哈希码是否相同,如果相同调用equals方法比较内容是否相同;如果哈希码不相同,equals方法将不再调用。

  如果equals相同,hash码肯定相同;hash码相同,equals结果不一定相同。

3.2 LinkedHashSet

  LinkedHashSet继承了HashSet,采用的是哈希码+链表的结构进行存储,其中的元素有序(添加顺序)

  常用的构造方法

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

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

  常用的方法:

    add(Object a):添加元素

    remove(Object a):移除指定的元素

    contains(Object a):是否包含指定的元素

    size():获取元素的个数。

    iterator():返回一个迭代器

3.3 TreeSet

  TreeSet:采用二叉树的方式进行存储,其中元素有序(大小顺序)。要添加元素是必须实现Comparable接口或传入一个比较器(需要实现Comparator接口)。

  原理:当向TreeSet容器添加元素时,会将当前元素的值与根节点/父节点的值进行比较,

    如果比根节点/父节点的值大,保存在右子节点上;

    如果比根节点/父节点的值小,保存在左子节点上。

  优点:有序,查询速度比List要快(折半查找)

  常用的构造方法:

    TreeSet()  构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。插入该 set 的所有元素都必须实现 Comparable接口

    TreeSet(Comparator<? super E> comparator) 构造一个新的空 TreeSet,它根据指定比较器进行排序。

       常用的方法:

    add(Object o): 添加元素

    remove(Object o): 移除元素

    contains(Object o): 如果此 set 包含指定的元素,则返回 true

    size(): 返回 set 中的元素数(set 的容量)。

    iterator():返 回在此 set 中的元素上按升序进行迭代的迭代器

示例:在实现 Comparable接口时重写compareTo方法

  public class Student implements Comparable<Student>

  * 定义比较规则:

    比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数

  @Override

  public int compareTo(Student o) {

    // if(age>o.age){

    // return 1;

    // }else if(age==o.age){

    // return 0;

    // }else{

    // return -1;

    // }

    return age-o.age;

  }

4 Map接口

  Map接口并不是Collection接口的子接口,Map接口采用的键值对方式进行存储数据,提供keyvalue的映射。无序

4.1 HashMap

  HashMap:基于哈希表的 Map 接口的实现。

  常用的构造方法:

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

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

  常用方法:

     put(K key, V value) 在此映射中关联指定值与指定键。

     get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null

     size() 返回此映射中的键-值映射关系数。

     remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。

     clear() 从此映射中移除所有映射关系。

     containsKey(Object key)  如果此映射包含对于指定键的映射关系,则返回 true

     containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true

4.2 Hashtable

  HashtableHashMap类似,不同之处主要是以下两点:

  1HashMap是非线程安全的,而Hashtable是线程安全的

  2HashMap中的键和值都运行为null,Hashtable不允许。

4.3 LinkedHashMap

  java.util.LinkedHashMap:哈希表+链表结构,有序(添加顺序),继承了HashMap类。

  常用的构造方法:

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

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

  常用的方法:

    put(K key, V value) 在此映射中关联指定值与指定键。

    get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null

    size() 返回此映射中的键-值映射关系数。

       remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。

    clear() 从此映射中移除所有映射关系。

    containsKey(Object key)  如果此映射包含对于指定键的映射关系,则返回 true

    containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true

  * Set<K> keySet() 返回此映射中所包含的键的 Set 视图。

  * Set<Map.Entry<K,V>> entrySet() 返回此映射所包含的映射关系的 Set 视图。

4.4 TreeMap

  TreeMap采用二叉树的方式存储,与TreeSet类似。其中的元素有序(大小顺序)

  要求添加的元素必须是可比较大小

   1)实现Comparable接口

   2)创建一个比较器(实现Comparator接口)

  在添加元素时根据键的自然顺序进行存储数据。

  常用的构造函数:

    TreeMap() 使用键的自然顺序构造一个新的、空的树映射。 插入该映射的所有键都必须实现 Comparable 接口.

    TreeMap(Comparator<? super K> comparator)   构造一个新的、空的树映射,该映射根据给定比较器进行排序。

5 Collections

  Collections类是一个对Collection集合进行操作的工具类型,其中提供一些静态的工具方法方便操作。

  CollectionCollections的区别:

   1 CollectionListSet的父接口,而Collections是操作Collection集合的工具类。

   2Collections(Collection集合进行操作的工具类),类似Arrays(对数组进行操作的工具类),提供了若干个静态的方法以方便操作集合。

  常用的方法:

     addAll(Collection<? super T> c, T... elements) 将所有指定元素添加到指定 collection 中。

     sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。

     reverse(List<?> list)反转指定列表中元素的顺序。

     max(Collection<? extends T> coll) 根据元素的自然顺序,返回给定 collection 的最大元素。

     min(Collection<? extends T> coll) 根据元素的自然顺序 返回给定 collection 的最小元素。

     binarySearch(List<? extends Comparable<? super T>> list, T key) 使用二分搜索法搜索指定列表,以获得指定对象,必须根据列表元素的自然顺序对列表进行升序排序

  egCollections.sort(list);  //排序,默认按照升序进行排列

    Collections.reverse(list);  //反转:倒序输出

    int index = Collections.binarySearch(list, 9);  //二分查找:待查找的集合中元素必须有大小顺序

posted @ 2017-06-18 22:00  Nicepanda  阅读(144)  评论(0编辑  收藏  举报