Java核心技术面试题(附答案),纯手码,赶紧带走冲刺10月秋招

本文汇总了Java核心技术面试中的60道常见问题,涵盖了Java语言优势、JVM、JRE、JDK的定义,基本数据类型,浮点数精度,& 和 && 的区别,数组、Arrays工具类,== 和 equals() 的区别,hashCode() 方法,装箱和拆箱,字符串常量池,值传递与引用传递,重载与重写,多态,构造方法,抽象类与接口,静态关键字应用场景,异常处理,集合框架,枚举,以及ArrayList、Vector、LinkedList、HashSet等集合类的特性与比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1.Java语言有哪些优势 ?

2.什么是JVM,JRE,JDK ?

3.Java中常见的基本数据类型有哪些 ?

4.Java中的浮点数为什么不精确 ?

5. & 和 && 有什么区别呢 ?

6. 什么是数组 ?

7. 谈谈你对Arrays工具类的理解 ?

8. == 和 equals() 的区别 ?

9.hashCode() 或HashCode的作用是什么 ?

10. 为什么要有 hashCode() ?  (以"HashSet如何检查重复"为例子来说明为什么要有hashCode)

11.为什么重写equals()时必须重写hahsCode()方法 ?

12. 什么是装箱和拆箱 ?

13. 基本类型的包装器类型有哪些 ?

14.包装类中的常量池技术有什么作用 ?

15. 什么是字符串常量池(String Pool) ?

16.Java是按值传递还是按引用传递 ?

17. 重载和重写的区别 ?

18. 什么是浅拷贝,什么是深拷贝 ?

19.成员变量与局部变量的区别有哪些 ?

20. 什么是构造方法 ?

21. 构造方法的作用是什么 ?

22.面向对象的三大特征是什么 ?

23. 什么是多态 ?

24.Java中如何实现多态 ?

25. String为什么是不可变的 ?

26.String与StringBuffer / StringBuilder有什么区别 ?

27. StringBuffer和StringBuilder有什么区别 ?

28.String,StringBuffer,StringBuilder如何选择使用 ?

29.String类中有哪些常见方法 ?

30. String中 intern() 方法的作用是什么 ?

31. final关键字的用法有哪些 ?

32. final,finally,finalize的区别 ?

33. 抽象类和接口有什么区别 ?

34.说说static关键字的主要使用场景有哪些 ?

35.静态方法与实例方法的区别有哪些 ?

36. 说说静态代码块static{} 与代码块{}的相同点和不同点 。

37.Object类中有哪些常见的方法 ?

38. Java中常见接口有哪些 ?

39. 什么是异常 ? 

40. 你是如何理解Java中的异常体系的 ?

41.Error和Exception的区别是什么 ?

42. throw 和 throws的区别是什么 ?

43. 检查型异常和非检查型异常有什么区别 ?

44. 如果在try/catch中出现return,会执行finally中的语句吗 ? 

45. Java中的常见异常有哪些 ?

46. 枚举是什么 ?

47. 你对Java集合是怎么理解的:

48. List,Set,Map三者的特点是 ?

49. 如何更好的选择集合 ?

50. 如何对集合进行排序 ?

51. ArrayList和Vector区别 ?

52. ArrayList与LinkedList的区别 ?

53. List的遍历例方式该如何选择?

54. 谈谈ArrayList的扩容机制 。

55. CopyOnWriteArrayList是什么 ? 

56.CopyOnWriteArrayList有啥缺点 ?

57.CopyOnWriteArrayList的实现原理是什么 ?

58. CopyOnWriteArrayList为什么并发安全且性能比Vector好 ?

59.HashSet,LinkedHashSet和TreeSet有那些区别 ?

60.HashSet是如何检查重复的 ?


1.Java语言有哪些优势 ?

        1.面向对象(封装,继承,多态);

        2.平台无关性(Java虚拟机实现了平台无关性) ;

        3.可靠性;

        4.安全性;

        5.支持多线程;

        6.支持网络编程;

        7.执行方式采用了解释执行 + 编译执行并存的方式;

        8.实践应用案例很丰富。

