JAVA里面set,map,list的区别是什么?(尽量详细)
发布网友
发布时间:2022-04-23 00:27
我来回答
共3个回答
懂视网
时间:2022-05-15 03:36
这篇文章主要给大家介绍了关于ES6学习笔记之map、set与数组、对象对比的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面一起学习学习吧。
前言
ES5中的数据结构,主要是用Array和Object。在ES6中主要新增了Set和Map数据结构。到目前为止,常用的数据结构有四种Array、Object、Set、Map。下面话不多说了,来一起看看详细的介绍吧。
// 数据结构横向对比,增,查,改,删
1、map和数组对比
2、set和数组对比
3、map、set和Object对比
通过对比可以发现,能使用map的优先使用,不使用数组,
考虑数据的唯一性,考虑使用set,不使用Objet
以后的开发中可以优先考虑使用map和set了,并且可以放弃数组和object了
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
vue的mixins属性详解
Vue使用mixins实现压缩图片代码
vue2.0模拟锚点的实例
热心网友
时间:2022-05-15 00:44
一、List接口
List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;第一个元素的索引值是0,往后的元素的索引值依次+1。和Set不同,List中允许有重复的元素。实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
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。
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。
HashMap
以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。
HashTable
也是以哈希表数据结构实现的,解决冲突时与HashMap也一样也是采用了散列链表的形式。HashTable继承Dictionary类,实现Map接口。其中Dictionary类是任何可将键映射到相应值的类(如 Hashtable)的抽象父类。每个键和每个值都是一个对象。在任何一个 Dictionary 对象中,每个键至多与一个值相关联。Map是”key-value键值对”接口。 HashTable采用”拉链法”实现哈希表不过性能比HashMap要低。
TreeMap
有序散列表,实现SortedMap接口,底层通过红黑树实现。
WeakHashMap
谈WeakHashMap前先看一下Java中的引用(强度依次递减)
强引用:普遍对象声明的引用,存在便不会GC
软引用:有用但并非必须,发生内存溢出前,二次回收
弱引用:只能生存到下次GC之前,无论是否内存足够
虚引用:唯一目的是在这个对象被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是线程安全的。
热心网友
时间:2022-05-15 02:02
java集合的主要分为三种类型:
Set(集)
List(列表)
Map(映射)
要深入理解集合首先要了解下我们熟悉的数组:
数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型),而JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中! JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。
简单说下集合和数组的区别:(参考文章:《Thinking In Algorithm》03.数据结构之数组)
Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种。
1、
效率高,但容量固定且无法动态改变。
array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。
2、Java中有一个Arrays类,专门用来操作array。
arrays中拥有一组static函数,
equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。
fill():将值填入array中。
sort():用来对array进行排序。
binarySearch():在排好序的array中寻找元素。
System.arraycopy():array的复制。
若撰写程序时不知道究竟需要多少对象,需要在空间不足时自动扩增容量,则需要使用容器类库,array不适用。所以就要用到集合。
那我们开始讨论java中的集合。
集合分类:
Collection:List、Set
Map:HashMap、HashTable
JAVA里面set,map,list的区别是什么?(尽量详细)
1、效率高,但容量固定且无法动态改变。array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。2、Java中有一个Arrays类,专门用来操作array。arrays中拥有一组static函数,equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。fill():将值填入...
如何证明,在n个元素组成的集合中取n+1个不同的三元子集,求证必有两个...
val map = Map( "1" -> "Hello", 2 -> "Scala", 3 -> "Spark" ) 创建Map时, 使用->来分隔key和value, KV类型可不相同, 中间使用逗号进行分隔. 4.2 map遍历 遍历map有三种方式, 即可使用foreach, 也可使用与Java中相同用法的迭代器, 还可使用for循环. 方式一: foreach map.foreach(println) 此...
java中List的用法?尽量详细解释,包括例子。
List 集合中的对象按照一定的顺序排放,里面的内容可以重复。List接口实现的类:ArrayList(实现动态数组), Vector(实现动态数组) ,LinkedList(实现链表), Stack(实现堆栈)一 list接口 1.java.util.ArrayList类实现一个可增长的动态数组,平时用的比较多的就是add()方法,其它方法 请参考API帮助文档...
Java代码处理数据技巧(java代码处理数据技巧有哪些)
Java在方法和属性的调用上是一致的,区别只表现在声明的时候,这和c++是不同的。 三、零基础如何学习Java开发?需要掌握哪些技能?Java的三个技术平台的关系 Java分为三个体系,分别为JavaSE(J2SE,Java2PlatformStandardEdition,标准版)。JavaEE(J2EE,Java2Platform,EnterpriseEdition,企业版)。JavaME(J2ME,Java2PlatformM...
...JavaWeb之间的区别是什么呢?请尽量说的详细点,谢谢啦
、Java Servlets API、JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。简单点理解就是:JavaSE是标准版本,JavaEE是优化版,功能更加强大。Java web主要是指web方向的开发和应用。即用java技术来解决相关web方面的问题。
JAVA中var的意思(请尽量详细)
说的简单一点点就是定义一个变量。在java-script中,变量可以用命令Var作声明:var mytest;该例子定义了一个mytest变量。但没有赋予它的值。Var mytest=”This is a book”该例子定义了一个mytest变量, 同时赋予了它的值。
Java界面高手请进 200分
以下是代码:(请参照MigLayout网站的whitepaper和tutorial详细体会用法) import java.awt.Color;import java.awt.Cursor;import java.awt.Font;import java.awt.Image;import java.awt.event.KeyEvent;import java.awt.font.TextAttribute;import java.util.Map;import javax.swing.ButtonGroup;import javax.swing.ImageIc...
...article的区别是什么?麻烦各位牛人解释的尽量详细点儿,谢谢啦!_百 ...
区别如下:Article类型论文一般指研究者对于研究成果进行全局性的详细阐述。Review类型论文一般指研究者对前人的实验结果或某一特定研究领域科研成果的总结与评述。Letter类型论文被称为“快报”,更为注重时效性,主要是一些研究者新发现的初步结果或者一种新机制,这些初步成果可能有待进一步阐述,新机制也可能...
JST、AMP分别是什么意思?尽量详细的解释,谢谢……
AZS,AutomaticZeroSet,自动置“... ...AMP AdvancedMacroProcessor 高级宏处理器 AMP AMPlifier 放大器 AMP 安普公司(开发智能家居系统) ...-CHROMA AMP: 色度放大器色度放大器医疗器械类英语及其缩写 ... CHROMA 色度 CHROMA AMP 色度放大器 CHROMA BURST AMP 色度、色同步信号放大器 ...-cyclic amp: 环腺苷...
在linux 中 ^ 这个符号的具体意义是什么,尽量的详细一些,谢谢,还有就...
(1)单独的^:是用来匹配输入字符串的开始位置。^d就是匹配以d开始的字符串。举个例子:dcd,efg,hijk,d264 这几个字符串,若是用^d来匹配,就只有 dcd 和 d264 这两个字符串了。(2)[^某某某] :是负值字符集合。匹配未包含的任意字符。[^d]就是匹配未包含d的字符。举个例子:abcdefg...