2024年Java面试题最新整理,附白话答案,java面试常问的设计模式是什么

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

Java

2022年最新常见Java开发面试题、面试常问Java面试题整理(附白话答案)


一、Java基础部分面试题


1. Java面向对象的三个特征

封装:对象只需要选择性的对外公开一些属性和行为

继承:子对象可以继承父对象的属性和行为,并且可以在其之上进行修改以适合更特殊的场景需求。

多态允许不同类的对象对同一消息做出响应

2. Java中基本的数据类型有哪些 以及他们的占用字节

数据类型

占用字节

byte

1

short

2

int

4

long

8

float

4

double

8

char

2

boolean

4

3. int和Integer的区别

int是Java中的原始类型,Integer是Java为int提供的封装类,他们有不同的特征和用法,包括大小、速度、默认值

4. String、StringBuilder、StringBuffer的区别及使用场景

String一旦定义就不可改变,可空赋值。操作少量数据时使用。

StringBuilder 可改变,线程不安全。操作单线程大量数据时使用。

StringBuffer 可改变,线程安全。操作多线程大量数据时使用。

5. ArrayList、Vector和LinkedList的区别及使用场景

ArrayList和Vector都是使用数组方式存储数据,允许按序号索引元素,但是插入数据会涉及到元素移动等内存操作,所以索引快插入慢

ArrayList懒加载 默认大小10 每次扩容1.5倍 线程不安全 性能较高

Vector 实例化时初始化 默认大小10 每次扩容2倍 线程安全 性能较低 已弃用

额外回答加分项:

多读少写建议使用CopyOnWriteArrayList

CopyOnWriteArrayList原理是发生修改的时候复制一份

多写少读或读写比较均匀建议使用Connections.synchronizedList

LinkedList 使用双向链表方式存储数据,插入只需要记录本项的前后项,索引需要向前或向后进行遍历,所以插入速度较快,线程不安全,频繁在任意位置插入和删除的情况可以使用,如果需要多线程访问,可以使用Connections.synchronizedList()或ConcurrentLinkedQueue

6. Collection和Collections的区别

Collection是集合类上级接口,继承他的主要有List和Set

Collections是集合类的帮助类,提供了对集合的搜索、排序、线程安全化等操作。

7. List和Map的区别

List是存储单列数据的集合,Map是存储键值对双列数据的集合

List存储的数据是有顺序且可重复的,Map存储的数据是无顺序,键不可重复,值可重复的

8. HashMap和HashTable的区别

HashMap是Map接口的实现,非线程安全,允许空键值

HashTable是Dictionary的子类,线程安全,不允许空键值。几乎被淘汰,建议使用ConcurrentHashMap来替代它。

HashMap使用的是快速失败迭代器,在迭代器创建后,除非通过迭代器自身的remove或者add方法,其他任何方式的修改都会抛出异常。

9. HashMap底层实现原理和扩容机制

JDK1.8以前:数组+单链表的组合,以键值对的方式存储元素。

JDK1.8及以后:引入红黑树结构,添加元素时,若链表个数大于8,链表会转换为红黑树,反之小于6时会修剪或还原成链表结构

选择6和8可以有效防止频繁的链表和红黑树转换。

扩容条件:

  1. 存放新值的时候当前已有元素个数大于阈值。

  2. 存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下标位置已经存在值)

默认容量是16,负载因子0.75,所以扩容阈值是12。

每次扩容的容量是原有的2倍。

10. HashMap什么样的类适合作为键

String最为常见,因为String对象不可变,且重写了equals和hashcode方法

不可变性是必要的,如果key的hashcode存入和获取是不一致,就无法找到。

获取对象时需要用到equals和hashCode方法,正确的重写这两个方法是非常重要的,因为两个不相等的对象返回不同的hashCode的话,碰撞的几率就会小些,就可以提高HashMap的性能。

11. final、finally、finalize的区别

final用于修饰属性、方法和类,分别表示属性不可变,方法不可覆盖,类不可继承

