java 集合框架笔记

java集合类可以用于存储数量不等的多个对象,并且可以实现常用的数据结构比如栈,队列等。与数组不同,数组长度是不可变的,数组元素可以存放基本类型和对象类型而集合里只能保存对象(实质上是对象的引用变量),Java集合大致可以分为Set、List、和Map ,其中Set代表无序,不可重复的集合,List代表有序,可重复的集合,Map代表具有映射关系的集合,map中key唯一,value可重复。其中Set ,List 以及java5之后新增的 Queue队列是Collection下派生的子接口

Set集合不允许包含相同的元素,集合中对象之间没有明显的顺序

HashSet,LinkedHashSet,TreeSet,是Set的主要实现类

其中 HashSet 不能保证元素的排列顺序,HashSet不是同步的,HashSet集合元素允许为null,当一个对象存入HashSet中时,HashSet会调用对象的hashCode方法到的对象的hashCode值,根据该hashCode值决定对象在HashSet中的存储位置。HashSet 中判断两个对象是否相等是通过比较equals()和hashCode()方法返回值都相等来判断的
LinkedHashSet 是HashSet的一个子类,但它同时使用链表来维护元素的次序,这样使得元素看起来是以插入的顺序保存的,因为其需要维护元素的插入次序,所以性能略低于HashSet的性能,由于其依然是HashSet所以同样元素不能重复

TreeSet

TreeSet是SortedSet接口的实现类,同样TreeSet可以去保证集合元素处于排序状态,TreeSet会调用集合元素的comparTo(Object obj)方法比较元素之间的大小关系,然后将集合元素升序排列,即自然排序。TreeSet也可以通过Comparator接口实现定制排序,在创建TreeSet集合对象时,提供一个Comparator对象与该TreeSet集合关联,由该Comparator对象负责集合元素的排序逻辑。

各种Set性能比较

HashSet的性能总比TreeSet要好,因为TreeSet需要额外的算法来维护集合元素的次序,只有当需要保持排序的set 时才应该使用TreeSet 否则都应使用HashSet 。另外LinkedHashSet是HashSet的子类,对应普通的插入,删除操作,LinkedHashSet 比HashSet 的性能要稍微慢点,是因为维护链表所带来的的开销造成的,不过因为有了链表,遍历LinkedHashSet时会更快一点。但是set的三个实现类都不是线程安全的,通常可以使用Collections工具类的synchronizedSortedSet方法来包装该set集合,此操作最好在创建时进行
例如:SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

List 集合代表一个有序的.可以重复的集合,集合中的元素都有其对应的索引

ArrayList 与 Vector是List的两个典型实现,还有一个LinkedList

其中ArrayList和Vector类封装了一个动态的,允许再分配的Object[ ] 数组,当添加的元素个数超出该数组长度时,则初始长度会自动增加。ArrayList和Vector的显著区别是ArrayList不是线程安全的,而Vector是线程安全的,无需程序保证集合的同步性。因为Vector是线程安全的,所以Vector色性能要比ArrayList要低。即使需要保证线程安全,一般也不推荐使用Vector,而是使用Collections工具类的相关方法将ArrayList包装成一个线程安全的类。
Vector还有一个子类叫Stack栈,用于模拟栈这种数据结构,后进先出,由于是继承关系,所以Stack也是线程安全的,所以性能比较差,不推荐使用,如果需要使用栈这种数据结构,可以考虑使用LinkedList.
LinkedList 也是List 的实现类,它是一个基于链表实现的List,对于顺序访问集合中的元素进行了优化,特别是插入和删除元素是非常快,LinkedList既实现了List接口,又实现了Deque接口,由于实现了Deque接口可以作为栈来使用。 Queue集合用于模拟队列这种数据结构,先进后出 ,Deque是Queue的一个子接口,代表一个双端队列,允许从两端操作队列的元素。

LinkedList与ArrayList区别

由于ArrayList内部是以数组的形式来保存集合中的元素,因此随机访问集合元素时拥有较好的性能,而LinkedList是以链表的形式来保存集合的元素的,所以随机访问的性能较差,但是在插入、删除元素时性能非常出色。

Map用于保存具有映射关系的数据,key和value都可以是任何引用类型的数据,但是map的key值是唯一的不能重复

HashMap 和Hashtable是Map的两个实现类

Hashtable 是一个线程安全的Map实现类,但是HashMap不是线程安全的,所以HashMap的性能要稍好一点。
另外Hashtable不允许使用null作为key和value,试图将null放进Hashtable会引发空指针异常,但是HashMap可以使用null作为key和value,由于key不能重复,所以HashMap最多只有一个key为null,但是可以有多个value为null。
HashMap和Hashtable判断两个key相等额标准是两个key通过equals()和hashCode()方法返回值都相等。
LinkedHashMap 是HashMap的一个子类,LinkedHashMap也使用双向链表来维护key的次序,即迭代顺序与插入顺序保持一致。因为要维护元素的插入顺序,所有性能较HashMap略低。

TreeMap

Map下还有一个SortedMap接口,SortedMap接口又一个TreeMap实现类TreeMap保存key-value对时,需要根据key对节点进行排序,TreeMap排序分为自然排序和定制排序,自然排序时key必须实现Comparable接口,定时排序时,创建TreeMap时需要传入一个Comparator对象,由该对象对TreeMap中的key进行排序。与TreeSet类似。TreeMap 比 HashMap和Hashtable效率要慢,因为其要保持排序。

Collection与Collections的区别

Collection是Java的集合框架的一个接口
Collections 是集合框架中的一个工具类,该工具类提供了大量方法对集合元素进行排序,查询,修改等操作,还提供了将集合对象设置为不可变,对象集合实现同步控制的一些方法。

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

推荐阅读更多精彩内容

  • 参考: 中文API Java集合类: Set、List、Map、Queue使用场景梳理 Collections类常...
    MryU93阅读 585评论 0 4
  • 3.3 集合 一方面, 面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另...
    闫子扬阅读 715评论 0 1
  • title: java集合框架学习总结 tags:集合框架 categories:总结 date: 2017-03...
    行径行阅读 1,673评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 以下是《疯狂Java讲义》中的一些知识,如有错误,烦请指正。 集合概述 Java集合可以分为Set、List、Ma...
    hainingwyx阅读 531评论 0 1