Java面试题总结1-2022

本文是作者整理的2022年Java面试基础题汇总,涵盖Java面向对象特性、基本数据类型、类与接口的区别、集合框架、数据库事务特性等关键知识点,旨在帮助求职者复习面试必备内容。
摘要由CSDN通过智能技术生成

java面试题总结1-2022


前言

随着毕业季的到来,也迎来了大学生对面试的问题焦虑,本人也正处其中,所以想通过一些博客记录一下关于java的面试问题,顺便当做复习一下。
今天是总结java基础方面的~


面试总结

一、Java基础面试题

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

封装:对象选择性的对外公开部分属性和行为。
继承:子类具有父类的属性和方法,还可以在子类中重新定义,以及追加属性和方法。
多态:同一个对象,在不同时刻表现出来的不同形态。

  1. Java中基本的数据类型有哪些?以及他们的占用字节数
数据类型占用字节
byte1
short2
int4
long8
float4
double8
char2
boolean1
  1. int和Integer的区别

int是Java的基本类型,Integer是Java专门为int提供的包装类,他们有不同的特征和用法,包括大小,速度,默认值

  1. String,StringBuilder,StringBuffer的区别及应用场景

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

  1. ArrayList,Vector和LinkList的区别及应用场景

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

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

推荐使用CopyOnWriteArrayList和Connections.synchronizedList
多读少写建议使用CopyOnWriteArrayList
CopyOnWriteArrayList原理是发生修改的时候复制一份
多写少读或比较均匀建议使用Connections.synchronizedList

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

  1. Collection和Collections的区别

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

  1. List和Map的区别

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

  1. HashMap和HashTable的区别

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

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

JDK1.8以前:数组+单链表的组合,以键值对的方式存储元素。
JDK1.8及以后: 引入红黑树结构,添加元素时,若链表元素格数大于8,链表会转换为红黑树,反之小于6时会还原成链表结构。
选择6和8可以有效防止频繁的链表和红黑树的转换。
扩容条件:
1. 存放新值的时候当前已有元素个数大于阈值。
2. 存放新值的时候当前存放数据发生hash碰撞(当前key计算的hash值换算出来的数组下表位置已经存在值)
默认容量是16,负载因子0.75,所以扩容阈值是12.
每次扩容的容量是原有的2倍。

  1. HashMap什么样的类适合作为建

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

  1. final,finally,finalize的区别

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

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

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

  1. 抽象类和接口的区别,以及应用场景

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

  1. Overload(重载)和Override的区别

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

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

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

  1. 连接池的工作机制

服务器启动时会建立一定数量的池连接,客户端需要连接时,池会返回一个未使用的连接并将其标记为忙,如果没有空闲连接池会新建一定数量的连接,最多不会超过连接池的最大连接数,到达最大连接数量时再有线程申请连接就会进入等待队列,当连接使用完毕后,池会将其标记为空闲。

  1. 什么是序列化

序列化就是一种用来处理对象流的机制,就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输与网络之间。
可通过实现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 的核心注解是什么,他是由哪几个注解组成的
    核心注解:@SprignBootApplication
    包含:
    @SpringBootConfiguration 实现配置文件功能
    @EnableAutoConfiguration 打开自动配置功能
    @CompoentScan 组件扫描功能

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

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

  7. SpringCloud的Hystrix断路器特性

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

三,MySQL数据库部分

  1. 事务的四大特性和隔离级别

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

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

  1. MySQL优化相关

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

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

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

  1. MySQL分库分表策略

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

总结

提示:这里对文章进行总结:
只是总结java基础部分的内容,后面会更新一些框架方面的~
更新到MySQL这里了

参考:参考文章

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值