失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 自整理Java面试题集锦(Java基础 1)

自整理Java面试题集锦(Java基础 1)

时间:2020-09-05 16:32:01

相关推荐

自整理Java面试题集锦(Java基础 1)

Java基础

1. JDK和JRE有什么区别?

JDK是java的开发工具包,而JRE是java的运行时环境,开发工具包中包含运行时环境。对于安装软件来说,理论上只需要JRE,但一般都一起安装。而JRE是由JVM和一些标准类库组成。java跨平台的实现,主要是通过JVM负责将字节码翻译成底层文件,相当于自带适配器。

2. == 和 equals的区别

==对于基本数据类型来说,也即(char,byte,boolean,short,int,long,float,double),==这种关系运算服意思是值是否相等。而对于String等对象类型的数据,==判断值判断引用是否相等,而不判断内容。equals是超类Object的方法,默认情况下是比较引用是否相等。但是实际使用中,我们需要知道两个对象的内容是否相等,所以一般equals是用来判断内容是否相等。所以String类中写了equals方法,如果我们要对其他类型的变量比较内容的话,需要重写equals方法。

equals方法有自反性,交换性等属性,如果equals相等,那么其hashCode应该也相等。

参考资料:码农小汪-java中hashCode方法与equals方法_11544106的技术博客_51CTO博客

3.两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?

不一定,因为hashCode本质上是一种哈希算法,存在哈希碰撞的可能,所以即便是一样的hashCode,也可能是不一样的值生成的。但是反之如果对象equals,那么hashCode一定相同。那么如果存在哈希碰撞的话,要怎么解决,第一个是用一个链表,把相同哈希值的数据存到一个链表里面,参考Java7之前的HashMap实现。或者可以对已经hashCode过的值再hash,直到其不会重复。

引申理解:为什么我们平时工作中不会用到重写equals和hashcode方法?因为我们平时的工作中在往java集合里添加key值的时候,往往不会put对象进去,而是数字或字符串。这些已经重写好了equals和hashcode方法。我们也不经常需要判断两个对象是否相等,我们一般都会对数据加主键或唯一标识来区对象。

什么时候我们需要重写equals和hashcode方法,即在我们需要判断两个对象是不是同一个的时候。其中equals用来比较内容是不是一样,他需要判断对象参与唯一性计算的所有字段都相等。而hashcode方法则用于在java的哈希表操作的时候,用来看两个对象是不是同一个(避免equals的复杂操作,相当于给对象一个唯一标识),需要参与equals计算的所有字段都参与hashcode计算。一般方法是用变量result(初始设置一个小整数)乘以31,然后再加上每个字段的hashcode值,作为result。继续进行下一个字段操作,直到获得了result字段结果作为hashcode值。可以参考String的hashcode方法。

4.final 在 java 中有什么作用?

final用来形容类,表示类不可被继承,final修饰方法则方法不能被子类重写,final用来形容变量,表示变量的引用或值(基本类型)不能被修改,所以需要在声明时就初始化完成。例子是String类就是final的,不能被继承,没有String子类存在。另外,对于抽象类不能用final来修饰,因为抽象类本身就是提供给子类继承的,而final又不能被继承,所以冲突了。

不过final在修饰引用类型的变量时没有什么意义,就好像数组或对象类型的变量,虽然其引用不可变化,但是引用指向的对象内容还是可以改变的,所以修饰为final并不能起到约束作用。

5.java 中的 Math.round(-1.5) 等于多少?

相当于对-1.5进行四舍五入,画一个数轴,入,则往大的方向上入,因此是-1.

6.String 属于基础的数据类型吗?

不属于基础数据类型,它实现了CharSequence接口,表示字符数组。当然,因为String类型应用十分广泛,所以java设置了这一引用类型数据,而且为了方便使用和安全角度考虑,String是final的不能被继承,String可以直接用字符串方式表示,且jvm会维护字符串常量池。可以像基本数据类型一样使用它,但是它确实是引用类型。String是不可变的,如果想要可变的话,那么需要使用StringBuilder或StringBuffer。

7.java 中操作字符串都有哪些类?它们之间有什么区别?

String,StringBuffer,StringBuilder。String是不可变的字符串,StringBuilder是可变的字符串,它通过append方法来为字符串追加内容,也可以指定下标在中间插入。他不是线程安全的类,多线程环境下需要使用StringBuffer类,这个类的操作方法上都添加了synchronized关键词加锁。但是加锁会增加开销,单线程环境下不要使用。

8. String str="i"与 String str=new String("i")一样吗?

不一样,equals是一样的,hashCode也是一样的,可能在内存中实际存储的地址也是一样的,但是存放这两个引用类型变量的值是不一样的,==操作将会返回false。因为new String是重新创建一个引用类型变量引用字符串i的,这个新的引用类型变量与原来的是不相等的。

9.如何将字符串反转?

java中,将字符串翻转,有几种方式,倒序遍历字符串,取出每个位置的字符然后重新拼接(StringBuilder);或者通过toCharArray获取字符数组,然后倒序遍历输出;或者通过将字符串传入StringBuilder类中,然后调用reverse在toString,翻转字符串。

10.String 类的常用方法都有那些?

equals比较是否相等,

substring截取字符串(返回新的字符串),

split分割字符串输出字符串数组,

toCharArray作为字符数组输出,

charAt某字符在字符串中的位置,

indexOf指定下标下的字符,

length字符长度方法,

startsWith字符串是否以XXX开头,

endsWith字符串是否以xxx结尾,

toUpperCase字符串转大写,

toLowerCase字符串转小写,

contains是否包含指定字符串,

replace替换字符串中的字符

11.抽象类必须要有抽象方法吗?

抽象类不一定要有抽象方法,但是有抽象方法的,必须是抽象类。

12.普通类和抽象类有哪些区别?

普通类不能有抽象方法,抽象类可以有抽象方法;普通类可以是final的,抽象类不能是final的;抽象类不能被实例化,注定被继承,所以抽象方法也不能是private,也不能是final的。职责上属于继承体系中较为上层的部分,它承担一些公共的职责较多。

13.抽象类能使用 final 修饰吗?

不能,final意味着不能被继承,但是抽象类生来就是要被继承的,否则其中的抽象方法就会得不到实现。虽然抽象类不一定要有抽象方法,但是语法上java还是禁止了这种情况。

如果觉得《自整理Java面试题集锦(Java基础 1)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。