java集合类详解

java 集合类详解

1. 概念

  • Java集合类存放于 java.util 包中,是一个用来存放对象的容器。

    • 集合只能存放对象

    • 集合存放的是多个对象的引用,对象本身还是放在堆内存中

    • 集合可以存放不同类型,不限数量的数据类型

  • 集合类的详解

    • Collection接口:List和Set的父接口,即各种List和Set和其子类都直接或间接继承至Collection接口

      • List下有ArrayList,LinkedList,Vector(都是有序可重复)

        • ArrayList:底层数据结构是数组,查询快,增删慢,效率高,且线程不安全
        • LinkedList:底层数据结构是链表,查询慢,增删快,效率高,且线程不安全,
        • Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低
      • Set下有HashSet,LinkedHashSet,TreeSet(都是无序且唯一)

        • HashSet:底层数据结构是哈希表(无序唯一),线程不安全,可以存储null元素,效率高

          • 依赖于两个方法hashCode()和equals()来保证唯一
        • LinkedHashSet:底层数据结构是链表和哈希表(FIFO插入有序,唯一)

          • 以链表保证元素有序

          • 以哈希表保证元素唯一

        • TreeSet :底层数据结构是红黑树(唯一,有序)

          TreeSet底层数据结构采用红黑树来实现,元素唯一且已经排好序;唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。根据构造方法不同,分为自然排序(无参构造)和比较器排序(有参构造),自然排序要求元素必须实现Compareable接口,并重写里面的compareTo()方法,元素通过比较返回的int值来判断排序序列,返回0说明两个对象相同,不需要存储;比较器排序要在TreeSet初始化是时候传入一个实现Comparator接口的比较器对象,或者采用匿名内部类的方式new一个Comparator对象,重写里面的compare()方法

    • Map接口:Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。

      • Map下有HashMap,LinkedHashMap(继承自HashMap), TreeMap(有序),Hashtable

        • HashMap(重点)

          • 具有很快的访问速度
          • 最多只允许一条记录的键为Null;允许多条记录的值为 Null
          • 不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致
          • 如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap
          • HashMap基于哈希表结构实现的 ,当一个对象被当作键时,必须重写hasCode和equals方法
        • LinkedHashMap

          • 主要是用链表实现来扩展HashMap类,HashMap中条目是没有顺序的,但是在LinkedHashMap中元素既可以按照它们插入图的顺序排序,也可以按它们最后一次被访问的顺序排序
        • TreeMap

          • TreeMap基于红黑树数据结构的实现,键值可以使用Comparable或Comparator接口来排序
          • TreeMap继承自AbstractMap,同时实现了接口NavigableMap,而接口NavigableMap则继承自SortedMap。SortedMap是Map的子接口,使用它可以确保图中的条目是排好序的
        • Hashtable

          Hashtable和前面介绍的HashMap很类似,它也是一个散列表,存储的内容是键值对映射,不同之处在于,Hashtable是继承自Dictionary的,Hashtable中的函数都是同步的,这意味着它也是线程安全的,另外,Hashtable中key和value都不可以为null。

    • 框架图

    • 集合的选择

