本帖最后由 小石姐姐 于 2018-1-5 09:11 编辑
第二阶段笔记集合摘要 -石家庄校区黑马JavaEE基础6期
集合Collection
- 包含了不同的实现类, 向上抽取出了很多共性的接口, 形成了一个体系结构
- 约束集合中元素的数据类型
- 将运行时发生的类型转换异常提前到了编译时期
- 优点: 快速简便的遍历集合元素
- 缺点: 不能在遍历过程中修改集合, 也没有索引可以使用
- 长度一旦确定则不可改变
- 有整数索引
- 只能存储同一个数据类型的元素
- 既能存储基本数据类型, 又能存储引用数据类型
- 增删慢, 查询快
// 增强for循环格式for (元素的数据类型 变量名 : 数组或集合对象) { // 遍历出来的变量可以直接使用}
Collection接口(单列集合体系的顶层) | * boolean add(E e): 添加元素, 添加成功返回true, 否则false | * void clear(): 清空集合中的元素 | * boolean contains(Object o): 判断集合中是否包含指定的对象 | * boolean isEmpty(): 判断集合中是否没有元素. 与null区分 | * boolean remove(Object o): 从集合中删除一个元素, 删除成功返回true, 否则false | * int size(): 获取集合的长度(元素的数量) | * Object[] toArray(): 将集合转换为Object[]数组 | * Iterator<E> iterator(): 获取集合的迭代器对象 |- List接口(有序, 可重复, 有索引) | * void add(int index, E e): 添加元素到指定索引上 | * E remove(int index): 删除索引上的元素, 并返回 | * E set(int index, E e): 修改指定索引上的元素, 并返回被替换的元素 | * E get(int index): 获取指定索引上的元素 | * ListIterator listIterator(): 获取List特有的迭代器对象 |- ArrayList类(底层是数组, 查询快, 增删慢) |- LinkedList类(底层是链表, 查询慢, 增删快) * void addFirst(E e): 添加元素到集合的开头 * void addLast(E e): 添加元素到集合的末尾 * E getFirst(): 获取集合开头的元素 * E getLast(): 获取集合末尾的元素 * E removeFirst(): 删除开头的元素, 并返回 * E removeLast(): 删除末尾的元素, 并返回Iterator接口 | * boolean hasNext(): 判断是否有下一个元素 | * E next(): 获取下一个元素 | * void remove(): 删除迭代器返回的最后一个元素 |- ListIterator接口 * void add(E e): 使用迭代器添加元素到集合 * void remove(): 使用迭代器删除元素
------------------------------------------------------------------------
Set接口,继承collection接口
- 特点:
- 元素存储无序(,存储和取出顺序不一样, 按照算法存储元素顺序)
- 元素不可重复
- 无索引
- boolean add (Object o) 添加元素对象
- 遍历方式
- 调用toArray方法,转成数组遍历
- 增强for循环遍历集合
- Iterator<> i = set.iterator迭代器循环
HashSet, Set的实现类 (自己总结:Set中的元素默认是根据其值的hash值从大到小排序)
- 特点:
- HashSet存储自定义元素的注意事项
- 重写equls方法必须重写hashCode方法
- 去重方式
- add底部是Map.put方法,利用Map中的K不能重复来存储
- Map.put源码比较了K的hash值&&(比较地址值||equals方法),如果都有一样不同,则添加
- HashSet唯一性规则
- HashSet的add()方, 首先会使用当前集合中的每一个元素与新添加的元素进行hash值比较,hash值不一样则添加
- 如果hash值一样,则比较地址值或使用equals方法比较
- 如果equals比较不一样,则添加
Collections工具类
- Collection和Collections的区别
- Collection是集合体系的最顶层,包含了集合体系的共性, 而Collections是一个工具类
- Collections的常用方法
- static int binarySearch(List list, Object o) 使用二分查找法查找指定元素在指定列表的索引位置(折半查找)
- 举例 Collections.binarySearch(list, 1);
- static void copy (List dest, List src); 将源列表的元素覆盖到指定列表,,目标类别的长度必须大于等于源列表
- 举例 Collections.copy (dest, src);
- static void fill(List list, Object o);使用指定的对象填充指定列表的所有元素
- 举例 Collections.fill (list, "java");
- static void reverse(List list);将指定列表元素进行反转
- static void shuffle (List list); 将指定列表元素随机置换;
- static void sort(List list); 按照列表中元素的自然顺序进行排序
- static void swap(List list, intdex j, index i);将指定列表中的两个索引上的元素进行互换
Map集合
概述(public interface Map<K,V>)
- Map集合中的K(键)是唯一的,如果添加时K重复则会修改K对应的值
常用方法一
- V put(K key, V value)
- V get(Object key) 通过键获取值,如果没有键则返回null
- int size()
- boolean containsKey(Object key)
- boolean containsValue(Object value)
- boolean isEmpty()
- void clear()
- V remove(Object key) 通过键删除值,如果没有键则返回null
常用方法二
- Set<K> keySet(); 返回此映射中包含键的Set视图
- Collection<V> values(); 返回此映射用包含值的Collection视图
- Set<Map.Entry<K, V> entrySet(); 返回此映射中包含的映射关系的Set视图
Map集合的两种遍历方式:
- 通过Keyset()方法获取所有的键,然后通过键获取对应的值
Set<String> key = map.keySet();
for (String string : key) {
String value = map.get(string);
System.out.println(string + "=" + value);
}
- 通过Set<Map.Entry<K, V>> entrySet();方式遍历
Set<Entry<String, String>> entrySet = map.entrySet();
for (Entry<String, String> entry : entrySet) {
//System.out.println(entry);
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key+ "=" + value);
}
Map嵌套Map
Map< K , Map<K, V>>
先遍历第一个Map,拿到所以的K,然后用K得到所有的Map集合并遍历
//通過keySet()方法遍歷
Set<String> keySet = itheima.keySet();
for (String key : keySet) {
System.out.println(key);
Map<String, String> map = itheima.get(key);
Set<String> keySet2 = map.keySet();
for (String string : keySet2) {
System.out.println(string+"="+map.get(string));
}
}
//通过 entrySet方法遍历
Set<Entry<String, Map<String, String>>> entrySet = itheima.entrySet();
for (Entry<String, Map<String, String>> entry : entrySet) {
System.out.println(entry.getKey());
Map<String, String> value = entry.getValue();
Set<Entry<String, String>> entrySet2 = value.entrySet();
for (Entry<String, String> entry2 : entrySet2) {
System.out.println(entry2.getKey()+"="+entry2.getValue());
}
}
Map嵌套Collection
Map<K, Collection<E>>
先遍历第一个Map,拿到所以的K,然后用K得到所有Collection集合并遍历
//用Set<K> keySet()方法遍历
Set<String> classNames = itheima.keySet();
for (String className : classNames) {
System.out.println(className);
Set<Student> students = itheima.get(className);
for (Student student : students) {
System.out.println(student.getId()+"="+student.getName());
}
}
//用Set<Map.Entry<K, V>> entrySet()方法遍历
Set<Entry<String, Set<Student>>> classNames = itheima.entrySet();
for (Entry<String, Set<Student>> className : classNames) {
System.out.println(className.getKey());
Set<Student> students = className.getValue();
for (Student student : students) {
System.out.println(student.getId()+"="+student.getName());
}
}
可变参数(数据类型明确,长度不明确时用)
- 其本质是一个长度可变的数组(其实是根据传入的参数数量定义数组的长度)
- 作为形参时格式: 数据类型...变量名
- 作为实参时: 一个一个传入,逗号分隔
- 注意
- 可变参数后不能再追加添加变量
- 可变参数前可以追加参数
- 调用方法时,参数的数量可以给多个,也可以一个也不给
|
|