大家好,我是陶然同学,软件工程大三明年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。
不敢苟同,相信大家和我一样,都有一个大厂梦,作为一名资深Java选手,深知面试重要性,接下来我准备用100天时间,基于Java岗面试中的高频面试题,以每日3题的形式,带你过一遍热门面试题及恰如其分的解答。当然,我不会太深入,因为我怕记不住!!
因此,不足的地方希望各位在评论区补充疑惑、见解以及面试中遇到的奇葩问法,希望这100天能够让我们有质的飞越,一起冲进大厂!!,让我们一起学(juan)起来!!!
目录
hashCode()与equals()之间的关系
简述final作用
为什么局部内部类和匿名内部类只能访问局部final变量?
hashCode()与equals()之间的关系
在Java中,每个对象都可以调⽤⾃⼰的hashCode()⽅法得到⾃⼰的哈希值(hashCode),相当于对
象的指纹信息,通常来说世界上没有完全相同的两个指纹,但是在Java中做不到这么绝对,但是我
们仍然可以利⽤hashCode来做⼀些提前的判断,⽐如:
●
如果两个对象的hashCode不相同,那么这两个对象肯定不同的两个对象
●
如果两个对象的hashCode相同,不代表这两个对象⼀定是同⼀个对象,也可能是两个对象
●
如果两个对象相等,那么他们的hashCode就⼀定相同
在Java的⼀些集合类的实现中,在⽐较两个对象是否相等时,会根据上⾯的原则,会先调⽤对象的
hashCode()⽅法得到hashCode进⾏⽐较,如果hashCode不相同,就可以直接认为这两个对象不
相同,如果hashCode相同,那么就会进⼀步调⽤equals()⽅法进⾏⽐较。⽽equals()⽅法,就是⽤
来最终确定两个对象是不是相等的,通常equals⽅法的实现会⽐较重,逻辑⽐较多,⽽
hashCode()主要就是得到⼀个哈希值,实际上就⼀个数字,相对⽽⾔⽐较轻,所以在⽐较两个对
象时,通常都会先根据hashCode想⽐较⼀下。 所以我们就需要注意,如果我们重写了equals()⽅
法,那么就要注意hashCode()⽅法,⼀定要保证能遵守上述规则。
简述final作用
最终的
修饰类:表示类不可被继承
修饰方法:表示方法不可被子类覆盖,但是可以重载
修饰变量:表示变量一旦被赋值就不可以更改它的值。
(1)修饰成员变量
如果
final
修饰的是类变量,只能在静态初始化块中指定初始值或者声明该类变量时指定初始值。
如果
final
修饰的是成员变量,可以在非静态初始化块、声明该变量或者构造器中执行初始值。
(2)修饰局部变量
系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用
final
修饰局部变量
时, 即可以在定义时指定默认值(后面的代码不能对变量再赋值),也可以不指定默认值,而在
后面的代码 中对final
变量赋初值(仅一次)
(3)修饰基本类型数据和引用类型数据
如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;
如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
但是引用的值是可变
的。
为什么局部内部类和匿名内部类只能访问局部final变量?
首先需要知道的一点是
:
内部类和外部类是处于同一个级别的,内部类不会因为定义在方法中就会
随着 方法的执行完毕就被销毁。
这里就会产生问题:当外部类的方法结束时,局部变量就会被销毁了,但是内部类对象可能还存在
(
只有没有人再引用它时,才会死亡)
。这里就出现了一个矛盾:内部类对象访问了一个不存在的变
量。为了解决这个问题,就将局部变量复制了一份作为内部类的成员变量,这样当局部变量死亡
后,内部类仍可以访问它,实际访问的是局部变量的"copy"
。这样就好像延长了局部变量的生命周
期将局部变量复制为内部类的成员变量时,必须保证这两个变量是一样的,也就是如果我们在内部
类中修改了成员变量,方法中的局部变量也得跟着改变,怎么解决问题呢?
就将局部变量设置为
final
,对它初始化后,我就不让你再去修改这个变量,就保证了内部类的成员
变量和方法的局部变量的一致性。这实际上也是一种妥协。使得局部变量与内部类内建立的拷贝保
持一致。