【面试】Java面试频繁问到的题最新整理(附答案)

文章目录
  • 一、Java基础部分面试题
    • 1.1. Java面向对象的三个特征
    • 1.2. Java中基本的数据类型有哪些 以及他们的占用字节
    • 1.3. int和Integer的区别
    • 1.4. String、StringBuilder、StringBuffer的区别及使用场景
    • 1.5. ArrayList、Vector和LinkedList的区别及使用场景
    • 1.6. Collection和Collections的区别
    • 1.7. List和Map的区别
    • 1.8. HashMap和HashTable的区别
    • 1.9. HashMap底层实现原理和扩容机制
    • 1.10. HashMap什么样的类适合作为键
    • 1.11. final、finally、finalize的区别
    • 1.12. sleep()和wait()的区别
    • 1.13. 抽象类和接口的区别、以及使用场景
    • 1.14. Overload(重载)和Override(重写)的区别
    • 1.15. forward(转发)和redirect(重定向)的区别
    • 1.16. 连接池的工作机制
    • 1.17. 什么是序列化
  • 二、第三方框架部分
    • 2.1. 什么是AOP、Spring AOP的底层原理是什么
    • 2.2. 什么是IOC、IOC注入方式有哪些
    • 2.3. Mybatis中 #{} 和 ${}的区别
    • 2.4. Spring Boot的核心注解是什么,它是由哪几个注解组成的
    • 2.5. SpringBoot 怎么读取配置文件
    • 2.6. SpringCloud和Dubbo的区别
    • 2.7. SpringCloud的Hystrix断路器特性
  • 三、MySQL数据库部分
    • 3.1. 事物的四大特性和隔离级别
    • 3.2. MySQL优化相关
    • 3.3. MySQL存储引擎InnoDB和MyISAM的区别
    • 3.4. MySQL在哪些情况下不使用索引
    • 3.5. MySQL分库分表策略
  • 四、扩展阅读
    • 4.1. 关于Spring对JDK和CgLib动态代理的选择
      • isOptimize()
      • isProxyTargetClass()
      • hasNoUserSuppliedProxyInterfaces()
    • 4.2. 为什么CgLib可以代理任何类,但还是需要JDK的动态代理?CgLib和JDK动态代理的区别。

一、Java基础部分面试题

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

  • 封装:对象只需要选择性的对外公开一些属性和行为
  • 继承:子对象可以继承父对象的属性和行为,并且可以在其之上进行修改以适合更特殊的场景需求。
  • 多态允许不同类的对象对同一消息做出响应

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

数据类型

占用字节

byte

1

short

2

int

4

long

8

float

4

double

8

char

2

boolean

4

1.3. int和Integer的区别

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

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

  • String一旦定义就不可改变,可空赋值。操作少量数据时使用。
  • StringBuilder 可改变,线程不安全。操作单线程大量数据时使用。
  • StringBuffer 可改变,线程安全。操作多线程大量数据时使用。

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

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

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

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

额外回答加分项: 多读少写建议使用CopyOnWriteArrayList
CopyOnWriteArrayList原理是发生修改的时候复制一份
多写少读或读写比较均匀建议使用Connections.synchronizedList

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

1.6. Collection和Collections的区别

  • Collection是集合类上级接口,继承他的主要有List和Set
  • Collections是集合类的帮助类,提供了对集合的搜索、排序、线程安全化等操作。

1.7. List和Map的区别

  • List是存储单列数据的集合,Map是存储键值对双列数据的集合
  • List存储的数据是有顺序且可重复的,Map存储的数据是无顺序,键不可重复,值可重复的

1.8. HashMap和HashTable的区别

  • HashMap是Map接口的实现,非线程安全,允许空键值。
  • HashTable是Dictionary的子类,线程安全,不允许空键值。几乎被淘汰,建议使用ConcurrentHashMap来替代它。
  • HashMap使用的是快速失败迭代器,在迭代器创建后,除非通过迭代器自身的remove或者add方法,其他任何方式的修改都会抛出异常。

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

