2022 Java秋招面试题-必备基础

文章目录

  • 2022 Java秋招面试题-必备基础
    • 一、语言基础
      • Java技术栈基础-语言基础
      • Java技术栈基础-spring
      • Java技术栈基础-netty
    • 二、面向对象
    • 三、存储
      • redis
      • mysql
    • 四、 络
    • 五、web服务、微服务、中间件
    • 六、其他、资料

2022 Java秋招面试题-必备基础

一、语言基础

Java技术栈基础-语言基础

  1. 阿里巴巴Java开发手册 (黄山版)

在这个很卷的时代,这本阿里的java碧血剑谱,面试前,必须得刷一波吧~

  1. java中是值传递还是引用传递/p>

  2. 双等 和equals的区别br> 对于基本类型和引用类型 == 的作用效果是不同的:
    基本类型:如果比较的是基本数据类型,则直接比较其存储的 “值”是否相等;
    引用类型:如果比较的是引用类型的变量,则比较的是所指向的对象的地址;

追问重写equals时要重写hashcode为什么非得重写hashcode呢br> 例如String、Date等类对equals方法进行了重写,比较的是所指向的对象的内容。

hashCode() 方法被设计在 Object 类中,说明是希望所有的对象都能实现该方法,该方法是会返回一个对应于当前对象的一个整数,之所以所有对象都实现该方法是为了将来对象在查找时变得快捷。

如果我们想比较内容的话就需要在Student类里面重写equals方法和hashcode方法,这两个方法是属于Object里面的方法,任何类都隐式的继承了Object类。

