zoukankan      html  css  js  c++  java
  • Java 高级-集合框架

    参考资料
    参考 HashMap

    类似 C++ 中的 STL 标准模板库,Java 也在 java.util 包中封装了一套常用数据结构及其算法,称为集合框架。所有的集合框架都包含如下内容:

    • 接口:代表集合的抽象数据类型 ADT,如 Collection、List、Set、Map 等
    • 实现(类):集合接口的具体实现,是可重复使用的数据结构,例如:ArrayList、LinkedList、HashSet、HashMap。
    • 算法:实现集合接口的对象里的方法,可以执行一些有用的计算,例如:搜索和排序。这些算法具有多态性,相同方法在相似的接口上有着不同的实现。

    除了集合,Java 的集合框架也定义了几个 Map 接口和类。Map 里存储的是键/值对。尽管 Map 不是集合,但是它们完全整合在集合中。

    集合框架概述

    Java 集合框架分为两大类:

    • Map 键值对的集合,包括SortedMap
    • Collection 元素的集合,包括Set(包括 SortedSet)、List、Queue

    Java 集合框架图

    主要接口及常用的实现类

    具体实现类,常用的有 ArrayList、LinkedList、HashSet、LinkedHashSet、HashMap、LinkedHashMap 等等。

    Collection 接口

    常用方法

    查询方法

    方法名 描述
    int size() 返回集合中元素个数
    boolean isEmpty() 如果集合中没有元素则返回 true
    boolean contains(Object obj) 判断对象是否在集合中
    boolean containsAll(Collection c) 判断方法的接收者对象是否包含集合中的所有元素

    修改方法

    方法名 描述
    boolean add(Object obj) 向集合中增加对象
    boolean addAll(Collection<?> c) 将参数集合中的所有元素增加到接收者集合中
    boolean remove(Object obj) 删除对象
    boolean removeAll(Collection c) 将参数集合中的所有元素从接收者集合中删除
    boolean retainAll(Collection c) 与 removeAll 方法相反,只保留参数集合中的所有元素

    List 接口

    有序列表,元素可重复。

    实现类

    • Vector
    • ArrayList:存储方式类似数组,访问速度快
    • LinkedList:存储方式类似链表,增删速度快

    Set 接口

    无序集合,元素不可重复。

    实现类

    • HashSet
    • TreeSet 树集合

    SortedSet 接口

    特殊的有序 Set,元素升序排列,还增加了次序的相关操作。

    Queue接口

    FIFO 先进先出队列。

    实现类

    • LinkedList:同时实现了 List 接口,先进先出
    • PriorityList:按元素值排序的队列

    Map 接口

    存储键值对。需要同时指定键和值的类型 Map<k, v>

    实现类

    • HashMap
    • TreeMap

    SortedMap

    特殊 Map,关键字升序排列。通常用于字典。

    相关算法

    大多算法用于 List,min 和max 可以用于所有集合对象。

    排序算法 sort

    使 List 中的元素按照某种次序关系升序排列。

    • 将元素按照自然次序排列,或者集合实现了 Comparable 接口
    • 附加 Comparator 对象做参数,规定比较规则,可实现反序或特殊规则

    乱序算法 shuffle

    可用于洗牌,每个次序出现的概率都是一样的。

    反序 reverse

    二分查找算法 binarySearch

    Arrays 类

    需要引入 java.util.Arrays
    常用方法:

    方法 描述
    sort(type[] a) 排序
    binarySearch() 二分查找
    equals(type[] a, type[] b) 数组比较
    fill(type[] a, type val) 数组填充同一个值
    asList(T… a) 将数组转为 ArrayList

    基于动态数组的类型

    Vector (集合框架的遗留类,不建议使用,线程安全)和 ArrayList(异步,效率高,建议用) :

    • 实现了 Collection 接口
    • 不能存储基本数据类型,需要包在包装类中
    • 可以存储同类型的对象
    • 容量可以自动扩充

    Java 提供了线程安全集合 java.util.concurrent 包,有序集、队列,任何集合类通过使用同步包装器可以变成线程安全的:

    List<E> synchArrayList = Collections.synchronisedList(new ArrayList<E>());
    

    遍历实现了 Collection 接口的集合

    • 通过 Enumeration (旧接口,不推荐使用)或 Iterator 接口(新接口,推荐)遍历集合
    • 通过增强的 for 循环遍历集合
    • 通过聚集操作遍历集合,可以在筛选的同时过滤

    Enumeration/Iterator

    Java 中的许多方法(例如 elements())返回 Enumeration 类型的对象,而不是返回集合类对象。

    Enumeration 接口不能用于 ArrayList 对象,Iterator 接口可用于 ArrayList 对象和 Vector 对象。

    Iterator 接口遍历对象的同时,可以删除对象。常用方法有:

    • hasNext():集合中是否还有下一个元素
    • next():取集合的下一个元素
    • remove():删除集合中最后调用 next() 返回的元素,注意不是从 Iterator 类中删除

    示例:

    import java.util.*;
    
    class test {
        public static void main(String[] args) {
            String[] s = {"hello", "world", "haha"};
            ArrayList al = new ArrayList<String> (java.util.Arrays.asList(s));
            System.out.println("before: " + al);
            Iterator it = al.iterator();
            while(it.hasNext()) {
                String tmp = (String)it.next();
                System.out.println(tmp);
                if (tmp.length() > 4) {
                    it.remove();
                }
            }
            System.out.println("after: " + al);
        }
    }
    

    输出:

    before: [hello, world, haha]
    hello
    world
    haha
    after: [haha]
    

    Map 接口

    Map 中保存键值对,主要实现类是 HashMap。

    常用的修改方法和查询方法有:

    示例:

    import java.io.*;
    import java.util.*;
    class test  {
        public static void main(String[] args) {
            String[] arr = {"hello", "world"};
            Map m = new HashMap();
            System.out.println(m.isEmpty() ? "empty map" : "not empty map");
            m.put("one", "this is a string");
            m.put("two", arr);
            System.out.println(m.containsKey("one"));
            System.out.println(m);
                    
            Iterator iter = m.entrySet().iterator();
            while(iter.hasNext()) {
                Map.Entry entry = (Map.Entry)iter.next();
                System.out.println("next : "+ entry.getKey() +" - "+entry.getValue());
            }
        }
    }
    

    输出:

    empty map
    true
    {one=this is a string, two=[Ljava.lang.String;@659e0bfd}
    next : one - this is a string
    next : two - [Ljava.lang.String;@659e0bfd
    
  • 相关阅读:
    Uva 11754(枚举+中国剩余定理)
    poj 1018(枚举+贪心)
    Uva 11021(概率)
    UVa 11426
    unittest(二)框架中的概念与断言
    unittest(一)IDE导出的代码分析
    Selenium(十五)cookie
    Selenium(十四)处理登录框的验证码
    Selenium(十三)调用js,控制浏览器的滚动条
    安装pytest
  • 原文地址:https://www.cnblogs.com/kika/p/10851522.html
Copyright © 2011-2022 走看看