【从零开始重学Java】第7天

发布时间 2024-01-09 17:01:38作者: 迷路的哨兵甲

前情提示

从零开始重学Java 第0天
从零开始重学Java 第1天
从零开始重学Java 第2天
从零开始重学Java 第3天
从零开始重学Java 第4天
从零开始重学Java 第5天
从零开始重学Java 第6天

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循环

直接看源码就很明白了,就是一种语法糖

forEach

克隆

诞生于JDK1.0,设计有缺陷,用于产生一个完全一样的对象,虽然没有废弃,但不推荐使用,特别是有继承关系或者有复杂类型属性
目前常见的应该都是new一个新对象然后赋需要的值

第七章习题

  • 深浅克隆的区别

简单来说就是复杂数据类型的属性,浅克隆指向的还是原来的引用,深克隆是克隆了一个新对象,指向新引用