A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 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,在哈希表中元素没有先后顺序.
    链表:来记录元素的先后添加顺序.
```


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马