视频出处 提取码: bwm8
ArrayList在前面提及了一部分 视频已经放了进去
个人感觉讲的还可以 但是这个部分比较需要实际的编程经验,需要有集合框架的思想才更好用
随看随记
- idea中的for 和itergor遍历的快捷键
- 集合不存储基本类型 只存储引用类型
- 引用类型不要写== 要用equals
- 两个对象的哈希值相同 equals不一定是true 两个对象的equals相同 其哈希值必须相同
集合 Collection
- list接口存储的是 有序可重复 set接口存储的是 无序不可重复
- Collection< E > coll = new ArrayList< E >();
- Collection 是一个接口 通常使用多态来调用或创建ArrayList和LinkedList类来调用方法
- Collection接口的常用方法
- 返回true coll.add(e); 在集合中添加一个指定的引用数据类型的对象
- 无返回值 coll.clear(); 清空集合中的所有元素
- 返回布尔值 coll.contains(object obj);判断集合中是否有该元素,如果有则返回true,如果没有则返回false 注意: coll.contains(7); coll.contains(“7”); 注意格式不同也会返回false
- 返回布尔值 coll.remove(object obj);判断集合中是否有该元素,如果有则删除第一个该元素并返回true,如果没有则返回false 注意: 格式和大小写也会区分
- 返回是Object[] coll.toArray(); 将集合中的元素转成该类型的数组 因为不确定是什么类型 所以其返回是Object类型的数组
集合的遍历
迭代器遍历 Iterator接口 util包中的迭代器
- Collection有接口定义的方法,因此通过调用ArrayList对象的iterator()方法可以多态创建Iterator接口对象 Collection< E > coll = new ArrayList< E >(); Iterator< E > it = coll.iterator(); 这几个泛型一定不要忘记
- 常用方法
- 返回boolean it.hasNext(); 是否存在下一个元素,如果存在则返回true,否则返回false
- 返回E it.next(); 返回下一个元素
- 当使用迭代器遍历一个集合时,代码如下所示
Iterator<Integer> it = collection.iterator();
while (it.hasNext()) {
int e = it.next();
System.out.println(e);
}
-
迭代器开始时指针在-1位置 运行hasNext不会移动指针但是会看0位置是否有元素 当程序运行到next() 时 其指针才会移动并取出元素
-
一个迭代器对象只能遍历一次集合,即使是遍历同一个集合也需要再创建一个新的迭代器。
增强for循环遍历集合
- for(数据类型 变量名 : 数组或集合){ }
- 其本质是将容器中的元素赋值给for中的遍历对象 当修改对象时容器里的元素的内容没有被改变
- 好处:代码简单方便容器遍历 弊端:由于没有索引不能操作容器里的元素
- 一般只使用其去遍历
泛型
java是伪泛型 是在jdk中编译是进行检验 在.class文件中是没有泛型的
- 带有泛型的类 ArrayList< E > iterator< E > 等
- 带有泛型方法
- 返回指定类型的数组 coll.toArray(T[] array) 将coll集合中的元素转化到array数组中 并返回array数组
- 返回指定类型的数组 coll.toArray(T[] array) 将coll集合中的元素转化到array数组中 并返回array数组
- 泛型的通配符 “?”
?作为通配符可以匹配所有的数据类型 和cmd中的*效果是一样的 - 泛型的限定
- 上限限定
- ?extend E 可以传递E和它的子类对象
- 下限限定
- ?super E 可以传递E和它的父类对象
- 上限限定
- 找的一点资料 先放到这里 后面有别的需要在百度
List接口
三大特点 : 有序 索引 可重复
- 抽象方法 (带有索引的都是List的特有方法)以arrayList为例
- 继承Collection的方法
- 返回true arrayList.add(obj); 在集合中添加一个引用数据类型的对象
- 返回int arrayList.size(); 搁到整个集合的长度并返回
- 返回boolean arrayList.remove(obj); 如果存在obj则删除第一次出现的obj对象并返回true,不存在则返回false
- List 的特有方法
- 无返回值 arrayList.add(index,e); 在集合中在第index索引出添加一个e
- 返回E arrayList.set(index, e); 将原集合中的第index索引的对象替换为e 返回值是原来该索引的对象
- 返回E arrayList.remove(index); 将原集合中的第index索引的对象删除 返回值是原来该索引的对象
- 返回E arrayList.get(index); 得到集合中的第index个元素并返回
- 继承Collection的方法
- 迭代器并发异常 java.util.ConcurrentModificationException 在使用迭代器进行遍历时不允许修改集合的长度 包括add添加元素 和 remove 去除元素
ArrayList 数组集合
与上面差不多 就不写了
LinkedList 链表集合
- 特有方法
- 无返回值 link.clear(); 清空链表
- 返回Boolean link.isEmpty(); 判断链表是否为空 是返回true 不是返回false
- 添加元素
- 无返回值 link.addFirst(e) 在链表的开始添加e元素
- 无返回值 link.addLast(e) 在链表的结尾添加e元素 其与add方法是一样的,但是add方法返回true
- 得到元素
- 返回E link.getFirst() 返回链表中的第一个元素
- 返回E link.getLast() 返回链表中的最后一个一个元素
- 注意: 当链表被clear();后还会出现异常 java.util.NoSuchElementException异常,元素不存在异常,为了提高其健壮性需要加判断 !link.isEmpty() 或 link.size()!=0
Set接口
无序 不重复 无索引 只能通过迭代器或增强for 其遍历方法与arrayList都相同
HashSet 哈希表
哈希表是链表数组结合体
哈希表判断的存储过程 假设adc和abc的哈希值是相等的
- 当使用哈希表进行存储时 可能会需要重写其hashCode() 和equals() 方法 可以idea直接生成、
- LinkedHashSet 链表哈希表 存储顺序和去除顺序是相同的
- 是否存在相同元素的判断
- ArrayList使用contains(obj)方法判断是否存在重复元素
- HashSet使用add(e) 或contains(obj)方法来判断是否有重复元素 add可以是因为有重复元素是不会添加的 contains() 是通过hashCode()和equals()方法来判断是否相同
Map(K,V)类 键值对
当自定义对象做键时,要保证保证键的唯一性,需要对hashCode() 和 equals()及进行重写
HashMap允许存储null键 null值 但是Hashtable不允许 其余除了线程以外都一样
foreach不能遍历map 通过set遍历map
- 常用方法
- 增/改 返回null或覆盖之前的值Value map.put(key,val) 当key相同value不同时 , value会被覆盖 当value不同key相同时 会新建一个新的对象 把key想成自变量 value想成因变量 一个自变量只能对应一个因变量,一个因变量可以对应多个自变量 类比Collection中的add(index,e)方法
- 删 返回null或删除之前的值Value map.remove(key) 取出对应的键值对 如果没有则返回null 类比arrayList中的remove(index)方法
- 取 返回对应的value map.get(key) 取出对应的value值 如果没有则返回null 类比arrayList中的get(index)方法
- 返回key的set集合 set=map.keySet(); 取出所有的key值并存储在集合中
- 返回entry的set链表 entry=map.entrySet(); 每一对键值对作为entry对象存入set集合中
- map的遍历方法
//创建一个hashMap对象
Map<String, Integer> map = new HashMap<String, Integer>();
/*省略了向键值对里添加值的操作*/
//通过keySet的迭代器遍历
Set<String> stringSet = map.keySet();
Iterator<String> iterator = stringSet.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
System.out.println(key + "....." + map.get(key));
}
//通过keySet的foreach遍历
for (String keySet : map.keySet()) {
System.out.println(keySet + "....." + map.get(keySet));
}
//通过entrySet的迭代器遍历
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
while (entryIterator.hasNext()) {
Map.Entry<String, Integer> next = entryIterator.next();
System.out.println(next.getKey() + "....." + next.getValue());
}
//通过entrySet的foreach遍历
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "....." + entry.getValue());
}
注意:
- Map也是一个抽象类 需要通过其子类HashMap进行多态创建对象
- 通过keySet遍历时其遍历的对象类型是Key的数据类型而不是键值对类型 类似一个函数通过自变量来求得因变量的值
- entry是一个类中类 其遍历的对象类型是Entry< K , V >数据类型 ,通过entry.getKey() 和 entry.getValue() ;两个方法来获取其中的key 和 value
可变参数
其在之前的基础篇已经学过了 javaSE复习(1)
集合操作的工具类 Collections
都是静态方法
-
无返回值 Collection.sort(list) 对集合进行排序 对针对字符串进行排序的时候时对照每个字母的ASCII码
-
返回E Collection.binarySearch(list) 对有序列表进行二分查找
-
返回Collection Collection.shuffle(list) 对集合进行随机排序
集合嵌套的四种写法
Map<String,String> javase = new HashMap<String,String>();
Map<String,String> javaee = new HashMap<String,String>();
Map<String,Map<String,String>> czbk = new HashMap<String,Map<String, String>>();
javase.put("001","张三");
javase.put("002","李四");
javaee.put("003","王五");
javaee.put("004","赵六");
czbk.put("javaSE",javase);
czbk.put("javaEE",javaee);
printByForeach(czbk);
System.out.println("============================");
printByForeachEntry(czbk);
System.out.println("============================");
printByiterator(czbk);
System.out.println("============================");
printByiteratorEntry(czbk);
}
public static void printByForeach (Map<String,Map<String,String>> czbk){
for (String s : czbk.keySet()) {
System.out.println(s+":");
for (String s1 : czbk.get(s).keySet()) {
System.out.println("学号:"+s1+" 姓名:"+czbk.get(s).get(s1));
}
}
}
public static void printByiterator (Map<String,Map<String,String>> czbk){
Set<String> stringSet = czbk.keySet();
Iterator<String> stringIterator = stringSet.iterator();
while (stringIterator.hasNext()) {
String key1 = stringIterator.next();
System.out.println(key1+":");
Set<String> stringSet1 = czbk.get(key1).keySet();
Iterator<String> stringIterator1 = stringSet1.iterator();
while (stringIterator1.hasNext()) {
String key2 = stringIterator1.next();
System.out.println("学号:"+key2+" 姓名:"+czbk.get(key1).get(key2));
}
}
}
public static void printByForeachEntry (Map<String,Map<String,String>> czbk){
for (Map.Entry<String, Map<String, String>> stringMapEntry : czbk.entrySet()) {
System.out.println(stringMapEntry.getKey()+":");
for (Map.Entry<String, String> stringStringEntry : stringMapEntry.getValue().entrySet()) {
System.out.println("学号:"+stringStringEntry.getKey()+" 姓名:"+stringStringEntry.getValue());
}
}
}
public static void printByiteratorEntry (Map<String,Map<String,String>> czbk){
Iterator<Map.Entry<String,Map<String,String>>> entryIterator = czbk.entrySet().iterator();
while (entryIterator.hasNext()) {
Map.Entry<String, Map<String, String>> className = entryIterator.next();
System.out.println("班级" + className.getKey());
Iterator<Map.Entry<String,String>> stringStringIterator = className.getValue().entrySet().iterator();
while (stringStringIterator.hasNext()) {
Map.Entry<String,String> classCont = stringStringIterator.next();
System.out.println("学号 " + classCont.getKey()+"姓名 " + classCont.getValue());
classCont.getKey();
classCont.getValue();
}
}
}