高考考试网
当前位置: 首页 高考资讯

list和map的特性(ListSetMap有什么异同)

时间:2023-05-29 作者: 小编 阅读量: 5 栏目名: 高考资讯

和Set不同,List中允许有重复的元素。它允许任何符合规则的元素插入甚至包括null。同时ArrayList是非同步的。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

引言:Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中

Java集合框架(常用接口):

Collection 接口存储一组不唯一,无序的对象 (父类接口)

List 接口存储一组不唯一,有序(插入顺序)的对象

Set 接口存储一组唯一,无序的对象

Map接口存储一组键值对象,提供key到value的映射

一、List接口

List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次 1。和Set不同,List中允许有重复的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。

1.可以允许重复的对象。

2.可以插入多个null元素。

3.是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。

4.常用的实现类有 ArrayList、LinkedList 和 Vector。ArrayList 最为流行,它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适。

ArrayList

ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量:

private static final int DEFAULT_CAPACITY = 10;

随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。

ArrayList擅长于随机访问。同时ArrayList是非同步的。

LinkedList

同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。

由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端,节约一半时间)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。

与ArrayList一样,LinkedList也是非同步的。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

List list = Collections.synchronizedList(new LinkedList(…));

Vector

与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。它的操作与ArrayList几乎一样。

Stack

Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

二、Set接口

Set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义。与List一样,它同样运行null的存在但是仅有一个。由于Set接口的特殊性,所有传入Set集合中的元素都必须不同,关于API方面。Set的API和Collection完全一样。实现了Set接口的集合有:HashSet、TreeSet、LinkedHashSet、EnumSet。

1.不允许重复对象

2. 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。

3. 只允许一个 null 元素

4.Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。最流行的是基于 HashMap 实现的 HashSet;TreeSet 还实现了 SortedSet 接口,因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。

HashSet

HashSet堪称查询速度最快的集合,因为其内部是以HashCode来实现的。集合元素可以是null,但只能放入一个null。它内部元素的顺序是由哈希码来决定的,所以它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。

TreeSet

TreeSet是二叉树实现的,基于TreeMap,生成一个总是处于排序状态的set,内部以TreeMap来实现,不允许放入null值。它是使用元素的自然顺序对元素进行排序,或者根据创建Set时提供的 Comparator 进行排序,具体取决于使用的构造方法。

LinkedHashSet

LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

三、Map接口

Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。实现map的集合有:HashMap、Hashtable、TreeMap、WeakHashMap。

1.Map不是collection的子接口或者实现类。Map是一个接口。

2.Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,Map 可能会持有相同的值对象但键对象必须是唯一的。

3. TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。

4. Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。

5.Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)

HashMap

以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。

HashTable

也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式。HashTable继承Dictionary类,实现Map接口。其中Dictionary类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类。每个键和每个值都是一个对象。在任何一个 Dictionary 对象中,每个键至多与一个值相关联。Map是”key-value键值对”接口。 HashTable采用”拉链法”实现哈希表不过性能比HashMap要低。

TreeMap

有序散列表,实现SortedMap接口,底层通过红黑树实现。

LinkedHashMap

LinkedHashMap它的特点主要在于linked,带有这个字眼的就表示底层用的是链表来进行的存储。相对于其他的无序的map实现类,还有像TreeMap这样的排序类,linkedHashMap最大的特点在于有序,但是它的有序主要体现在先进先出FIFIO上。没错,LinkedHashMap主要依靠双向链表和hash表来实现的。

WeakHashMap

谈WeakHashMap前先看一下Java中的引用(强度依次递减)

  1. 强引用:普遍对象声明的引用,存在便不会GC
  2. 软引用:有用但并非必须,发生内存溢出前,二次回收
  3. 弱引用:只能生存到下次GC之前,无论是否内存足够
  4. 虚引用:唯一目的是在这个对象被GC时能收到一个系统通知

以弱键实现的基于哈希表的Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。null值和null键都被支持。该类具有与HashMap类相似的性能特征,并具有相同的效能参数初始容量和加载因子。像大多数集合类一样,该类是不同步的。

四、总结

1、List、Set都是继承自Collection接口,Map则不是

2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)

3、Set和List对比:

Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

4、Map适合储存键值对的数据

5、线程安全集合类与非线程安全集合类 :

  • LinkedList、ArrayList、HashSet是非线程安全的,Vector是线程安全的;
  • HashMap是非线程安全的,HashTable是线程安全的;
  • StringBuilder是非线程安全的,StringBuffer是线程安全的。