2.什么是JVM,JRE,JDK ?

        JVM

                JVM是Java虚拟机(Java Virtual Machine) 的缩写,用于运行Java字节码文件(*.class文件)。JVM针对不同的操作系统都有特性的实现(例如Windows,Linux,nacOC),目的是使用相同的字节码啊,在不同操作系统运行结果相同,是Java实现跨平台的核心机制。Java中默认虚拟机为HotSpot VM,除此之外还有JRockit(BEA),j9(IBM),TaoBaoVM(淘宝)等虚拟机;

        JRE

                JRE全称Java Runtime Environment(Java运行时环境)。JRE包括Java虚拟机和Java程序我所需要的核心类库等,如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。

        JDK

                JDK是Java开发工具包(Java Development Kit)的缩写,是提供给Java开发人员使用的,JDK中包含JRE以及开发,调节和监视应用程序的工具,编译工具(javac.exe),打包工具(jar.exe),Java监控和管理平台(jConsole,jvisualvm)等,

        JDK包含JRE,JRE包含JVM。 所以JDK > JRE > JVM。

3.Java中常见的基本数据类型有哪些 ?

        Java中的基本数据类型共有8种,分别是:

                数值类型:

                        整型:

                                 1.byte        字节型,内存中占1个字节。

                                2.short        短整型,内存中占2个字节。

                                3.int            整型,内存中占4个字节。

                                4.long         长整型,内存中占8个字节。

                        浮点型:

                                5.float        单精度浮点型,内存中占4个字节。

                                6.double     双精度浮点型,内存中占8个字节。

                非数值类型:

                                1.char        字符型,内存中占两个字节。

                                2.boolean        布尔型(在Java虚拟机里采用8位二进制数表示布尔值,00000001表示true,00000000表示false)。boolean类型被编译成int类型来使用,占4个byte。boolean数组被编译成byte数组,每个boolean数组成员占1个byte。

4.Java中的浮点数为什么不精确 ?

        计算机使用二进制运算,程序中1的十进制数先转换成二进制,再进行运算。Float和Double的小数部分在转换成二进制时容易产生无线循环的情况,通常都是取无限接近于原值的近似值,所以导致出现精度丢失的情况。(在金融,建筑,工程,科学等领域,对计算数值的精度要求一般比较高,为了避免计算结果不精准,往往采用BigDecimal + 字符串来解决精度丢失的问题。)

        例如:

BigDecimal d1 = new BigDecimal("0.1");
BigDecimal d2 = new BigDecimal("0.2");
BigDecimal d3 = d1.mutiply(d2);        //计算0.1 × 0.2的精确值。
double result = d3.doubleValue();      //获取double类型的结果。

5. & 和 && 有什么区别呢 ?

        "&按位与" 运算 当位运算符时,a & b时把a和b都转换成二进制数,然后再逐位进行"与运算",同时为1结果为1,否则为0;

int result;
result = 9 & 8;    //9 & 8 = 1001(9) & 1000(8) = 1000(8).
System.out.println(result);         //result = 8

        "&不断路与"运算符 当逻辑运算符时,当执行"表达式1 & 表达式2"时,表达式1等于true或者false,都会继续执行表达式2,执行不会中断。

int i = 3;
if(i++ > 5) & (i++ < 9){
   System.out.println("if语句执行啦");    //该语句未执行
}
System.out.println(i);        //结果输出i = 5,说明执行了两个i++

        "&&短路与"运算 当逻辑运算符,当执行"表达式1 && 表达式2"时,表达式1等于false,执行会中断,表达式2不会执行。 

int i = 3;
if((i++ > 5) && (i ++ < 9)) {
    System.out.println("if语句执行啦");
}
System.out.println(i);        //输出 i = 4,说明 i++只执行了一次。也就说明if语句只判断了 i++ > 5, 结果weifalse,退出if判断语句。

6. 什么是数组 ?

        1.数组时一种引用数据类型,用于保存一组相同类型的数据结构,长度固定;

        2.使用连续的内存空间进行存储,所以元素有序,遍历速度较快。

        3.下标从0开始,尾下标为长度-1,引发ArrayIndexOutOfBoundsException数组下标越界异常;

7. 谈谈你对Arrays工具类的理解 ?

        1.Arrays类时JDK提供专门用来操作数组的工具类,该类提供了大量的静态方法完成对于数据的常见的操作。

        2.static List asList(T...a)  //按照动态参数,创建一个ArrayList集合(内部类)

        3.static void sort(int[] a)   //数组排序(快速排序算法)

        4.static int binarySearch(Object[] a ,  Object key)  //搜索(二分查找算法)

8. == 和 equals() 的区别 ?

  •  ==是运算符

        1.基本数据类型 == 用于比较值。

        2.引用数据类型 == 用于比较内存地址。

  • equals()是Object类中的方法

        1.基本数据类型不能使用equals()

        2.引用数据类型如果没有重写equals() ,会默认使用Object类的equals() , 在该方法中采用 == 进行比较内存地址,所以引用数据类型会重写equals() ,可以进行值或内容的比较。例如String类。

