
本文共 2980 字,大约阅读时间需要 9 分钟。
1. Collection 接口简介
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的底层实现是链表
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 的子接口
发表评论
最新留言
关于作者
