【从零开始重学Java】第7天 高级特性
传送门
从零开始重学Java 第0天
从零开始重学Java 第1天 Java概述
从零开始重学Java 第2天 标识符和数据类型
从零开始重学Java 第3天 表达式和流程控制语句
从零开始重学Java 第4天 数组、向量和字符串
从零开始重学Java 第5天 对象和类
从零开始重学Java 第6天 异常
从零开始重学Java 第7天 高级特性
从零开始重学Java 第8_9_10天 图形界面、Swing、Applet
从零开始重学Java 第11天 数据流
从零开始重学Java 第12天 线程
从零开始重学Java 第13天 线程
Java语言的高级特性
泛型
Java里的是假泛型(擦除泛型),底层都是Object,运行时拿不到真实类型,在JSON库里经常会有TypeReference这种东西出现,反序列化时解决泛型问题
直接写上最常见的泛型使用场景代码
泛型数据类型
接口中的泛型
泛型类
泛型类和接口泛型用起来没什么太大区别
public class Result<T>{
private int code;
private String message;
private T data;
}
泛型方法
这些方法是一样的,不算重载方法,但明显最后一个方法用起来,代码可读性更高且不用强转返回类型
public static Object getListFirst(List list) {
return list.get(0);
}
public static Object getListFirst(List<Object> list) {
return list.get(0);
}
public static Object getListFirst(List<?> list) {
return list.get(0);
}
public static <T> T getListFirst(List<T> list) {
return list.get(0);
}
反序列化泛型,如果只有一层泛型,可以直接传Class解决,嵌套多层必须通过传入类似TypeReference的类来解决
public static <T> T readFileToObj(File file, Class<T> clazz){
T t;
try {
t = clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("反射构造异常");
}
return t;
}
List<Student> list = JSON.parseObject("""
[{"name":"小明","age":18},{"name":"小张","age":19}]
""",
new TypeReference<List<Student>>() {} );
迭代器
JDK8 StreamAPI出现,Iteraotr就已经很少在用,JDK17 StreamAPI优化,更少用了
效率上,1万以内的数据量之间差距基本不大,Iteraotr还要多写几行代码就很没必要,超过1万建议原生for循环(交给JVM优化)或者并发流(自己手动优化)
迭代器的基本概念
接口Iterator
接口Iterable
使用迭代器示例
Iterable和for-each循环
直接看源码就很明白了,就是一种语法糖
克隆
诞生于JDK1.0,设计有缺陷,用于产生一个完全一样的对象,虽然没有废弃,但不推荐使用,特别是有继承关系或者有复杂类型属性
目前常见的应该都是new一个新对象然后赋需要的值
第七章习题
- 深浅克隆的区别
简单来说就是复杂数据类型的属性,浅克隆指向的还是原来的引用,深克隆是克隆了一个新对象,指向新引用