2021最新Java面试题全集-2021年第二版20210805版
在《2021最新Java面试题全集-20210326版》基础之上,再次在手撕了数千道网络流传的面试题,外加十多个不眠之夜,继续调整和完善这个面试题集,形成本版《2021最新Java面试题全集-20210805版》,精心挑选了约556道题目(完整包含20210326版的题目),做为大家求职、跳槽前复习准备面试使用。
一:挑选题目的原则:
常考的、常被面试问到的
题目有一定的深度和难度的
题目涉及的知识点比较重要的
二:敲黑板啦,重点!重点!重点! 这份面试题集和其它网络流传的有什么不一样???
1:去掉了 陈旧、过时 的题目,比如:旧版本的知识,或者是现在不怎么用的技术,如struts2、memcache等等
2:所有题目的答案,都经过审核校对,对于一些回答错误的、答非所问的、没有答案的题目,都重新整理了答案,大约有1/3的题目答案都重新调整或者是重答了一遍,所以才耗费了那么多时间。
3:这份面试题集会不断补充、完善下去:
- 不断补充新的、实际的面试题上来,同时淘汰掉一些旧的、考的少的题目
- 对于已有题目的回答,还会不断调整和完善,以求更好
希望能够对大家求职、跳槽的备战有所帮助!
或者是到 http://90416.com/bGQ 查看完整的网页版
一共二十七章,包含绝大部分主流的框架和面试题。
1:Math.round(1.5) 等于多少?Math.round(-1.5)等于多少?
Math.round(1.5)的返回值是2,Math.round(-1.5)的返回值是-1。四舍五入的原理是在参数上加0.5然后进行下取整。
不正确。
3:5是双精度数,将双精度型(double)赋值给浮点型(float)属于下转型(down-casting,也称为窄化)会造成精度损失,因此需要强制类型转换float f =(float)3.5; 或者写成float f =3.5F;。
4:short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 += 1;有错吗?
对于short s1 = 1; s1 = s1 + 1;由于1是int类型,因此s1+1运算结果也是int 型,需要强制转换类型才能赋值给short型。
而short s1 = 1; s1 += 1;可以正确编译,因为s1+= 1;相当于s1 = (short)(s1 + 1);其中有隐含的强制类型转换。
+= 隐式的将加操作的结果类型强制转换为持有结果的类型。如果两这个整型相加,如 byte、short 或者 int,首先会将它们提升到 int 类型,然后在执行加法操作。
5:3*0.1 == 0.3 将会返回什么?true 还是 false?
false,因为有些浮点数不能完全精确的表示出来。
6:两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对?
不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希码(hash code)应当相同。
Java对于eqauls方法和hashCode方法是这样规定的:(1)如果两个对象相同(equals方法返回true),那么它们的hashCode值一定要相同;(2)如果两个对象的hashCode相同,它们并不一定相同。
当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在Set集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。
关于equals和hashCode方法, equals方法的:首先equals方法必须满足自反性(x.equals(x)必须返回true)、对称性(x.equals(y)返回true时,y.equals(x)也必须返回true)、传递性(x.equals(y)和y.equals(z)都返回true时,x.equals(z)也必须返回true)和一致性(当x和y引用的对象信息没有被修改时,多次调用x.equals(y)应该得到同样的返回值),而且对于任何非null值的引用x,x.equals(null)必须返回false。
实现高质量的equals方法的诀窍包括:
(1) 使用==操作符检查"参数是否为这个对象的引用";
(2) 使用instanceof操作符检查"参数是否为正确的类型";
(3) 对于类中的关键属性,检查参数传入对象的属性是否与之相匹配;
(4) 编写完equals方法后,问自己它是否满足对称性、传递性、一致性;
(5) 重写equals时总是要重写hashCode;
(6) 不要将equals方法参数中的Object对象替换为其他的类型,在重写时不要忘掉注解。
7:当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
是值传递。Java语言的方法调用只支持参数的值传递。
当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。
Java中没有传引用实在是非常的不方便,这一点在Java 8中仍然没有得到改进,正是如此在Java编写的代码中才会出现大量的Wrapper类(将需要通过方法调用修改的引用置于一个Wrapper类中,再将Wrapper对象传入方法)。
8:String str="i"与 String str=new String(“i”)一样吗?
不一样,因为内存的分配方式不一样。
String str="i"的方式,Java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。
9:请说出下面程序的输出,90%的程序人员都可能错?
class StringTest {
public static void main(String[] args) {
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program";
String s4 = "ming";
String s5 = "Program" + "ming";
String s6 = s3 + s4;
System.out.println(s1 == s2);
System.out.println(s1 == s5);
System.out.println(s1 == s6);
System.out.println(s1 == s6.intern());
System.out.println(s2 == s2.intern());
}
}
答案分别是:
false
true
false
true
false
下面详细解释一下:
第一个:
s1在常量池,s2在堆内存,而“==”比较的是引用的地址,所以false
第二个:
s1在常量池,s5的写法是一种特例,在赋值语句中直接用两个原始的字符串相加的时候(用变量都不行),不会转成使用StringBuilder来操作,而是直接执行字符串连接,并把结果放在常量池里面,所以true
第三个:
s1在常量池,s6是两个变量相加,跟s5不一样,会转成使用StringBuilder来操作,结果是在StringBuilder对象里面,所以false
第四个:
首先要清楚一点:String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。
s1在常量池,而s6.intern()也是常量池中字符串的引用了,所以true
第五个:
s2在堆上,而s2.intern()也是常量池中字符串的引用了,所以false
10:接口和抽象类有什么区别?
• 实现方面:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。
• 构造函数方面:抽象类可以有构造函数;接口没有构造函数。
• main 方法方面:抽象类可以有 main 方法,并且我们能运行它;接口不能有 main 方法。
• 实现数量方面:一个类可以实现很多个接口;但是只能继承一个抽象类,Java是单继承的。
• 访问修饰符:接口中的方法默认使用 public修饰;抽象类中的方法可以是任意访问修饰符。
满满的都是诚意!!!
赶紧添加我的公众号领取吧,无套路!无套路!无套路!
只是为了防止失联,另外,后续更新的版本,也会及时更新到公众号上!好方便大家获取!
公众号见下:
添加公众号过后,直接输入 20210805 ,即可自助获取《2021最新Java面试题全集》-20210805版本的文档了!
祝大家都能找到满意的工作!!!
敬请关注公众号,这份面试题集会不断完善,不断发放新版本!
后续版本都会在公众号发放!