黑马程序员技术交流社区
标题:
第二阶段笔记集合摘要 -石家庄校区黑马JavaEE基础6期 集合...
[打印本页]
作者:
1059472218
时间:
2018-1-4 17:20
标题:
第二阶段笔记集合摘要 -石家庄校区黑马JavaEE基础6期 集合...
本帖最后由 小石姐姐 于 2018-1-5 09:11 编辑
第二阶段笔记集合摘要
-石家庄校区黑马JavaEE基础6期
集合
Collection
包含了不同的实现类, 向上抽取出了很多共性的接口, 形成了一个体系结构
数据结构
数据的组织和存储方式
迭代器
作用: 遍历集合
并发修改异常:
原因: 迭代集合时改变了集合的长度
解决:
不使用迭代器
使用迭代器对象中的修改方法
泛型
作用:
约束集合中元素的数据类型
将运行时发生的类型转换异常提前到了编译时期
遍历集合的3种方式
普通for循环
迭代器
增强for循环
优点: 快速简便的遍历集合元素
缺点: 不能在遍历过程中修改集合, 也没有索引可以使用
常见的数据结构
数组
特点:
长度一旦确定则不可改变
有整数索引
只能存储同一个数据类型的元素
既能存储基本数据类型, 又能存储引用数据类型
增删慢, 查询快
链表
特点:
增删快, 查询慢
栈
特点: 先进后出, FILO
队列
特点: 先进先出, FIFO
// 增强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());
}
}
可变参数(数据类型明确,长度不明确时用)
其本质是一个长度可变的数组(其实是根据传入的参数数量定义数组的长度)
作为形参时格式: 数据类型...变量名
作为实参时: 一个一个传入,逗号分隔
注意
可变参数后不能再追加添加变量
可变参数前可以追加参数
调用方法时,参数的数量可以给多个,也可以一个也不给
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2