【java基础】

为什么重写equals()就一定要重写hashCode()方法

如果只重写equals方法,不重写hashCode方法。就有可能导致a.equals(b)这个表达式成立,

但是hashCode却不同 那么这个只重写了equals对象在使用散列集合进行存储的时候 就会出现问题

因为散列集合是使用hashCode来计算key的存储位置 如果存储两个完全相同的对象

但是有不同的hashCode 就会导致这两个对象存储在hash表的不同位置 当我们想要去根据这个对象去获取数据的时候就会出现一个悖论

一个完全相同的对象会存储在hash表的两个位置 那么就会破坏大家约定俗成的规则 使得我们在使用程序中会出现一些不可预料的错误

序列化和反序列化的理解

首先之所以需要序列化他的核心目的是为了解决网络通信之间的一个对象传输的问题

也就是说怎么把当前Jvm进程里面的一个对象跨网络传输到另外一个JVM进程里面进行恢复

而序列化呢就是把内存里面的对象转化为字节流 以便用来实现存储和传输

而反序列化其实就是根据从文件或者网络上获取到的对象的一个字节流 根据字节流里面

保存的对象描述信息和状态从新构建一个新的对象

其次序列化的前提是为了去保证通信双方对于对象的可识别性 所以很多时候我们会把对象先转化为

通用的解析格式 比如说像Json、Xml或者其他一些格式 然后再把它们转化为数据流进行网络传输

从而去实现跨平台或者跨语言的这样一个可识别性 序列化的一个选择问题略

Integer和int的区别

主要有一下几个方面

第一个作为成员变量来说Integer的初始值是null,int的初始值是0

第二个Integer存储在堆内存,int类型是直接存储在栈空间

第三个Integer是对象类型,它封装了很多的方法和属性,我们在使用的时候更加灵活

为什么要封装为对象类型 我认为Java本身是面向对象的语言,一切操作都是以对象为基础

比如像集合里面存的元素 也只支持存储Object类型 普通类型是无法通过集合来存储的

一个空Object对象占多大空间

在开启了压缩指针的一个情况下Oject默认会占用12个字节但是为了避免伪共享的问题

JVM会按照8个字节的倍数去进行填充所以会填充4个字节变成16个字节的长度

在关闭压缩指针的一个情况下呢Object默认会占16个字节 而16个字节正好是8的整数倍

所以他不需要填充 因此在开启和不开启压缩指针情况下 一个Object对象默认都只占用

16个字节的一个空间 在Hostpost虚拟机里面一个对象在堆内存里面的 一个内存布局

他使用了一个oop的一个结构来表示 主要分为三个部分 对象头 实例数据、对齐填充

Integer a1=100 Integer a2=100 ,a1==a2的运行结果原因

a1==a2的执行结果是true 原因是Integer内部 用到了一个享元模式的设计

也就是针对-128到127之前的数字呢 做了一个缓存 使用Integer a1 = 100这个方式

赋值的时候Java默认会通过valueOf这个方法 对100这个数字进行一个装箱操作 从而触发了一个缓存机制

使得a1和a2指向了同一个Integer的内存地址

finally语句块一定会执行吗

finally在两种情况下不会执行

第一个 程序没有进入到try语句块因为异常导致程序终止,这个问题主要是开发人员在编写代码的时候

异常捕获范围不够

第二个 在try或者cache语句块中,执行了Sysetm.exit(0)语句,导致JVM直接退出

java异常

受检异常和对受检异常

第一个异常的本质

受检异常和非受检异常都是派生自thowable他有两个子类实现

一个是error一个是exception

error是指程序无法处理的错误他和程序本身没有关系

而exception是指程序运行时候他需要处理的异常

受检异常和非受检异常的都是派生这个exception

第二个对于受检异常和非受检异常的定义 :受检异常的定义是程序在

编译阶段必须要主动捕获的异常 遇到该异常他有两种处理方法

通过 try catch捕获 或者通过 throw把异常抛出去

非受检异常的定义是指 程序说不需要主动捕获一般发生在程序运行期间

比如nullpointexception 当然我们可以选择主动捕获异常 出现这些异常的时候

虽然说无法通过捕获异常来实现异常的恢复 但是这些异常信息可以去帮助我们定位问题

这就是我对于异常和非受检异常的理解

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值