zoukankan      html  css  js  c++  java
  • Java集合(Collection)综述

    1.集合简介

    数学定义:一般地,我们把研究对象统称为元素。把一些元素组成的总体叫做集合。

    java集合定义:集合就是一个放数据的容器,准确的说是放数据对象引用的容器。

    java中通用集合类存放于java.util包中。

    2.集合的实现

    实现集合(Collection)的数据类型有三种:

    • 1.集(set)无序、不重复

      Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。

      例如:HashSet 特例:TreeSet 有序的

    • 2.列表(list)有序、可重复

      List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,拥有一系列和索引相关的方法。

      例如ArrayList、LinkedList 等

    • 3.队列(Queue)

      队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

      在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。

      例如 ArrayBlockingQueue、LinkedBlockingQueue等。由于其难以管理,性能不稳定等特点,一般项目中很少使用。

    • 4.Map(映射)(键值对、键唯一、值不唯一)
      Map与collection的关系为依赖关系并不是其他三种的泛化关系。这一点要区分。

      例如 HashMap、TreeMap

    3.集合的层次关系

    所有的集合都继承与Collection,而Collection实现了Iterator接口。类图如下
    java集合
    依据实现分类

    | 接口实现 | 哈希表(Hash) |数组(Array)|平衡二叉树(Balanced Tree)| 链表(Linked List)|哈希表+链表(Hash + Linked List)|枚举(enum)|
    | :------------- | :------------- |:------------- |:------------- |:------------- |:------------- |
    |集(Set)|HashSet | |TreeSet||LinkedHashSet|EnumSet|
    |列表(List)| |ArrayList
    Stack||LinkedList|||
    |队列(Queue)| |ArrayBlockingQueue
    ArrayDeque
    PriorityQueue ||LinkedBlockingQueue|||
    |映射(Map)|HashMap
    HashTable
    WeakHashMap
    IdentityHashMap | |TreeMap||LinkedHashMap|EnumMap|
    后续的篇章中我将各个实现类逐个解析。

    4.抽象方法解读

    1.Iterator与Iterable接口

    定义迭代器,Iterator 接口中有三个方法:

    1.hasNext()是否还有下一个元素。

    2.next()返回下一个元素。

    3.remove()删除当前元素。

    定义是否能获取迭代器,Iterable 接口中的方法

    iterator() return Iterator 返回一个迭代器。提供一个获取迭代器的方法。

    2.Collection接口

    Collection接口中的方法:

    1.size() return int 集合中元素个数。

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    System.out.println(list1.size());
    

    结果 3

    2.isEmpty() return boolean 集合是否为空集合。

    List<String> list1 = new ArrayList<String>();
    System.out.println(list1.isEmpty());
    

    结果 true

    3.contains(Object o) return boolean 集合中是否包含该元素。

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    boolean isCont = list1.contains("3");
    System.out.println(isCont);
    

    结果: true

    4.iterator() return Iterator 返回一个迭代器与Iterable中的重复了。

    5.toArray() return Object[] 将所有元素以数组形式返回。

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    for(Object obj:list1.toArray()) {
      System.out.print(obj+" ");
    }
    

    结果 1 2 3

    6. T[] toArray(T[] a) 将所有元素按照约定的数据类型返回。 数据类型。

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    for(Object obj:list1.toArray(new String[4])) {
    System.out.print(obj+" ");
    }
    

    结果 1 2 3 null

    7.boolean add(E e); 添加元素

    8.boolean remove(Object o) 移除元素

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    System.out.println(list1);
    list1.remove("2");
    System.out.println(list1);
    

    结果

    [1, 2, 3]

    [1, 3]

    9.boolean containsAll(Collection<?> c) 当前集合是否包含传入集合的全部元素

    List<String> list1 = new ArrayList<String>();
    
    list1.add("1");
    list1.add("2");
    list1.add("3");
    
    List<String> list2 = new ArrayList<String>();
    list2.add("1");
    list2.add("2");
    System.out.print(list1.containsAll(list2));
    
    List<String> list3 = new ArrayList<String>();
    list3.add("1");
    list3.add("2");
    list3.add("4");
    System.out.print(list1.containsAll(list3));
    

    结果 true false

    10.boolean addAll(Collection<? extends E> c) 将传入的集合全部添加到该集合中。(引用添加,如果引用的内容变化该集合也变化)

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    List<String> list3 = new ArrayList<String>();
    list3.add("1");
    list3.add("2");
    list3.add("4");
    list1.addAll(list3);
    System.out.println(list1);
    

    结果 [1, 2, 3, 1, 2, 4]

    11.boolean removeAll(Collection<?> c) 移除该集合中包含传入集合的元素。

    List<String> list1 = new ArrayList<String>();
    
    list1.add("1");
    list1.add("2");
    list1.add("3");
    
    List<String> list2 = new ArrayList<String>();
    list2.add("1");
    list2.add("2");
    list1.removeAll(list2);
    System.out.println(list1);
    

    结果 [3]

    另外一个例子

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    List<String> list3 = new ArrayList<String>();
    list3.add("1");
    list3.add("2");
    list3.add("4");
    list1.removeAll(list3);
    System.out.println(list1);
    

    结果 [3]

    由此可见不管传入元素有多少不相同的元素list的实现是只移除传入集合中与调用集合中元素相同的部分。

    12.boolean retainAll(Collection<?> c) 保留该集合中相当于传入元素的集合,其他的元素删除。相当于 取两个集合的交集

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    List<String> list3 = new ArrayList<String>();
    list3.add("1");
    list3.add("2");
    list3.add("4");
    list1.retainAll(list3);
    System.out.println(list1);
    

    结果 [1, 2]

    13.void clear() 清空所有元素

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    list1.clear();
    System.out.println(list1);
    

    结果 []

    14.boolean equals(Object o) 判断是否相同

    15.int hashCode() 返回该集合的哈希值。

    3.AbstractCollection抽象方法

    该抽象方法实现了Collection接口除了统计大小未实现外其他方法都提供了一个简单的实现方式。

    4.ListIterator接口

    ListIterator继承了Iterator接口。由于list的下表操作性所以ListIterator在Iterator接口方法的基础上可以拓展很多下标特点的方法,比如在迭代中转向、修改元素、添加元素等。

    1.boolean hasPrevious() 是否有前一个

    2.E previous() 返回前一个元素

    3.int nextIndex() 下一个元素的下标

    4.int previousIndex() 前一个元素的下标

    5.void set(E e) 迭代中替换元素

    6.void add(E e) 迭代中添加元素

    5.List接口

    List接口继承了Collection接口中的所有方法并重新定义了Collection接口中方法的规范。添加了一些list专用的方法。

    1.E get(int index) 通过下标获取元素

    2.E set(int index, E element) 将元素放入集合

    3.void add(int index, E element) 添加新元素

    4.E remove(int index) 依据下标移除元素

    5.int indexOf(Object o) 查询元素位置从前往后找。

    6.int lastIndexOf(Object o) 查询元素位置从后往前找。

    7.ListIterator listIterator() 获取list迭代器。

    8.ListIterator listIterator(int index) 从该元素位置迭代到最后一个元素。

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    ListIterator<String> i = list1.listIterator(1);
    while(i.hasNext()) {
      System.out.println(i.next());
    }
    

    结果 2 3

    9.List subList(int fromIndex, int toIndex) 依据下标截取一段列表(list)

    List<String> list1 = new ArrayList<String>();
    list1.add("1");
    list1.add("2");
    list1.add("3");
    List<String> subList = list1.subList(1, 2);
    System.out.println(subList);
    
    

    结果 [2]

    返回的结果并不是ArrayList 而是ArrayList中的一个内部类SubList。SubList只是ArrayList的一个视图(映射) 所以无法转换为ArrayList.

    6.Set和AbstractSet

    Set接口继承了Collection接口中的所有方法并重新定义了Collection接口中方法的规范。
    AbstractSet继承AbstractCollection 并重写了equals、removeAll、hashCode等方法

    7.Queue

    Queue继承了Collection接口中的方法并重新定义了Collection接口中方法规范。并重新添加了一些队列相关方法。

    1.boolean add(E e) 像队列尾部添加一个元素,无容量检查。

    2.boolean offer(E e) 向队列尾部添加一个元素,有容量检查。

    3.E remove() 移除头部一个元素。

    4.E poll() 移除头部一个元素。

    5.E element() 获取头部元素并不移除元素。

    6.E peek() 检索但不删除此队列的头部。

    8.Map

    Map作为集合中比较特殊的一个部分。使用了关联的方式使用了Collection并不存在继承关系。
    Map的结构自成一体。下面介绍下Map接口中的功能。

    1.interface Entry<K,V> 由于Map中的元素是以Key-Value方式存储的实际上就是一个一个的Entry.在Map中维护一个组合key和value的对象是有必要的。
    这个对象中的方法有K getKey()、V getValue()、V setValue(V value)、boolean equals(Object o)、int hashCode()

    2.int size() 元素个数

    3.boolean isEmpty() 元素是否为空

    4.boolean containsKey(Object key) 是否包含传来的key

    5.boolean containsValue(Object value) 是否包含传来的Value

    6.V get(Object key) 通过key获取value

    7.V put(K key, V value) 将一个key-value放入map

    8.V remove(Object key) 移除传来key的entity

    9.void putAll(Map<? extends K, ? extends V> m)将传来的map中的entity传入该Map中、

    10.void clear() 清空该集合

    11.Set keySet() 将key遍历到Set集合中

    12.Collection values() 返回一个所有元素的引用。

    13.Set<Map.Entry<K, V>> entrySet() 返回一个entry的set集合

    14 equales 和 hashCode

    5.总结

    将所有抽象层级比较高的的抽象方法都了解了一遍。有些抽象层级并没有写,到具体介绍时才进行编写。
    java的集合家族庞大但是结构非常清晰。需要继续深入的研究。

  • 相关阅读:
    [ZJOI2007]时态同步 题解
    Xposed 在android 6.0上报couldn't load class,找不到xposed_init中配置的入口类
    微信小程序http 400问题
    在Mac上 python中使用tesseract OCR (Pytesser) 识别图片中的文字
    微信小游戏跳一跳简单手动外挂(基于adb 和 python)
    第一个微信小程序踩的几个小坑
    android studio/Intellij IDEA(MAC OSX)中android模拟器无法启动的一种原因
    【转载】word2vec原理推导与代码分析
    HTTP Get Post究竟有哪些区别
    初试kotlin:用Kotlin开发桌面/CommandLine 工具
  • 原文地址:https://www.cnblogs.com/yanlong300/p/8487300.html
Copyright © 2011-2022 走看看