9.hashCode() 或HashCode的作用是什么 ?

        1.hashCode()是Object类中的native本地方法,底层使用c/c++语言实现,用于获取对象的HashCode哈希码。

        2.HashCode哈希码是该对象的内存地址通过哈希hash算法计算出的一个整数值,代表该对象在哈希表中的位置,作用主要是为了提高查找对象的快捷性,通过HashCode可以快速定位对象的存储地址,

        3.两个对象进行比较,先通过HashCode比较,如果HashCode相等,再条用equals()方法比较,提高效率;

10. 为什么要有 hashCode() ?  (以"HashSet如何检查重复"为例子来说明为什么要有hashCode)

        1.当你把对象加入HashSet时,HashSet会先获取该对象的hashCode值,来计算该对象加入的位置,同时与其他已经加入的对象的hashcode值作比较。

        2.如果没有重复的hashCode,HashSet会假设对象没有重复出现,正常添加。

        3.如果发现有相同hashCode值的对象,这时会条用equals()方法来检查hashCode相等的对象是否真的相同。

        4.如果两个相同,HashSet就不会其加入操作成功。

        5.如果两者不同,就会重新散列到其他位置。

        6.这样就大大减少了equals()的执行次数,相应就提高了执行速度。

11.为什么重写equals()时必须重写hahsCode()方法 ?

        equals() 方法和hashCode()方法之间的关系应符合。

                1. 如果两个对象相同(即:用equals比较返回true),那么它们的hashCode值一定要相同。

                2. 如果两个对象的hashCode相同,他们并不一定相同(用equals比较)。

        综上所述,在每个覆盖了equals()方法的类中,也必须覆盖hashCode()方法,如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致HashSet和HashTable等集合。另外,可以避免equals()被频繁调用,减少性能开销。

12. 什么是装箱和拆箱 ?

  •         装箱:将基本类型转换成它们对应的引用类型,例如:Integer i = 666;
  •         拆箱:将包装类型转换成基本数据类型,例如:int n =  i;

13. 基本类型的包装器类型有哪些 ?

        1. byte(1字节) :      Byte类

        2.short(2字节):       Short类

        3.int(4字节):            Integer类

        4.long(8字节):         Long类

        5. float(4字节):        Float类

        6. double(8字节):    Double类

        7.char(2字节):         Character类

        8.boolean(未定):     Boolean类

14.包装类中的常量池技术有什么作用 ?

        1. Byte,Short,Integer,Long创建范围在[-128 , 127]的缓存数据;

        2.Character创建范围在[ 0 , 127]的缓冲数据;

        3.如果数据处于缓存范围,不必重新创建对象,直接从缓存中获取,减少对象重复创建所带来的内存与性能开销;

        4.如果数据超出缓存范围,才会创建新的对象。

        例如:

//使用常量缓存池,同一内存地址,输出true
//强调一下Integer是引用数据类型,== 比较基本类型比较值,比较引用类型比较地址
Integer n1 = 33;    
Integer n2 = 33;
System.out.println(n1 == n2);


//超出常量缓存池范围,重新分配内存地址,输出false
Integer n3 = 130;
Integer n4 = 130;
System.out.println(n3 == n4);


// n5从常量缓存池取,n6使用new关键字创建,非同一内存地址,输出false
Integer n5 = 40;
Integer n6 = new Integer(40);
System.out.println(n5 == n6);

15. 什么是字符串常量池(String Pool) ?

        1.JVM为了提升性能和减少内存开销,避免字符串的重复创建,维护了一块特殊的内存空间,用于保存常量字符串,即字符串常量池(String Pool),JDK1.7以后,字符串常量池从方法区移到Heap堆区;

        2.字符串常量池的优点(String Pool):避免了相同内容字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能。

16.Java是按值传递还是按引用传递 ?

  •         值传递(pass by value):

                        值传递是指在调用方法时,按实际参数的值或内存地址复制一份传递到方法中。

  •         引用传递(pass by reference):

                        引用传递是指在调用方法时,将实际传输的内存地址直接传递到方法中(不创建参数值或者内存地址的副本)。

        在Java中,都是值传递,如果参数时基本类型,复制参数的值,传递给方法。如果参数时引用类型,复制对象参数的Heap堆中内存地址值,传递给方法。

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是小陈呀~

您的鼓励是我最大的动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值