JavaSE之集合及底层

基本

常用集合接口和实现类的UML图


关系图.png

特点

List接口实现类的特点:有序可重复。

Set接口特点:无序不可重复。

SortedSet实现类:无序不可重复,但是可以按照元素的大小自动排列。

ArrayList底层使用的是数组,所以他的特点和数组类似,查询比较快,但是增删效率比较低。

LinkedList底层使用的是双向链表,查询不方便,但是增删效率比较高。

Vector线程安全,但是不推荐使用,因为效率比较低。

TreeSet特点是无序不重复,但是取出来的元素是按大小排列出来的!

HashSet底层时候用的哈希表。

Collection常用方法

@Test
    public void demon(){
        /*
        boolean add(Object Element):向集合中添加元素
        void clear():清空集合
        boolean isEmpty():清空集合
        Object[] toArray():将集合转换为数组
         */

        List<Object> c = new ArrayList<Object>();
        c.add(1);//由于jdk5之后,可以进行自动装箱,将int类型转换为Integer类型
        c.add(new Integer(100));
        Object o = new Object();
        c.add(o);
        System.out.println("存储元素的个数"+c.size());
        System.out.println(c.isEmpty());
        Object[] arr  = c.toArray();
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        //c.clear();
        //System.out.println(c);
    }

迭代器

//面向接口
//迭代器,迭代器是集合类的父类,所以任何集合类都可以使用迭代器
Iterator it = c.iterator();
while (it.hasNext()){//hasNext方法返回的布尔值
    Object element = it.next();//指向下一个地址,并且取出这个元素
    System.out.print(element+"    ");
}

关于HashSet底层

java中的HashSet底层就是HashMap,而HashMap的底层是一个哈希表/散列表,而在java中,哈希表由数组和单向链表组成。下图可以表示哈希表。

我们看一下底层的源码。

我们在HashMap中可以发现单向链表的一个节点,我们发现这个节点有四部分组成,k-v值,hash值还有指向下一个节点。

单向链表的一个节点.png

实际上,这个哈希表就可以画成底下这个结构!

hashmap总的标示图.png

注意这个hash值,它是有key通过哈希算法得出来的,如果我们传入k所得出来的hash值都是相同的,那么就放在同一个单向链表中,注意,在放之前首先使用equals方法去对比放入的值的key与已存在的key是否相同,如果相同就不进行存放,这就是为什么HashMao不重复的原因,还有就是如果传入的k所得出来的hash不存在这个数组中,那么就在这个数组中往后排,继续创建一个。Hash表之所以查询增删的效率快,就是因为数组相当于做了一个索引,先去查找这个hash值,找到hash值之后再在这个对应的单向链表中进行查找数据。增删是因为单向链表的增删效率本来就很快!

我们继续看一下源码:

初始容量和加载因子.png

什么是初试容量,什么又是加载因子?

我们可以知道Hash表底层是一个数组,数组的长度在定义好之后是不可变的,这个16就是HashMap默认的初试容量,默认加载因子就是当这个数组填满百分之75的时候,就需要对这个数组进行一个扩容处理!

总结

  • HashSet底层实际上是一个HashMap,HashMap底层是一个哈希表。
  • 哈希表又称为散列表,哈希表底层是一个数组,数组中存储的是一个单向链表。每一个单向链表都一个独一无二的hash值,代表数组下标。在一个单向链表上的Hash值是相同的,hash值实际上是由key调用hashCode方法,再通过“hash Function”转换成的值。
  • 如何向Hash表中添加元素:先调用key的HashCode方法,计算出该数据的Hash值,如果在这个Hash表中不存在该Hash值,就直接添加元素。如果该Hash值已经存在,继续调用key之间的equals方法,如果equals返回false,则代表没有相同的key就可以添加元素,如果返回true就代表已经存在了,不能进行添加!
  • HashSet其实就是HashMap中的Key,HashSet有什么特点,HashMap中应该具有相同的特点。
  • HashMap和HashSet初试容量都是16,默认的加载因子是0.75。

补充:在jdk1.8之后,当单向链表的长度大于8之后,总数量大于64之后,会将单向链表改变为一个红黑树。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352