Java容器详解Ⅰ——概述

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wchstrife/article/details/78010957

Java容器详解Ⅰ——概述

Java的容器是前人为我们设计好的一套存储对象和数据的一套轮子,
通过使用Java中写好的容器API我们可以很方便的存储、操作我们的数据。

本教程从浅入深,从了解各个容器特点开始,了解各个容器的不同之处,最后会从源码的角度解析容器实现原理。

在学习的过程中,我们要注意分清各个Collection中,哪个是接口,哪个是具体的实现类,这对于我们的了解非常有好处。


一、常用容器的图录

容器图解

从图上可以看到,Java容器分为两大阵营:CollectionMap

Collection:主要是单个元素的集合,由List、Queue、Set三个接口区分不同的集合特征,然后由下面的具体的类来实现对应的功能。
Map:有一组键值对的存储形式来保存,可以用键对象来查找值

下面我们从Collection的三个接口开始,介绍每一个实现类之间的特色,让大家在处理不同的数据时选择合适的结构

二、List

List的特点就是所有的元素是可以重复的。List接口在Collection的基础上增加了很多的方法。
List主要分为ArrayList和LinkedList,前者底层是使用数组实现的List,后者是使用链表实现的List。
Vector是一个已经被弃用的类,因为他是线程同步的,而我们平时使用的时候都是非同步的,使用同步的坏处就是会在一个记录上加锁,防止多个程序访问同一条数据导致数据不同步。这样会导致访问速度变慢。
Stack是满足“后进先出”规则的容器,注意LinkedList可以实现所有的栈功能。

2.1 ArrayList

ArrayList是一个可以动态增长的数组。
我们都知道Java中的数组一旦指定了长度就不可以改变,如果我们在业务中需要使用动态的数组,就可以使用ArrayList

ArrayList默认的长度是10,如果我们插入的数据超过了10,ArrayList会不断的自我增长,这一原理的实现我们会在以后介绍

ArrayList由于底层是使用数组实现的,所以随机访问速度快,插入删除较慢

  • toArray:把LinkedList转化为Array

2.2 LinkedList

LinkedList是使用链表实现的容器。
在列表中插入和删除速度快,但是查找需要遍历整个链表,速度较慢
使用LinkedList可以实现很多队列、栈的数据结构,并且有很多方法很类似,但是有细小的差别

  • getFirst和element都返回列表的头,但是不删除它,如果列表为空,抛出异常
  • peek实现的功能一样,但是列表为空时返回null
  • removeFirst和remove都是删除并返回列表的头,如果列表为空抛出异常
  • pool实现的功能一样,但是列表为空时返回null

使用LinkedList可以实现一个栈的功能,下面让我们写一个属于自己的栈

public class MyStack<T> {

    private LinkedList<T> storage = new LinkedList<T>();

    /*
     * 进栈
     */
    public void push(T v){
        storage.addFirst(v);
    }

    /**
     * 窥视栈顶
     * @return
     */
    public T peek(){
        return storage.getFirst();
    }

    /**
     * 出栈
     * @return
     */
    public T pop(){
        return storage.removeFirst();
    }

    public boolean empty(){
        return storage.isEmpty();
    }

    public String toString(){
        return storage.toString();
    }
}

2.3Queue

队列是一个满足“先进先出”的数据结构。
LinkedList提供了方法支持队列操作,并且实现了Queue接口,所以LinkedList是队列的一种实现,可以通过LinkedList向上转型为Queue

  • offer:讲一个元素插入对尾
  • peek:不移除的情况下将元素插入队尾,队列为空返回null
  • element:不移除的情况下将元素插入队尾,队列为空报错
  • poll:移除并返回队头,队列为空返回null
  • remove:不移除的情况下将元素插入队尾,队列为空报错

PriorityQueue是优先级队列,我们暂时先不介绍

三、Set

set代表的是数学上的集合的意思,所以set中的元素不可以重复。
所以set中查找是最为重要的操作,而对于查找来说,我们最常用的就是HashSet

  • HastSet底层是使用散列函数,在查询的方面有优化
  • TreeSet底层使用的是红黑树

四、Map

Map是使用键值对存储的一种结构,所以在处理列如单词统计等方面是杀手锏
Map的键值对都可以为null
Map可以多维扩展。例如一个人拥有多个宠物,你可以这样定义:Map< Person, List< pet>>

  • Object put(Object key, Object value):放进一个键值对,返回值是被替换的值
  • Object remove(Object key)
  • void putAll(Map mapping)
  • void clear()
  • boolean containsKey(Object key)是否包含某个键
  • boolean containsValue(Object value)是否包含某个值

在Map中比较重要的是处理键值对的集合

  • public Set keySet():返回这个Map的所有键的集合,因为Map中键是唯一的,所以返回使用一个set
  • public Collection values():返回这个Map的所有值的集合,因为值可能重复,所以返回一个Collection
  • public Set entrySet():返回一个实现Map.Entry接口对象集合,使用这个方法可以遍历每一条记录。

遍历Map示范代码:

for(Map.Entry<String, String> file : films.entrySet()){
    String title = file.getKey();
    String videoUrl = file.getValue();
}

HashMap更适合查找、删除、插入
TreeMap更适合遍历。

展开阅读全文

没有更多推荐了,返回首页