• 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);
      }
      
  • 相关阅读:
    [收藏转贴]struct探索·extern "C"含义探索 ·C++与C的混合编程·C 语言高效编程的几招
    [收藏转贴]构建RESTful风格的WCF服务
    [转贴] C/C++中动态链接库的创建和调用
    [转贴]WebService的简单实现 C++
    谷歌已经对Android的开源严防死守
    如何成为一名黑客?
    当程序员思路被打断
    编辑语言是这样的
    开发者需要掌握多少门语言?
    程序员的六大优势
  • 原文地址:https://www.cnblogs.com/cjdstudy/p/12685073.html
Copyright © 2020-2023  润新知