2022年Java秋招面试,程序员求职必看的Java基础面试题

本文整理了2022年Java秋季招聘的面试题,涵盖Java基础、面向对象、数据类型、内存管理、多线程、异常处理、集合框架等多个方面。面试题涉及了Java中的核心概念,如构造器、继承、封装、多态、访问修饰符、字符串特性、数据结构和并发编程等,旨在帮助求职者全面准备Java面试,提高面试成功率。
摘要由CSDN通过智能技术生成

前言

不管你应聘的是大厂还是小厂,不管你是应届生还是架构师,面试官都会问到 Java 基础知识,特别是大厂比较注重个人的基础能力。掌握了基础,可以轻松搞定面试官,希望大家都能找到一份满意的工作。

小编分享的这份2022年Java秋招备战面试题总计有1000多道面试题,包含了MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Java 并发编程、Java基础、Spring、微服务、Linux、Spring Boot 、Spring Cloud、RabbitMQ、kafka等16个专题技术点,都是小编在今年金三银四总结出来的面试真题,已经有很多粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到大家!【持续更新中!】

Java秋招面试题集锦:大家可以扫二维码免费领取

序号 专题技术 内容 地址
1 MyBatis Mybatis面试题 https://blog.csdn.net/SQY0809/article/details/125337817
2 ZooKeeper ZooKeeper面试题 https://blog.csdn.net/SQY0809/article/details/125377579
3 Dubbo Dubbo面试题 https://blog.csdn.net/SQY0809/article/details/125566025
4 Elasticsearch Elasticsearch 面试题 https://blog.csdn.net/SQY0809/article/details/125728950
5 Memcached Memcached面试题 https://blog.csdn.net/SQY0809/article/details/125729578
6 Redis Redis 面试题 https://blog.csdn.net/SQY0809/article/details/125729723
7 MySQL MySQL 面试题 https://blog.csdn.net/SQY0809/article/details/125729828
8 Java并发编程 Java并发编程面试题 https://blog.csdn.net/SQY0809/article/details/125730117
9 Java基础 Java基础面试题 https://blog.csdn.net/SQY0809/article/details/125731945
10 Spring Spring面试题 https://blog.csdn.net/SQY0809/article/details/125836705
11 微服务 微服务面试题 https://blog.csdn.net/SQY0809/article/details/125854775
12 Linux Linux面试题 https://blog.csdn.net/SQY0809/article/details/125855037
13 Spring Boot Spring Boot面试题 https://blog.csdn.net/SQY0809/article/details/125856135
14 Spring Cloud Spring Cloud面试题 https://blog.csdn.net/SQY0809/article/details/125856298
15 RabbitMQ RabbitMQ面试题 https://blog.csdn.net/SQY0809/article/details/125856398
16 kafka kafka面试题 https://blog.csdn.net/SQY0809/article/details/125856614

1、面向对象的特征有哪些方面?

答: 面向对象的特征主要有以下几个方面:

**抽象:**抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。

**继承:**继承是从已有类得到继承信息创建新类的过程。提供继承信息的类 被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段(如果不能理解请阅读阎宏博士的《Java 与模式》或《设计模式精解》中关于桥梁模式的部分)。

**封装:**通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口(可以想想普通洗衣机和全自动洗衣机的差别,明显全自动洗衣机封装更好因此操作起来更简单;我们现在使用的智能手机也是封装得足够好的,因为几个按键就搞定了所有的事情)。

**多态性:**多态性是指允许不同子类型的对象对同一消息作出不同的响应。简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。多态性分为编译时的多态性和运行时的多态性。如果将对象的方法视为对象向外界提供的服务,那么运行时的多态性可以解释为:当 A 系统访问 B 系统提供的服务时,B系统有多种提供服务的方式,但一切对 A 系统来说都是透明的(就像电动剃须刀是 A 系统,它的供电系统是 B 系统,B 系统可以使用电池供电或者用交流电,甚至还有可能是太阳能,A 系统只会通过 B 类对象调用供电的方法,但并不知道供电系统的底层实现是什么,究竟通过何种方式获得了动力)。

方法重载(overload)实现的是编译时的多态性(也称为前绑定),而方法重写(override)实现的是运行时的多态性(也称为后绑定)。运行时的多态是面向对象最精髓的东西,要实现多态需要做两件事:1). 方法重写(子类继承父类并重写父类中已有的或抽象的方法);2). 对象造型(用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为)。

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

在这里插入图片描述

3、String 是最基本的数据类型吗?

在这里插入图片描述

4、float f=3.4;是否正确?

在这里插入图片描述

5、short s1 = 1; s1 = s1 + 1;有错吗?short s1 = 1; s1 +

在这里插入图片描述

6、Java有没有goto?

在这里插入图片描述

7、int和Integer有什么区别?

答:

Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。

Java 为每个原始类型提供了包装类型:

  • 原始类型: boolean,char,byte,short,int,long,float,double
  • 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
