2022-08-06 第二组刘禹彤 学习笔记
打卡26天
今天继续学习集合
###学习内容
LinkList
- List:数据是有顺序(添加的先后顺序)的,数据可以重复
- ArrayList:内部结构是数组,比较适合做高频率的查找,遍历
LinkedList:双向链表,比较适合做高频率的新增和删除
- 我们在创建对象时使用的是多态(父类对象---子类引用)
我们创建出来的对象只能调用父类和子类都有的方法
面试题:Collection和Map接口的区别Collection:存放单值的最大父接口;Map:存放对值的最大父接口面试题:ArrayList和LinkList的区别ArrayList:内部结构是数组,比较适合做高频率的查找,遍历;LinkList:双向链表,比较适合做高频率的新增和删除面试题:ArrayList和Vector的区别ArrayList和Vector,但ArrayList是线程异步的,不安全;Vector是线程同步的,安全
Collection接口
List:有顺序,元素可以重复,顺序指的是添加的先后顺序
set:没有顺序,元素不可以重复,顺序指的是添加的先后顺序
set其实是有顺序的,内部有一个专门排序的算法:1.所谓的无序不等于随机
2.所谓的无序指的是没有按照添加的先后顺
序,其实内部是做了排序的
实现类HashSet
Set集合如何确保数据不重复?
保证数据类型的类要重写hashCode和equals方法
面试题:List和set的区别List:有顺序,元素可以重复;Map:没有顺序,元素不可以重复
TreeSet
排序规则:要排序的对象的类必须实现comparable接口
LinkedHashSet
再添加数据的同时,会维护数据的添加顺序,效率要比HashSet略低一些
面试题:HashSet和LinkedHashSet的区别
比较接口
Comparable接口:自然排序
Comparator接口:临时排序
Map接口
1.存储对值K-V key-value
2.key不能重复,value可重复
3.没有顺序(添加的先后顺序)
HashMap内部存储结构
jdk1.7之前:链表+二叉树
jdk1.7及之后:链表+数组+红黑树
HashMap基本上面试90%问原理
Hashtable
Hashtable和HashMap几乎一模一样
面试题:Hashtable和HashMap区别2.HashMap的key是可以为null的,Hashtable是不可以为null的1.HashMap是线程异步,线程不安全;Hashtable是线程同步,线程安全的
Properties(属性)
Properties是Hashtable的子类,更多的是用来操作属性文件
集合的遍历
List集合的遍历
1.for循环
for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); }
2.foreach语句
for (String s : list) { System.out.println(s); }
3.迭代器
Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { String s = iterator.next(); iterator.remove(); // System.out.println(s); }
Set集合的遍历
1.foreach语句(增强for循环)
for (Integer integer : set) { System.out.println(integer); } for (int i = 0; i < set.size(); i++) {
2.迭代器
Iterator<Integer> iterator = set.iterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); }
Map集合的遍历
1for循环
Set<String> strings = map.keySet(); for (String s : strings) { System.out.println(s + "->" + map.get(s)); }
2.增强for循环
Set<String> strings = map.keySet(); Collection<String> values = map.values();
3.增强for循环
Entry是HashMap的一个内部类
每一组键值对就是一个Entry对象
Set<Map.Entry<String, String>> entries = map.entrySet(); for (Map.Entry<String, String> entry : entries) { System.out.print(entry.getKey() + "->"); System.out.println(entry.getValue());}
4.迭代器
Set<String> strings = map.keySet(); Iterator<String> iterator = strings.iterator(); while(iterator.hasNext()) { String s = iterator.next(); System.out.println(s + "->" + map.get(s)); }
其他的集合
1.LinkedHashMap,在HashMap的基础上维护了一个双向链表。
2.TreeMap:天然支持排序
3.Collections:Collections是一个工具类
迭代中删除元素
1.回调指针
for (int i = 0; i < names.size(); i++) { if(Objects.equals(names.get(i),"lucy")){ names.remove(i); // 1.回调指针 i--; } if("lucy".equals(names.get(i))){ } }
2.逆序遍历
for (int i = names.size() - 1; i >= 0; i--) { if(Objects.equals(names.get(i),"lucy")){ names.remove(i); } }
3.使用迭代器(推荐)
Iterator<String> iterator = names.iterator(); while(iterator.hasNext()) { String s = iterator.next(); if(Objects.equals(s,"lucy")){ iterator.remove(); } }
面试题:
线程安全问题: 迭代器是依赖于集合而存在,在判断成功以后,集合中新增了元素, 迭代器不知 道,所以就报错。
解决: 1.迭代器遍历元素,迭代器删除元素 2.普通for循环遍历,集合删除
###学习心得
今天把集合剩下的内容基本都学习完成,感觉知识点很多,需要记的东西也很多,代码量也逐渐上来了,要努力跟上老师的进度
###掌握情况:一般
###课上练习
public class Ch07 { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("1001","张岳"); map.put("1002","赵红兵"); map.put("1003","小北京"); map.put("1004","李四"); map.put("1004","张浩然"); map.put("1005","张浩然"); System.out.println(map); System.out.println(map.get("1003")); System.out.println(map.values()); System.out.println(map.keySet()); } }
###运行结果