首页 > 其他分享 >聊聊List、Set、Map

聊聊List、Set、Map

时间:2023-07-25 19:23:29浏览次数:51  
标签:扩容 Map Set HashMap 实现 List 数组 大小

1. List哪些实现类

Java List一共三个实现类分别是ArrayList、Vector和LinkedList。

(1) ArrayList是最常见用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已有数组的数据复制到新的存储空间中。当ArrayList的中间位置需要插入或删除元素的时候,需要对数组进行移动、赋值,代价比较高。因此他适合随机读和遍历,不适合添加和删除元素。扩容过程:初始大小为空数组,当插入数据后,初始容量为10,当容量不够时会扩容50%,如果扩容后还是不够则直接扩容至所需的最小容量大小,扩容后通过Arrays.copyOf()将原数组复制到新数组。

(2) Vector和ArrayList一样是通过数组实现的,不同的是它支持线程的同步(是通过synchronized实现的,高并发效率低,会采用并发容器处理高并发场景),但实现同步需要很高的花费,因此他的效率比ArrayList差。扩容过程:初始大小为10,当容量不够时会扩容1倍(当在构造函数中设置了指定扩容大小,则扩容指定大小),如果扩容后还是不够则直接扩容至所需的最小容量大小,扩容后通过Arrays.copyOf()将原数组复制到新数组。

(3) LinkedList是用于链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外它还提供了List接口中没有定义的方法,专门用于操作表头和表尾数据,可以当堆栈、队列和双向对列使用。是一种双向链表,无扩扩容问题。

2. Set哪些实现类

Set实现有HashSet、TreeSet、LinkedHashSet

(1) HashSet是无序的、不可重复的。通过对象的hashCode和equals方法保证对象的唯一性。 HashSet内部的存储结构是哈希表,是线程不安全的。通过HashMap的key来实现不重复和无序效果。

(2) TreeSet对元素进行排序,内部是通过TreeMap 实现。

a. 自然排序,元素实现Comparable接口,并覆盖compareTo方法,>1正序,<1倒序, =0只存储当前第一个对象,Integer、String均已实现了该接口,所以可以直接进行排序。

b. 定制排序,newTreeSet时需要传入Comparator实现接口,并覆盖compare方法,>1正序,<1倒序, =0只存储当前第一个对象

(3) LinkedHashSet是一种有序的Set集合,即其元素的存入和输出的顺序是相同的。内部是通过LinkedHashMap实现,继承HashSet,而且LinkedHashMap是一个双链表结构,节点为LinkedHashMap.Entry继承HashMap的Node。。!!!!!!!!!!!!!!!!!!!!!!!!

3. Map有哪些实现类

HashMap

Hash冲突:键(key)经过hash函数得到的结果作为地址去存放当前的键值对(key-value)(hashmap的存值方式),但是却发现该地址已经有值了,就会产生冲突。换句话说就是:如果两个不同对象的hashCode相同,这种现象称为hash冲突。

线程安全:当多线程的情况下,可能产生条件竞争。当重新调整HashMap大小的时候,确实存在条件竞争,如果两个线程都发现HashMap需要重新调整大小了,它们会同时试着调整大小。在调整大小的过程中,存储在链表中的元素的次序会反过来,因为移动到新的数组位置的时候,HashMap并不会将元素放在LinkedList的尾部,而是放在头部,这是为了避免尾部遍历(tail traversing)。如果条件竞争发生了,那么就死循环了

TreeMap

LinkedHashMap

ConcurrentHashMap

标签:扩容,Map,Set,HashMap,实现,List,数组,大小
From: https://www.cnblogs.com/yifanSJ/p/17580753.html

相关文章

  • ConcurrentHashMap &&hashmap
    学习资料:https://www.bilibili.com/video/BV1QS4y1u7gG/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598https://www.bilibili.com/video/BV1KK411U78K/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50d......
  • linq lambda 两个list求交集:根据每一项模糊匹配(contains) 并且带出where过滤条件里
    直接使用 varresult=list1.Where(str1=>list2.Contains(str))是不行的,这个要求两个list的string值必须有相等的才行例如list1中有apple,那么list2中必须有apple才能匹配,而list2中只有app所以匹配不了 解决办法:List<string>list1=newList<string>{"apple","......
  • php array_map
    1、php里面怎么新建数组?2、PHP中要使用数组的话必须先定义一个变量为“array()”的代码吗?_百度...3、如何运用PHP函数arrayphp里面怎么新建数组?1、php里面新建数据可以通过两种方式phparray,一种是通过array函数来创建phparray,另一种就是通过赋值[]来创建。2、在PHP中创......
  • MapReduce面试题
    MapReduce优化方法或如何减少map任务的启动或如何减少磁盘io数据输入小文件合并。使用抽象类CombineFileInputFormat作为输入处理。map阶段减少spill和merge次数。通过调整io.sort.mb及sort.spill.percent参数值,增大触发spill的内存上限,减少spill次数,从而减少磁盘I......
  • CMake Error at CMakeLists.txt: No CMAKE_CXX_COMPILER could be found.
    系统环境:Ubuntu22.04.11.问题发生--TheCcompileridentificationisGNU11.3.0--TheCXXcompileridentificationisunknown--DetectingCcompilerABIinfo--DetectingCcompilerABIinfo-done--CheckforworkingCcompiler:/usr/bin/cc-skipped--......
  • 【大联盟】20230713 T1 方向矩阵(rect) 题解 CF1666A 【Admissible Map】
    题目描述here。题解赛时得分:60/100。想到了正解,但调不出来,就改写暴力了。。。首先,我们把问题转化成每个点都入度为\(1\)。我们考虑合法子串只有两种形式:注意到U和D,要么同时出现,要么同时不出现,因为如果存在U,就说明U所在这一行得到度数减少了,一定需要上一行D来弥补......
  • 学好Elasticsearch系列-Mapping
    本文已收录至Github,推荐阅读......
  • list agg cause ORA-06502 PL/SQL: numeric or value error
    http://www.idb-stock.net/idb/2011/07/05/204.htmlora-06502错误主要是指数据字或值错误,包括以下子类型:字符到数据值的转换错误、字符串缓冲区太小、数值精度太高等。对空集合的调用,会报ora-06502错误declaretypecnt_typistableofnumberindexbybinary_integer;v_c......
  • inno setup打包软件学习
    目录一 打包结果二示例打包脚本三错误解决3.1另一个程序正在使用此文件,进程无法访问3.2桌面图标无法修改四参考资料一 打包结果二示例打包脚本使用打包软件下载地址:innosetup-6.2.2.exeUS7,1552023-02-15UnicodeInnoSetup self-installingpackage.#defineMyAppName......
  • android开发 - ListView
    android中很多应用都是用ListView来显示数据就像系统中的设置里面,每一行,就是构成的ListViewprivateListViewlistview;privatePersonServiceperson;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstan......