java核心卷一笔记(持续更新)

java核心卷一第一章知识点:

  1. java是将.java文件编译成字节码文件然后由虚拟机执行,这样速度就会比运行机器码慢很多,不过虚拟机有一个选项(即时编译),可以将执行最频繁的字节码序列转换文机器码

  2. 都说java拥有很好的可移植性,在各个平台上都能运行,但是除了与用户界面有关的部分

  3. 蠕虫与病毒常用的攻击手段是运行时堆栈溢出

java核心卷一第三章知识点:

  1. 从jdk10开始声明局部变量可以不直接显示声明它的类型,直接使用VAR声明。

  2. const是java的保留字,但是目前还未被使用。

  3. 如果要遍历一个字符串,可以使用codePoints方法,它会生成int值的流,然后可以将流转化为数组再遍历。

java核心卷一第四章知识点:

  1. 对象的状态可能会随着时间而发生改变,但这种改变不会是自发的。对象状态的改变必须通过调用方法实现(如果不经过方法调用就可以改变对象状态,只能说明破坏了封装性)。

  2. 一个类的方法使用或操纵另一个类的对象,我们就说一个类依赖于另一个类,我们应尽可能减少类之间的耦合。

  3. 在Java中,任何对象变量的值都是对存储在另外一个地方的某个对象的引用

  4. 如果一个对象明确不再使用,可以将其明确的声名为null,以防内存泄漏

    java核心卷一第五章知识点:

    1.equals方法要求满足:自反性,对称性,传递性,一致性(引用不变的情况下,反复调用,结果不变)

    2.只要对象与一个字符串以 + 相连,就会自动调用这个对象的toString方法。

    3.鉴于历史原因,getName对于数组类型会返回奇奇怪怪的名字

java核心卷一第六章知识点:

1.浅拷贝与深拷贝:先说说拷贝,我们为什么要拷贝呢,一般用到拷贝的时候我们都会想让拷贝前后的两个对象除了属性一模一样之外没有任何关联,然后再说说我理解的浅拷贝:只会拷贝"一层",即如果对一个对象使用浅拷贝,那么我们会得到一个与原对象一模一样的对象,唯一区别为他们的引用地址不同,拷贝前后的属性的引用均为同一个,此时如果其属性一直不变,那么浅拷贝也不会出现什么问题,但如果对象其中有一个属性为可变的,又因为两个对象的属性指向同一个引用,那么如果这个属性被修改,这两个对象中的此属性都会随之更改.在我理解的深拷贝就像是gc的可达性算法,他会从一个对象的属性一个个向下面找,看看是否属性中是否又为其他非String以及基本类型的包装类型的引用,如果是,则继续向下找,直到所有属性,都不为其他非String以及基本类型的包装类型的引用,然后将所有可达的都复制一遍,并将他们的引用地址串联起来,就得到了一个原对象无论如何改变,拷贝对象也不会跟着改变的对象.

2.最开始了解到函数式接口的时候并不明白函数式接口的存在意义是什么,当时就只了解一个概念,等熟悉lambda表达式之后,再看到函数式接口之后就大抵明白了函数式接口就是为了方便lambda表达式的使用

3.predicate接口是专门用来传递lambda表达式的

4.Supplier<T> 接口,没有参数,调用时会生成一个T类型的值,主要用于实现懒计算,举例说明,Objects里面有个requireNonNull(T obj, Supplier<String> messageSupplier)方法,此方法的第二个参数即为Supplier,这个方法允许将消息的创建推迟到进行空检查之后。虽然这可能会在非 null 情况下带来性能优势,但在决定调用此方法时,应注意创建消息提供程序的成本低于直接创建字符串消息的成本。

5.只有当lambda表达式的体只调用一个方法而不做其他操作时,才能把lambda表达式重写为方法引用

6.内部类的对象会有一个隐式引用,指向实例化这个对象的外部类对象

7.代理模式分两种:一种为jdk的代理模式,是面向接口的,就是一个类A实现某个接口G,重写了G的方法。现在要对A的方法进行增强,但是不要修改A的代码。所以创建类B,也实现接口G,在这个方法里面写增强业务,但是具体方法调用A的.第二种是面向类的,以cglib代理举例:cglib代理又称子类代理。一个类A,要对其方法进行增强,但是,这个类没有实现接口。现在创建一个类继承类A,重写方法,但是具体业务还是调用父类的。只是在这个方法里面进行额外添加小功能而已,在我的印象中spring的aop就是使用代理模式实现的.

java核心卷一第七章知识点:

1.如果在一个方法中出现了一个检查型异常,但这个方法不允许抛出检查型异常,这种情况下包装技术也很有用.我们可以捕获这个检查型异常,并将它包装成一个运行时异常.让我想起一个注解@SneakyThrows,可用于偷偷抛出已检查的异常,而无需在方法的throws子句中实际声明,但这两者还是有着本质区别,@SneakyThrows并不会对异常进行包装、忽略、吞噬或重新定义,其本质只是通过泛型骗过编译器,源码是这样的:

    public static RuntimeException sneakyThrow(Throwable t) {
        if (t == null) throw new NullPointerException("t");
        //泛型还能这样用?学到了
        return Lombok.<RuntimeException>sneakyThrow0(t);
    }
    //利用泛型将我们传入的Throwable强转为RuntimeException。虽然事实上我们不是RuntimeException。但是没关系。因为JVM并不关心这个。泛型最后存储为字节码时并没有泛型的信息。这样写只是为了骗过javac编译器
    //基本上是说“ 在执行时并没有真正检查这个强制转换”(由于类型擦除)-因此编译器无奈地假设你做的是正确的,知道它实际上不会被检查。现在只有 编译器 关心已检查和未检查的异常-它根本不是JVM的一部分。因此,一旦您通过了编译器,就可以使用了。现在只有 编译器 关心已检查和未检查的异常-它根本不是JVM的一部分。一旦通过了编译器,就可以正常使用了
    //什么是类型擦除?  Java的泛型基本上都是在编译器这个层次上实现的,在生成的字节码中是不包含泛型中的类型信息的,使用泛型的时候加上类型参数,在编译器编译的时候会去掉,这个过程成为类型擦除。
    @SuppressWarnings("unchecked")
    private static <T extends Throwable> T sneakyThrow0(Throwable t) throws T {
        throw (T)t;
    }

2.try-with-resource语句自身也可以有catch子句,甚至还可以有一个finally子句.这些子句会在关闭资源之后执行.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值