集合
本部分为日常学习笔记,因整理方法尚不完善,部分内容或有待补充。
之后会逐一编辑完善,用作日常知识点记录与参考。
- collection接口
- List接口
- ArrayList
- Vector
- Stack
- Queue接口
- Deque
- LinkedList
- Deque
- List接口
集合特点
集合类解决什么问题?
在不知道集合中到底有多少个对象的情况下,对于一组对象进行操作,而不是某一个对象。
集合类的特点
- 只能存储引用数据类型
- 当存储空间不足时,能够进行自动扩容
数组和集合都是容器,它们之间有什么不同?
主要的区别存在于数据类型、长度、效率、API四个方面;
— | 数组 | 集合类 |
---|---|---|
数据类型 | 可以存储多种数据类型 | 仅仅能够存储引用类型 |
长度 | 一旦创建,长度不变 | 空间不够能够自动扩容 |
效率 | 较高,偏底层 | 较低 |
API | 没什么API | 有丰富的API |
Collection接口概述
Collection 层次结构 中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。JDK不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。
- Collection的子类接口为set、List
- 有些子类集合允许重复有些不允许,有些子类集合是有序的有些是无序的
Collection API
- 单个集合上进行操作
- boolean add(E e)–添加元素e,确保集合中存在元素
- boolean remove(Object o)–移除集合中指定元素,如果有重复的只会删除一个
- void clear()–将集合中的内容置为空,但该集合对象依然存在
- boolean contains(Object o)–查找集合中是否存在该元素,如果存在则返回true
- boolean isEmpty()–判断该集合是否为空,如果是空则返回true
- int size()–返回集合中元素的个数
- 多个集合上进行操作
- boolean addAll(Collection c)–将指定集合c中的所有元素都添加到集合当中,相当于两集合求并集
- boolean removeAll(Collection c)
- boolean containsAll(Collection c)
- boolean retainAll(Collection c)
迭代器Iterator接口
迭代器的模型
迭代器的实现语法
迭代器的设计原理
- 为什么Iterator定义成一个接口而不是一个类?
- 不同的集合数据接口可能不同,遍历方式也不一样,所以不能够再一个类当中实现对所有集合的遍历。
- 遍历是集合的基本操作,应该有一个统一的方法作为遍历的标准,因此需要一个抽象方法表示遍历。
- 因为迭代器与集合之间没有从属关系,所以将迭代器设置为接口而非抽象类。
- 通过
Iterator it=c.iterator();
方式获取迭代器,其中it肯定是Iterator的实现子类对象,那么此迭代器是什么类型的?为什么要这样设计迭代器?- 迭代器用来遍历集合,所以迭代器必须知道集合的数据结构,但集合的数据结构都是私有的;
- 一个类如何访问另一个类的私有成员?此处通过内部类来实现迭代器;
- 局部内部类的对象属于该方法所有,遍历集合在多种方法中都可能用到,所以不能以局部内部类实现迭代器;
- 静态内部类对象属于外部类而非外部类对象,也就是不依赖于集合对象,也不适合实现迭代器;
- 成员内部类对象依赖于外部类对象存在,所以创建方式也是通过外部类对象进行创建。
- 这属于设计模式中的【迭代器模式】;
使用迭代器的注意事项
- 警惕
ConcurrentModificationException
异常 - 不要使用while循环遍历集合,推荐使用for循环,最好使用foreach循环;
List接口
有序的collection
,此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
List子类
ArrayList
- 特点
- 底层数据结构是数组,查询快,增删慢
- 不是同步的,所以线程不安全,但是没有锁效率高
- 常用API:
- 11
Vector 向量
- 特点
- 底层数据结构是数组,查询快,增删慢
- 是同步的,线程安全
- 常见API
- 11
LinkeList
List 接口的链接列表实现。
- 实现所有可选的列表操作,并且允许所有元素(包括 null)。
- 这些操作允许将链接列表用作堆栈、队列或双端队列。
- 不仅实现了List接口,而且实现了Deque接口
- 特点