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)》对你有帮助,请点赞、收藏,并留下你的观点哦!