java 源码复习随笔1

(ps:此博客的内容都是自己在学习Java源码时自己遇到的问题,解释大多都是摘抄其他大佬的博客,仅在此记录,方便复习,若侵权,私信立删。)

  1. native 修饰
    native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成,而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。用native修饰,即表示操作系统,需要提供此方法,Java本身需要使用。具体到registerNatives()方法本身,其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。

  2. 对于父类的protected成员,不同包中的子类可以访问
    “不同包中的子类可以访问”,是指当两个类不在同一个包中的时候,继承自父类的子类内部且主调(调用者)为子类的引用时才能访问父类用protected修饰的成员(属性/方法)。 在子类内部,主调为父类的引用时并不能访问此protected修饰的成员。!(super关键字除外),一定要是子类引用调用父类的成员才能编译通过。

  3. ==与equals的区别
    首先Java中有基本数据类型和引用数据类型,基本数据类型的变量存放的是该变量的值,而引用类型的变量存储的是一个存储地址,该存储地址中村的才是这个引用变量真正的值。==比较的就是变量的值,只不过这个值可能是一个真正的值(如:1,2,3),亦可能是一个指向别处的存储地址; 而equals则是用来比较两个对象是否相等,这样的相等可能是一个属性相等,亦可能是对象是否是同一份数据。

  4. 重写equals必须重写hashcode方法
    a. 为什么要重写hashcode?
    这主要因为hashCode()方法可以增强哈希表的性能,以Set为例,当新加一个对象时,需要判断现有集合中是否已经存在与此对象相等的对象,如果没有hashCode()方法,需要将Set进行一次遍历,并逐一用equals()方法判断两个对象是否相等,此种算法时间复杂度为o(n)。通过借助于hasCode方法,先计算出即将新加入对象的哈希码,然后根据哈希算法计算出此对象的位置,直接判断此位置上是否已有对象即可。(注:Set的底层用的是Map的原理实现)
    b. 如何重写?
    对于JDK7及更新版本,你可以是使用java.util.Objects 来重写 equals 和 hashCode 方法,如下:
    import java.util.Objects;
    public class User {
    private String name;
    private int age;
    private String passport;
    //getters and setters, constructor

    @Override
    public boolean equals(Object o)
    {
    if (o == this) return true;
    if (!(o instanceof User)) {
    return false;
    }
    User user = (User) o;
    return age == user.age &&
    Objects.equals(name, user.name) &&
    Objects.equals(passport, user.passport);
    }

    @Override
    public int hashCode() {
    return Objects.hash(name, age, passport);
    }

}
c. hashCode()的返回值不是对象的地址
对象的hashCode()返回的不是对象所在的物理内存地址。甚至也不一定是对象的逻辑地址,hashCode()相同的两个对象,不一定相等,换言之,不相等的两个对象,hashCode()返回的哈希码可能相同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值