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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值