JDK1.8以前:数组+单链表的组合,以键值对的方式存储元素。
JDK1.8及以后:引入红黑树结构,添加元素时,若链表个数大于8,链表会转换为红黑树,反之小于6时会修剪或还原成链表结构
选择6和8可以有效防止频繁的链表和红黑树转换。
扩容条件:

  1. 存放新值的时候当前已有元素个数大于阈值。
  2. 存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下标位置已经存在值)
    默认容量是16,负载因子0.75,所以扩容阈值是12。
    每次扩容的容量是原有的2倍。

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

String最为常见,因为String对象不可变,且重写了equals和hashcode方法
不可变性是必要的,如果key的hashcode存入和获取是不一致,就无法找到。
获取对象时需要用到equals和hashCode方法,正确的重写这两个方法是非常重要的,因为两个不相等的对象返回不同的hashCode的话,碰撞的几率就会小些,就可以提高HashMap的性能。

1.11. final、finally、finalize的区别

  • final用于修饰属性、方法和类,分别表示属性不可变,方法不可覆盖,类不可继承
  • finally异常处理语句结构的一部分,表示总是执行。
  • finalize是Object类的一个方法,在GC执行时会调用被回收对象的此方法

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

  • sleep()是Thread类的,wait()是Object类的方法
  • sleep不会释放锁,wait会释放锁
  • sleep可在任意地方使用,wait notify notifyAll只能在synchronized块方法中使用。
  • sleep必须捕获异常,而wait不需要。

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

  • 抽象类中可以有构造方法、静态方法、普通方法、普通成员变量。接口中不能有。
  • 抽象类中的抽象方法访问类型可以是public、protected和默认类型,接口中只能是public。
  • 抽象类中的静态成员变量访问类型可以任意,接口中只能是public的。
  • 一个类只能继承一个类,但是可以实现多个接口。
  • 抽象类和子类为“是不是”的关系。主要用于为一些类提供公共实现代码。
  • 接口和实现为“有没有”的关系。主要用于代码的扩展性和可维护性。

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

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

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

  • forward是服务器请求资源,服务器访问目标URL,把响应内容发给用户,用户不知道数据是从哪来的。
  • redirect是服务器向客户端发送一个状态码,告知重新请求该URL。

1.16. 连接池的工作机制

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

1.17. 什么是序列化

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

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

二、第三方框架部分

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

  • AOP是面向切面编程,用于在不改变原有逻辑的基础上增加一些额外的功能,如事务管理、日志、缓存、权限控制等。
  • Spring AOP是基于代理的。
  • 如果目标对象实现了接口,则默认采用JDK动态代理
  • 如果目标对象没有实现接口,则采用CgLib进行动态代理
  • 如果目标对象实现了接口,且强制CgLib代理,则采用CgLib动态代理。

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

  • IOC翻译为控制反转,他还有个别名为DI(依赖注入)。
  • IOC就是由IOC容器来负责对象的生命周期和对象之间的关系
  • 控制反转就是本来应该你做的事情,让系统去做,比如通常获取一个对象需要通过new,而使用IOC则是IOC将对象创建后注入到被注入的对象中。
  • 注解注入(Spring)、构造器注入、setter方法注入、接口方式注入(不推荐)

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

  • #{}是预编译,可防止SQL注入。
  • ${}是直接拼接在SQL语句中。

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

核心注解:@SpringBootApplication
包含:

  • @SpringBootConfiguration 实现配置文件功能
  • @EnableAutoConfiguration 打开自动配置功能
  • @CompoentScan 组件扫描功能

2.5. SpringBoot 怎么读取配置文件

  • 属性上使用@Value注解
  • 类上使用@ConfigurationProperties注解
  • 读取指定文件注解可在类上使用@PropertySource(不支持yml文件读取)
    注入Environment对象获取到。

2.6. SpringCloud和Dubbo的区别

SpringCloud采用基于HTTP的REST API,Dubbo采用RPC方式。

