Collection集合接口及其子接口、实现类
发布日期:2021-05-07 06:54:32 浏览次数:22 分类:精选文章

本文共 2980 字,大约阅读时间需要 9 分钟。

1. Collection 接口简介

在这里插入图片描述

Collection 接口继承自Iterable接口
因此可以通过迭代器迭代元素

Collection接口常用方法

方法名 解释
boolean add(E e) 向集合中添加元素
int size 获取集合中元素的个数
void clear() 清空集合
boolean contains(Object o) 判断集合中是否有元素o
boolean remove(Object o) 删除集合中的一个元素
boolean isEmpty() 判断集合是否为空
Object[] toArray 将集合转为数组

2. Collection的子接口

List:存放有序、可重复的元素

Set:存放无序、不可重复的元素

Queue:队列接口

2.1 List接口

List接口继承自Collection接口

List常用方法:

方法 解释
T get(int index) 通过下标返回集合中对应位置的元素
T set(int index,T element) 在集合中的指定位置存入对象
add(Object element) 向集合的尾部添加指定的元素

List接口的实现类

① ArrayList

ArrayList 是开发中使用频率最高的 List 实现类,实现了长度可变的数组,在内存中分配连续空间,所以读取快,增删慢

特点: 有序、可重复

底层数据结构: Object[]数组(所以可以存储不同类型的数据)

Array和ArrayList的区别

1. Array长度在定义之后就不运行改变了,而ArrayList是长度可变的,可以自动扩容。
2. Array只能存储相同类型的数据,ArrayList可以存储不同类型的数据。

② Vector

Vector是线程安全的ArrayList,但效率较低,实现线程安全直接通过 synchronized 修饰方法来完成

③ Stack

Stack是Vector 的子类,实现了栈的数据结构,(后进后出)

常用方法:

push:入栈
peek:取出栈顶元素,将栈顶复制一份取出,取完之后栈内的数据不变。
pop:取出栈顶元素,直接取出栈顶元素,取完之后栈内的数据减一

④ LinkedList

在这里插入图片描述

从源码可以看出,LinkedList继承了List,还继承了Deque接口等
Deque接口是Queue(队列)的子接口

LinkedList的底层实现是链表

ArrayList 和 LikedList 的区别:内存中存储的形式不同,ArrayList 采用的数组的方式,LinkedList实现采用的是双向链表的形式

链表在内存中存储空间不连续,所以读取慢,链表通过节点的后置指针来寻找下一个节点,所以增删快(数组进行增删需要将后续的所有元素往后或往前移动)

LinkedList的特点:

(1)允许null值
(2)内部以双向链表的形式来保存集合中的元素
(3)线程不安全,线程安全的可以使用synchronizedList
(4)因为底层是链表,所以所有指定位置的操作都是从头开始遍历进行的
(5)元素是有序的,输出顺序与输入顺序一致

LinkedList 和 Stack 的 pop()方法的区别和相同点

相同点:pop 方法都是取出集合中的第一个元素,但是两者的顺序是相反的

不同点:Stack 是“后进先出”,所以 pop 取出的是最后一个元素
LinkedList 是“先进先出”,所以 pop 取出的是第一个元素

2.2 Set接口

Set 集合是以散列的形式存储数据,所以元素是没有顺序的,可以存储一组无序且唯一的数据

特点:无序,不可重复

Set接口的常用实现类

① HashSet

HashSet底层是HashMap,利用了key来保证元素的唯一性

特点:无序(元素的存储顺序和遍历顺序不一致)

例如

HashSet set = new HashSet();	set.add("一");	set.add("二");	set.add("三");	set.add("四");	set.add("五");	Iterator iterator = set.iterator();	while(iterator.hasNext()){   	 System.out.println(iterator.next()); //输出顺序为"一 五 三 四 二"	}

HashSet是如何去重的?

① 对于基本类型,直接按值进行比较
② 对于引用数据类型,会先比较hashCode()返回值是否相同,如果不同则代表不是同一个对象,如果相同则继续比较equals()方法返回值是否相同,都相同说明是同一个对象。
③ 自定义类使用HashSet存储除了重写equals()方法还要重写hashCode()方法,因为内容相同的对象hashCode()值不一定相同,因为只有hashCode()和equals()都相同才说明是同一个对象。

② LinkedHashSet

LinkedHasSet 是 Set 的另外一个实现类,可以存储一组有序且不重复的元素

有序:元素的存储顺序和遍历顺序一致

例如:

LinkedHashSet linkedHashSet = new LinkedHashSet();			linkedHashSet.add("一");	linkedHashSet.add("二");	linkedHashSet.add("三");	linkedHashSet.add("四");	linkedHashSet.add("五");			Iterator iterator = linkedHashSet.iterator();	while(iterator.hasNext()){   		System.out.println(iterator.next()); //输出为"一 二 三 四 五"	}

③ TreeSet

TreeSet 也是存储一组有序且唯一的数据

LinkedHashSet 和 TreeSet 都是存储一组有序且唯一的数据,但是这里的两个有序有区别

LinkedHashSet 的有序是指元素的存储顺序和遍历顺序是一致的

TreeSet 的有序是指集合内部会自动对所有的元素按照升序进行排列,无论存入的顺序是什么,遍历的时候一定按照升序输出(没有继承Comparable接口的类不能存入TreeSet)

补充:Compareble接口中有CompareTo()方法,当一个类继承该接口并实现CompareTo()方法,则可以进行比较,也就可以存入TreeSet

2.3 Queue接口

Queue 就是队列,底层实现了队列的数据结构(先进先出)

Queue 的实现类是 AbstractQueue,它是一个抽象类,不能直接实例化

其实现子类 PriorityQueue继承了抽象类AbstractQueue

Queue 中添加的数据必须是可以比较排序的,这一点和TreeSet类似

Queue 默认给元素进行升序排列,即自然排序

补充:LinkedList 实现了 Deque 接口,而 Deque 接口是 Queue 的子接口

上一篇:学校初二模拟赛(9,21)
下一篇:Java中的集合简要概括

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年03月30日 14时38分25秒