java集合—List 、 Set、 Map详解
一、集合与数组
数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。
集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。
二、集合
1、集合框架中不同的集合类有各种不同的数据结构,所以在使用中要根据应用的性能要求来选择不同的集合类, Java集合中实际存放的只是对象的引用,每个集合元素都是一个引用变量,实际内容都放在堆内存或者方法区里面,但是基本数据类型是在栈内存上分配空间的,栈上数据随时就会被收回的。
- 基本类型数据如何解决呢?
可以通过包装类把基本类型转为对象类型,存放引用就可以解决这个问题。更方便的,由于有了自动拆箱和装箱功能,基本数据类型和其对应对象(包装类)之间的转换变得很方便,想把基本数据类型存入集合中,直接存就可以了,系统会自动将其装箱成封装类,然后加入到集合当中。
3、集合类存放在java.util包中,今后进行程序编程时将大量使用的集合类和相关接口,
如以下:
Iterable:迭代器接口
Collection:类集接口
List:列表接口
Set:数据集接口
Queue:队列
Map:键-值对组合映射表
Iterable接口
实现改接口允许对象成为“Foreach”语句的目标,即改集合对象允许迭代。
类集接口Collection是Iterable的子接口,所以所有类集对象可以迭代访问,而映射Map不行。
方法
Iterator iterator()
功能: 返回一个在一组T类型的元素上进行迭代的迭代
迭代器是实现了Iterator/ListIterator 接口的类的对象,可以通过遍历类集,访问操作其中的每个元素。
ListIterator 扩展了父接口Iterator,允许双向遍历集合,并可以修改和删除元素。
下面是ListIterator的方法介绍:
下面是Iterator和ListIterator遍历区别:
打印结果为:
使用Iterator迭代.
Amy Bob nCarl
使用ListIterator迭代
正向遍历: Amy Bob nCarl
反向遍历: nCarl Bob Amy
Collection接口定义的方法
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
List 、 Set、 Map
1、List(有序、可重复)
List接口扩展了Collection, List里存放的对象时有序的,同时也是可以重复的,并且如果列表本身允许 null 元素的话,通常它们允许多个 null 元素。List关注的是索引,拥有一系列和索引相关的方法,查询速度快。因为list集合里插入或删除数据时,会伴随着后面数据的移动,所有插入删除数据速度慢。
ArrayList.
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程不安全,效率高
Vector.
优点: 底层数据结构是数组,查询快,增删慢。
缺点: 线程安全,效率低
LinkedList.
优点: 底层数据结构是链表,查询慢,增删快。
缺点: 线程不安全,效率高
2、Set(无序、不可重复)
Set接口扩展了Collection,Set集合存放的对象是无序,不能重复的,并且最多包含一个 null 元素。集合中的对象不按特定的方式排序,只是简单地把对象加入集合中。
****HashSet.
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet.
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet.
底层数据结构是红黑树。(唯一,有序)
- 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
3、Map(键值对、键唯一、值不唯一)
映射(map)是一个存储关键字/值对的对象。键不能重复,值可以重复。根据键得到值,给定一个关键字,可查询得到它的值,关键字和值都可以是对象。映射不是Collection的子接口。所以它本身不能使用迭代器来进行遍历。
针对collection集合我们到底该使用谁呢???
首选判断是否重复?
没有重复:
用set
排序么?
排序:TreeSet或LinkedHashSet
不排序:HashSet
重复:
用List
是否需要安全?
安全:Vector
不安全:ArrayList或则LinkedList
查询多:ArrayList
增删多:LinkedList
总结:
如果你知道该用Set,但是不知道用哪个实现类,就用HashSet。
如果你知道用LIst,但是不知道是哪个list,就用ArrayList。
如果你知道是Collection集合,但是不知道使用谁,就用ArrayList ;
如果你知道用集合,就用ArrayList.
参考文献:https://blog.csdn.net/zhangqunshuai/article/details/80660974
推荐阅读
-
四种常见的数据结构、LinkedList、Set集合、Collection、Map总结
-
详解ES6中的 Set Map 数据结构学习总结
-
python 集合 并集、交集 Series list set 转换的实例
-
JavaScript之Map和Set_动力节点Java学院整理
-
day07-set集合,深浅拷贝,list删除,字符串join操作
-
ES6中Set和Map数据结构,Map与其它数据结构互相转换操作实例详解
-
第51节:Java当中的集合框架Map
-
利用Distinct()内置方法对List集合的去重问题详解
-
Java语法基础之集合-Set+集合-List
-
Java 集合基础知识 List/Set/Map