2.7. SpringCloud的Hystrix断路器特性

  • 请求熔断:请求服务失败量超过一定比例(默认50%)断路器会切换到开路状态,这时所有请求不会发送到后端服务,断路器在保持开路状态一段时间后(默认5秒),自动切换到半开路状态。这时如果下一次请求成功,断路器切回闭路状态,否则重新切换到开路状态。
  • 服务降级:对于查询操作,可以实现一个fallback方法。当请求服务出现异常时,可以使用fallback方法返回的值。
  • 依赖隔离:通过线程池来实现资源隔离,比如一个服务调用另外两个服务,如果这两个服务在同一线程池,那么如果一个服务卡住,后面的请求又来了,就会导致后面的请求都会卡住等待。
  • 请求缓存:缓存上次请求结果,返回给后续请求。
  • 请求合并:把多个请求合并成一个请求,提升效率。

三、MySQL数据库部分

3.1. 事物的四大特性和隔离级别

原子性:不可分割的操作单元,要么全部成功,要么回滚。
一致性:如果执行事物之前数据库是一致的,那么执行后还是一致的。
隔离性:事物操作之间彼此独立和透明,互不影响。
持久性:事物一旦提交,其结果就是永久的。

未提交读:允许脏读,其他事物只要修改了数据,即使未提交,本事物也能看到修改后的数据值。
提交读:只能读取到已提交的数据。
可重复读(innoDB默认):无论其他事物是否修改并提交了数据,这个事物中的数据不受影响。
串行读:完全串行化的读,每次读都要获得锁,读写相互都会阻塞。

3.2. MySQL优化相关

  • 使用更小的整数类型、尽可能的定义字段为not null(否则会导致索引复杂)、
  • 只创建需要的索引、分库分表。
  • 使用explain检查复杂SQL语句、LIMIT语句尽量要跟order by或distinct
  • 插入多条数据时使用单条INSERT语句。

3.3. MySQL存储引擎InnoDB和MyISAM的区别

  • InnoDB支持事物,MyISAM不支持。
  • InnoDB支持外键,MyISAM不支持。
  • InnoDB是聚集索引,MyISAM是非聚集索引。索引和数据文件是分离的。
  • InnoDB必须要有主键(没有会自己找或创建),MyISAM可以没有。
  • InnoDB不保存表的行数,MyISAM用了一个变量保存表的行数。
    InnoDB支持表、行级锁 默认行级锁,MyISAM只支持表级锁。

3.4. MySQL在哪些情况下不使用索引

  • like查询使用%开头不能使用索引,但用%结尾的可以使用索引。
  • where语句中使用<>或!=。
  • where语句中使用or,且没有把or中的所有字段加上索引。
  • where语句中对字段表达式操作。
  • where语句中使用NOT IN。使用简单的IN会使用索引。

3.5. MySQL分库分表策略

  • 垂直切分:某个表字段过多,可以将不常用或字段长度较大的字段拆分出去到扩展表中。
  • 水平切分:分为库内分表和分库分表,是根据表内数据的逻辑关系,按照不同的条件分散到多个数据库或表中。

四、扩展阅读

4.1. 关于Spring对JDK和CgLib动态代理的选择

通过查阅Spring-AOP包中的org.springframework.aop.framework.DefaultAopProxyFactory 类得到以下代码:

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {@Overridepublic AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {Class<?> targetClass = config.getTargetClass();if (targetClass == null) {throw new AopConfigException("TargetSource cannot determine target class: " +"Either an interface or a target is required for proxy creation.");}if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {return new JdkDynamicAopProxy(config);}return new ObjenesisCglibAopProxy(config);}else {return new JdkDynamicAopProxy(config);}}private boolean hasNoUserSuppliedProxyInterfaces(AdvisedSupport config) {Class<?>[] ifcs = config.getProxiedInterfaces();return (ifcs.length == 0 || (ifcs.length == 1 && SpringProxy.class.isAssignableFrom(ifcs[0])));}
}

可以看到,Spring先使用isOptimize()方法、isProxyTargetClass()方法以及hasNoUserSuppliedProxyInterfaces()方法进行判断,这三个方法的含义分别如下:

isOptimize()

是否对生成代理策略进行优化
当返回值为true时为进行优化,如果有接口就代理接口(使用JDK动态代理),没有接口代理类(CGLIB代理)
当返回值为false时为不进行优化(default)

isProxyTargetClass()

是否强制使用CGLIB来实现代理
当返回值为true时为强制使用CgLib来实现代理
当范围值为false时为不强制使用CgLib来实现代理,而是首选JDK来实现代理(default)