finally异常处理语句结构的一部分,表示总是执行。

finalize是Object类的一个方法,在GC执行时会调用被回收对象的此方法

12. sleep()和wait()的区别

sleep()是Thread类的,wait()是Object类的方法

sleep不会释放锁,wait会释放锁。

sleep可在任意地方使用,wait notify notifyAll只能在synchronized块方法中使用。

sleep必须捕获异常,而wait不需要。

13. 抽象类和接口的区别、以及使用场景

**抽象类中可以有构造方法、静态方法、普通方法、普通成员变量。接口中不能有。

抽象类中的抽象方法访问类型可以是public、protected和默认类型,接口中只能是public。

抽象类中的静态成员变量访问类型可以任意,接口中只能是public的。

一个类只能继承一个类,但是可以实现多个接口。**

抽象类和子类为“是不是”的关系。主要用于为一些类提供公共实现代码。

接口和实现为“有没有”的关系。主要用于代码的扩展性和可维护性。

14. Overload(重载)和Override(重写)的区别

重载是一个类中多态性的一种表现,在一个类中定义了多个同名的方法,他们有不同的参数列表

重写是父类与子类之间多态的一种表现,子类中定义了与父类有相同名称和参数的方法时,子类对象使用该方法会调用子类中的定义。

15. forward(转发)和redirect(重定向)的区别

forward服务器请求资源,服务器访问目标URL,把响应内容发给用户,用户不知道数据是从哪来的。

redirect服务器向客户端发送一个状态码,告知重新请求该URL

16. 连接池的工作机制

服务器启动时会建立一定数量的池连接,客户端需要连接时,池会返回一个未使用的连接并将其标记为忙,如果没有空闲连接,池会新建一定数量的连接,当连接使用完毕后,池会将其标记为空闲。

17. 什么是序列化

序列化就是一种用来处理对象流的机制,就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。

可通过实现java.io.Serializable接口来实现序列化。

二、第三方框架部分


1. 什么是AOP、Spring AOP的底层原理是什么

AOP是面向切面编程,用于在不改变原有逻辑的基础上增加一些额外的功能,如事务管理、日志、缓存、权限控制等。

Spring AOP是基于代理的。

如果目标对象实现了接口,则默认采用JDK动态代理

如果目标对象没有实现接口,则采用CgLib进行动态代理

如果目标对象实现了接口,且强制CgLib代理,则采用CgLib动态代理。

2. 什么是IOC、IOC注入方式有哪些

IOC翻译为控制反转,他还有个别名为DI(依赖注入)。

IOC就是由IOC容器来负责对象的生命周期和对象之间的关系

控制反转就是本来应该你做的事情,让系统去做,比如通常获取一个对象需要通过new,而使用IOC则是IOC将对象创建后注入到被注入的对象中。

注解注入(Spring)、构造器注入setter方法注入、接口方式注入(不推荐)

3. Mybatis中 #{} 和 ${}的区别

#{}是预编译,可防止SQL注入

${}是直接拼接在SQL语句中。

4. Spring Boot的核心注解是什么,它是由哪几个注解组成的

核心注解:@SpringBootApplication

包含:

@SpringBootConfiguration 实现配置文件功能

@EnableAutoConfiguration 打开自动配置功能

@CompoentScan 组件扫描功能

5. SpringBoot 怎么读取配置文件

属性上使用@Value注解

类上使用@ConfigurationProperties注解

读取指定文件注解可在类上使用@PropertySource(不支持yml文件读取)

注入Environment对象获取到。

读者福利

由于篇幅过长,就不展示所有面试题了,感兴趣的小伙伴

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

更多笔记分享

35K成功入职:蚂蚁金服面试Java后端经历!「含面试题+答案」

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
3377146654)]

[外链图片转存中…(img-lFcKQfdT-1713377146654)]

[外链图片转存中…(img-uLaHDWeN-1713377146655)]

更多笔记分享

[外链图片转存中…(img-eiQw3lRY-1713377146656)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-yW5fZw6s-1713377146656)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值