那为什么非得重写hashcode呢为对象的比较有硬性规定:

  1. 应用执行期间,同一个对象内容不发生改变,经过多次调用,hashCode方法都必须始终返回同一个值。如果把对象重新copy到另外一个应用程序里,hashcode可以和上一个的不一样。

  2. 如果两个对象根据equals(Object)方法比较是相等的,那么所产生的的hashcode必须一样。

  3. 如果两个对象根据equals(Object)方法比较是不相等的,那么产生的hashcode可能一样,也可能不一样。
    如果不重写,很明显是违反了第二条规定~

  4. map和set

    追问, java自己写string类,可以吗/p>

    • 如果当自己定义了一个String类,且包名也是java.lang,不会被加载。因为双亲委派机制,基于JVM的双亲委派机制,类加载器收到了加载类的请求,会把这个请求委派给他的父类加载器。而只有父类加载器自己无法完成加载请求时,子类才会自己加载。这样用户自定义的String类的加载请求就会最终达到顶层的BootStrap ClassLoader启动类加载器,
      启动类加载器加载的是系统中的String对象,而
      用户编写的java.lang.String不会被加载

    • 如果自定义String和java自带的String不在同一个包下是可以加载的,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。

    1. 什么是泛型,我们为什么需要泛型br> JDK5提出了泛型这个概念,但是JDK5以前是没有泛型的。
      把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。
    • 把类型当作是参数一样传递
    • 只能是引用类型
    1. Java反射是什么ava中为什么需要反射射要解决什么问题br> 反射就是把java类中的各种成分映射成一个个的Java对象。

    2. java怎么创建线程池ava线程的生命周期ava怎么创建线程线程的生命周期br> 线程池不允许使用 Executors 去创建,而是通过 的方式,这样的处理方
      式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
      说明:Executors 返回的线程池对象的弊端如下:
      1)FixedThreadPool 和 SingleThreadPool:
      允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。
      2)CachedThreadPool:
      允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
      3)ScheduledThreadPool:Java 开发手册(黄山版)
      允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。

    java怎么创建线程br> jdk5之前有两种方式,一种是继承Thread类,另一种是实现Runnable接口。在jdk1.5后又为我们提供两种方式,一种是实现Callable接口,另一种就是使用线程池。

    • 继承Thread类
      继承Thread类需要我们重写run()方法,且将核心代码写到run方法中。
    • 实现Runnable接口
    • 实现Callable接口
    • 使用线程池
    1. threadlocal是什么br> ThreadLocal并不是一个Thread,而是Thread的局部变量。
      ThreadLocal翻译成中文比较准确的叫法应该是:线程局部变量。或称为 线程本地变量。
      ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个副本,在实际多线程操作的时候,操作的是自己本地内存中的变量,从而规避了线程安全问题。

    2. java中异常怎么分类的的br> Throwable是所有异常的根,java.lang.Throwable
      Throwable有两个直接子类,Error类和Exception类。

      AIO:AIO 也就是 NIO 2。在 Java 7 中引入了 NIO 的改进版 NIO 2,它是异步非阻塞的IO模型。异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。

      目前来说 AIO 的应用还不是很广泛,Netty 之前也尝试使用过 AIO,不过又放弃了。

      二、面向对象

      1. 六大设计模式原则
        设计模式七大原则中的“开闭原则”,也称为OCP原则
        “开闭原则”是面向对象编程中最基础和最重要的设计原则之一。
        开闭原则非常著名,只要是做面向对象编程的,甭管是什么语言,Java也好,C++也好,或者是Smalltalk,在开发时都会提及开闭原则。
        其次,开闭原则是最基础的一个原则。

      类、模块和函数(方法)等软件实体,应该对扩展开放,对修改关闭。

      举例:
      把创建Shape 类做成抽象类,并提供一个抽象的 draw 方法,让子类去实现即可,这样我们有新的图形种类时,只需要让新的图形类继承 Shape,并实现 draw 方法即可,使用方的代码就不需要修改了, 从而满足了开闭原则。

      1. 什么是设计模式什么要使用设计模式br> 设计模式,即Design Patterns,是指在软件设计中,被反复使用的一种代码设计经验。使用设计模式的目的是为了可重用代码,提高代码的可扩展性和可维护性。

      为什么要使用设计模式本原因还是软件开发要实现可维护、可扩展,就必须尽量复用代码,并且降低代码的耦合度。设计模式主要是基于OOP编程提炼的。

      1. 什么是单例模式(Singleton)
        保证一个类仅有一个实例,并提供一个访问它的全局访问点。

      因为这个类只有一个实例,因此,自然不能让调用方使用new Xyz()来创建实例了。所以,单例的构造方法必须是private,这样就防止了调用方自己创建实例,但是在类的内部,是可以用一个静态字段来引用唯一创建的实例的。

      1. 说说你对工厂模式的理解用场景br> 工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。

      将对象的创建和对象本身的处理业务分离,这样可以降低耦合度,可以两者修改起来都相对容易。在调用工厂类方法时,由于是静态方法使得调用简单,直接通过类名调用传入正确的参数即可。

      三、存储

      redis

      推荐刷一遍, Redis常见面试题总结与持久化

      1. Redis支持的数据类型br> Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

      五种类型与类比java的模型
      string –> String
      hash –> Hashmap
      list –> LinkList
      set –> HashSet
      sorted_set –> TreeSet

      1. 缓存穿透、缓存击穿、缓存雪崩
      • 缓存穿透
        缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。

      • 缓存击穿
        这里需要注意和缓存穿透的区别,缓存击穿, 是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
        当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存过期,会同时访问数据库来查询最新数据,并且回写缓存,会导使数据库瞬间压力过大。

      • 缓存雪崩
        缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。和缓存击穿不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

      缓存雪崩是指缓存由于某种原因(比如服务器宕机, 络不可达等)无法访问,造成所有请求直接打到MySQL,造成系统整体挂掉。

      解决方案:
      缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
      如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
      设置热点数据永远不过期。

      缓存雪崩是因为大量数据在同一时间失效,造成数据大批量的访问数据库的现象。
      解决办法是
      方法一:可以设置数据的失效时间为一个随机值,让每一个数据失效的时间不一样,避免大范围的数据失效,这样就不会给数据库压力了;
      方法二:对于“redis挂掉了,请求全部走数据库”,可以采取事发前:实现redis高可用(主从架构+Sentinel(哨兵)或者redisCluster(集群)),尽量避免挂掉;事发中:设置本地缓存(echcache)+限流(hystrix);

      事发后:redis持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

      1. redis的持久化方式
        Redis的持久化有3种方式
      • 快照方式(RDB Redis DataBase) 将某一时刻的内存数据,以二进制的方式写入到磁盘当中;
      • 文件追加方式(AOF Append Only File)记录所有的文件并以文本的形式追加到文件中;
      • 混合持久化方式,Redis 4.0之后新增的方式,混合持久化是结合RDB和AOF的优点,在写入的时候先把当前的数据以RDB的形式写入到文件的开头,再将后续的操作以AOF的格式存入文件当中,这样既能保证重启时的速度,又能降低数据丢失的风险。
      1. redis是单线程还是多线程
        Redis4.0版本之前,使用的是单线程,一般来说,单线程的处理能力要比多线程差,但是Redis还能达到每秒数万级的处理能力。首先最重要的原因是,Redis的大部分操作都在内存中完成,并且采用了高效的数据结构,比如哈希表和跳表。其次,单线程可以避免多线程之间的竞争,省去了多线程切换带来的时间和性能上的开销,而且还不会导致死锁。最后,Redis采用了I/O多路复用机制处理客户端的socket请求,这样可以使Redis高效的进行 络通信,因为是基于非阻塞的I/O模型,就意味着I/O的读写流程不再阻塞。

      Redis4.0版本之后,添加了多线程的支持,但这时的多线程主要体现在大数据的异步删除功能上,例如unlink key、flushdb async、flushall async等。

      Redis6.0版本之后,采用了多个I/O线程来处理 络请求,这是因为随着 络硬件的性能提升,Redis的性能瓶颈有时会出现在 络I/O的处理上,所以为了提高 络请求处理的并行度,Redis6.0对于 络请求采用多线程来处理。但是对于读写命令,Redis仍然采用单线程来处理。

      1. Redis 为什么那么快
        腾讯架构师是如何解释:Redis高性能通信的原理(精华版)
        参考URL: https://www.toutiao.com/article/7020366249465004581/

      根据官方的基准测试数据,一台普通硬件配置的Linux机器上运行单个Redis实例,处理简单命令(O(n)或者O(logn)),QPS可以达到8W,如果使用pipeline批处理功能,QPS最高可以达到10W。

      Redis的高性能主要依赖于几个方面。

      • C语言实现,C语言在一定程度上还是比Java语言性能要高一些,因为C语言不需要经过JVM进行翻译。
      • 纯内存I/O,内存I/O比磁盘I/O性能更快
      • I/O多路复用,基于epoll的I/O多路复用技术,实现高吞吐 络I/O
      • 单线程模型,单线程无法利用到多核CPU,但是在Redis中,性能瓶颈并不是在计算上,而是在I/O能力,所以单线程能够满足高并发的要求。 从另一个层面来说,单线程可以避免多线程的频繁上下文切换以及同步锁机制带来的性能开销。

      mysql

      1. 什么是数据库事务br> 在数据库中,事务是指一组逻辑操作,无论成或败,都作为一个整体进行工作,要么全部执行,要么全部不执行。

      2. 事务的ACID四个特性

      • 原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
      • 一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态的含义是数据库中的数据满足完整性约束。
      • 隔离性(Isolation):多个事务并发执行,一个事务的执行不应该影响其他事务的执行。
      • 持久性(Durability):已被提交的事务对数据库的修改应该永远永久保存在数据库中。传统的关系型数据库都支持ACIDa特性,具体来说是通过SQL语句支持事务功能。
      1. 事务的隔离级别都有哪些务的隔离级别
        在事务的并发操作中可能会出现脏读,不可重复读,幻读。
      • Read uncommitted(读未提交)
      • Read committed(读提交)
      • Repeatable read(重复读)
      • Serializable (序列化)
      1. 什么是数据库索引,有哪些分类引有什么用/li>

      MySQL按照逻辑分类,索引可分为:

      • 主键索引:一张表只能有一个主键索引,不允许重复、不允许为 NULL;
      • 唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,但是一个唯一索引只能包含一列,比如身份证 码、卡 等都可以作为唯一索引;
      • 普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;
      • 全文索引:让搜索关键词更高效的一种索引。

      追问,索引何时应该使用br> 1.主键,自动建立唯一索引
      2.频繁作为查询的条件的字段
      3.查询中与其他表关联的字段存在外键关系
      4.查询中排序的字段,排序字段若通过索引去访问将大大提高排序的速度
      5.查询中统计或者分组字段

      追问,Mysql索引原理是什么br> 索引的数据结构主要有B+树和哈希表,对应的索引分别为B+树索引和哈希索引。InnoDB引擎的索引类型有B+树索引和哈希索引,默认的索引类型为B+树索引。

      1. 什么是事务的隔离级别什么用br> 隔离级别在一定程度解决了事务并发问题。
        隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。
        Mysql 默认采用的REPEATABLE_READ隔离级别.

      四、 络

      1. TCP三次握手原理br> 一开始,双方都处于close状态,先是接收端监听某个端口,进入listen状态
        第一次握手:发送syn包时,希望向接收端建立连接,并初始化序列 。此时发送端进入syn_sent状态
        第二次握手:接收端接受到了syn包,发送ack+syn包,并初始化序列 ,并将发送的序列 +1放入确认应答 中。此时接收端进入syn_rcvd状态
        第三次握手:发送ack包,给确认应答 +1,表示收到了接收端的 文,进入establelisten状态
        服务端收到了客户端的 文后,也进入了establelisten状态、

      追问,timewait状态/p>

      1. 为什么“握手”是三次,“挥手”却要四次/li>
      2. TCP协议如何保证可靠性
      3. MTU是什么br> 2022 Java秋招面试题-必备基础
        以太 EthernetII最大的数据帧是1518Bytes这样,刨去以太 帧的帧头(DMAC目的MAC地址48bits=6Bytes+SMAC源MAC地址48bits=6Bytes+Type域2Bytes)14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。

      在 络层,因为IP包的首部要占用20字节,所以这的MTU为1500-20=1480; 
      在传输层,对于UDP包的首部要占用8字节,所以这的MTU为1480-8=1472;

      所以,在应用层,你的Data最大长度为1472。当我们的UDP包中的数据多于MTU(1472)时,发送方的IP层需要分片fragmentation进行传输,而在接收方IP层则需要进行数据 重组,由于UDP是不可靠的传输协议,如果分片丢失导致重组失败,将导致UDP数据包被丢弃。

      从上面的分析来看,在普通的局域 环境下,UDP的数据最大为1472字节最好(避免分片重组)。

      1. 什么是粘包么解决TCP粘包DP存在粘包问题吗br> UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。

      UDP 对应用层交下来的 文,既不合并,也不拆分,而是保留这些 文的边界。而接收方在接收数据 的时候,也不会像面对 TCP 无穷无尽的二进制流那样不清楚啥时候能结束。正因为基于数据 和基于字节流的差异,TCP 发送端发 10 次字节流数据,而这时候接收端可以分 100 次去取数据,每次取数据的长度可以根据处理能力作调整;但 UDP 发送端发了 10 次数据 ,那接收端就要在 10 次收完,且发了多少,就取多少,确保每次都是一个完整的数据 。

      跟 UDP 不同在于,TCP 发送端在发的时候就不保证发的是一个完整的数据 ,仅仅看成一连串无结构的字节流,这串字节流在接收端收到时哪怕知道长度也没用,因为它很可能只是某个完整消息的一部分。

      粘包出现的根本原因是不确定消息的边界。接收端在面对”无边无际”的二进制流的时候,根本不知道收了多少 01 才算一个消息。一不小心拿多了就说是粘包。

      五、web服务、微服务、中间件

      1. cookie、session有什么区别/li>
      2. 什么是jwt token有什么优缺点/li>
      3. http、https有什么区别br> 追问,tls、ssl工作在哪一层/li>

      六、其他、资料

      1. Docker的基本原理虚拟机有什么区别/li>

      ????????????????走别人的路,让别人无路可走,小伙伴们国庆又可以开心的卷了??????????????????

      文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91437 人正在系统学习中

      声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年9月26日
下一篇 2022年9月26日

相关推荐