hasNoUserSuppliedProxyInterfaces()

判断代理的对象是否只有指定了SpringProxy的接口或未实现接口
当返回值为true时代表没有实现接口或仅实现了指定SpringProxy的接口
当返回值为false时代表实现了接口,直接使用JDK动态代理

当了解这三个方法的含义后,接下来阅读代码就很简单了。
如果以上三个方法有任意方法返回值为true,就进入下一步判断,如果所有的返回值均为false,说明即不强制使用CgLib,或又实现了接口,则使用JDK动态代理。

在第二步判断中,首先对其targetClass进行了判空,然后判断它是否为接口或代理类,如果是则使用JDK动态代理。
反之,则使用CgLib进行代理。

4.2. 为什么CgLib可以代理任何类,但还是需要JDK的动态代理?CgLib和JDK动态代理的区别。

这就不得不说到CgLib的特点:创建速度慢但执行速度快,而JDK的动态代理与其刚好相反:创建速度快但执行速度慢。

如果在程序运行时不断地使用CgLib去创建代理的话,系统运行的性能会大打折扣,所以建议一般在系统初始化时采用CgLib来创建代理,并放入Spring的ApplicationContext中。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/70308.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零搭建微服务项目Base(第7章——微服务网关模块基础实现)

前言&#xff1a; 在前面6章的学习中已经完成了服务间的调用实现&#xff0c;即各微服务通过nacos或eureka服务器完成服务的注册&#xff0c;并从nacos中拉取配置实现热更新。当某个服务接口需要调用其他服务时&#xff0c;通过feign定义接口&#xff0c;并通过注解配置服务名…

C# ConcurrentQueue 使用详解

总目录 前言 在C#多线程编程中&#xff0c;数据共享如同走钢丝——稍有不慎就会引发竞态条件&#xff08;Race Condition&#xff09;或死锁。传统Queue<T>在并发场景下需要手动加锁&#xff0c;而ConcurrentQueue<T>作为.NET Framework 4.0 引入的线程安全集合&a…

在Vue项目中使用three.js在前端页面展示PLY文件或STL文件

前言&#xff1a;这是一个3d打印局域网管理系统的需求 一、安装three.js three.js官网&#xff1a;https://threejs.org/docs/#manual/en/introduction/Installation 我用的是yarn,官网用的是npm 二、使用three.js 1.在script部分导入three.js import * as THREE from thr…

DeepSeek 助力 Vue 开发:打造丝滑的右键菜单(RightClickMenu)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

大数据学习(46) - Flink按键分区处理函数

&&大数据学习&& &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 承认自己的无知&#xff0c;乃是开启智慧的大门 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一下博主哦&#x1f91…

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者&#xff1a;后端小肥肠 目录 1. 前言 为什么选择DeepSeek&#xff1f; 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…

Transformer多头注意力并行计算原理与工业级实现:从数学推导到PyTorch工程优化

一、核心数学原理剖析 1.1 多头注意力矩阵分解 Q XW^Q ∈ R^{nd_k} K XW^K ∈ R^{nd_k} V XW^V ∈ R^{nd_v} 多头分解公式&#xff1a; head_i Attention(QW_i^Q, KW_i^K, VW_i^V) 其中 W_i^Q ∈ R^{d_kd_k/h}, W_i^K ∈ R^{d_kd_k/h}, W_i^V ∈ R^{d_vd_v/h} (h为头数…

通过监督微调提升多语言大语言模型性能

引言 澳鹏助力一家全球科技公司提升其大语言模型&#xff08;LLM&#xff09;的性能。通过提供结构化的人工反馈形式的大语言模型训练数据&#xff0c;让该模型在30多种语言、70多种方言中的表现得到优化。众包人员们进行多轮对话&#xff0c;并依据回复的相关性、连贯性、准确…

大数据开发治理平台~DataWorks(核心功能汇总)

目录 数据集成 功能概述 使用限制 功能相关补充说明 数据开发 功能概述 数据建模 功能概述 核心技术与架构 数据分析 功能概述 数据治理 数据地图 功能概述 数据质量 功能概述 数据治理资产 功能概述 使用限制 数据服务 功能概述 数据集成 DataWorks的数据…

