Java 面试 - 基础核心汇总

news/2025/1/26 17:13:35/文章来源:https://www.cnblogs.com/shoufeng/p/18691996

一、Java基础部分面试题

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

篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可】即可免费获取

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

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

  3. String、StringBuilder、StringBuffer的区别及使用场景
    String一旦定义就不可改变,可空赋值。操作少量数据时使用。
    StringBuilder 可改变,线程不安全。操作单线程大量数据时使用。
    StringBuffer 可改变,线程安全。操作多线程大量数据时使用。

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

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

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

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

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

  2. List和Map的区别
    List是存储单列数据的集合,Map是存储键值对双列数据的集合。
    List存储的数据是有顺序且可重复的,Map存储的数据是无顺序,键不可重复,值可重复的。

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

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

存放新值的时候当前已有元素个数大于阈值。
存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下标位置已经存在值)
默认容量是16,负载因子0.75,所以扩容阈值是12。
每次扩容的容量是原有的2倍。
篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可】即可免费获取

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

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

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

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

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

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

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

  8. 什么是序列化
    序列化就是一种用来处理对象流的机制,就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输于网络之间。
    可通过实现java.io.Serializable接口来实现序列化。

  9. jdk1.6和1.8区别

JDK 1.6和1.8的主要区别包括ArrayList的初始化方式、HashMap的实现机制、静态代码块的加载方式以及switch语句的支持。

首先,JDK 1.6中ArrayList的默认构造方式是初始化大小为10,而JDK 1.8中ArrayList的默认构造方式是懒加载,即第一次放入值时才初始化。

其次,JDK 1.6中的HashMap实现是数组加链表,而JDK 1.8中,当链表长度超过8时,会自动转换为红黑树结构。此外,JDK 1.6和1.8在静

态代码块的加载方式上也存在差异,JDK 1.6先初始化static再执行main方法,而JDK 1.8则是懒加载,先执行main方法,使用到static时再进

行初始化。最后,JDK 1.8中的switch语句支持String变量,而JDK 1.6及之前的版本只支持int类型的变量。‌

JDK 1.8的新特性包括:

接口默认方法:JDK 1.8引入了default关键字,允许接口定义具体的实现方法。‌
Lambda表达式:支持函数式编程,允许使用函数作为参数和返回值。
函数式接口:通过@FunctionalInterface注解,支持函数式编程。
Date API更新:提供了更好的日期处理功能,位于java.time包中。
模块化特性:Java 8引入了模块化系统,提高了代码的可维护性和可扩展性。‌
多语言支持:Java 8对多种动态语言提供了更好的支持。
开发效率提升:通过注解和新的API,简化了开发过程。
这些区别和新特性使得JDK 1.8在功能和使用体验上有了显著的提升。

19.慢sql优化

慢SQL优化是一个复杂的过程,涉及多个方面,包括查询分析、索引优化、查询逻辑改进以及数据库参数调整等。以下是一些关键的优化步骤和策略:

  1. 慢查询日志分析
    开启慢查询日志:首先,需要确保数据库的慢查询日志功能已经开启。通过show variables like 'slow_query_log%'命令可以查看慢查询日志的状态和配置。
    分析慢查询日志:查看慢查询日志,找出执行时间较长的SQL语句,这些语句通常是优化的重点。

  2. 使用‌EXPLAIN分析执行计划
    使用EXPLAIN命令:对于选定的慢查询,使用EXPLAIN命令分析SQL的执行计划,查看type、rows、filtered、extra和key等字段,以确定是否使用了有效的索引。

  3. 优化索引设计
    检查索引使用情况:确保查询中使用的字段都有适当的索引,并且避免在索引列上进行计算或函数操作。
    避免全表扫描:通过优化索引设计,减少全表扫描的情况,提高查询效率。

  4. 优化查询逻辑
    条件前置:将能过滤最多记录的条件放在WHERE子句的前面,减少需要处理的数据量。
    避免在查询中使用不必要的JOIN操作:减少JOIN的数量和复杂性,可以提高查询性能。

  5. 调整数据库参数
    调整数据库参数:根据数据库的负载和性能需求,调整数据库的缓存大小、连接数等参数,以提高数据库的整体性能。

  6. 使用专业的优化工具
    使用数据库管理工具:利用数据库管理工具进行性能分析和优化建议,这些工具可以提供更详细的执行计划分析和优化建议。
    通过上述步骤,可以有效地定位和优化慢SQL问题,提高数据库的性能和响应速度。需要注意的是,优化是一个持续的过程,需要定期检查和调整以确保数据库的最佳性能

  7. java线程阻塞的方式

Java中实现线程阻塞的一些方法:

Thread.sleep方法:使线程转到阻塞状态,结束后,就转为就绪(Runnable)状态。
wait()方法:Object类的方法,使当前线程等待,直到被某个线程调用notify() 方法唤醒。可设置wait时间或者不设置,不设置必须要被调用notify() 方法才能唤醒
Thread.yield()方法*:暂停当前线程,转为就绪态,给更高优先级的线程让行。
Join()方法:当前线程转为阻塞态,直到其他线程运行结束
suspend() 和 resume() 方法:suspend()使当前线程阻塞, resume() 可唤醒被suspend()阻塞线程。

  1. String是否可被继承

String类为final类,不可被继承,代表不可变的字符序列

