Java基础:浅析List、Set、Map的特点和区别(整合版)(上)

简介: Java基础:浅析List、Set、Map的特点和区别(整合版)

我们知道Java集合主要分为三种类型:


• Set(集)

• List(列表)

• Map(映射)


一、要理解集合首先要了解数组:


数组是大小固定的,并且同一个数组只能存放类型一样的数据(基本类型/引用类型)

而JAVA集合可以存储和操作数目不固定的一组数据。 所有的JAVA集合都位于 java.util包中,JAVA集合只能存放引用类型的的数据,不能存放基本数据类型。

正如鲁迅先生所讲"世界上本没有集合,想要的人多了,便有了集合"


几乎所有的集合都是基于数组来实现的,因为集合是对数组的封装,所以,数组永远比任何一个集合要快;但任何一个集合比数组提供的功能要多。


1.数组和集合的区别:


数组声明了它容纳的元素的类型,而集合不声明。这是由于集合以object形式来存储它们的元素。

一个数组实例具有固定的大小,不能伸缩。集合则可根据需要动态改变大小。

数组是一种可读/可写数据结构,我们没有办法创建一个只读数组。然而可以使用集合提供的ReadOnly方法,以只读方式来使用集合。该方法将返回一个集合的只读版本。

2.Java所有“存储及随机访问一连串对象”的做法,array是最有效率的一种:


(1)效率高,但容量固定且无法动态改变。 array还有一个缺点是,无法判断其中实际存有多少元素,length只是告诉我们array的容量。

(2)Java中有一个Arrays类,专门用来操作array。

arrays中拥有一组static函数,

equals():比较两个array是否相等。array拥有相同元素个数,且所有对应元素两两相等。

fill():将值填入array中。

sort():用来对array进行排序。

binarySearch():在排好序的array中寻找元素。

System.arraycopy():array的复制。


二、集合分类:


若程序中不知道对象的数量,需要在空间不足时自动扩增容量,则需要使用容器类库,数组不适用。所以就要用到集合。

那我们开始讨论java中的集合。

这里有一张图参考看一下:

20190726011315383.png

