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

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 中进行选择。
    推荐阅读
  • 工会参观学习活动方案(这10个基地成为我区首批工会活动基地)

    工会参观学习活动方案9月27日,由旌阳区总工会主办的工会会员普惠活动启动仪式暨工会活动基地命名授牌在东湖街道高槐村举行,我区10个基地被命名为首批区工会活动基地。据了解,本次工会活动基地是贯彻落实“中国梦·劳动美”主题教育实践活动的一项举措,进一步提升工会活动品质,着力推进职工素质教育阵地建设,助推农旅休闲产业、全域旅游发展和乡村振兴。

  • 怎样查询宽带是否欠费 怎么查询宽带是不是欠费

    查询宽带是否欠费的方法是:1、拨打宽带客服服务号码进行询问电信:10000联通:10010移动:10086长城宽带:95079艾普宽带:9521552、登录到移动、电信、联通的官网,查询您的宽带是否欠费3、拿着办理宽带时的身份证,去营业厅找客服查询

  • 简短人生哲理文案(关于简短人生哲理文案有哪些)

    下面内容希望能帮助到你,我们来一起看看吧!简短人生哲理文案世界是真的,付出都是值得的。只有想不到的事,没有做不到的事。不要给自己的失败找借口!不较真,“真”就不出来,还是较吧。中国人想做大事的人太多,而愿把小事做完美的人太少。意志坚强的人,他的世界充满着无限的可能性。人在旅途,难免会遇到荆棘和坎坷,但风雨过后,一定会有美丽的彩虹。人惟患无志,有志无有不成者。

  • 微信读书私密阅读模式怎么开启(开启微信读书私密阅读模式的方法)

    打开手机中的微信读书app,点击屏幕下方的书架图标,进入书架界面,然后点击右上角的编辑按钮,下面我们就来说一说关于微信读书私密阅读模式怎么开启?我们一起去了解并探讨一下这个问题吧!该方法的好处在于可同时设置多个书籍。

  • 高考英语口语考试考什么(英语口语考试注意事项)

    高考英语口语考试考什么第一部分内容是以一篇小短文为基础,要求考生朗读指定部分,并能在不看短文的情况下回答主考老师就短文内容提出的若干问题。口试成绩将与高考成绩一起公布。考生进入考点,要严格按工作人员的安排进行有关各项准备。

  • 鲁迅逝世于哪年(在鲁迅逝世前的3年多时间里)

    据可考证的文字记载,鲁迅与巴金最早的一次见面是在1933年4月6日。正是因为这种欣赏与信任,鲁迅晚年出版译著,巴金主持的文化生活出版社成为首选。值得注意的是,书末有许广平在“鲁迅先生逝世后三个月又五天”所作的《后记》。不仅在巴金的上述回忆中特别提到,还有一个有力的证据来自冯雪峰的回忆。

  • 旧电脑英特尔(旧电脑先别急着扔)

    旧电脑先别急着扔我们出去维修的时候看到很多朋友的电脑已经非常旧,配置也非常古老了同时有时候收回来很多旧电脑非常便宜收回来,其实好多时候改下配件升下级,简单办公其实还是可以再用多一二年的!毕竟很多公司都电脑都是简单办公。

  • 电影票降价退差价(电影票终于降价了)

    《长津湖之水门桥》正在全国热映中。该片在整个春节档一路领跑,以超过25亿元的票房成绩斩获2022年春节档票房冠军,有超4600万人次的观众前往影院观影。除了《长津湖之水门桥》以外,电影《狙击手》也于2月6日宣布下调最低结算价格至A类35元,B类30元。据悉,票房结算标准为每人次票价。除了两部单独宣布优惠或降价的电影,随着春节假期结束,全国电影院也在根据最新市场需求进行调价。

  • 楚辞名句(出自楚辞名句)

    ——《楚辞·卜居》它山之石,可以攻玉。——《楚辞·九歌·少司命》王孙游兮不归,春草生兮萋萋。——淮南小山《楚辞·招隐士》路曼曼其修远兮,吾将上下而求索。——《楚辞·离骚》余将董道而不豫兮,固将重昏而终身。——《楚辞·卜居》蒹葭苍苍,白露为霜,所谓伊人,在水一方。——《楚辞·离骚》莫悲兮生别离,乐莫乐兮新相知。——屈原《九歌·司命》如切如磋,如琢如磨。——《离骚》亦余心之所善兮,虽九死其犹未悔。

  • 自制糯米肠怎么保存(自制糯米肠保存方法介绍)

    接下来我们就一起去研究一下吧!自制糯米肠怎么保存米肠晾干水分,用保鲜膜包好,然后冰箱放着。但建议不要反复解冻,又反复冰冻。糯米是一种温和的滋补品,有补虚、补血、健脾、暖胃、止汗作用。适用于脾胃虚寒所致的反胃、食欲减少、泄泻和气虚引起的汗虚、气短无力、妊娠腹坠胀症状。