一、集合进阶
双列集合Map<>【Java】Map集合概述
双列集合特点
Map常见API
三种遍历方式
1、由键找值,创建键的集合
2、通过键值对对对象进行遍历
3、利用lambda表达式进行遍历
HashMap
HashMap的特点
HashMap的底层
总结
例题
package com.itheima.Mapdemo;
import java.util.Objects;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
@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);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
}
package com.itheima.Mapdemo;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class HashMap_demo1 {
public static void main(String[] args) {
HashMap<Student,String> hm=new HashMap<>();
Student s1=new Student("zhangsan",23);
Student s2=new Student("lisi",24);
Student s3=new Student("wangwu",25);
hm.put(s1,"shanxi");
hm.put(s2,"guangdong");
hm.put(s3,"anhui");
Set<Student> keys=hm.keySet();
for (Student key : keys) {
String value=hm.get(key);
System.out.println(key+"="+value);
}
System.out.println("---------------");
Set<Map.Entry<Student, String>> entries = hm.entrySet();
for (Map.Entry<Student, String> entry : entries) {
/*Student key = entry.getKey();
String value = entry.getValue();
System.out.println(key+"="+value);*/
System.out.println(entry);
}
System.out.println("---------------");
hm.forEach((student,s)-> {
System.out.println(student+"="+s);
}
);
}
}
package com.itheima.Mapdemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Random;
import java.util.Set;
public class HashMap_demo2 {
public static void main(String[] args) {
String[] arr={"A","B","C","D"};
ArrayList<String> list=new ArrayList<>();
Random r=new Random();
for (int i = 0; i < 80; i++) {
int index=r.nextInt(arr.length);
list.add(arr[index]);
}
HashMap<String,Integer> hm=new HashMap<>();
for (String s : list) {
if(hm.containsKey(s)){
int num = hm.get(s);
num++;
hm.put(s,num);
}
else {
hm.put(s, 1);
}
}
String s=arr[0];
int max=hm.get(s);
Set<String> keys=hm.keySet();
for (String key : keys) {
int value = hm.get(key);
if(value>max) {
s = key;
}
}
System.out.println(s);
}
}
LinkedHashMap
TreeMap
升序
降序
例题
package com.itheima.Mapdemo.TreeMapdemo;
public class Student implements Comparable<Student>{
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 获取
* @return name
*/
public String getName() {
return name;
}
/**
* 设置
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
* 获取
* @return age
*/
public int getAge() {
return age;
}
/**
* 设置
* @param age
*/
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "Student{name = " + name + ", age = " + age + "}";
}
@Override
public int compareTo(Student o) {
int i=this.getAge()-o.getAge();
i=i==0?this.getName().compareTo(o.getName()):i;
return i;
}
}
总结
可变参数
总结
集合工具类connections
package com.itheima.a07mycollections;
import java.util.ArrayList;
import java.util.Collections;
public class CollectionsDemo1 {
public static void main(String[] args) {
/*
public static <T> boolean addAll(Collection<T> c, T... elements) 批量添加元素
public static void shuffle(List<?> list) 打乱List集合元素的顺序
*/
//addAll 批量添加元素
//1.创建集合对象
ArrayList<String> list = new ArrayList<>();
//2.批量添加元素
Collections.addAll(list,"abc","bcd","qwer","df","asdf","zxcv","1234","qwer");
//3.打印集合
System.out.println(list);
//shuffle 打乱
Collections.shuffle(list);
System.out.println(list);
}
}
package com.itheima.a07mycollections;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CollectionsDemo2 {
public static void main(String[] args) {
/*
public static <T> void sort(List<T> list) 排序
public static <T> void sort(List<T> list, Comparator<T> c) 根据指定的规则进行排序
public static <T> int binarySearch (List<T> list, T key) 以二分查找法查找元素
public static <T> void copy(List<T> dest, List<T> src) 拷贝集合中的元素
public static <T> int fill (List<T> list, T obj) 使用指定的元素填充集合
public static <T> void max/min(Collection<T> coll) 根据默认的自然排序获取最大/小值
public static <T> void swap(List<?> list, int i, int j) 交换集合中指定位置的元素
*/
System.out.println("-------------sort默认规则--------------------------");
//默认规则,需要重写Comparable接口compareTo方法。Integer已经实现,按照从小打大的顺序排列
//如果是自定义对象,需要自己指定规则
ArrayList<Integer> list1 = new ArrayList<>();
Collections.addAll(list1, 10, 1, 2, 4, 8, 5, 9, 6, 7, 3);
Collections.sort(list1);
System.out.println(list1);
System.out.println("-------------sort自己指定规则规则--------------------------");
Collections.sort(list1, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
System.out.println(list1);
Collections.sort(list1, (o1, o2) -> o2 - o1);
System.out.println(list1);
System.out.println("-------------binarySearch--------------------------");
//需要元素有序
ArrayList<Integer> list2 = new ArrayList<>();
Collections.addAll(list2, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
System.out.println(Collections.binarySearch(list2, 9));
System.out.println(Collections.binarySearch(list2, 1));
System.out.println(Collections.binarySearch(list2, 20));
System.out.println("-------------copy--------------------------");
//把list3中的元素拷贝到list4中
//会覆盖原来的元素
//注意点:如果list3的长度 > list4的长度,方法会报错
ArrayList<Integer> list3 = new ArrayList<>();
ArrayList<Integer> list4 = new ArrayList<>();
Collections.addAll(list3, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Collections.addAll(list4, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
Collections.copy(list4, list3);
System.out.println(list3);
System.out.println(list4);
System.out.println("-------------fill--------------------------");
//把集合中现有的所有数据,都修改为指定数据
ArrayList<Integer> list5 = new ArrayList<>();
Collections.addAll(list5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Collections.fill(list5, 100);
System.out.println(list5);
System.out.println("-------------max/min--------------------------");
//求最大值或者最小值
ArrayList<Integer> list6 = new ArrayList<>();
Collections.addAll(list6, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
System.out.println(Collections.max(list6));
System.out.println(Collections.min(list6));
System.out.println("-------------max/min指定规则--------------------------");
// String中默认是按照字母的abcdefg顺序进行排列的
// 现在我要求最长的字符串
// 默认的规则无法满足,可以自己指定规则
// 求指定规则的最大值或者最小值
ArrayList<String> list7 = new ArrayList<>();
Collections.addAll(list7, "a","aa","aaa","aaaa");
System.out.println(Collections.max(list7, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
}));
System.out.println("-------------swap--------------------------");
ArrayList<Integer> list8 = new ArrayList<>();
Collections.addAll(list8, 1, 2, 3);
Collections.swap(list8,0,2);
System.out.println(list8);
}
}
综合例题
随机点名
import java.util.ArrayList;
import java.util.Collections;
public class Test1 {
public static void main(String[] args) {
/* 班级里有N个学生,学生属性:姓名,年龄,性别。
实现随机点名器。*/
//1.定义集合
ArrayList<String> list = new ArrayList<>();
//2.添加数据
Collections.addAll(list,"范闲","范建","范统","杜子腾","杜琦燕","宋合泛","侯笼藤","朱益群","朱穆朗玛峰","袁明媛");
//3.随机点名
/* Random r = new Random();
int index = r.nextInt(list.size());
String name = list.get(index);
System.out.println(name);*/
//打乱
Collections.shuffle(list);
String name = list.get(0);
System.out.println(name);
}
}
不可变集合
二、Stream流
Stream流的使用步骤
第一步-得到Stream流
单列集合
双列集合
数组
一堆零散的数据
注意
第二步-Stream流的中间方法
方法举例
简化后
第三步-Stream流的终结方法
Lambda表达式
小结
三、方法引用
引用静态方法
引用成员方法
引用构造方法
类名引用成员方法
引用数组的构造方法
小结
四、异常
编译异常和运行异常
异常的作用
异常的处理方式
JVM默认的处理方式
自己处理(捕获异常)
灵魂四问
异常的常用方法
抛出处理
小结
练习
自定义异常
五、File
构造方法
小结
成员方法
判断、获取
创建、删除
获取并遍历
六、IO流
概述
字节输出流(FileOutputStream)
小结
字节输入流(FileInputStream)
字节输入流循环读取
文件拷贝(小文件)
文件拷贝 (大文件)
文件拷贝(改写)
IO流中捕获异常的方式
自动释放异常
字符集
计算机存储规则(英文GBK)
计算机存储规则(汉字GBK)
计算机存储规则(英文)(Unicode)
计算机存储规则(中文)(Unicode)
产生乱码的原因
编码和解码的方法
字符输入流
空参read方法
有参read方法
字符输出流
字符流原理解析
字节流和字符流不同适用场景
练习
缓冲流
字节缓冲流
字符缓冲流
转换流
序列化流/反序列化流
打印流
字节打印流
字符打印流
小结
解压缩流/压缩流
解压缩流
压缩流
单个文件
文件夹
常用工具包(Commons-io)
Hutool工具包