愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
目录
第3集 Java集合框架之Collections工具类讲解上集
第4集 Java集合框架之Collections工具类讲解下集
第5集 Java集合框架元素排序之Comparable排序接口讲解
第1集 Java集合框架遍历之迭代器(Iterator)
简介:讲解什么是迭代器
-
使用循环遍历集合
-
普通for循环
-
增强for循环
-
-
什么是迭代器Iterator
-
Iterator是java中的一个接口,核心作用就是用来遍历容器的元素,当容器实现了Iterator接口后,可以通过调用Iterator()方法获取一个 Iterator对象
-
为啥是调用容器里面的Iterator方法呢?
-
因为容器的实现有多种,不同的容器遍历规则不一样,比如ArrayList/LinkedList/HashSet/TreeSet等,所以设计了Iterator接口,让容器本身去实现这个接口,实现里面的方法,从而让开发人员不用关系容器的遍历机制,直接使用对应的方法即可
-
-
三个核心方法
-
boolean hashNext()
-
用于判断iterator内是否有下个元素,如果有则返回true,没有则false
-
-
Obejct next()
-
返回iterator的下一个元素,同时指针也会向后移动1位
-
-
void remove()
-
删除指针的上一个元素(容易出问题,删除元素不建议使用容器自己的方法迭代器遍历集合
-
-
-
-
-
public static void testSet(){ Set<String> set = new HashSet<>(); set.add("jack"); set.add("tom"); set.add("marry"); set.add("tony"); set.add("jack"); Iterator<String> iterator = set.iterator(); while (iterator.hasNext()){ String str = iterator.next(); System.out.println(str); } } public static void testList(){ List<String> list = new ArrayList<>(); list.add("jack"); list.add("tom"); list.add("mary"); list.add("tim"); list.add("tony"); list.add("eric"); list.add("jack"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()){ String str = iterator.next(); System.out.println(str); } }
第2集 Java迭代器进阶和注意事项
简介:详细讲解迭代器的进阶知识和注意事项
-
迭代器是一种设计模式
-
三个核心方法
- boolean hashNext() - 用于判断iterator内是否有下个元素,如果有则返回true,没有则false - Obejct next() - 返回iterator的下一个元素,同时指针也会向后移动1位 - void remove() - 删除指针的上一个元素 - 只有当next执行完后,才能调用remove函数 - 如要删除第一个元素,不能直接调用 remove(),要先next一下()否则调用remove方法是会抛出异常的
-
迭代器遍历元素时不能通过Collection接口中的remove方法删除元素,只能用Iterator的remove方法删除元素; 原因 某个线程在 Collection 上进行迭代时,不允许另一个线程修改该 Collection
public static void testList(){
List<String> list = new ArrayList<>();
list.add("jack");
list.add("tom");
list.add("mary");
list.add("tim");
list.add("tony");
list.add("eric");
list.add("jack");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
if("jack".equals(str)){
list.remove(str);//ConcurrentModificationException并发修改异常
}
System.out.println(str);
}
}
-
迭代出的对象是引用的拷贝,如果修改迭代中的元素,那么就是修改容器对象的本身
-
和for循环对比
-
for循环适合顺序访问,或者通过下标进行访问的
-
迭代器适合链式结构
-
最终看使用场景,性能会有轻微差别,但是可以忽略
-
第3集 Java集合框架之Collections工具类讲解上集
简介:讲解Java集合工具类Collections讲解上集
-
Collections工具类
-
Java里关于集合的工具类,包含有各种有关集合操作的静态多态方法,不能实例化(把构造函数私有化)
-
public class Collections { // Suppresses default constructor, ensuring non-instantiability. private Collections() { }
-
-
-
和Collection的区别
-
Collection是接口,提供了对集合对象进行基本操作的通用接口方法,List、Set等多种具体的实现类
-
Collections是工具类,专门操作Collection接口实现类里面的元素
-
-
常见方法
-
排序 sort(List list)
-
按自然排序的升序排序
List<String> list = new ArrayList<>(); list.add("aaaa"); list.add("zzz"); list.add("gggg"); System.out.println(list); Collections.sort(list); System.out.println(list);
-
sort(List list, Comparator c) 自定义排序规则,由Comparator控制排序逻辑
List<String> list = new ArrayList<>(); list.add("aaaa"); list.add("zzz"); list.add("gggg"); System.out.println(list); //默认升序 Collections.sort(list, Comparator.naturalOrder()); System.out.println(list); //降序 Collections.sort(list, Comparator.reverseOrder()); System.out.println(list);
-
-
随机排序 shuffle(List list)
List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); list.add("4"); list.add("5"); list.add("6"); list.add("7"); list.add("8"); list.add("9"); list.add("10"); list.add("J"); list.add("Q"); list.add("K"); System.out.println(list); Collections.shuffle(list); System.out.println(list);
-
第4集 Java集合框架之Collections工具类讲解下集
-
简介:讲解Java集合工具类Collections讲解下集
-
获取最大元素 max(Collection coll) 默认比较,不适合对象比较
-
获取最大元素 max(Collection coll, Comparator comparator)
public class CollectionsTest { public static void main(String[] args) { List<Student> list = new ArrayList<>(); list.add(new Student("jack", 26)); list.add(new Student("tom", 29)); list.add(new Student("mary", 32)); list.add(new Student("tony", 19)); list.add(new Student("smith", 41)); System.out.println(list); Student maxAgeStudent = Collections.max(list, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getAge() - o2.getAge(); } }); Student mixAgeStudent = Collections.mix(list, new Comparator<Student>() { @Override public int compare(Student o1, Student o2) { return o1.getAge() - o2.getAge(); } }); System.out.println(maxAgeStudent.toString()); } } class Student { public Student(String name, int age) { this.name = name; this.age = age; } private int age; private String name; public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public String toString() { return "Student{" + "age=" + age + ", name='" + name + '\'' + '}'; } }
-
获取最小元素 min(Collection coll)
-
创建不可变集合unmodifiablleXXX()
List<String> list = new ArrayList<>(); list.add("SpringBoot课程"); list.add("架构课程"); list.add("微服务SpringCloud课程"); //设置为只读List集合 list = Collections.unmodifiableList(list); System.out.println(list); Set<String> set = new HashSet<>(); set.add("Mysql教程"); set.add("Linux服务器器教程"); set.add("Git教程"); //设置为只读Set集合 set = Collections.unmodifiableSet(set); System.out.println(set); Map<String, String> map = new HashMap<>(); map.put("key1", "课程1"); map.put("key2", "课程2"); //设置为只读Map集合 map = Collections.unmodifiableMap(map); System.out.println(map);
-
第5集 Java集合框架元素排序之Comparable排序接口讲解
简介:讲解Java集合元素排序接口Comparable讲解
-
什么是Comparable
public interface Comparable<T> { public int compareTo(T o); }
-
是一个接口,定制排序规则
-
对实现它的每个类的对象进行整体排序,里面 compareTo 方法是实现排序的具体方法
-
比如TreeSet、SortedSet、Collections.sort() 方法调用进行排序
-
String、Integer等类默认实现了这个接口,所以可以排序(看源码)
-
-
详解compareTo方法
-
用于比较次对象和指定对象的顺序,o为要比较的对象
-
返回int类型
-
大于0, 表示this大于传进来的对象o ,则往后排,即升序
-
等于0,表示this等于传进来的对象o
-
小于0,表示this小于传进来的对象o
-
-
-
需求:根据学生的年龄进行排序
public class TestCom {
public static void main(String [] args) {
Set<Student> studentSet = new TreeSet<>();
studentSet.add(new Student("jack",32));
studentSet.add(new Student("tom",22));
studentSet.add(new Student("mary",35));
studentSet.add(new Student("tim",11));
studentSet.add(new Student("tony",49));
studentSet.add(new Student("dd",30));
System.out.println(studentSet);
}
}
class Student implements Comparable{
private int age;
private String name;
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public Student(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Object o) {
if(o instanceof Student){
Student student = (Student)o;
return this.age - student.age;
}
//返回的数是0代表两个对象相同
return 0;
}
}
第6集 新版JDK之Objects 工具类实战
简介:讲解Objects工具类重点方法使用
-
Objects工具类讲解
-
jdk1.7引进的工具类,都是静态调用的方法,jdk1.8新增了部分方法
-
重点方法
-
equals
-
用于字符串和包装对象的比较,先比较内存地址,再比较值
-
-
deepEquals
-
数组的比较,先比较内存地址,再比较值,如String/char/byte/int数组, 或者包装类型Integer等数组
-
-
hashCode
-
返回对象的hashCode,若传入的为null,返回0
-
-
hash
-
传入可变参数的所有值的hashCode的总和,底层调用Arrays.hashCode
-
-
-
-
可变参数(只能在最后一个参数里面加)
public static int hash(Object... values) { return Arrays.hashCode(values); }
第7集 新版JDK之重写HashCode和Equals实战
简介:讲解对象的HashCode和equals方法使用
-
HashCode方法
-
顶级类Object里面的方法,所有类都是继承Object的,返回值int类型
-
根据一定的hash规则(存储地址,字段,或者长度等),映射成一个数值,即散列值
-
-
Equals方法
-
顶级类Object里面的方法,所有类都是继承Object的,返回值boolean类型
-
根据自定义的匹配规则,用于匹配两个对象是否一样, 一般逻辑是如下
-
//判断地址是否一样 //非空判断和class类型判断 //强转 //对象里面的字段一一匹配
-
-
重写规则
class User { private int age; private String name; private Date time; //省略setter和getter方法 @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name) && Objects.equals(time, student.time); } @Override public int hashCode() { return Objects.hash(age, name, time); } }
-
问题:当向集合中插入对象时,如何判别在集合中是否已经存在该对象,比如Set确保存储对象的唯一,并判断是不是同个对象呢?
-
依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法
-
判断两个对象是否一样,首先判断插入obj的hashcode值是否存在,hashcode值不存在则直接插入集合,值存在则还需判断equals方法判断对象是否相等
-
第8集 本章课程作业练习题布置
简介: 根据本章知识点布置课程作业
-
使用Collection统计下面每个字出现的次数
"*Constructs a new <tt>HashMap</tt> 小滴课堂 with the same mappings as the * 小滴课堂 specified <tt>Map</tt>. The <tt>HashMap</tt> is created with default load factor (0.75) and an initial capacity sufficient to*hold the mappings in the specified <tt>Map</tt>."
-
A、B用户订单列表里面的 交集(2种方式),差集(2种方式),并集,去重并集, 以下是部分代码
List<VideoOrder> videoOrders1 = new ArrayList<>();
videoOrders1.add(new VideoOrder("a课程", 22));
videoOrders1.add(new VideoOrder("w课程", 200));
videoOrders1.add(new VideoOrder("c课程", 100));
videoOrders1.add(new VideoOrder("d课程", 33));
videoOrders1.add(new VideoOrder("f课程", 1));
List<VideoOrder> videoOrders2 = new ArrayList<>();
videoOrders2.add(new VideoOrder("a课程", 22));
videoOrders2.add(new VideoOrder("b课程", 18));
videoOrders2.add(new VideoOrder("d课程", 33));
videoOrders2.add(new VideoOrder("f课程", 1));
videoOrders2.add(new VideoOrder("z课程", 22));
class VideoOrder {
private int price;
private String title;
public VideoOrder(String title, int price) {
this.title = title;
this.price = price;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
第9集 本章课程作业常见问题和答案解析
简介: 讲解课程作业常见问题和答案解析
-
使用Collection统计下面每个字出现的次数
//1.字符串 String str = "*Constructs a new <tt>HashMap</tt> 小滴课堂 with the same mappings as the * 小滴课堂 specified <tt>Map</tt>. The <tt>HashMap</tt> is created with default load factor (0.75) and an initial capacity sufficient to*hold the mappings in the specified <tt>Map</tt>."; //2.把字符串转换为数组 char[] charArr = str.toCharArray(); //3.创建一个Map Map<Character, Integer> counterMap = new HashMap<>(); //4.遍历数组,得到每个字符 for (int i = 0; i < charArr.length; i++) { //5、拿得到的字符作为健到集合中去找值。 Integer value = counterMap.get(charArr[i]); if(value ==null){ //把字符作为键,1为值存入集合, counterMap.put(charArr[i], 1); }else{ //把值加1重新写入集合 value +=1; counterMap.put(charArr[i], value); } } //6.遍历输出 Set<Map.Entry<Character, Integer>> entrySet = counterMap.entrySet(); for (Map.Entry<Character, Integer> entry : entrySet) { System.out.println(entry.getKey()+" 字符出现次数="+entry.getValue()); } }
-
A、B用户订单列表里面的 交集(2种方式),差集(2种方式),并集,去重并集
public class QuestioinTest { public static void main(String[] args) { List<VideoOrder> videoOrders1 = new ArrayList<>(); videoOrders1.add(new VideoOrder("a课程", 22)); videoOrders1.add(new VideoOrder("w课程", 200)); videoOrders1.add(new VideoOrder("c课程", 100)); videoOrders1.add(new VideoOrder("d课程", 33)); videoOrders1.add(new VideoOrder("f课程", 1)); List<VideoOrder> videoOrders2 = new ArrayList<>(); videoOrders2.add(new VideoOrder("a课程", 22)); videoOrders2.add(new VideoOrder("b课程", 18)); videoOrders2.add(new VideoOrder("d课程", 33)); videoOrders2.add(new VideoOrder("f课程", 1)); videoOrders2.add(new VideoOrder("z课程", 22)); //交集 //videoOrders1.retainAll(videoOrders2); //System.out.println(videoOrders1); List<VideoOrder> intersectionList = new ArrayList<>(); for(VideoOrder videoOrder: videoOrders1){ if(videoOrders2.contains(videoOrder)){ intersectionList.add(videoOrder); } } System.out.println("交集="+intersectionList); //videoOrders1差集 //videoOrders1.removeAll(videoOrders2); //System.out.println(videoOrders1); List<VideoOrder> diffList1 = new ArrayList<>(); for(VideoOrder videoOrder: videoOrders1){ if(!videoOrders2.contains(videoOrder)){ diffList1.add(videoOrder); } } System.out.println("订单1差集="+diffList1); //videoOrders2差集 //videoOrders2.removeAll(videoOrders1); //System.out.println(videoOrders2); List<VideoOrder> diffList2 = new ArrayList<>(); for(VideoOrder videoOrder: videoOrders2){ if(!videoOrders1.contains(videoOrder)){ diffList2.add(videoOrder); } } System.out.println("订单2差集="+diffList2); //并集 //videoOrders1.addAll(videoOrders2); //System.out.println(videoOrders1); //去重并集 //Set<VideoOrder> set = new HashSet<>(videoOrders1); //System.out.println(set); } } class VideoOrder { private int price; private String title; public VideoOrder(String title, int price) { this.title = title; this.price = price; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; VideoOrder that = (VideoOrder) o; return price == that.price && Objects.equals(title, that.title); } @Override public int hashCode() { return Objects.hash(price, title); } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "VideoOrder{" + "price=" + price + ", title='" + title + '\'' + '}'; } }
第10集 集合框架Collection初步总结
简介:集合框架Collection初步总结
-
回顾知识点
干货文档
关注公众号发送:“CSDN干货文档” 即可领取