愿景:"让编程不再难学,让技术与生活更加有趣"
更多架构课程请访问 xdclass.net
目录
第1集 Java集合框架遍历之迭代器(Iterator)
第2集 Java迭代器进阶和注意事项
第3集 Java集合框架之Collections工具类讲解上集
第4集 Java集合框架之Collections工具类讲解下集
第5集 Java集合框架元素排序之Comparable排序接口讲解
第6集 新版JDK之Objects 工具类实战
第7集 新版JDK之重写HashCode和Equals实战
第8集 本章课程作业练习题布置
第9集 本章课程作业常见问题和答案解析
第10集 集合框架Collection初步总结
干货文档
简介:讲解什么是迭代器
使用循环遍历集合
普通for循环
增强for循环
什么是迭代器Iterator
Iterator是java中的一个接口,核心作用就是用来遍历容器的元素,当容器实现了Iterator接口后,可以通过调用Iterator()方法获取一个 Iterator对象
为啥是调用容器里面的Iterator方法呢?
因为容器的实现有多种,不同的容器遍历规则不一样,比如ArrayList/LinkedList/HashSet/TreeSet等,所以设计了Iterator接口,让容器本身去实现这个接口,实现里面的方法,从而让开发人员不用关系容器的遍历机制,直接使用对应的方法即可
三个核心方法
public static void testSet(){
Set set = new HashSet<>();
set.add("jack");
set.add("tom");
set.add("marry");
set.add("tony");
set.add("jack");
Iterator iterator = set.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
}
}
public static void testList(){
List 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 iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
System.out.println(str);
}
}
简介:详细讲解迭代器的进阶知识和注意事项
迭代器是一种设计模式
三个核心方法
- 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 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 iterator = list.iterator();
while (iterator.hasNext()){
String str = iterator.next();
if("jack".equals(str)){
list.remove(str);//ConcurrentModificationException并发修改异常
}
System.out.println(str);
}
}
迭代出的对象是引用的拷贝,如果修改迭代中的元素,那么就是修改容器对象的本身
和for循环对比
for循环适合顺序访问,或者通过下标进行访问的
迭代器适合链式结构
最终看使用场景,性能会有轻微差别,但是可以忽略
简介:讲解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 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 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 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);
简介:讲解Java集合工具类Collections讲解下集
获取最大元素 max(Collection coll) 默认比较,不适合对象比较
获取最大元素 max(Collection coll, Comparator comparator)
public class CollectionsTest {
public static void main(String[] args) {
List 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() {
@Override
public int compare(Student o1, Student o2) {
return o1.getAge() - o2.getAge();
}
});
Student mixAgeStudent = Collections.mix(list, new Comparator() {
@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 list = new ArrayList<>();
list.add("SpringBoot课程");
list.add("架构课程");
list.add("微服务SpringCloud课程"); //设置为只读List集合
list = Collections.unmodifiableList(list);
System.out.println(list);
Set set = new HashSet<>();
set.add("Mysql教程");
set.add("Linux服务器器教程");
set.add("Git教程");
//设置为只读Set集合
set = Collections.unmodifiableSet(set);
System.out.println(set);
Map map = new HashMap<>();
map.put("key1", "课程1");
map.put("key2", "课程2");
//设置为只读Map集合
map = Collections.unmodifiableMap(map);
System.out.println(map);
简介:讲解Java集合元素排序接口Comparable讲解
什么是Comparable
public interface Comparable {
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 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;
}
}
简介:讲解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);
}
简介:讲解对象的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方法判断对象是否相等
简介: 根据本章知识点布置课程作业
使用Collection统计下面每个字出现的次数
"*Constructs a new HashMap 小滴课堂 with the same mappings as the * 小滴课堂 specified Map. The HashMap is created with default load factor (0.75) and an initial capacity sufficient to*hold the mappings in the specified Map."
A、B用户订单列表里面的 交集(2种方式),差集(2种方式),并集,去重并集, 以下是部分代码
List 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 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;
}
}
简介: 讲解课程作业常见问题和答案解析
使用Collection统计下面每个字出现的次数
//1.字符串
String str = "*Constructs a new HashMap 小滴课堂 with the same mappings as the * 小滴课堂 specified Map. The HashMap is created with default load factor (0.75) and an initial capacity sufficient to*hold the mappings in the specified Map.";
//2.把字符串转换为数组
char[] charArr = str.toCharArray();
//3.创建一个Map
Map 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> entrySet = counterMap.entrySet();
for (Map.Entry entry : entrySet) {
System.out.println(entry.getKey()+" 字符出现次数="+entry.getValue());
}
}
A、B用户订单列表里面的 交集(2种方式),差集(2种方式),并集,去重并集
public class QuestioinTest {
public static void main(String[] args) {
List 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 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 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 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 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 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 + '\'' +
'}';
}
}
简介:集合框架Collection初步总结
回顾知识点
关注公众号发送:“CSDN干货文档” 即可领取