五:List、Set、Map的使用场景(面试题)

  1. 如果你经常会使用索引来对容器中的元素进行访问,那么 List 是你的正确的选择。如果你已经知道索引了的话,那么 List 的实现类比如 ArrayList 可以提供更快速的访问,如果经常添加删除元素的,那么肯定要选择LinkedList。
  2. 如果你想容器中的元素能够按照它们插入的次序进行有序存储,那么还是 List,因为 List 是一个有序容器,它按照插入顺序进行存储。
  3. 如果你想保证插入元素的唯一性,也就是你不想有重复值的出现,那么可以选择一个 Set 的实现类,比如 HashSet、LinkedHashSet 或者 TreeSet。所有 Set 的实现类都遵循了统一约束比如唯一性,而且还提供了额外的特性比如 TreeSet 还是一个 SortedSet,所有存储于 TreeSet 中的元素可以使用 Java 里的 Comparator 或者 Comparable 进行排序。LinkedHashSet 也按照元素的插入顺序对它们进行存储。
  4. 如果你以键和值的形式进行数据存储那么 Map 是你正确的选择。你可以根据你的后续需要从 Hashtable、HashMap、TreeMap 中进行选择。
    推荐阅读
  • 早安的心语(一句话的早安心语)

    人生最曼妙的风景,是内心的淡定与从容在自已的内心世界里,你可以遇见未知的自己,遇见未知的美好是的,在最美的年华,不辜负最美的自己,不忘初心,不负年华早安,下面我们就来聊聊关于早安的心语?早安的心语人生最曼妙的风景,是内心的淡定与从容。摆正心态,享受生活中的欢乐,也去勇敢面对所有的磨难。不会为取悦别人的欢喜,再去伪装自己。而要用自己喜爱的方式来取悦自己,安静的做好自己。

  • 汉服的全称是什么(汉服的简介)

    汉服的全称是什么汉服,全称是“汉民族传统服饰”。汉服“始于黄帝,备于尧舜”,源自黄帝制冕服。定型于周朝,并通过汉朝依据四书五经形成完备的冠服体系,成为神道设教的一部分。因此后来各个华夏朝代均宗周法汉以继承汉衣冠为国家大事,于是有了二十四史中的舆服志。汉服还通过华夏法系影响了整个汉文化圈,亚洲各国的部分民族如日本、朝鲜、越南、蒙古、不丹等等服饰均具有或借鉴汉服特征。

  • 可玩性高的网游手游(现在都可以玩到)

    如今手游产品已经多如过江之鲫,但其中最有竞争力的,还是那些以端游IP改编的手游,这些手游凭借着端游的丰富玩家和用户基础,很快制霸了各大排行榜。热血传奇手游指尖上的沙巴克攻城,支持野外砍人!全民奇迹与《奇迹》一样的华丽,别名全民大翅膀!倩女幽魂录粉丝向的卡牌手游,这货不是回合制,这货不是回合制,这货不是回合制!

  • 怎么先学英文单词(如何记英文单词)

    下边就把处理这些问题的方式给各位介绍一下,期待可以作用到大伙儿。根据发音背单词不仅迅速就能记牢单词,更能练就正宗发音!每日早上起床后、睡觉前、一日三餐前后左右、排长队等车、念书回家路上、乃至尿尿的零碎時间都能够用于狂读狂背单词。根据语句背单词独立地背单词只有是“背了记、忘记了背、背了又忘”!并且,在短文中你能紧紧记牢单词的想法和使用方法。好啦,有关背单词的体会心得,我已经毫无保留的传给加盟商了。

  • 西红柿外面红里面绿能吃吗(西红柿外面红里面绿可以吃吗)

    跟着小编一起来看一看吧!正常情况下,成熟的西红柿应该是外面红色、内部也是红色的,成熟度不高的西红柿也应当是外面青、里面红。如果在西红柿还没有成熟的时候打了催熟剂的话,就会出现外面红、里面绿的情况,这样的西红柿长期食用对健康有较大的危害。

  • 自己弄的松花石有寄生虫吗(他把绿松石锁进保险柜)

    下班后,就把松石锁进保险箱了,结果第二天,打开保险箱,竟然地发现,绿松石,绿松石…………………………后来,工作人员对该绿松石圆珠检测,发现它使用了磷酸二氢钾和氯化铜进行优化处理,通过二者的反应,对瓷度不高的绿松石,可以起到加瓷和提色的作用。别说,老盘也不是没见过长毛的绿松石,但是没有见过长毛长得这么夸张的。所以,如果发现你的绿松石长毛的话,先不要惊慌。

  • 肖战竹子画欣赏(一个月画一次肖战)

    估计很多小伙伴都关注过这位博主@千景绘STUDIO爱好:画画、旅游、吃喝玩乐最喜欢的男明星:肖战、焦恩俊她到底有多喜欢肖战?比如画这张肖战,300g宝虹比如画这张热巴,选用阿诗,色调太美了如今,她的工作室已走上正轨拥有稳定的客户也开始做起周边产品一切都是努力所得的希望她越来越好!作品已获得作者授权,原创作者:@千景绘STUDIO,版权归原作者,禁止商用

  • 洋葱小菌核病防治技术(洋葱细菌病害)

    预防洋葱小菌核病应从种植工作着手,如深耕土地,实行轮作,生长中平衡施肥,并控制氮肥的用量。发病初期使用多硫悬浮剂或甲基硫菌灵可湿性粉剂等农药进行喷防,连续用药2至3次。

  • 梦见下雪是什么寓意(梦见下雪是什么意思)

    以下内容希望对你有帮助!梦见下雪是什么寓意梦见雪,表示梦者最近可能会遇到喜事,也会有很多开心的事情。如果看到雪又消失了,表示可能会损失一些金钱。梦见雪落身上,表示梦者开始介入的大户股逐渐跌落。梦见下雪,这是吉祥的征兆,如果是春天,梦者心理上得到满足。如果是夏天,好运马上会来临。如果是秋天,梦者会很幸福。如果是冬天,梦者经过自己的努力,可以获得成功。

  • 不易返潮的酥脆蛋卷怎么做(自制酥脆蛋卷)

    不易返潮的酥脆蛋卷怎么做食材:鸡蛋120克,牛奶80克,食用油80克,面粉100克,细沙糖50克,奶粉10克,食用盐一克,黑芝麻20克,葱末少许。首先我们准备一个干净的容器,把牛奶,食用油,食用盐放进去,用打蛋器打发汁乳化发白,然后加入芝麻葱末,继续搅拌均匀。等到鸡蛋液打发至没有粗泡细腻状态为止。