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

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

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

和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 中进行选择。
    推荐阅读
  • 水空心菜的种植方法(水空心菜如何种植)

    水空心菜的种植方法准备容器先准备一个大容器,最好是陶瓷的或者水泥类的,不要选择塑料的,因为塑料容器是有寿命期的,老化的塑料会释放有害物质。接下来,就是浮水材料的选择,最好是用竹子编一个篱笆网,这样将它放在水面,也不会泡烂,可以起到固定水空心菜的根部的作用。准备淤泥将大量的淤泥放进大水缸里面,注意所选择的淤泥一定要是肥沃的,这样有利于水空心菜的生长。

  • 独狼的袭击到底有多可怕(人称噬人妖兽3年杀200人)

    之后,少女向当地领主报告了此事。为了抓获这只怪兽,领主派出一支由民兵和猎人组成的捕猎队。然而令人吃惊的是,热沃当怪兽袭人事件不仅丝毫没有得到遏制,反而变得越来越频繁,手段也越来越残忍。1767年,怪兽袭击事件又在热沃当地区发生。最终,洞中的两只巨狼皆死于银子弹之下,而热沃当怪兽之灾也就此结束。而猎人们专门用银子弹将其击毙,更是让人浮想联翩。不过后代学者认为,狼人传说不过是迷信,热沃当恶魔应为变异的灰狼。

  • 干发帽真的能速干头发吗(下面一起看看吧)

    干发帽之所以能够快速吸收头发上的水分,是因为它所使用的布料具有非常好的吸水性,一般干发帽使用的材料有两种,超细纤维和维卡纤维。一般很多女生经常使用的干发产品就是吹风机,功率较大的吹风机虽然能够很快吹干头发,但同时也会带给我们身体一定辐射,影响身体健康。因为一直戴着干发帽的话,会导致干发帽和头发的摩擦增大,而且头皮的透气性减弱,所以最好不要戴着干发帽直接睡觉,而是应该在头发干后直接取下干发帽再睡觉。

  • 写作文五年级上册我的心爱之物(部编五年级语文上册第一单元我的心爱之物)

    在它上面,我看见了蒸蒸日上的祖国。我喜欢地球仪还有一个十分重要的原因,那就是:地球是我们的家园。达亚超人有一头浓密的齐肩黄发,胸前的正中间有一个黄色标志,这个标志象征着和平。达亚超人的双手带着紫色的手套,右手的手套上也有一个黄色的三角形,蓝色的护膝上各有一道闪电标志。我特别喜欢达亚超人,简直把他当成了宝贝。我真佩服设计师,为我们设计出这么漂亮的笔来。昨天,妈妈办公室的李妮阿姨送我了一个新文具袋。

  • 原来懂比爱更重要经典句子 懂比爱重要的经典句子成熟有内涵

    孤独就是一轮月,升了,落了。死亡就是一场梦,累了,睡了。结有道之朋,断无义之友。饮清净之茶,戒色花之酒。开方便之门,闭是非之口口。

  • 娃娃鱼会不会咬人,娃娃鱼吃什么食物?

    但是,娃娃鱼生性凶猛,牙齿尖而密,上颚两排下颚一排,也是会咬人的。娃娃鱼的人工繁殖全国每年繁殖量有人报道为10万尾,人工繁育已经突破160万尾。据统计,娃娃鱼自然资源蕴藏量约为9万尾,以丘陵山区资源量为多,在经济发达地区由于工业污染的加剧,资源更显不足。

  • 历史上最悲惨的和亲公主杀了丈夫(一个女人连续嫁三个皇帝)

    尔朱英娥出生贵族,父亲尔朱荣原本是契胡部落酋长,后被北魏皇帝拉拢进入朝廷。这个痴迷于权力心狠手辣的女人,竟然就此毒死了自己的亲生儿子。元子攸惧怕尔朱荣的权力,娶尔朱英娥为后实属无奈之举,两人之间并没有感情,也时常拌嘴。尔朱英娥产子在即,皇帝下旨请老丈人尔朱荣入宫探望,实际上已经在宫中埋伏好杀手刺杀尔朱荣。几年后,高欢为了拉拢北方势力,娶了柔然蠕蠕公主。

  • 婵真洗面奶怎么样(氨基酸洗面奶排行榜)

    boots小黄瓜洗面奶boots是属于英国的一个平价品牌来的,所以它们家的产品但是非常适合学生党和吃土少女。eltaMD氨基酸洁面大热的网红洗面奶,而且是氨基酸的含量洗面奶。花钰集氨基酸洗面奶花钰集氨基酸洗面奶里面含有氨基酸成分,弱酸性的安全配方,清洁肌肤的同时,还具有保湿效果,洗完皮肤一点也不紧绷,淡淡的清香味非常好闻,不挑肤质,脆弱敏感肌也可放心使用,很多明星大咖都在用,品质质量尽可放心!

  • 佛珠植物怎么养(佛珠植物如何养)

    佛珠植物怎么养土壤佛珠性喜富含有机质的、疏松肥沃的土壤。温度和光照佛珠在温暖、空气湿度较大的环境下生长最佳。佛珠,不能接受强光照射,可早晚将佛珠放在向阳处进行养护。浇水佛珠生长时需要有充足水分的,要适量浇水保持土壤的湿润。施肥佛珠在养护时要注意薄肥勤施。换盆佛珠长的还是相对较快的,1-2年换盆一次就差不多了,初春头次浇水前进行换盆。佛珠会长出很多分枝。

  • 死神黑崎一护有多厉害(死神黑崎一护的各个形态)

    融合地狱力量后,一护的身体和脸被金色的骷髅盔甲覆盖,可以释放出金色的月牙天冲。手与斩魄刀融合,释放巨大黑色斩击,但只要使用一次就会失去的死神的能力。半完全状态;出现在漫画中,一护此时受控制。头发倒立,只有一只角,实力强大,会释放王虚闪。