简单看一下Java中的集合框架的设计

Java集合框架

ps:写这篇文章主要为了整理一下Java 的类集合框架,如有错误或不全,欢迎纠正

开头图片

Java集合框架图

图片摘自网络

java 集合框架继承图
补充一下上图:

  1. 继承自Iterator的是ListIterator而不是LinkIterator
  2. 加一个Deque接口继承自Queue
    在这里插入图片描述

集合框架分析

整个Java集合框架其实被分为两部分,Collection和Map,但我们一般也称Map是Collection。从集合框架图我们可以看到,Map指出一个箭头produce指向Collection,这是因为Map的key,value,entry都是Set,而Set是继承自Collection。所以我们一般也说Map是Collection,Colleciton是java集合框架的顶层类。

1.Interator 迭代器

迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。源自百度百科

迭代器顾名思义,用来迭代集合,Colleciton是Java集合框架的顶层接口,而Collection实现了iterator,也就意味着所有继承自Colleciton的子类也就具有了迭代的能力。

public interface Iterable<T> {
    
    Iterator<T> iterator();
    //还有两个default接口
    ...
	...
}

这个接口定义了一个iterator方法,每一个Collection必须返回自己实现的迭代器。
我们看一下迭代器的实现:

public interface Iterator<E> {
   
    boolean hasNext();

    
    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

主要的两个方法:next、hasNext。根据每一个集合的特性方法的内部实现有所不同,但提供给外部的功能都一样,分别是判断迭代的下一个位置是否有元素、返回当前元素然后迭代的当前位置+1,以ArrayList为例:

		ArrayList<String> arrayList = new ArrayList<>();
		//Iterator接口中定义的方法,这个额迭代器的具体实现在ArrayList中以内部类的形式存在
        Iterator<String> iterator = arrayList.iterator();

        while (iterator.hasNext()) {
            String temp = iterator.next();
            System.out.println(temp);
        }
2.集合工具类
  • Arrays
  • Collections

类中有很多静态方法,用来操作数组和集合,很多方法很实用,比如

  • Arrays.toSort(List list); 对集合排序
  • Arrays.toString(array);格式化打印数组
  • List<String syncList = Collections.synchronizedList(mList); 将一个List转换成线程安全的List。
3.List

特性:

  • 有序集合
  • 元素允许重复,并且允许为null
  • 可以通过索引得到指定位置元素

常用的有如ArrayList、LinkedList都直接或间接实现了List。

4.Set

特性:

  • 无法通过索引获取元素
  • 元素不允许重复,通过集合存储元素的equals方法来判断重复。
  • 无法保证Set中元素迭代顺序和存储顺序相同
  • 常用集合如HashSet、TreeSet
  • HashSet:基于哈希值散列存储,性能高,添加和删除操作的时间复杂度恒定,无序
  • TreeSet:通过存储元素实现的Comparable接口来对TreeSet中的元素进行排序,遍历TreeSet时按排序后的顺序输出。
4.Queue、Deque、BlockingQueue

Queue代表着单向队列,先进先出,从队尾入队,队头出队,两个操作对应接口中的两个方法:

public interface Queue<E> extends Collection<E> {
  

    //插入队尾
    boolean offer(E e)
    //得到队头元素并移除
    E poll();
    //得到队头元素不移除
    E peek();
}

Deque代表双向队列:扩展了Queue。可以通过Deque实现Stack:后进先出,队尾入队,队尾出队,对应的两个方法:

public interface Deque<E> extends Queue<E> {
    //push 元素 入栈
    void push(E e);

    //pop  元素 出栈
    E pop();

BlockingQueue代表堵塞队列,用重入锁实现他有几个实现类:

  1. LinkedBlockingQueue
    内部采用链表实现,且持有两把锁,一把用于入队,一把用于出队,,这样可能会有两个线程同时执行入队和出队操作,所以底层也维持了一个原子类Integer用于存储元素个数,保证了线程安全。
  2. ArrayBlockingQueue
    内部采用数组实现,且固定容量,构造函数传入,如果队列满,则堵塞。其内部只持有一把锁,所以同时只有一个线程能进行入队出队操作。
Map

是一种从Key到Value的映射的数据结构:

		HashMap<Integer, String> hashMap = new HashMap<>();
        hashMap.put(1,"数字1");
        hashMap.put(10,"数字10");
        String result = hashMap.get(10);

可以通过Key得到相应的Value。
其中Map有三个方法

  • KeySet
  • values
  • entrySet

分别返回Map中存储的键值对的Key集合、Value集合、存储键值对的Entry的类集合。这也就是为什么说虽然Map不继承自Collection,但通常也说Map是Java集合框架中的一员。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值