集合框架

1.HashSet集合框架


image
image
image
image
image
image
image
image
image
image
image
image

hashSet集合的添加方法上次已经讲过了,我们接下来要在maven工程下来讲其他的一些方法了:

如上图,把环境弄好。
写个循环来测试一下能否存储值:

其运行结果如:

其实我们自己写的hashSet的添加方法的objs数组长度只定义为了10,这是不太够的,我最好都要给定到1000,或者更多一点。这个长度定大一点,集合的运行速度就会更加快一点。
哈希集合的特点在于检索速度非常快,链表数组删除、修改比较灵活方便、然后就是数组集合的添加比较快。其中数组集合和链表集合是有序集合,而哈希集合是无序集合,它添加进去的【学Java,到凯哥学堂kaige123.com】数据的顺序是打乱的。哈希集合的特点在于检索速度非常快,我们这里有junit来测试一下它的检索速度到底怎么样,先把junit的依赖加进来:

然后,我们写个junit的测试案例代码,测试一下ArrayList和HashSet两种集合的检索时间的差别:

由上图,我们可以看出,ArrayList的检索速度和HashSet的检索速度比起来简直是太慢了。
自己写一个检索方法:
哈希里面存储数据时用到的是链表集合的方式,我们在检索一个集合中有没有该数据时,要先把这个数据的hash值计算出来,找到相应的位置,然后再到对应位置下的单链里面去一个一个去问。我们的写的contains1方法如下图:

写这个方法的主要思路就是要先把要检索的数据进行hashCode值的计算,然后定位到在Object数组的哪个位置里面,然后到相应的位置下的单链表里面去一个一个的对比。

上图是自己写的contains1方法的检索速度测试,



由上可知,在Object数组长度是10的时候,我们把检索的数据量加到1000000的时候,需要6000多毫秒,这是比较慢的,但是如果我们把Object数组长度增加到10000,再来检索1000000个数据,此时只要21毫秒,可以看出,Object数组的长度越长,检索的速度就会大大的缩短。因为Object数组长度长了,那么每个位置下的单链表的长度就短了,比对的时间就少了。
所以对于hashSet来说,Object数组的长短决定了检索的时间快慢。哈希集合添加速度不快,查找速度非常快,之所以会有这么快的查找速度,是因为它在查找数据之前就已经做好了充分的准备工作。我们写的哈希集合和系统的哈希集合是有一定差距的,系统的哈希集合的Object是可以自动改变长度的。系统的哈希集合的Object数组会自动根据数据量的多少来进行相应的扩大或减少,当数据量多了,Object的长度就会增加。
集合家族:

主要的类结构如上图所示。其中Collection、List、Set三个是接口。

为啥要在最高的集合接口下弄两个不同的接口?有何用途?
其中List集合是有序集合,可以添加重复值。
Set集合是无序集合,检索速度非常快,不可添加重复值。这两个都继承于最高接口,它们都是集合。
这个集合框架结构是很好的了,为啥要做不同的集合呢?
因为集合是数据存储中心,要存数据的,但是存数据时有各种各样的不同的要求,有些要求你存储速度快,有些要求检索速度快,还有一些要求存储有序,所以说为了满足各种需求,我们就应该做出不同的集合接口来进行各种数据的存储。
集合框架就是包含不同的集合的,每个集合都各有特色,每个集合都是为了某种特定业务而开发出来的。那最高集合接口Collention呢?它实际上就是规定了,规定集合的方法,约定了只要你是集合,就要按照我的方法来,就必须有这些方法。不然就不算是集合了。最高集合是统一方法的。


ArrayList:有序的、数组的集合
Vector      数组集合,线程安全的
>>stack   堆栈集合、进栈出栈的描述很方便,Vector的派生,适用于某些算法。
LinkedList:双链表集合,上可找下,下可找上,删除、插入、前面加入、中间加入都非常方便灵活的,它的结构没有ArrayList动荡这么大。
HashSet:天生服务于检索的,检索速度快,无序
TreeSet:在做到检索速度快的同时,还可以帮你排序,这是二叉树的算法。添加进来的数据会帮你排序摆放(和有顺序不是一回事,添加进来的数据可以排顺序的。)

