# 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() {
重写方法
});node