# List、Set
1. 数据结构
* 栈结构:先进后出
* 队列结构:先进先出
* 数组结构:是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。
* 数组特点:查询快,增删慢。且数组的长度在内存中是固定的,不可改变。存储位置连续
* 指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。
* 指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。
* 链表结构:由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。常说的链表分为单项链表和双向链表,单项链表每个结点只能指向下一个结点,而双向链表可以指向前一个和下一个结点。
* 链表特点:
* 查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
* 增删元素快:
增加元素:只需要修改连接下个元素的地址即可。
删除元素:只需要修改连接下个元素的地址即可。
* 长度不固定,存储位置不一定连续
2. List
1. 特点
有序(存进去和取出来的顺序一致)
有索引,方便查询,但是增删元素较慢
可以存储重复元素
2. 特有方法(能够使用索引的方法)
* void add(int index,E e):给指定的位置添加元素
* E remove(int index):删除指定位置元素,并返回bool类型的删除结果
* E set(int index,E e):修改指定位置的元素为e,并返回被修改的原数据。
* E get(int index):获取指定位置元素
3. ArrayList<T>
* 使用数组结构,查询快,增删慢
4. LinckedList<T>
* 底层是链表结构,查询慢,增删快
* 可以进行首位操作,所以Lincked有6个特有方法:
* addFirst() addLast()
* removeFirst() removeLast()
* getFirst() getLast()
5. Vector
* 底层也是数组结构
* Vector与ArrayList的区别:
* 相同点:
底层都是数组结构,特点就是查询块,增删慢
不同点:
Vector是线程安全的,效率低
ArrayList线程不安全的,效率高
3. Set
1. HashSet(无序,不可重复,无索引)
* LinkedHashSet:有序
* 如何保证Set集合内元素唯一呢?
* 依赖两个方法hashCode方法,equals方法
先执行hashCode方法,会和集合中的每一个元素的hash值进行比较,如果不同,直接添加
如果相同,执行equals方法判断,如果相同,就不添加,如果不同就添加元素
2. 集合使用的选择:
允许存储重复元素:
是:使用List集合
查询多还是增删多
查询多:选择ArrayList
增删多:选择LinkedList
不知道是查询多还是增删多,就使用ArrayList
否:使用set集合
有序吗?
是:选择LinkedHashSet
否:选择HashSet
不知道是否有序使用HashSet
什么都不知道选择ArrayList
适当的情况选择适合的容器可以增加我们的代码效率
4. 可变参数
定义:
修饰符 返回值类型 方法名(数据类型... 参数名) {
在方法中使用参数参数就可以看做是数组
}
使用:
方法名(参数) // 参数可以是0个,也可以是多个
5. Collections工具类
* 特点:
构造方法私有
成员静态
*方法:
sort(List list):按照自然排序
sort(List list, Compartor c): 按照比较器进行排序
自然排序就是按照默认规则由小到大排序(集合内容是可比较的类型)
比较器排序: 集合中存储的元素的类型实现了Comparable(可比较的)接口
ArrayList<String> list = new ArrayList<>();
Collections.sort(list, new Compartor() {
重写方法
});