class AutoUnboxingTest {
   
public static void main(String[] args) {
   
Integer a = new Integer(3);
Integer b = 3; // 将 3 自动装箱成 Integer 类型
int c = 3;
System.out.println(a == b); // false 两个引用没有引用同一对
象
System.out.println(a == c); // true a 自动拆箱成 int 类型再和 c
比较
} }
最近还遇到一个面试题,也是和自动装箱和拆箱有点关系的,代码如下所示:
public class Test03 {
   
public static void main(String[] args) {
   
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);
System.out.println(f3 == f4);
  } 
}

如果不明就里很容易认为两个输出要么都是 true 要么都是 false。首先需要注意的是 f1、f2、f3、f4 四个变量都是 Integer 对象引用,所以下面的==运算比较的不是值而是引用。装箱的本质是什么呢?当我们给一个 Integer 对象赋一个 int 值的时候,会调用 Integer 类的静态方法 valueOf,如果看看 valueOf 的源代码就知道发生了什么。

public static Integer valueOf(int i) {
   
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache 是 Integer 的内部类,其代码如下所示:
/**
* Cache to support the object identity semantics of autoboxing for
values between
* -128 and 127 (inclusive) as required by JLS.
** The cache is initialized on first usage. The size of the cache
* may be controlled by the {@code -XX:AutoBoxCacheMax=<size>}
option.
* During VM initialization, java.lang.Integer.IntegerCache.high
property
* may be set and saved in the private system properties in the
* sun.misc.VM class.
*/
private static class IntegerCache {
   
static final int low = -128;
static final int high;
static final Integer cache[];
static {
   
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
   
try {
   
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
} catch( NumberFormatException nfe) {
   
// If the property cannot be parsed into an int,
ignore it.
} }
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
private IntegerCache() {
   }
}

简单的说,如果整型字面量的值在-128 到 127 之间,那么不会 new 新的 Integer对象,而是直接引用常量池中的 Integer 对象,所以上面的面试题中 f1f4 的结果是 false。

**提醒:**越是貌似简单的面试题其中的玄机就越多,需要面试者有相当深厚的功力。

8、&和&&的区别?

在这里插入图片描述

9、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。

在这里插入图片描述

看看下面代码的执行结果是什么并且比较一下 Java 7 以前和以后的运行结果是否一致。

String s1 = new StringBuilder("go")
.append("od").toString();
System.out.println(s1.intern() == s1);
String s2 = new StringBuilder("ja")
.append("va").toString();
System.out.println(s2.intern() == s2);

10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

答: Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。四舍五入的原理是在参数上加 0.5 然后进行下取整。

11、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?

在这里插入图片描述

12、用最有效率的方法计算2乘以8?

在这里插入图片描述

public class PhoneNumber {
   
private int areaCode;
private String prefix;
private String lineNumber;
@Override
public int hashCode() {
   
final int prime = 31;
int result = 1;
result = prime * result + areaCode;
result = prime * result
+ ((lineNumber == null) ? 0 : lineNumber.hashCode());
result = prime * result + ((prefix == null) ? 0 : prefix.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
   
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
PhoneNumber other = (PhoneNumber) obj;
if (areaCode != other.areaCode)
return false;
if (lineNumber == null) {
   
if (other.lineNumber != null)
return false;
} else if (!lineNumber.equals(other.lineNumber))
return false;
if (prefix == null) {
   
if (other.prefix != null)
return false;
} else if (!prefix.equals(other.prefix))
return false;
return true;
} }

13、数组有没有length()方法?String有没有length()方法?

数组没有 length()方法,有 length 的属性。String 有 length()方法。JavaScript中,获得字符串的长度是通过 length 属性得到的,这一点容易和 Java 混淆。

14、在Java中,如何跳出当前的多重嵌套循环?

在这里插入图片描述

15、构造器(constructor)是否可被重写(override)?

答:构造器不能被继承,因此不能被重写,但可以被重载。

16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这

答: 不对,如果两个对象 x 和 y 满足 x.equals(y) == true,它们的哈希码(hash code)应当相同。Java 对于 eqauls 方法和 hashCode 方法是这样规定的:(1)如果两个对象相同(equals 方法返回 true),那么它们的 hashCode 值一定要相同;(2) 如果两个对象的 hashCode 相同,它们并不一定相同。当然,你未必要按照要求去做,但是如果你违背了上述原则就会发现在使用容器时,相同的对象可以出现在 Set 集合中,同时增加新元素的效率会大大下降(对于使用哈希存储的系统,如果哈希码频繁的冲突将会造成存取性能急剧下降)。

在这里插入图片描述

17、是否可以继承String类?

在这里插入图片描述

18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?

答:是值传递。Java 语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的属性可以在被调用过程中被改变,但对对象引用的改变是不会影响到调用者的。C++和 C#中可以通过传引用或传输出参数来改变传入的参数的值。在 C#中可以编写如下所示的代码,但是在 Java 中却做不到。

using System;
namespace CS01 {
   
class Program {
   
public static void swap(ref int x, ref int y) {
   
int temp = x;
x = y;
y = temp;
}
public static void Main (string[] args) {
   
int a = 5, b = 10;
swap (ref a, ref b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值