image
image
image

先认识一下java.util.Collection,最高的集合接口:

方法主要有以上这些,可以将这些方法进行分类管理:
主要有哪几类呢?
添加数据
删除数据
查看数据
转换数组

什么是集合?
集合就是可以进行无限存储的容器。重点是容器:
说起容器呢,设计一种容器,应该有哪些类型的方法呢?
比如桶:
要有存放、取出、查询、清除这些类型的功能方法的。
集合是容器,能存储、取出,大体的方法应该设计为下面这些种类:

添加数据:


add(Object)每次添加一个数据
addAll(Collection)批量添加数据对象
删除数据:
remove(Object)删除某个数据对象
removeAll(Collection)批量删除
retainAll(Collection)交集删除
clear()清除所有数据
查询数据:
iterator拿出所有数据
contains(Object)检索某个数据
containsAll(Collection)批量检索
isEmpty判断是否为空集合
size看集合的大小

image
image

转换数组
toArray将集合转换为对象数组。
作为一个容器,上面的方法是必须设计出来的,要求我们的每个集合都要有这些方法的。我们设计容器的时候,要把它设计为接口类型,我们是规范容器的功能、不是实现容器的功能,这是设计的重点思路。
如果我们做个集合,也可以遵照上面的最高集合接口规定的方法规则的。

上面就是交集删除的意思(retainAll)给你的数据是要保留的,其他的删除掉。
Iterator是迭代器,以后拿值都用迭代器来拿值了,为啥用迭代器来拿值了呢?
以前不是都用下标来拿值的吗?
List一般可以用下标来拿值,但是Set也可以用下标来拿值吗?
Set是不适合按下边拿值的,因为Set是散列的集合,不好按下标来拿值。
Set集合应该用迭代器来拿值,实际上所有的集合都可以用迭代器来拿值,只不过List也可以使用下标来拿值。
List集合接口:

List集合的方法有哪些?如上图。可以看出上面罗列的方法都是基本上与下标有关系的。


Add(int,Object)按下标插入
Add(int,Collection)按下标批量插入
Get(int)按下标获得
IndexOf(Object)看集合中有没有这个对象,在集合的哪个下标下
LastIndexOf(Object)从后往前看集合中有没有该对象,在集合的哪个下标下
ListIterator(int)list的迭代器,甚至可以设置从哪个地方开始迭代取值
Remove(int)按下标删除
Set(int,Object)按下标替换
SubList(int,int)按下标截取

image


由上图可知,List的相关方法都是与下标有关系的,这些是List集合特有的用下标控制的方法,所以是不会在Collection里面去规定的。
Set集合接口里面是没有自己特有的方法的,它的所有方法都是从父类Collection里面继承下来的。为啥它不设计自己的方法呢?
因为父类的方法都够它的功能了,而且它自己也没有什么特殊的方法要重新设计的。没有必要再重新设计方法。
总结一下:
学习了如何搭建集合框架,如何设计每个方法?上面是接口、规范,下面实现。


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

推荐阅读更多精彩内容

  • title: java集合框架学习总结 tags:集合框架 categories:总结 date: 2017-03...
    行径行阅读 1,682评论 0 2
  • 一、集合框架的概述 1、概述: 1、简述:所谓集合,就是为方便对多个对象的操作,对对象进行存储。集合就是存储对象最...
    玉圣阅读 512评论 0 4
  • 概述 Java集合框架由Java类库的一系列接口、抽象类以及具体实现类组成。我们这里所说的集合就是把一组对象组织到...
    absfree阅读 1,251评论 0 10
  • 5分钟搞定java集合框架 java集合就是一个容器。 集合概述 l 为了保存 不确定的数据,或者对象...
    wangchuang2017阅读 451评论 0 0
  • 我曾经是个非常在意别人对我的评价和看法的人。 这一点一直令我很苦恼,我也一直想极力摆脱。但到后来不管怎么尝试却只都...
    风墟阅读 18,115评论 80 518