用Nginx打造防盗链护盾

用Nginx打造防盗链护盾 一、你的网站正在"为他人做嫁衣"&#xff1f; 想象一下这个场景&#xff1a; 你精心拍摄的摄影作品、录制的课程视频、设计的原创素材&#xff0c;被其他网站直接盗用链接。 更气人的是——当用户在他们网站查看这些资源时&#xff0c;消耗的…

STM32 看门狗

目录 背景 独立看门狗&#xff08;IWDG&#xff09; 寄存器访问保护 窗口看门狗&#xff08;WWDG&#xff09; 程序 独立看门狗 设置独立看门狗程序 第一步、使能对独立看门狗寄存器的写操作 第二步、设置预分频和重装载值 第三步、喂狗 第四步、使能独立看门狗 喂狗…

Kubernetes的Ingress 资源是什么?

在Kubernetes中&#xff0c;Ingress资源是一种用于管理集群外部对内部服务访问的API对象&#xff0c;主要用于将不同的外部请求路由到集群内的不同服务&#xff0c;以下是关于它的详细介绍&#xff1a; 定义与作用 Ingress资源定义了从集群外部到内部服务的HTTP和HTTPS路由规…

vue3-03初学vue3中的配置项setup(Composition API (组合API组件中所用到的:数据、方法等,均要配置在setup中)

1.关于setup Vue3.0中一个新的配置项&#xff0c;值为一个函数.setup是所有Composition API (组合API)“表演的舞台”m组件中所用到的:数据、方法等等&#xff0c;均要配置在setup中。 2..setup函数使用 setup函数的两种返回值 1.若返回一个对象&#xff0c;则对象中的属性、…

【go语言规范】 使用函数式选项 Functional Options 模式处理可选配置

如何处理可选配置&#xff1f; Config Struct 方式 (config-struct/main.go) 这是最简单的方式&#xff0c;使用一个配置结构体&#xff1a; 定义了一个简单的 Config 结构体&#xff0c;包含 Port 字段创建服务器时直接传入配置对象优点&#xff1a;简单直接缺点&#xff1a…

leetcode 2585. 获得分数的方法数

题目如下 数据范围 莫要被困难的外衣骗了&#xff0c;本题就是有数量限制的完全背包问题。显然我们可以令 f(x,y)为当有x种题目时分数为y时的方法数 令某种题目的数量为k 那么方法数应该是 f(x,y) f(x - 1,y - k * (分值))其中(0 < k < 题目数量)通过代码 class So…

深入理解JavaScript中的异步编程与Promise

一、引言 在JavaScript的世界中&#xff0c;异步编程是一个核心概念&#xff0c;尤其是在处理网络请求、文件操作或任何可能阻塞主线程的任务时。本文将深入探讨JavaScript中的异步编程模型&#xff0c;特别是Promise对象的使用。 二、异步编程基础 2.1 什么是异步编程&…

VS Code 如何搭建C/C++开发环境

目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…

如何查询网站是否被百度蜘蛛收录?

一、使用site命令查询 这是最直接的方法。在百度搜索框中输入“site:你的网站域名”&#xff0c;例如“site:example.com”&#xff08;请将“example.com”替换为你实际的网站域名&#xff09;。如果搜索结果显示了你的网站页面&#xff0c;并且显示了收录的页面数量&#xf…

数仓搭建:DWS层(服务数据层)

DWS层示例: 搭建日主题宽表 需求 维度 步骤 在hive中建数据库dws >>建表 CREATE DATABASE if NOT EXISTS DWS; 建表sql CREATE TABLE yp_dws.dws_sale_daycount( --维度 city_id string COMMENT 城市id, city_name string COMMENT 城市name, trade_area_id string COMME…

伪类选择器

作用&#xff1a;选中特殊状态的元素 一、动态伪类 1. :link 超链接 未被访问 的状态。 2. :visited 超链接 访问过 的状态。 3. :hover 鼠标 悬停 在元素上的状态。 4. :active 元素 激活 的状态。 什么是激活&#xff1f; —— 按下鼠标不松开。 注意点&#xf…