Java面试题集合,不断收集中......
目录
3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
5、 java 中的 Math.round(-1.5) 等于多少?
8、String、StringBuffer、StringBuilder
16、String str="i"与 String str=new String(“i”)一样吗?
20、final、finally、finalize 有什么区别?
21、Error、Exception和RuntimeException的区别,作用又是什么?
28、NoClassDefFoundError和ClassNotFoundException区别
29、如果try{} 里有一个 return 语句,那么finalfly{} 里的代码会不会被执行,什么时候被执行,在 return 前还是后?
1、JDK 和 JRE 有什么区别?
JDK:Java Development Kit 的简称,java 开发工具包,它提供了编译、运行Java程序所需的各种工具和资源。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
2、== 和 equals 的区别是什么?
“==”是运算符。如果比较的对象基本数据类型,则比较的是其存储的值是否相等;如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等。
equals 本质上就是 ==,不能用于比较基本数据类型。只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。
3、两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
不对,两个对象的 hashCode()相同,equals()不一定 true。
代码示例:
String str1 = "通话";
String str2 = "重地";
System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
System.out.println(str1.equals(str2));
执行的结果:
1 2 3 | str1:1179395 | str2:1179395
false |
代码解读:很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
4、 final 在 java 中有什么作用?
final 修饰的类叫最终类,该类不能被继承。
final 修饰的方法不能被重写。
final 修饰的变量叫常量,常量必须初始化,初始化之后值就不能被修改。
5、 java 中的 Math.round(-1.5) 等于多少?
等于 -1,因为在数轴上取值时,中间值(0.5)向右取整,所以正 0.5 是往上取整,负 0.5 是直接舍弃。
6、String 属于基础的数据类型吗?
String 不属于基础类型,基础类型有 8 种:byte、boolean、char、short、int、float、long、double,而 String 属于对象。
7、float f=3.4;是否正确?
不正确。3.4是双精度数,将双精度型(double)赋值给浮点型(float)属于
下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换
float f =(float)3.4; 或者写成 float f =3.4F;。
8、String、StringBuffer、StringBuilder
String是final修饰的,不可变,每次操作都会产生新的String对象
StringBuffer和StringBuilder都是在原对象上操作
StringBuffer是线程安全的,StringBuilder线程不安全的
StringBuffer方法都是synchronized修饰的
性能:StringBuilder > StringBuffer > String
场景:经常需要改变字符串内容时使用后面两个
优先使用StringBuilder,多线程使用共享变量时使用StringBuffer
9、&(按位与)和&&(逻辑与)的区别?
&&具有短路功能,而&不具备短路功能。
当&运算符两侧的表达式的结果均为true时,整个的运算结果才为true。
当&&运算符左侧的表达式为false时,不再计算右侧的表达式,整个结果返回false。
|和||区别一样,|运算符两侧的表达式,不论左侧表达式为true还是false,右侧表达式都会执行。而||运算符当左侧表达式为true时,不再计算右侧表达式,整个结果返回true。
10、如何将字符串反转?
使用StringBuilder或者StringBuffer的reverse()方法
11、String类的常用方法都有哪些?
indexOf():返回指定字符的索引
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
12、抽象类必须要有抽象方法吗?
不需要,抽象类不一定非要有抽象方法。
示例代码:
abstract class Cat {
public static void sayHi() {
System.out.println("hi~");
}
}
以上代码中抽象类并没有抽象方法但完全可以正常运行。
13、普通类和抽象类有哪些区别?
普通类不能包含抽象方法,抽象类可以包含抽象方法。
抽象类不能直接实例化,普通类可以直接实例化。
14、抽象类能使用final修饰吗?
不能,定义抽象类就是让其他类继承的,如果定义final该类就不能被继承,这样彼此就是产生矛盾,所以final不能修饰抽象类。
15、ArrayList和LinkedList有什么区别?
LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。
1.数据结构不同
ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.效率不同
当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
16、String str="i"与 String str=new String(“i”)一样吗?
String str="i"会将起分配到常量池中,常量池中没有重复的元素,如果常量池中存中i,就将i的地址赋给变量,如果没有就创建一个再赋给变量。
String str=new String(“i”)会将对象分配到堆中,即使内存一样,还是会重新创建一个新的对象。
17、列出一些你常见的运行时异常
ArithmeticException(算术异常)
ClassCastException (类转换异常)
IllegalArgumentException (非法参数异常)
IndexOutOfBoundsException (下标越界异常)
NullPointerException (空指针异常)
SecurityException (安全异常)
18、Java中如何将字符串转换为整数?
String s="123";
int i;
第一种方法:i=Integer.parseInt(s);
第二种方法:i=Integer.valueOf(s).intValue();
19、throw 和 throws 的区别?
(1)throw
作用在方法内,表示抛出具体异常,由方法体内的语句处理;
一定抛出了异常;
(2)throws
作用在方法的声明上,表示抛出异常,由调用者来进行异常处理;
可能出现异常,不一定会发生异常;
20、final、finally、finalize 有什么区别?
final可以修饰类,变量,方法,修饰的类不能被继承,修饰的变量不能重新赋值,修饰的方法不能被重写
finally用于抛异常,finally代码块内语句无论是否发生异常,都会在执行finally,常用于一些流的关闭。
finalize方法用于垃圾回收。
一般情况下不需要我们实现finalize,当对象被回收的时候需要释放一些资源,比如socket链接,在对象初始化时创建,整个生命周期内有效,那么需要实现finalize方法,关闭这个链接。
但是当调用finalize方法后,并不意味着gc会立即回收该对象,所以有可能真正调用的时候,对象又不需要回收了,然后到了真正要回收的时候,因为之前调用过一次,这次又不会调用了,产生问题。所以,不推荐使用finalize方法。
21、Error、Exception和RuntimeException的区别,作用又是什么?
Error和Exception都是Throwable的子类,RuntimeException是Exception的子类。
Error用于指示合理应用程序不应该试图捕获的错误。
Exception指出合理的应用程序需要捕获的条件。分为已检查异常和未检查异常。
RuntimeException是未检查异常,不需要try catch或在方法上声明,主要子类:NullPointer、Arithmatic、ArrayIndexOutOfBounds、ClassCast。
22、hashCode的作用?
hashCode主要是用于快速查找,如HashMap结构中,用于定位键值对的位置。两个对象相同,则hashCode一定相同,而hashCode相同的对象则不一定相同,就相当于放在同一个框里。
23、HashMap和Hashtable的区别?
HashMap,运行key和value为null,Hashtable不允许为null。
HashMap线程不安全,Hashtable线程安全。
24、重载和重写的区别
重载: 发生在同一类中,函数名必须一样,参数类型、参数个数、参数顺序、返回值、修饰符可以不一样。
重写: 发生在父子类中,函数名、参数、返回值必须一样,访问修饰符必须大于等于父类,异常要小于等于父类,父类方法是private不能重写。
25、什么是反射
在运行过程中,对于任何一个类都能获取它的属性和方法,任何一个对象都能调用其方法,动态获取信息和动态调用,就是反射。
26、浅拷贝和深拷贝的区别
浅拷贝: 基础数据类型复制值,引用类型复制引用地址,修改一个对象的值,另一个对象也随之改变。
深拷贝: 基础数据类型复制值,引用类型在新的内存空间复制值,新老对象不共享内存,修改一个值,不影响另一个。
深拷贝相对浅拷贝速度慢,开销大。
27、并发和并行
并发:把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。
并行: 把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。
28、NoClassDefFoundError和ClassNotFoundException区别
NoClassDefFoundError:在打包时漏掉了某些类或者打包时存在,然后你把target里的类删除,然后jvm运行时找不到报错。
ClassNotFoundException:在编译的时候某些类找不到,然后报错。
29、如果try{} 里有一个 return 语句,那么finalfly{} 里的代码会不会被执行,什么时候被执行,在 return 前还是后?
会执行,在return之前执行,如果finally有return那么try的return就会失效。
30、什么是 java 序列化?什么情况下需要序列化?
序列化:将数据结构或对象转换成二进制字节流的过程。
反序列化:将在序列化过程中所生成的二进制字节流的过程转换成数据结构或者对象的过程
实际开发中有用到序列化和反序列化的场景:
1.对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
2.将对象存储到文件中的时候需要进行序列化,将对象从文件中读取出来需要进行反序列化。
3.将对象存储到缓存数据库(如 Redis)时需要用到序列化,将对象从缓存数据库中读取出来需要反序列化。