集合的整理(List,Set详解)
集合的特点:
集合和数组的区别:
1.长度区别:数组固定,集合可变
2.内容区别:数组可以使基本类型,也可以是引用类型,集合只能是引用类型
3.元素内容:数组只能储存同一种类型的数据,集合可以储存不同类型的数据(其实集合一般存储的也是同一种类型)
概述:
一.Collection 接口的接口,对象的集合(单列集合)
List接口:元素按进入先后有序保存,可重复(有序可重复)
ArrayList:
1.Java.util包
2.构造方法:
无参构造:ArrayList list=new ArrayList();
3.限定存储数据类型构造方法:
ArrayList< String > str = new ArrayList<>();
4.常用API:增删改查
-》增加数据:add(E e)/add(int index,E e)
-》删除数据:remove(E e)/remove(int index)
-》修改数据:set(int index,E e)
-》查询数据:get(int index)
5.集合操作
(1)addAll(Collection c) 并集
removeAll(Collection c) 差集
retainAll(Collection c) 交集
indexOf()
lastIndexOf()
isEmpty()
iterator() 获取List对应的迭代器
size()
.........
优点:
底层数据结构是数组,查询快,增删慢
缺点:
线程不安全,效率高
特点:
存储数据分配连续内存空间,类似于动态数据,适合便利轮训,不适合插入数据,没有同步。
LinkedList:
1.Java.util包
2.构造方法:
无参构造:LinkedList list = new LinkedList();
3.限定存储数据类型构造方法
LinkedList str = new LinkedList<>();
4.常用API:增删改查
-》增加数据:add(E e)/add(int index,E e)
-》删除数据:remove(E e)/remove(int index)
-》修改数据:set(int index,E e)
-》查询数据:get(int index)
-》addFrist()
-》addLast()
5.集合操作
(1)addAll(Collection c) 并集
removeAll(Collection c) 差集
retainAll(Collection c) 交集
indexOf()
lastIndexOf()
isEmpty()
iterator() 获取List对应的迭代器
size()
.........
底层
底层使用双向链表;对于频繁的插入、删除操作,我们建议使用此类,因为效率高;
优点:
底层数据结构是链表,查询慢,增删快(与ArrayList相反)
缺点:
线程不安全,效率高
特点:
存储数据是采用链表的形式,适合数据插入,不适合遍历轮询。
Set:(无序,唯一)
1.Java.util包
2.数据存储:
存储的是value
3.构造方法:
无参构造方法:HashSet set = new HashSet()
指定存储的数据类型:HashSet<String> set = new HashSet<>();
4.常用API:增删改查
-》增加数据:add()
-》删除数据:remove()只能通过数据的引用删除,
-》没有修改方法
-》查询
-》只能通过迭代器 it = set.iterator()
while(it.hasNext()){
it.next()
}
-》contains() 是否包含某个元素
-》isEmpty() 检查集合中元素是否为空
5.相同元素:
后面的是否会覆盖前面的元素?
如何实现集合中的元素不重复?
条件一:首先判断加入HashSet集合中的对象进行equals比较 判断返回结果是否为true
条件二:判断加入HashSet集合中的元素的hashCode码是否一致
HashSet
底层数据结构是哈希表。(无序,唯一)
如何来保证元素唯一性?
1.依赖两个方法:hashCode()和equals()
LinkedHashSet
底层数据结构是链表和哈希表。(FIFO插入有序,唯一)
1.由链表保证元素有序
2.由哈希表保证元素唯一
TreeSet
底层数据结构是红黑树。(唯一,有序)
1. 如何保证元素排序的呢?
自然排序
比较器排序
2.如何保证元素唯一性的呢?
根据比较的返回值是否是0来决定
Vector:
1.Java.util包
2.ArrayList早期版本
StringBuffer StringBuilder
3.构造方法:
无参构造: Vector vec=new Vector();
4.限定存储数据类型构造方法
Vectort vec = new Vector<>();
5.常用API:增删改查
增删改查
add()
remove()
set()
get()
size()
.....
Vector:
类似动态数据的形式存储数据,但是Vector扩容是以2倍的方式
优点:
底层数据结构是数组,查询快,增删慢线程是同步的,
缺点:
安全性高,效率低。
Stack:
1.Java.util包
2.存储特点:
先进后出,后进先出
3.构造方法:通常用无参构造
4.Stack特殊方法:
empty() 检测栈中元素是否为空
push() 将元素压入栈中
pop() 将栈顶的元素删除
peek() 查看栈顶的元素但是不删除
search() 查找元素在栈中的位置,查找出的索引从1开始
5.为什么要使用栈?
悔棋
撤销功能
Queue:队列(也是线性结构)
1.Java.util包
2.(是一个接口)存储特点:
实现数据的先进先出,后进后出的数据结构
3.常用的实现类:
LinkedList(除了是list的实现类之外,还是Deque的实现类), ArrayDeque/Deque(双端队列)
4.常用的方法对比:
List接口中
add()
remove()
element()-->get()
Queue特有的方法
offer() 添加元素,相当于add
peek() 查看队列中第一个元素
poll() 删除队列底端的第一个元素
pop () 弹栈
push()压栈
5.队列应用
抢购秒杀
抢答
底层
顺序/链表
重点分析
TreeSet, LinkedHashSet and HashSet 的区别
TreeSet的主要功能用于排序
LinkedHashSet的主要功能用于保证FIFO即有序的集合(先进先出)
HashSet只是通用的存储数据的集合
Duplicates elements: 因为三者都实现Set interface,所以三者都不包含duplicate elements
Thread safety: 三者都不是线程安全的,如果要使 用线程安全可以Collections.syn
Performance and Speed: HashSet插入数据最快,其次LinkHashSet,最慢的是TreeSet因为内部实现排序
- Ordering: HashSet不保证有序,LinkHashSet保证FIFO即按插入顺序排序,TreeSet安装内部实现排序,也可以自定义排序规则
- null:HashSet和LinkHashSet允许存在null数据,但是TreeSet中插入null数据时会报NullPointerException
set和list的区别:
1.有序性:list:保证按插入顺序 set:存储顺序和取出顺序是不一致的
2.唯一性:list:可以有重复元素 set:元素唯一
3.获取元素:list:可以通过下标索引,直接操作元素 set:不可以直接使用索引
如何使用集合
1.需要唯一吗?
需要:set 不需要:list
2.需要指定顺序吗?
需要:TreeSet 不需要:HashSet 和存储顺序一致:LinkedHashSet
3.需要频繁的删除和增加吗?
需要:LinkedList 不需要:ArrayList