首页 > 编程语言 >2024年Java面经(附答案)

2024年Java面经(附答案)

时间:2024-05-26 17:34:19浏览次数:27  
标签:Java 请求 对象 面经 Redis 2024 索引 线程 使用

目录

一、Java基础部分面试题

二、第三方框架部分

三、MySQL数据库部分

四、Redis部分


一、Java基础部分面试题


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

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

数据类型占用字节
byte1
short2
int4
long8
float4
double8
char2
boolean4

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对象获取到。

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

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

三、MySQL数据库部分


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

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

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

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

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

四、Redis部分

1.什么是Redis?它主要用来什么的?

Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。

2.说说Redis的基本数据结构类型

  • String(字符串)
  • Hash(哈希)
  • List(列表)
  • Set(集合)
  • zset(有序集合)

 这里就不展开说了

3.redis为什么这么快

4. Redis 过期策略和内存淘汰策略

标签:Java,请求,对象,面经,Redis,2024,索引,线程,使用
From: https://blog.csdn.net/m0_59679869/article/details/139091749

相关文章

  • Java控制台实现斗地主的洗牌和发牌功能
    一、题目要求  有3个玩家:A,B,C。底牌有三张牌,每个人共17张牌,共(17*3+3=54)张牌,实现洗牌与发牌,只在控制没有实现UI可视化。二、思路1、用List集合存储所有的扑克牌。2、洗牌:随机打乱牌的顺序,用到Collections工具类。publicstatic void shuffle(List<?> list)使用默......
  • JAVA计算机毕业设计基于Springboot的助学金管理系统设计与实现(附源码+springboot+开题
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景在当今高等教育日益普及的背景下,助学金作为保障学生顺利完成学业的重要措施,其管理效率和公正性显得尤为关键。然而,传统的助学金管理方式往往依赖于人......
  • java —— 连接 MySQL 操作
    MySQL是独立于java之外的数据库,二者之间建立连接需要提前引入mysql-connector-java的jar包。一、引入方法:①在项目中新建一个Folder(即文件夹),该文件夹通常命名为lib,意思是存放项目所依赖的第三方库或外部的jar文件。②将 mysql-connector-java的jar包复制进......
  • java —— 封装、继承、接口和多态
    一、封装封装是将数据和操作这些数据的方法整合成一个类。在这个类中,用private修饰符将某些数据隐藏起来,只通过特定的方法实现这些数据的访问和修改,以此实现数据的完整和安全性。封装的步骤:二、继承 继承是指把子类共有的某些属性或方法抽离出来,编写为父类,这样多个子类......
  • java —— 类与方法
    一、访问修饰符在类和方法中,均可使用访问修饰符以锁定该类或方法的被访问权限。访问修饰符有四种:(一)public同一个项目中,对所有的类可见。(二)protected同一个项目中,对同一个包中的类可见,对子类可见,对其他包中的类不可见。(三)default同一个项目中,对同一个包中的类可见,对其他......
  • JAVA计算机毕业设计基于springboot的在线考试系统(附源码+springboot+开题+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的快速发展和普及,教育领域对信息技术的应用越来越广泛。在线考试系统作为教育信息化的一种重要形式,已经逐渐成为了现代教育管理的重要组......
  • Java学习笔记(二)
    Java学习笔记(二)快捷方法生成psvm>>publicstaticvoidmain(String[]args){}main>>publicstaticvoidmain(String[]args){}sout>>System.out.println();i.sout>>System.out.println(i);i.soutv>>System.out.println("i=&......
  • Java基础(I/O)
    一、File类1.1File类概述I/O(Input/Output)指应用程序对设备的数据输入/输出。负责输入/输出的类都位于java.io包中。File类中的java.io包是唯一代表磁盘本身文件的对象,定义了一些与平台无关的方法用于操作文件。常用构造方法如下图。常用方法如下图。1.2遍历目录下的......
  • Java基础(集合)
    一、集合概述集合:可以存储任意类型的对象,并且长度可变的类集合类位与java.util包中集合类的继承体系如下图。二、Collection接口Collection是所有单列集合的父接口,定义了单列集合通用的一些方法,常用方法如下图。开发中基本使用其子接口。三、List接口3.1List接口简介......
  • java顺序结构,循环结构,选择结构,增强for循环,switch穿透现象,值匹配
    顺序结构inta=10;intb=20;intc=a+b;System.out.println(c);//按顺序执行循环结构一、For循环格式for(初始化语句;循环条件;迭代语句){循环语句体;}for(inti=0;i<5;i++){System.out.println("我爱你");}int[]is={1,2,3};for(inti=0;i<is.l......