java容器(集合类)

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

主要是总结前一段时间自己对容器的学习。

首先明白什么叫容器是干嘛的?

        在Java当中,有一个类专门用来存放其它类的对象,这个类就叫做容器,它就是将若干性质相同或相近的类对象组合在一起而形成的一个整体 。(你可以把它想象成一个大的木桶里面装了有一定联系的很多东西。)

一张构思图来说明一些基本常用的容器类。

一、Map:一组成对的“键值对”对象,允许你使用键来查找值。它是映射关系的集合。

       1.HashMap:它的线程安全,但是效率低,键可以是null,但键值不可以重复,如果重复了以后就会对第一个进行键值进行覆   盖。HashMap是Map接口的实现类。具体方法可以查看API。它的底层实现是:采用了哈希表。即:数组+单链表。具体介绍移步:

        https://blog.csdn.net/qq_40301026/article/details/86660646

       2. TreeMap :是红黑树的经典实现,一般在需要排序时才用到。它在讲对象元素添加到集合中时会自动按照某种比较规则将其插入到有序的对象序列中,并保证该集合元素组成的读uixiangxulie时刻按照“升序”排列。

       3.HashTable:线程不安全,但效率高,允许key或value为null。

二 、Collection:是java集合框架的根接口,它继承了Iterable接口,提供元素遍历的功能。对于集合框架而言,这个接口定义了集合基本的操作。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。

 0

1. Set <interface>:无序,不可重复的集合。Set容器类主要有HashSet和TreeSet等。

     (1).HashSet 
   Java.util.HashSet类是Java.util.Set接口的实现类。
   由Set接口决定它不允许出现重复元素; 不保证和政集合中元素的顺序 ;允许包含值为null的元素,但最多只能有一个null元素。

       这是HashSet最普通的一个构造器,可以看出它的底层还是一个HashMap。所有的值都是放在Map的key里面,而value是系统给了一个固定的Object,所以HashSet相当于一个简化版的HashMap。

public class HashSet<E>
    extends AbstractSet<E>
    implements Set<E>, Cloneable, java.io.Serializable
{
    static final long serialVersionUID = -5024744406713321676L;

    private transient HashMap<E,Object> map;

    // Dummy value to associate with an Object in the backing Map
    private static final Object PRESENT = new Object();

    /**
     * Constructs a new, empty set; the backing {@code HashMap} instance has
     * default initial capacity (16) and load factor (0.75).
     */
    public HashSet() {
        map = new HashMap<>();
    }
}

       这是其添加功能:

 public boolean add(E e) {
        return map.put(e, PRESENT)==null;
    }

  (2).TreeSet:同理和HashSet一样,TreeSet相当于一个简化版的TreeMap。TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

public class TreeSet<E> extends AbstractSet<E>
      implements NavigableSet<E>, Cloneable, java.io.Serializable
   {
     // NavigableMap对象
     private transient NavigableMap<E,Object> m;
  
     // TreeSet是通过TreeMap实现的,
     // PRESENT是键-值对中的值。
     private static final Object PRESENT = new Object();
 
     // 不带参数的构造函数。创建一个空的TreeMap
     public TreeSet() {
     this(new TreeMap<E,Object>());
     }
}

    (3).EnumSet 是一个专为枚举设计的集合类,EnumSet中的所有元素都必须是指定枚举类型的枚举值,该枚举类型在创建EnumSet时显式或隐式地指定。

 2.List:有序,可重复的集合。List承诺可以将元素维护在特定的序列中。List接口在Collection的基础上加入了大量的方法,使得可以在List中间可以插入和移除元素。

    (1).ArratList:它的优点在于随机访问元素快,但是在中间插入和移除比较慢。他的底层是用数组实现的。基本原理可以移步:

        https://blog.csdn.net/qq_40301026/article/details/86499920

    (2).LinkedList:其底层原理是:双向链表。LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在 LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。基本原理移步:

        https://blog.csdn.net/qq_40301026/article/details/86773133

        https://blog.csdn.net/qq_40301026/article/details/86510295

     (3).Vector :Vector 是矢量队列,它是JDK1.0版本添加的类。Vector 继承了AbstractList,实现了List;所以,它是一个队列,支持相关的添加、删除、修改、遍历等功能

       Vector 实现了RandmoAccess接口,即提供了随机访问功能。RandmoAccess是java中用来被List实现,为List提供快速访问功能的。

       在Vector中,我们即可以通过元素的序号快速获取元素对象;这就是快速随机访问。
       Vector 实现了Cloneable接口,即实现clone()函数。它能被克隆。
       和ArrayList不同,Vector中的操作是线程安全的

猜你喜欢

转载自blog.csdn.net/qq_40301026/article/details/87534202
今日推荐