本帖最后由 sun2ice 于 2018-1-4 23:07 编辑
#day7 集合
##常用的方法
* Collection 接口
```
Collection: [kəˈlekʃn], 单列集合的顶层接口
boolean add(E e): 添加元素, 添加成功返回true, 否则false
boolean remove(Object o): 从集合中删除一个元素, 删除成功返回true, 否则false
void clear(): 清空集合中所有元素
boolean contains(Object o): 判断集合值中是否包含指定的元素
boolean isEmpty(): 判断集合中是否没有元素.有返回false 没有返回true 与null区分
int size(): 获取集合的长度(元素的数量)
Object[] toArray(): 将集合转换为Object[]数组
Iterator<E> iterator(): 获取集合的迭代器对象
```
* List 接口(有序的 可重复,有索引)
```
List list = new ArrayaList();
ListIterator lit = list.listIterator(): 获取List特有的迭代器对象
List: [lɪst], 有序单列集合的接口
void add(int index, E e): 添加元素到指定索引上
E remove(int index): 删除索引上的元素, 并返回
E set(int index, E e): 修改指定索引上的元素, 并返回被替换的元素
E get(int index): 获取指定索引上的元素
```
* LinkedList 实现类
```
ArrayList: [əˈreɪ][lɪst], 类(底层是数组, 查询快, 增删慢)
LinkedList: ['lɪŋkt][lɪst], 类(底层是链表, 查询慢, 增删快)
void addFirst(E e): 添加元素到集合的开头
void addLast(E e): 添加元素到集合的末尾
E getFirst(): 获取集合开头的元素
E getLast(): 获取集合末尾的元素
E removeFirst(): 删除开头的元素, 并返回
E removeLast(): 删除末尾的元素, 并返回
```
* Set: 无序单列集合的接口
```
boolean add(E e): 添加成功返回true; 添加失败(重复了)返回false
```
* Map: [mæp], 双列集合的接口
* HashMap
```
V put(K key, V value)`: 添加/修改键值对,如有相同键,则覆盖其对应值,并返回被覆盖的值,没有则返回null
V get(Object key)`: 通过指定键获取值
int size()`: 获取集合长度
containsKey(Object key)`: 是否包含指定的键
containsValue(Object value)`: 是否包含指定的值
boolean isEmpty()`: 是否为空
void clear()`: 清空集合
V remove(Object key)`: 删除指定键的值(key和value都会删除)
Set<Map.Entry<K, V>> entrySet()`: 获取键值对的Set集合
Set<K> keySet()`: 获取所有键的Set集合
Collection<V> values()`: 获取所有值得Collection集合
```
* Collections: [kəˈlekʃns], 操作单列集合的工具类
```
static int binarySearch(List list, T key)`: 使用二分查找来查找元素在指定列表的索引位置
static void copy(List dest, List src)`: 将源列表中的数据覆盖到目标列表
static void fill(List list, Object obj)`: 使用指定对象填充指定列表的所有元素
static void reverse(List list)`: 反转集合中的元素
static void shuffle(List list)`: 随机打乱集合中元素的顺序
static void sort(List list)`: 将集合中的元素按照元素的自然顺序排序
static void swap(List list, int i, int j)`: 将指定列表中的两个索引进行位置互换
```
* Iterator 接口
```
Iterator: [ɪtə'reɪtə], 迭代器接口
boolean hasNext(): 判断是否有下一个元素
E next(): 获取下一个元素
void remove(): 删除迭代器返回的最后一个元素
```
* ListIterator接口
```
List list = new ArrayaList();
ListIterator lit = list.listIterator(): 获取List特有的迭代器对象
ListIterator: 用于List集合的迭代器接口
void add(E e): 使用迭代器添加元素到集合
void remove(): 使用迭代器删除元素
```
##集合体系结构
* 由于不同的数据结构(数据的储存方式),所以Java为我们提供了不同的集合
* 但是不同的集合功能相似,不断地向上抽取,将共性抽取出来,这就是集合体系结构形成的原因
* 体系结构
* 从最顶层开始学,因为顶层包含了所有共性
* 使用最底层,因为底层是具体的实现
##Collection(单列集合)
* 接口 不能实例化 需要创建子类对象来调用本类方法
* `Collection<E> c = new ArrayList<>();`
##遍历集合
方式1:toArray() 转换数组再for循环遍历
方式2:iterator() 返回一个迭代器对象Iterator(可用来遍历集合)
方式3:foreach 增强for
##迭代器遍历集合
* 迭代器Iterator方法
```
boolean hasNext() 判断是否有元素可以获取
E next() 返回迭代的下一个元素。
注意:没有元素获取则出现 NoSuchElementException
```
* 遍历集合
```
Collection c= new ArrayList();
Iterator it = c.iterator();
while(it.hasNext()){
syso(it.next());
}
```
##并发修改异常
* 迭代器是依赖于,相当于集合的副本,当迭代器在操作时发现和集合不一样时则抛出异常 `ConcurrentModificationException`
* 避免以上异常 在迭代器进行遍历的时候,使用迭代器进行修改
```
List列表
//创建List对象l
List l = new ArrayList();
//创建ListIterator对象lit
ListIterator lit = l.ListIterator
//迭代时添加 此时同步集合;
lit.add();
```
##泛型的概述< E >
* 泛型出现的原因
* 由于集合可以储任何类型的对象,,当我们储存了不同类型的对象,就有可能在转型时出现转换类型异常
* 泛型
* 一种广泛的类型,把明确数据类型的工作提前到编译时期,借鉴数组的特点
* 泛型好处
* 避免了类型转换问题
* 可以减少黄色警告线
* 可以简化我们代码的书写
##增强for foreach
* 一般用于集合或者数组的遍历
* 格式
```
for(元素的类型 变量 : 集合或者数组对象){
//每次循环都会遍历出一个元素,,保存到变量名中
}
注意:在增强for循环使用中不能改变集合,否则会出现并发修改异常
ConcurrentModificationException
```
##栈&列队
* 栈
* 先进后出(弹夹)
* 队列
* 先进先出(单行道)
##List的特点
* 接口 不能创建对象 创建子类的对象
* `List <E> l = new ArrayList<>();`
* 有整数索引
* 允许重复
* 有序的
##常见数据结构
* 数组 Array
* 特点
* 长度不可变
* 元素有对象应的整数索引
* 只能存储同一种数据类型
* 可以存基本数据类型,也可以存储引用数据类型
* 查找快,增删慢
##常见链表结构
* 链表 Link
* 由链子链接起来的一堆结点(火车箱)
* 结点: 地址值,值,下一个结点地址值
* 查找慢,增删快
##List的子类概述
* ArrayList 底层数组结构
* 查询快,增删慢
* LinkedList底层链表结构
* 查询慢,增删快
* 如果不确定什么操作多就用ArrayList
##Set的特点
* 接口 不能创建对象 创建子类的对象
* `Set <E> s = new HashSet<>();`
* 无序(添加和读取顺序可能不一样)
* 不允许重复,元素唯一性
* 没有索引
##自定义对象去重
* 重写HashCoe()方法
* 重写equals()方法
* 快捷键生成
##Collections工具类
* 静态方法,类名调用
* Collection 与 collections 的区别
* collection 单列集合体系的顶层,包含了所有集合的共性
* Collections 工具类,用来操作collection
##Map的特点(双列集合)
* 接口 不能创建对象 创建子类对象
* `Map<K,V> m = new HashMap<>();`
* 将键映射到值得对象,每个键最多可以映射(对应)到一个值,
* 键不能重复,值可以
* 键时无序的
##可变参数
* 当参数数量不确定,类型要明确,
* 本质
* 长度可变的数组
* 格式
* 参数 数据类型...变量名
* `sum(int...arr)`
* 注意:后面不能追加参数
* 传值时可以多个,,也可以0个
```
List接口: 允许元素重复,记录先后添加顺序.
Set 接口: 不允许元素重复,不记录先后添加顺序.
需求: 不允许元素重复,但是需要保证先后添加的顺序.
LinkedHashSet:底层采用哈希表和链表算法.
哈希表:来保证唯一性,.此时就是HashSet,在哈希表中元素没有先后顺序.
链表:来记录元素的先后添加顺序.
```
|
|