Collection接口子类讲解

基本概念

Java容器类主要是用来保存对象,其中可以分为两种概念:

实现Collection接口

实现Collection接口主要有三种类型,List,Set

List 主要讲两个实现类ArrayList和LinkedList
ArrayList

ArrayList底层为数组结构,有序的。查找速度快,但是插入速度慢。
查询速度快:数组的数据结构,是一块连续的内存空间,减少了因指针移动所带来的时间消耗,所以ArrayList查询速度快。
插入速度慢:如果插入一个数据,后面的数据都需要向后移动一个位置,所以插入速度慢。
ArrayList允许添加null值。

LinkedList

LinkedList底层为双向链表的数据结构,它的特点是查找慢,但是插入的速度快。
查找速度慢:底层为链表的数据结构,每一个Element内存并不连续,遍历LinkedList需要频繁的移动指针,找到下一个Element,所以查询速度比较慢。
插入速度快:插入一个数据只需要改变一下指针的位置就ok了。
LinkedList允许值为null
LinkedList也实现了Queue这个接口,因此可以实现栈和队列数据结构的模拟,具体可参看http://blog.csdn.net/kai1ge1/article/details/78961341

具体的LinkedList数据结构如下

private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
Set集合

Set集合主要讲HashSet,以及HashSet的子类LinkedHashSet,以及TreeSet。
Set集合和List的集合最大的不同是在于,List集合有序可重复,而Set集合则是无序不可重复。

HashSet

HashSet的底层是靠HashMap来保证其值不重复的,其实它的实现主要是靠HashMap的,具体看一下源码就知道。
HashSet的添加的值允许为null,但是数据并不保证顺序。
当调用HashSet的add方法的时候的源码

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

具体map.put()做了什么操作呢,由于代码太多,这里就不详细列出来了,说一下流程,它会先判断e的hashcode值,如果hashcode的值没有重复,则直接返回null,表示add成功,如果hashcode的值相等的,在用equals进行比较,如果不相等也会返回null,添加元素成功,否则就表示添加失败。

LinkedHashSet

LinkedHashSet是HashSet的子类,所以没有什么不一样的只是比HashSet多维护了一个链表,用来定义迭代顺序所用,所以LinkedHashSet输出是有顺序的,和添加顺序一致。
HashSet的添加的值允许为null。

TreeSet

TreeSet和HashSet类似,TreeSet主要实现是靠TreeMap实现的,由于红黑树的概念太多,有时间会补上。TreeSet输出是有序的,且不能添加null值,因为TreeSet再添加Element的时候都会调用compareTo方法进行排序,如果有null值的话,会报 NullPointerException。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值