2. 基本方法

  • Collection常用方法

    • add(E e) ,添加元素

    • clear() ,暴力清除集合中所有元素

    • contains(Object o), 返回值类型:boolean。判断集合是否包含某个元素

    • isEmpty() ,返回值类型:boolean。如果此集合不包含元素,则返回true。

    • iterator() 迭代器。返回值类型:Iterator

    • size() 返回值类型:int。返回集合中的元素数

  • List常用的方法(继承自collection,即可以使用Collection的方法)

    • void add(int index,Object element):在指定位置添加元素
    • Object get(int index):获取指定位置的元素
    • ListIterator listIterator():List集合特有的迭代器。该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法
    • Object previous():获取上一个元素
    • boolean hasPrevious():判断是否有元素
    • Object remove(int index):根据索引删除元素,返回被删除的元素
    • Object set(int index,Object element):根据索引修改元素,返回被修改的元素
  • LinkedListt的特有方法

    • 添加功能

      public void addFirst(Object e)

      public void addLast(Object e)

    • 获取功能

      puclic Object getFirst()

      public Object getLast()

    • 删除功能

      public Object removeFirst()

      public Object removeLast()

  • ArrayList无特有方法

  • Set的方法,基本都继承自Collection

  • Map中常用的方法

    • put(K key, v value):向map集合中添加Key为key,Value为value的元素,当添加成功时返回null,否则返回value。
    • void putAll(Map<? extends K,? extends V> m):向map集合中添加指定集合的所有元素
    • void clear():把map集合中所有的键值删除
    • boolean containsKey(Object key):检出map集合中有没有包含Key为key的元素,如果有则返回true,否则返回false。
    • boolean containsValue(Object value):检出map集合中有没有包含Value为value的元素,如果有则返回true,否则返回false。
    • Set<Map.Entry<K,V>> entrySet(): 返回map到一个Set集合中,以map集合中的Key=Value的形式返回到set中。
    • boolean equals(Object o):判断两个Set集合的元素是否相同
    • V get(Object key):根据map集合中元素的Key来获取相应元素的Value
    • int hashCode():返回map集合的哈希码值
    • boolean equals(Object o):判断两个Set集合的元素是否相同
    • boolean isEmpty():检出map集合中是否有元素,如果没有则返回true,如果有元素则返回false
    • Set keySet():返回map集合中所有Key
    • V remove(Object key):删除Key为key值的元素
    • int size():返回map集合中元素个数
    • Collection values():返回map集合中所有的Value到一个Collection集合

3. 遍历

  • 迭代器(接口)

    1. 概念

      迭代器(Iterator)是一种设计模式、提供了一种方法,来对集合、容器进行遍历的方式,不需要关注底层数据结构和数据类型,来达到底层和上层遍历解耦的目的

    2. 迭代器方法

      • boolean hasNext() :判断集合是否还有元素; true表示还存在元素 ,false表示不存在元素
      • E next():返回当前数据
      • void remove():删除元素
    3. 实现

      public static void main(String[] args) {
          ArrayList<Integer> arrayList = new ArrayList<>();
          arrayList.add(1);
          arrayList.add(2);
          arrayList.add(3);
          arrayList.add(4);
          arrayList.add(5);
      	Iterator<Integer> iterator = arrayList.iterator();
      	while (iterator.hasNext()){
      	    Integer value = iterator.next();
      	    System.out.print(value+" ");
      	}
      	System.out.println();
      }
      /*
      注意事项:
      在使用next()方法前必须调用hasNext()方法
      使用remove()方法前必须调用next()方法
      */
      
  • 通过for循环遍历

    for (int i = 0; i < arrayList.size(); i++) {
        System.out.print(arrayList.get(i)+" ");
    }
    System.out.println();
    
  • 通过增强for循环遍历

    for (Integer i :arrayList) {
        System.out.print(i+" ");
    }
    System.out.println();
    
  • Map的遍历

    //增强for
    for(Map.Entry<String, String> entry : map.entrySet()){
        String mapKey = entry.getKey();
        String mapValue = entry.getValue();
        System.out.println(mapKey+":"+mapValue);
    }
    //for循环
    for(String key : map.keySet()){
        System.out.println(key);
    }
    //value
    for(String value : map.values()){
        System.out.println(value);
    }
    //通过迭代器Iterator
    Iterator<Entry<String, String>> entries = map.entrySet().iterator();
    while(entries.hasNext()){
        Entry<String, String> entry = entries.next();
        String key = entry.getKey();
        String value = entry.getValue();
        System.out.println(key+":"+value);
    }
    //通过键找值(效率低)
    for(String key : map.keySet()){
        String value = map.get(key);
        System.out.println(key+":"+value);
    }
    
posted @ 2020-04-12 14:20  cjd  阅读(407)  评论(0编辑  收藏  举报