图片来源:(https://baijiahao.baidu.com/s?id=1620007201190925694&wfr=spider&for=pc)


我们可以看到Collection下有:List、Set

Map下面有:HashMap、HashTable、TreeMap


1.Collection接口


Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。 Set 和List

都继承了Conllection。

Collection接口的方法:

 boolean add(Object o);       //向集合中加入一个对象的引用      
 void clear();                //删除集合中所有的对象,即不再持有这些对象的引用      
 boolean isEmpty();           //判断集合是否为空      
 boolean contains(Object o);  //判断集合中是否持有特定对象的引用         
 boolean remove(Object o);    //从集合中删除一个对象的引用      
 int size();                  //返回集合中元素的数目 
 Iterartor iterator();        //返回一个Iterator对象,可以用来遍历集合中的元素        
 Object[] toArray();          //返回一个数组,该数组中包括集合中的所有元素

关于:Iterator() 和toArray() 方法都用于集合的所有的元素,前者返回一个Iterator对象,后者返回一个包含集合中所有元素的数组。

Iterator接口声明了如下方法:

 hasNext();     //判断集合中元素是否遍历完毕,如果没有,就返回true      
 next();        //返回下一个元素      
 remove();      //从集合中删除上一个有next()方法返回的元素。


2.List(列表)


List的特征是其元素以线性方式存储,集合中可以存放重复对象;可以插入多个null元素;是一个有序容器,保持了每一个元素的插入顺序,插入的顺序即输出的顺序;区别于Map集合,List集合是单列集合。


List的接口有三个实现类。

  (1) ArrayList(代表长度可以改变得数组,可以对元素进行随机的访问)

  优点: 底层数据结构是数组,查询快,增删慢。

  缺点: 线程不安全(一般不考虑到线程的安全因素,用Arraylist效率比较高)

  (2) LinkedList(在实现中采用链表数据结构,双向链表的数据结构存储数据)

  优点: 底层数据结构是链表,增删快,查询慢。

  缺点: 线程不安全。

  (3)Vector

  优点: 底层数据结构是数组,查询快,增删慢。线程安全。

  缺点: 效率低(相比 ArrayList 线程不安全的,性能会稍慢一些)。


3.Set(集合)


Set是最简单的一种集合。集合中的对象不按特定的方式排序,且没有重复对象;只允许一个 null 元素 。


Set接口有三个实现类

  (1) HashSet

  为快速查找而设计的Set,依赖hashCode()和equals()方法保证元素的唯一性。

  HashSet类按照哈希算法来存取集合中的对象,存取速度比较快 如果没有其他限制,这就是我们的默认选择,因为他对速度进行了优化。它不保证 set 元素的迭代顺序。

  (2)TreeSet

  底层为树结构,通过 Comparator 或者 Comparable 接口保证元素处于排序状态。

  TreeSet类还实现了SortedSet接口,能够对集合中的对象进行排序。

  (3)LinkedHashSet

  具有HsahSet的查询速度,内部使用链表维护元素的顺序(插入的次序)在使用迭代器遍历Set时,结果会按元素插入的次序显示。元素也必须定义hashCode()方法。


4.Map(映射)


Map 是一种把键对象和值对象映射的集合,它的每一个元素都包含一对键对象和值对象。Map没有继承于Collection接口,Map本身是一个接口 ,它存储的数据是没有顺序的,可能会持有相同的值对象但键对象必须是唯一的,这是双列集合的特点 ;Map 里你可以拥有随意个 null 值但最多只能有一个 null 键 。


Map接口有6个实现类。

  (1) HashMap

  HashMap 底层基于拉链式的散列结构,并在 JDK 1.8 中引入红黑树优化过长链表的问题。插入和查询"键值对"的开销是固定的。可以通过构造器设置容量和负载因子,以调整容器性能。

  基于这样结构,HashMap 可提供高效的增删改查操作。

  (2) LinkedHashMap

  类似于HashMap,但是迭代遍历时,取得的"键值对"的顺序是其插入次序,或是最近最少使用的(LRU)的次序。

  只比HashMap慢一点,通过维护一条双向链表,实现了散列数据结构的有序遍历。;而在迭代访问时反而更快,因为他使用链表维护内部次序。

  (3)TreeMap

  是SortedMap现阶段的唯一实现。基于红黑树实现。按 key 排序,默认的排序方式是升序自定义排序需要由Comparable或Comparator决定。

  TreeMap的特点在于,所得到的结果是经过排序的。

  (4)Hashtable

  内部存储的键值对是无序的是按照哈希算法进行排序,与 HashMap 最大的区别就是线程安全。键或者值不能为 null,为 null 就会抛出空指针异常。

  (5) WeakHashMap

  弱键(weak key)映射,允许释放映射所指的对象;这是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个"键",则此"键"可以被垃圾回收器回收。

  (6) ConcurrentHashMap

  一种线程安全的Map。

  (7) IdentityHashMap

  使用"=="代替"equals()"对键进行比较的散列映射,专门解决特殊问题而设计出的。

目录
相关文章
|
3天前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
16 3
|
1月前
|
存储 自然语言处理 C++
map和set的简单介绍
map和set的简单介绍
20 1
|
1月前
|
Java
Java isBlank和isEmpty的区别
JavaisBlank和isEmpty的区别
17 0
|
1月前
|
Java Spring 容器
[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
[JavaWeb]——过滤器filter与拦截器Interceptor的使用、执行过程、区别
|
1天前
|
Java API
List转Map(id为key,list为value)
List转Map(id为key,list为value)
8 0
|
2天前
|
JavaScript 前端开发 Oracle
java和JavaScript的区别
java和JavaScript的区别
6 3
|
3天前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
|
18天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0
|
23天前
|
存储 JavaScript 前端开发
set和map的区别
set和map的区别
31 4
|
25天前
|
Java
Java使用List去重的四中方式
Java使用List去重的四中方式
19 6