IE盒子

搜索
查看: 193|回复: 2

2022年大厂offer必备java面试题整理-Java基础(2)

[复制链接]

1

主题

4

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2022-9-23 21:08:37 | 显示全部楼层 |阅读模式
上一篇:
Allen:2022年大厂offer必备java面试题整理-Java基础(1)

11、String s = "xyz" 和 String s = new String("xyz") 区别?




两个语句都会先去字符串常量池中检查是否已经存在 “xyz”,如果有则直接使⽤,如果没有则会在常量池中创建 “xyz” 对象。
另外,String s = new String("xyz") 还会通过 new String() 在堆⾥创建⼀个内容与 "xyz" 相同的对象实例。
所以前者其实理解为被后者的所包含。


12、== 和 equals 的区别是什么?



==:运算符,⽤于⽐较基础类型变量和引⽤类型变量。
对于基础类型变量,⽐较的变量保存的值是否相同,类型不⼀定要相同




对于引⽤类型变量,⽐较的是两个对象的地址是否相同。




equals:Object 类中定义的⽅法,通常⽤于⽐较两个对象的值是否相等。
equals 在 Object ⽅法中其实等同于 ==,但是在实际的使⽤中,equals 通常被重写⽤于⽐较两个对象的值是否相同。




13、两个对象的 hashCode() 相同,则 equals() 也⼀定为 true,对吗?



不对。hashCode() 和 equals() 之间的关系如下:
当有 a.equals(b) == true 时,则 a.hashCode() == b.hashCode() 必然成⽴,反过来,当 a.hashCode() == b.hashCode() 时,a.equals(b) 不⼀定为 true。


14、什么是反射?



反射是指在运⾏状态中,对于任意⼀个类都能够知道这个类所有的属性和⽅法;并且对于任意⼀个对象,都能够调
⽤它的任意⼀个⽅法;这种动态获取信息以及动态调⽤对象⽅法的功能称为反射机制。

反射涉及到四个核⼼类:
java.lang.Class.java:类对象;
java.lang.reflect.Constructor.java:类的构造器对象;
java.lang.reflect.Method.java:类的⽅法对象;
java.lang.reflect.Field.java:类的属性对象;

反射有什么⽤?
操作因访问权限限制的属性和⽅法;
实现⾃定义注解;
动态加载第三⽅jar包;
按需加载类,节省编译和初始化APK的时间;

反射⼯作原理
当我们编写完⼀个Java项⽬之后,每个java⽂件都会被编译成⼀个.class⽂件,这些Class对象承载了这个类的所有
信息,包括⽗类、接⼝、构造函数、⽅法、属性等,这些class⽂件在程序运⾏时会被ClassLoader加载到虚拟机中。当⼀个类被加载以后,Java虚拟机就会在内存中⾃动产⽣⼀个Class对象。
我们通过new的形式创建对象实际上就是通过这些Class来创建,只是这个过程对于我们是不透明的⽽已。

反射的⼯作原理就是借助Class.java、Constructor.java、Method.java、Field.java这四个类在程序运⾏时动态访 问和修改任何类的⾏为及状态。


15、深拷⻉和浅拷⻉区别是什么?



数据分为基本数据类型和引⽤数据类型。基本数据类型:数据直接存储在栈中;引⽤数据类型:存储在栈中的是对象的引⽤地址,真实的对象数据存放在堆内存⾥。

浅拷⻉:对于基础数据类型:直接复制数据值;对于引⽤数据类型:只是复制了对象的引⽤地址,新旧对象指向同⼀个内存地址,修改其中⼀个对象的值,另⼀个对象的值随之改变。

深拷⻉:对于基础数据类型:直接复制数据值;对于引⽤数据类型:开辟新的内存空间,在新的内存空间⾥复制⼀个⼀模⼀样的对象,新⽼对象不共享内存,修改其中⼀个对象的值,不会影响另⼀个对象。
深拷⻉相⽐于浅拷⻉速度较慢并且花销较⼤。

举个例⼦这就好⽐两兄弟⼤家买⾐服可以⼀⼈⼀套,然后房⼦⼤家住在⼀套房⼦⾥(浅拷⻉),当两个⼈成家⽴业了,房⼦分开了⼀⼈⼀套互不影响(深拷⻉)




16、并发和并⾏有什么区别?



并发:两个或多个事件在同⼀时间间隔发⽣。
并⾏:两个或者多个事件在同⼀时刻发⽣。

并⾏是真正意义上,同⼀时刻做多件事情,⽽并发在同⼀时刻只会做⼀件事件,只是可以将时间切碎,交替做多件事情。

并⾏在多处理器系统中存在,⽽并发可以在单处理器和多处理器系统中都存在,并发能够在单处理器系统中存在是
因为并发是并⾏的假象,并⾏要求程序能够同时执⾏多个操作,⽽并发只是要求程序假装同时执⾏多个操作(每个⼩时间⽚执⾏⼀个操作,多个操作快速切换执⾏)。

当系统有⼀个以上 CPU 时,则线程的操作有可能⾮并发。当⼀个 CPU 执⾏⼀个线程时,另⼀个 CPU 可以执⾏另
⼀个线程,两个线程互不抢占 CPU 资源,可以同时进⾏,这种⽅式我们称之为并⾏(Parallel)。

并发编程的⽬标是充分的利⽤处理器的每⼀个核,以达到最⾼的处理性能。


17、当⼀个对象被当作参数传递到⼀个⽅法后,此⽅法可改变这个对象的属性,并可返回变化后的结果,那么这⾥到底是值传递还是引⽤传递?


值传递。Java 中只有值传递,对于对象参数,值的内容是对象的引⽤。


18、重载(Overload)和重写(Override)的区别?


⽅法的重载和重写都是实现多态的⽅式,区别在于前者实现的是编译时的多态性,⽽后者实现的是运⾏时的多态性。

重载:⼀个类中有多个同名的⽅法,但是具有有不同的参数列表(参数类型不同、参数个数不同或者⼆者都不同)。

重写:发⽣在⼦类与⽗类之间,⼦类对⽗类的⽅法进⾏重写,参数都不能改变,返回值类型可以不相同,但是必须是⽗类返回值的派⽣类。即外壳不变,核⼼重写!重写的好处在于⼦类可以根据需要,定义特定于⾃⼰的⾏为。


19、构造器是否可被重写?


Constructor 不能被 override(重写),但是可以 overload(重载),所以你可以看到⼀个类中有多个构造函数的情况。


20、为什么不能根据返回类型来区分重载?


如果我们有两个⽅法如下,当我们调⽤:test(1) 时,编译器⽆法确认要调⽤的是哪个。




⽅法的返回值只是作为⽅法运⾏之后的⼀个“状态”,但是并不是所有调⽤都关注返回值,所以不能将返回值作为重载的唯⼀区分条件。
回复

使用道具 举报

4

主题

11

帖子

20

积分

新手上路

Rank: 1

积分
20
发表于 2025-3-2 16:55:02 | 显示全部楼层
众里寻他千百度,蓦然回首在这里!
回复

使用道具 举报

2

主题

7

帖子

12

积分

新手上路

Rank: 1

积分
12
发表于 5 天前 | 显示全部楼层
嘘,低调。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表