Java SE——Object

Object是属于java.lang包,是所有类的父类。
Object是所有类的基类,所有类都间接或者直接继承了该类。object类中能访问的方法在所有类中都能调用。
object所有方法
1 构造器
object的jdk源码中,是看不到构造器的,所以会默认加载一个无参构造器
Object object = new Object();

2 getClass():
如下,作用是返回对象的运行时类
在这里插入图片描述
 这里我们要知道用 native 修饰的方法我们不用考虑,由操作系统帮我们实现,该方法的作用是返回一个对象的运行时类,通过这个类对象我们可以获取该运行时类的相关属性和方法。也就是Java中的反射。反射是实现各种框架的重要知识点。
 Java中还有一种这样的用法,通过 类名.class 获取这个类的类对象 ,这两种用法有什么区别呢?

//父类
public class parent{};
//子类
public class son extends parent{};
//测试
@Test
public void testClass(){
    Parent p = new Son();
    System.out.println(p.getClass());
    System.out.println(Parent.class);
}
//打印结果
class  com.lz.test.Son
class  com.lz.test.Parent

结论:class 是一个类的属性,能获取该类编译时的类对象,而 getClass() 是一个类的方法,它是获取该类运行时的类对象。

3 hashcode():
这也是一个用 native 声明的本地方法,作用是返回对象的散列码,是 int 类型的数值。
在这里插入图片描述
 那么这个方法存在的意义是什么呢?

我们知道在Java 中有几种集合类,比如 List,Set,还有 Map,List集合一般是存放的元素是有序可重复的,Set 存放的元素则是无序不可重复的,而 Map 集合存放的是键值对。

判断一个元素是否相等可以通过 equals 方法,每增加一个元素,那么我们就通过 equals 方法判断集合中的每一个元素是否重复,但是如果集合中有10000个元素了,但我们新加入一个元素时,那就需要进行10000次equals方法的调用,这显然效率很低。
  于是,Java 的集合设计者就采用了 哈希表 来实现。关于哈希表的数据结构我有过介绍。哈希算法也称为散列算法,是将数据依特定算法产生的结果直接指定到一个地址上。这个结果就是由 hashCode 方法产生。这样一来,当集合要添加新的元素时,先调用这个元素的 hashCode 方法,就一下子能定位到它应该放置的物理位置上。
  ① 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;
  ② 如果这个位置上已经有元素了,就调用它的equals方法与新元素进行比较,相同的话就不存了;
  ③ 不相同的话,也就是发生了Hash key相同导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将所有产生相同HashCode的对象放到这个单链表上去,串在一起(很少出现)。这样一来实际调用equals方法的次数就大大降低了,几乎只需要一两次。
  在这里插入图片描述
   这里有 A,B,C,D四个对象,分别通过 hashCode 方法产生了三个值,注意 A 和 B 对象调用 hashCode 产生的值是相同的,即 A.hashCode() = B.hashCode() = 0x001,发生了哈希冲突,这时候由于最先是插入了 A,在插入的B的时候,我们发现 B 是要插入到 A 所在的位置,而 A 已经插入了,这时候就通过调用 equals 方法判断 A 和 B 是否相同,如果相同就不插入 B,如果不同则将 B 插入到 A 后面的位置。所以对于 equals 方法和 hashCode 方法有如下要求:

一、hashCode 要求
  ①、在程序运行时期间,只要对象的(字段的)变化不会影响equals方法的决策结果,那么,在这个期间,无论调用多少次hashCode,都必须返回同一个散列码。

②、通过equals调用返回true 的2个对象的hashCode一定一样。

③、通过equasl返回false 的2个对象的散列码不需要不同,也就是他们的hashCode方法的返回值允许出现相同的情况。

因此我们可以得到如下推论:

两个对象相等,其 hashCode 一定相同;

扫描二维码关注公众号,回复: 4278916 查看本文章

两个对象不相等,其 hashCode 有可能相同;

hashCode 相同的两个对象,不一定相等;

hashCode 不相同的两个对象,一定不相等;

这四个推论通过上图可以更好的理解。

可能会有人疑问,对于不能重复的集合,为什么不直接通过 hashCode 对于每个元素都产生唯一的值,如果重复就是相同的值,这样不就不需要调用 equals 方法来判断是否相同了吗?
  实际上对于元素不是很多的情况下,直接通过 hashCode 产生唯一的索引值,通过这个索引值能直接找到元素,而且还能判断是否相同。比如数据库存储的数据,ID 是有序排列的,我们能通过 ID 直接找到某个元素,如果新插入的元素 ID 已经有了,那就表示是重复数据,这是很完美的办法。但现实是存储的元素很难有这样的 ID 关键字,也就很难这种实现 hashCode 的唯一算法,再者就算能实现,但是产生的 hashCode 码是非常大的,这会大的超过 Java 所能表示的范围,很占内存空间,所以也是不予考虑的。
4 toString():
在这里插入图片描述
getClass().getName()是返回对象的全类名(包含包名).
Integer.toHexString(hashCode()) 是以16进制无符号整数形式返回此哈希码的字符串表示形式。
  打印某个对象时,默认是调用 toString 方法,比如 System.out.println(person),等价于 System.out.println(person.toString())
  5 registerNatives():
 在这里插入图片描述
 静态代码块就是一个类在初始化过程中必定会执行的内容,所以在类加载的时候是会执行该方法的,通过该方法来注册本地方法。
 有的概念是转载收集的,本系列是用来记录方便自己复习的。

猜你喜欢

转载自blog.csdn.net/weixin_42255265/article/details/83010891