(ps:此博客的内容都是自己在学习Java源码时自己遇到的问题,解释大多都是摘抄其他大佬的博客,仅在此记录,方便复习,若侵权,私信立删。)
-
native 修饰
native关键字修饰,Java中,用native关键字修饰的函数表明该方法的实现并不是在Java中去完成,而是由C/C++去完成,并被编译成了.dll,由Java去调用。方法的具体实现体在dll文件中,对于不同平台,其具体实现应该有所不同。用native修饰,即表示操作系统,需要提供此方法,Java本身需要使用。具体到registerNatives()方法本身,其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦。 -
对于父类的protected成员,不同包中的子类可以访问
“不同包中的子类可以访问”,是指当两个类不在同一个包中的时候,继承自父类的子类内部且主调(调用者)为子类的引用时才能访问父类用protected修饰的成员(属性/方法)。 在子类内部,主调为父类的引用时并不能访问此protected修饰的成员。!(super关键字除外),一定要是子类引用调用父类的成员才能编译通过。 -
==与equals的区别
首先Java中有基本数据类型和引用数据类型,基本数据类型的变量存放的是该变量的值,而引用类型的变量存储的是一个存储地址,该存储地址中村的才是这个引用变量真正的值。==比较的就是变量的值,只不过这个值可能是一个真正的值(如:1,2,3),亦可能是一个指向别处的存储地址; 而equals则是用来比较两个对象是否相等,这样的相等可能是一个属性相等,亦可能是对象是否是同一份数据。 -
重写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()返回的哈希码可能相同。