二、第三方框架部分

  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语句中。

  1. Spring Boot的核心注解是什么,它是由哪几个注解组成的
    核心注解:@SpringBootApplication
    包含:
    @SpringBootConfiguration 实现配置文件功能
    @EnableAutoConfiguration 打开自动配置功能
    @CompoentScan 组件扫描功能

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

  3. SpringCloud和Dubbo的区别
    SpringCloud采用基于HTTP的REST API,Dubbo采用RPC方式。

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

三、MySQL数据库部分

  1. 事物的四大特性和隔离级别
    原子性:不可分割的操作单元,要么全部成功,要么回滚。
    一致性:如果执行事物之前数据库是一致的,那么执行后还是一致的。
    隔离性:事物操作之间彼此独立和透明,互不影响。
    持久性:事物一旦提交,其结果就是永久的。
    未提交读:允许脏读,其他事物只要修改了数据,即使未提交,本事物也能看到修改后的数据值。
    提交读:只能读取到已提交的数据。
    可重复读(innoDB默认):无论其他事物是否修改并提交了数据,这个事物中的数据不受影响。
    串行读:完全串行化的读,每次读都要获得锁,读写相互都会阻塞。

篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可】即可免费获取

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

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

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

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

四、扩展阅读

  1. 关于Spring对JDK和CgLib动态代理的选择
    通过查阅Spring-AOP包中的org.springframework.aop.framework.DefaultAopProxyFactory 类得到以下代码:

public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
@Override
public 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进行代理。

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

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

相关文章

draw.io(免费流程图制作工具) v26.0.7 中文绿色版

draw.io是一款免费的在线图表绘制工具,它提供了强大的功能和易于使用的界面,适用于各种绘图需求。 软件功能 1. 多种类型的图表:draw.io支持创建各种类型的图表,包括流程图、组织结构图、UML图、网络拓扑图、平面图等。2. 自定义图表元素:用户可以根据自己的需求,自定义…

Svelte 最新中文文档翻译(6)—— if、each、key、await 逻辑区块

前言 Svelte,一个非常“有趣”、用起来“很爽”的前端框架。从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

java中的集合ArrayList

创建集合对象有3种形式 1,不需要传递构造参数,直接new就可以,此时底层数组为空数组。 2,构造参数需要传递一个int类型的值, 用于设置底层数组的长度 3,构造参数需要传递一个Collection集合类型的值,用于将集合中的数据放置在当前的集合中。 第1种方式创建数组 package goodSt…

IDM下载器(Internet Download Manager) v6.42.27 直装破解版

Internet Download Manager(IDM)是一款功能强大的下载管理软件,可以帮助用户加快下载速度,管理下载任务,并能够恢复中断或损坏的下载任务。 软件功能 多线程下载:IDM支持多线程下载,可以同时下载多个文件,提高下载速度。定时下载:用户可以设置定时下载任务,方便管理…

Exadata磁盘写入性能差,导致数据库出现大量free buffer waits

1、故障概述 某客户的Exadata上,运行着很多套ORACLE数据库,在每个月的征期内,业务系统经常出现卡顿的现象,主要表现为业务数据写入慢,甚至出现业务写入超时的情况。2、故障分析 2.1 AWR分析 (1).分析数据库的AWR报告。(本报告取自于业务高峰期)从数据库的TOP10等待事件…

zkap_春节赛

题目情况web welcome_to_zkaqctf nodejs题目。给出附件包含后端源码,app listen部分根据本地nodejs监听调式需要,自行添加,用node --inspect app.js命令启动调试监听 // const host = 127.0.0.1; // 主机名或IP地址 // const port = 9999; // const app = fastify(); app.l…

AI 语音独角兽 ElevenLabs C 轮融资估值超 30 亿美元;港科大 Llasa TTS:15 秒声音克隆支持中英双语

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

The Locker Puzzle

The Locker Puzzle 今天刷到一个很有趣的著名概率题,如果有和我一样闲的人可以一起看看。 Philippe Flajolet和Robert Sedgewick在2009年提出了“百囚犯问题(The Locker Puzzle)”。 问题描述 在监狱中有100名囚犯,被编号为1-100号。典狱长决定给囚犯们一次特赦的机会,条件…

DDR3 memory type not supported

问题现象 电脑开机之后无法进入系统,而是显示下图: 解决方法 以为是内存条金手指有灰尘导致无法正常读取,插拔擦拭之后问题依旧。在网上查阅资料之后发现可能是内存条的电压与原装的不同,把加装的第二根内存取下之后,电脑正常。hp技术支持中心:https://h30434.www3.hp.co…

Python数据格式转换神器-提高办公效率

Python办公技巧,数据转换神器,提升工作效率一、引言在工作日常里,数据转换总是让人头疼?别急,今天揭秘一个超级实用的Python技巧,帮你轻松搞定各种数据格式转换,提升工作效率不是梦! 场景1:你手头有一堆CSV格式的(逗号分隔符)数据,其他部门或公司需要你提供其中几列关…

Python Functools模块

代码:#coding=utf-8import functools from functools import cache from functools import cached_property, lru_cache from functools import partial, partialmethod from functools import singledispatch, singledispatchmethod from functools import update_wrapper, w…

F12调试应用:强行查看洛谷个人主页

1.前言 众所周知,洛谷的个人主页常常有些不得了的东西,但是:(洛谷估值第二名%%%)这个系统维护每次都拦着我们。 有一个比较常用的方法就是删掉域名.cn,访问外国服务器(天天炸)。所以必须要有更可靠的方法。 2.F12大法妙 这时候,我们就可以按下F12打开检查。按下左上角…