查看: 97|回复: 1

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

[复制链接]

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-9-23 19:11:21 | 显示全部楼层 |阅读模式
1、⾯向对象的三个基本特征?


⾯向对象的三个基本特征是:封装、继承和多态。
继承:让某个类型的对象获得另⼀个类型的对象的属性和⽅法。继承就是⼦类继承⽗类的特征和⾏为,使得⼦类对
象(实例)具有⽗类的实例域和⽅法,或⼦类从⽗类继承⽅法,使得⼦类具有⽗类相同的⾏为
封装:隐藏部分对象的属性和实现细节,对数据的访问只能通过外公开的接⼝。通过这种⽅式,对象对内部数据提
供了不同级别的保护,以防⽌程序中⽆关的部分意外的改变或错误的使⽤了对象的私有部分。
多态:对于同⼀个⾏为,不同的⼦类对象具有不同的表现形式。多态存在的3个条件:
1)继承;2)重写;3)⽗类引⽤指向⼦类对象。
举个简单的例⼦:英雄联盟⾥⾯我们按下 Q 键这个动作:
对于亚索,就是斩钢闪
对于提莫,就是致盲吹箭
对于剑圣,就是阿尔法突袭
同⼀个事件发⽣在不同的对象上会产⽣不同的结果。
下⾯再举个简单的例⼦帮助⼤家理解,这个例⼦可能不是完全准确,但是依然是可以帮助我们理解的。


在这个例⼦中:
House 和 Cat 都是 Animal,所以他们都继承了 Animal,同时也从 Animal 继承了 sleep 这个⾏为。
但是针对 sleep 这个⾏为,House 和 Cat 进⾏了重写,有了不同的表现形式(实现),这个我们称为多态。
在 Cat ⾥,将 age 属性定义为 private,外界⽆法直接访问,要获取 Cat 的 age 信息只能通过 getAge ⽅法,从⽽
对外隐藏了 age 属性,这个就叫做封装。当然,这边 age 只是个例⼦,实际使⽤中可能是⼀个复杂很多的对象。

2、访问修饰符public,private,protected,以及不写(default)时的区别?





类的成员不写访问修饰符默认为default,默认对于同⼀个包的其他类相当于公开(public),对于不是同⼀个包
的其他类相当于私有(private)。
受保护(protected)对⼦类相当于公开,对于不是同⼀个包没有⽗⼦关系的类相当于私有。
Java中,外部类的修饰符只能是public或默认,类的成员(包括内部类)的修饰符可以是以上四种。

3、下⾯两个代码块能正常编译和执⾏吗?




代码块1编译报错,错误原因是:不兼容的类型: 从int转换到short可能会有损失”。
代码块2正常编译和执⾏。
我们将代码块2进⾏编译,字节码如下:





可以看到字节码中包含了 i2s 指令,该指令⽤于将 int 转成 short。i2s 是 int to short 的缩写。
其实,s1 += 1 相当于 s1 = (short)(s1 + 1),有兴趣的可以⾃⼰编译下这两⾏代码的字节码,你会发现是⼀摸⼀样的。

4、基础考察,指出下题的输出结果




答案是:false,true。
执⾏ Integer a = 128,相当于执⾏:Integer a = Integer.valueOf(128),基本类型⾃动转换为包装类的过程称为⾃动装箱(autoboxing)。


在 Integer 中引⼊了 IntegerCache 来缓存⼀定范围的值,IntegerCache 默认情况下范围为:-128~127。
本题中的 127 命中了 IntegerCache,所以 c 和 d 是相同对象,⽽ 128 则没有命中,所以 a 和 b 是不同对象。
但是这个缓存范围时可以修改的,可能有些⼈不知道。可以通过JVM启动参数:-XX:AutoBoxCacheMax= 来修改
上限值,如下图所示:




5、⽤最有效率的⽅法计算2乘以8?


2 << 3。(左移 相当于乘以2的⼏次幂 n << m 相当于n乘2的m次幂)
进阶:通常情况下,可以认为位运算是性能最⾼的。但是,其实编译器现在已经“⾮常聪明了”,很多指令编译器都 能⾃⼰做优化。所以在实际实⽤中,我们⽆需特意去追求实⽤位运算,这样不仅会导致代码可读性很差,⽽且某些 ⾃作聪明的优化反⽽会误导编译器,使得编译器⽆法进⾏更好的优化。

6、&和&&的区别?


&&:逻辑与运算符。当运算符左右两边的表达式都为 true,才返回 true。同时具有短路性,如果第⼀个表达式为 false,则直接返回 false。




&:逻辑与运算符、按位与运算符。
以开关开灯论:
有这样两个开关,0为开关关闭,1为开关打开。
与运算进⾏的是这样的算法:




在与运算中两个开关是串联的,如果我们要开灯,需要两个开关都打开灯才会打开。
理解为A与B都打开,则开灯,所以是1&1=1
任意⼀个开关没打开,都不开灯,所以其他运算都是0。
按位与运算符:⽤于⼆进制的计算,只有对应的两个⼆进位均为1时,结果位才为1 ,否则为0。
逻辑与运算符:& 在⽤于逻辑与时,和 && 的区别是不具有短路性。所在通常使⽤逻辑与运算符都会使⽤ &&,⽽
& 更多的适⽤于位运算。

7、String 是 Java 基本数据类型吗?


答:不是。Java 中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type),剩下的都是引⽤类型(reference type)。
基本数据类型:数据直接存储在栈上。
引⽤数据类型区别:数据存储在堆上,栈上只存储引⽤地址。

8、String 类可以继承吗?


不⾏。String 类使⽤ final 修饰,⽆法被继承。

9、String和StringBuilder、StringBuffer的区别?


String:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的⽣成。
StringBuffer:跟 String 类似,但是值可以被修改,使⽤ synchronized 来保证线程安全。
StringBuilder:StringBuffer 的⾮线程安全版本,没有使⽤ synchronized,具有更⾼的性能,推荐优先使⽤。

10、String s = new String("xyz") 创建了⼏个字符串对象?


⼀个或两个。如果字符串常量池已经有“xyz”,则是⼀个;否则,两个。
当字符串常量池没有 “xyz”,此时会创建如下两个对象:
⼀个是字符串字⾯量 "xyz" 所对应的、驻留(intern)在⼀个全局共享的字符串常量池中的实例,此时该实例也是在堆中,字符串常量池只放引⽤。
另⼀个是通过 new String() 创建并初始化的,内容与"xyz"相同的实例,也是在堆中。


当然不止这些,我还总结了Java思维导图和知识点手册。


本系列持续更新中.....
回复

举报

1

主题

12

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2025-3-7 22:50:48 | 显示全部楼层
我了个去,顶了
回复

举报

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

本版积分规则

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