Java【安恒信息】

283 阅读24分钟

本文内容参考牛客网安恒信息面经

Java基础

1、java ee/se/me区别?

  1. Java SE(Java Platform,Standard Edition)。Java SE 以前称为 J2SE。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使用的 Java 应用程序。Java SE 包含了支持 Java Web 服务开发的类,并为 Java Platform,Enterprise Edition(Java EE)提供基础。
  2. Java EE(Java Platform,Enterprise Edition)。这个版本以前称为 J2EE。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器端 Java 应用程序。Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、管理和通信 API,可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和 Web 2.0 应用程序。
  3. Java ME(Java Platform,Micro Edition)。这个版本以前称为 J2ME。Java ME 为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME 包括灵活的用户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可以利用每个设备的本机功能。

说得更简单点:

  1. Java SE 是做电脑上运行的软件。
  2. Java EE 是用来做网站的(我们常见的JSP技术)
  3. Java ME 是做手机软件的

2、jvm、jre、jdk区别?

3、Java常用的命令有哪些?

  1. javac:将文件编译成.class文件
  2. java:执行.class文件,若类中没有main函数,则不能执行
  3. jar:主要打包jar文件
  4. javadoc:主要用于生成帮助文档
  5. javah:主要用于生成头文件
  6. javap:反编译器,显示编译器中可以访问的方法和数据

4、Java的数据类型及应用场景

数据类型(基本数据类型+引用数据类型);基本数据类型(byte、short、int、long、float、double、char、boolean),引用数据类型(类、接口、数组)

5、重载和重写的区别?

重载(overload)的通俗解释:在平时生活中经常会出现这样一个情况,一个班里可能同时出现两个同学叫小明,甚至有多个,但是他们的身高、体重、外貌等有所不同,老师点名时都会根据他们的特征来区分。在编程语言里也存在这种情况,参数不同的方法有着相同的名字,调用时根据参数确定调用哪个方法,这就是Java方法重载机制

重写(override):也称覆盖。重写是子类对父类非静态,非private,非final方法的实现过程进行重新编写,返回值(JDK7以后,被重写的方法返回值类型可以不同,但是必须是具有父子关系的)和形参都不能改变。即外壳不变,核心重写。

方法的重载和重写都是实现多态的方式,区别在于前者实现的是编译时的多态性,而后者实现的是运行时的多态性。

  • 重载发生在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同或者二者都不同)则视为重载;
  • 重写发生在子类与父类之间,重写要求子类被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)。
  • 编译器无法决定调用哪个重写的方法,因为只从变量的类型上是无法做出判断的,要在运行时才能决定;但编译器可以明确地知道该调用哪个重载的方法,因为引用类型是确定的,参数个数决定了该调用哪个方法。
  • 多态针对的是重写,而不是重载。

方法重载的规则:

  1. 方法名一致,参数列表中参数的顺序,类型,个数不同。
  2. 重载与方法的返回值无关,存在于父类和子类,同类中。
  3. 可以抛出不同的异常,可以有不同修饰符。

6、==和equals的区别?

5、被final修饰的类可以被继承吗?

被final修饰的类不可以被继承。

6、String是final的吗?

是的;String被final修饰是为了保证String对象的不可变性,即String对象一旦创建,它的内容就不能被改变,从而保证了String对象的安全性。

7、String、StringBuilder、StringBuffer的区别

  • String:String 的值被创建后不能修改,任何对 String 的修改都会引发新的 String 对象的生成。
  • StringBuffer:跟 String 类似,但是值可以被修改,使用 synchronized 来保证线程安全
  • StringBuilder:StringBuffer 的非线程安全版本,性能上更高一些

8、谈谈你对OOP的理解

面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。

面向对象的特点主要可以概括为:封装性、继承性和多态性。(再分别解释一下这三个特性)

9、面向对象三大特征

  • 封装:
  • 继承:
  • 多态:

13、通俗地解释一下Java泛型,谈谈你对Java泛型的理解

Java泛型是Java语言中的一种特性,它可以让程序员在编写代码时使用参数化类型,从而使程序更加灵活,更加安全。它可以让程序员在编写代码时,指定一个或多个类型参数,从而使程序更加灵活,更加安全。例如,可以使用泛型来定义一个类,该类可以接受任何类型的参数,而不必指定具体的类型,从而使程序更加灵活,更加安全。

总的来说,Java泛型是一种参数化类型,可以让程序员在编写代码时使用参数化类型,从而使程序更加灵活,更加安全。

14、说一下stream

Stream是Java 8引入的一种新的数据处理模型,它可以让你以一种声明式的方式处理数据,而不需要编写复杂的循环和迭代代码。Stream操作可以是顺序的,也可以是并行的,可以支持非常复杂的数据处理操作,比如filter、map、reduce、find、match等等。

Java集合

1、对集合了解吗?说一说具体有哪些,基类(父类)是什么?

2、ArrayList与LinkedList的区别?

得分点:数据结构、访问效率

标准回答

  1. ArrayList的实现是基于(Object)数组,LinkedList的实现是基于双向链表
  2. 对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N)。
  3. 对于插入和删除操作,LinkedList要优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引。
  4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

(2、3、4可简化为—ArrayList:增删慢、查询快,线程不安全,对元素必须连续存储。LinkedList:增删快,查询慢,线程不安全。)

3、hashmap了解吗?hashmap还能怎么优化?

HashMap是一种散列表,它使用散列函数将键映射到值,以提供快速查找。它的优点是查找速度快,缺点是插入和删除操作比较慢。

可以通过以下方式优化HashMap:

  1. 减少HashMap的大小,以减少冲突的可能性。
  2. 使用更好的散列函数,以减少冲突的可能性。
  3. 使用链表来解决冲突,以提高查找效率。
  4. 使用红黑树来解决冲突,以提高查找效率。
  5. 使用缓存来提高查找效率。

4、hashmap具体怎么实现的?(底层实现原理)

基于hash算法,通过put方法和get方法存储和获取对象。

存储对象时,我们将K/V传给put方法时,它调用K的hashCode计算hash从而得到bucket位置,进一步存储,HashMap会根据当前bucket的占用情况自动调整容量(超过Load Facotr则resize为原来的2倍)。获取对象时,我们将K传给get,它调用hashCode计算hash从而得到bucket位置,并进一步调用equals()方法确定键值对。

如果发生碰撞的时候,HashMap通过链表将产生碰撞冲突的元素组织起来。在Java 8中,如果一个bucket中碰撞冲突的元素超过某个限制(默认是8),则使用红黑树来替换链表,从而提高速度。

5、HashMap扩容的时候为什么是2的n次幂

  1. 2的n次幂的数据结构比较容易实现,可以使用位运算来替代乘法和除法,提高效率。
  2. 2的n次幂的数据结构可以更好地利用空间,比如HashMap的容量是2的n次幂,那么它的桶数组就可以利用更多的空间,而不会浪费太多的空间。
  3. 2的n次幂的数据结构可以更好地支持哈希函数,比如HashMap的容量是2的n次幂,那么它的哈希函数就可以更好地将元素映射到桶数组中,从而提高查找效率。

6、hash冲突的解决方法?讲一下开放地址法、怎么确定开放地址的位置?

HashMap冲突的解决方法之一是开放地址法,也叫线性探测法。当发生冲突时,将元素放在散列表中的下一个空位置上。

确定开放地址的位置的方法有多种,其中最常用的是线性探测法,即从冲突的位置开始,按照一定的步长(通常为1),依次查找下一个空位置,直到找到一个空位置为止。

7、HashMap的寻址算法

HashMap的寻址算法是基于哈希函数的,它将键值映射到数组的索引上,以此来实现快速查找。哈希函数的作用是将任意长度的输入转换为固定长度的输出,这个输出就是哈希值,也叫散列值。HashMap根据哈希值来计算出数组的索引,从而实现快速查找。

8、HashCode怎么实现的?

Object类中的hashCode()方法是native方法,由C++语言实现,具体实现细节取决于具体的JVM实现。

一般来说,hashCode()方法会根据对象的地址或者存储在对象中的某些属性值来计算出一个整数值,这个整数值就是对象的hashCode值。

9、ConcurrentHashMap

JVM

1、jvm内存模型有哪些

2、怎么打破双亲委派

3、垃圾回收器有哪些?有哪些垃圾回收算法?

4、CMS的执行流程

5、解释一下分代回收

6、有哪些对象是GC ROOT对象

7、说一下线程池

8、介绍一下类加载机制

9、怎么破坏类加载机制?

计算机网络

1、你了解哪些网络协议?

2、GET和Post的区别?POST和PUT一般用在什么场景?

GET 和 POST 本质上就是 TCP 链接,并无差别。但是由于 HTTP 的规定和浏览器/服务器的限制,导致他们在应用过程中体现出一些不同。

区别GETPOST
数据传输方式从服务器获取数据向服务器提交数据
对数据长度的限制当发送数据时,GET方法向URL添加数据;URL的长度是受限制的(URL的最大长度是2048个字符)无限制
对数据类型的限制只允许ASCII字符无限制
安全性较差,所发送的数据是URL的一部分,会显示在网页上较好,参数不会被保存在浏览器历史或web服务器日志中
可见性显示在URL上不显示
收藏为书签可以不可以
历史记录可以被保留在历史记录当中不可以被保留
缓存能被缓存不可以被缓存

3、网络TCP的四次挥手,谁先开始的,谁结束的?TIME_WAIT和CLOSE_WAIT。CLOSE_WAIT的话是正常结束还是非正常结束?

四次挥手是由客户端发起的,客户端先发送一个FIN报文段,服务器收到后回复一个ACK报文段,然后服务器发送一个FIN报文段,客户端收到后回复一个ACK报文段,最后客户端发送一个FIN报文段,服务器收到后回复一个ACK报文段,这样就完成了四次挥手。

TIME_WAIT状态是正常结束的,CLOSE_WAIT状态也是正常结束的,它表示服务器已经收到了客户端的FIN报文段,但是服务器还没有发送FIN报文段给客户端。

4、TCP三次握手、四次挥手

5、HTTP协议和TCP协议的区别?

TCP协议是一种面向连接的协议,它建立在IP协议之上,为上层应用提供可靠的数据传输服务。它提供了可靠的字节流服务,具有可靠性、有序性和可控性等特点。

HTTP协议是一种无连接的协议,它建立在TCP协议之上,为上层应用提供数据传输服务。它提供了无连接的请求/响应服务,具有简单性、快速性和可扩展性等特点。

6、http和https的区别

7、tcp和udp区别?

UDPTCP
是否连接无连接面向连接
是否可靠不可靠传输,不使用流量控制和拥塞控制可靠传输,使用流量控制和拥塞控制
是否有序无序有序,消息在传输过程中可能会乱序,TCP会重新排序
传输速度
连接对象个数支持一对一,一对多,多对一和多对多交互通信只能是一对一通信
传输方式面向报文面向字节流
首部开销首部开销小,仅8字节首部最小20字节,最大60字节
适用场景适用于实时应用(IP电话、视频会议、直播)适用于要求可靠传输的应用,例如文件传输

8、tcp基于连接, http基于tcp ,http为啥是无连接的协议呢?

HTTP是无连接的协议,因为它不需要建立和维护连接,每次请求/响应都是独立的,这样可以提高传输效率,减少服务器的负载。

9、tcp、udp在哪个层?有什么优势呢?

应用层。

TCP的优势:可靠、稳定,TCP的可靠体现在TCP在传输数据之前,会有三次握手来建立连接,而且在数据传输之前,会有三次握手来建立连接,而且在数据传输时,有确认、窗口、重传、拥塞控制机制,在数据传完猴,还会断开连接用来节约系统资源。

UDP的优势

  • 关于发送什么数据以及何时发送的应用层控制更为精细。采用 UDP 时,只要应用进程将数据传递给 UDP,UDP 就会将此数据打包进 UDP 报文段并立即将其传递给网络。
  • 无需连接建立。TCP 在开始数据传输之前要经过三次握手,UDP 却不需要任何准备即可进行数据传输,因此 UDP不会引入建立连接的时延。(HTTP 使用 TCP 而不是 UDP, 因为对于具有文本数据的 Web网页来说,可靠性是至关重要的)
  • 无连接状态。
  • 分组首部开销小。每个TCP报文段都有20字节的首部开销,而UDP仅有8字节的开销。

10、OSI七层网络模型,他们各自作用

MySQL

1、聚集索引和非聚集索引

聚集索引与非聚集索引的区别:

  1. 非聚集索引与聚集索引的区别在于非聚集索引的叶子节点不存储表中的数据,而是存储该列对应的主键
  2. 对于InnoDB来说,想要查找数据我们还需要根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据 的过程,我们称为回表。第一次索引一般是顺序IO,回表的操作属于随机IO。需要回表的次数越多,即随机IO 次数越多,我们就越倾向于使用全表扫描。
  3. 通常情况下,主键索引(聚簇索引)查询只会查一次,而非主键索引(非聚簇索引)需要回表查询多次。当 然,如果是覆盖索引的话,查一次即可
  4. 注意:MylSAM无论主键索引还是二级索引都是非聚簇索引,而InnoDB的主键索引是聚簇索引,二级索引是非 聚簇索引。我们自己建的索引基本都是非聚簇索引。

2、一条使用索引的语句和几个索引,问会用到索引吗,为什么

SELECT * FROM table WHERE id = 1 AND name = 'John';

索引:

  1. id索引
  2. name索引

会用到索引,因为索引可以加快查询的速度,减少查询时间,提高查询效率。

3、索引的的实现

4、给了一个例子判断是否索引失效(列举了几种SQL看是否有索引失效)

  1. 检查索引的统计信息:如果索引的统计信息显示索引的使用率很低,则可能是失效的索引。
  2. 检查查询计划:如果查询计划中没有使用索引,则可能是失效的索引。
  3. 检查索引的更新频率:如果索引的更新频率很低,则可能是失效的索引。
  4. 检查索引的大小:如果索引的大小超过了数据表的大小,则可能是失效的索引。
  5. 检查索引的列:如果索引的列不是查询中使用的列,则可能是失效的索引。

5、MySQL用过吧,说一说索引在不同搜索引擎下的实现?

MySQL中,索引是一种特殊的数据结构,它可以加快查询的速度,提高查询的效率。MySQL中的索引可以使用B树或者哈希索引来实现。

MongoDB中,索引是一种特殊的数据结构,它可以加快查询的速度,提高查询的效率。MongoDB中的索引可以使用B树或者哈希索引来实现。

Elasticsearch中,索引是一种特殊的数据结构,它可以加快查询的速度,提高查询的效率。Elasticsearch中的索引可以使用Lucene索引来实现。

6、索引为什么用B+ Tree而不用hash

  1. 哈希表的查询效率是最高的,时间复杂度O(1),但是它要求将所有数据载入内存,而数据库存储的数据量级可能非常大,全部载入内存不现实;
  2. 哈希表在大数据量的时候会有hash冲突,且不支持范围查找;
  3. B+树可以分段加载需要的节点数据,可以在内存资源有限的前提下,极大提高查询效率,B+树没有hash冲突,且为所有叶子节点增加了链接,从而实现快速范围查找。

7、隐式转换为什么不走索引了?

隐式转换会导致数据类型发生变化,这样会导致索引失效,因此不会走索引。

8、介绍一下最左匹配原则

最左匹配原则:在InnoDB的联合索引中,查询的时候只有匹配了前一个/左边的值之后,才能匹配下一个。

根据最左匹配原则,我们创建了一个组合索引,如 (a1,a2,a3),相当于创建了(a1)、(a1,a2)和 (a1,a2,a3) 三个索引。

为什么不从最左开始查,就无法匹配呢?

比如有一个user表,我们给 name 和 age 建立了一个组合索引。

ALTER TABLE user add INDEX comidx_name_phone (name,age);

组合索引在 B+Tree 中是复合的数据结构,它是按照从左到右的顺序来建立搜索树的 (name 在左边,age 在右边)。

从这张图可以看出来,name 是有序的,age 是无序的。当 name 相等的时候, age 才是有序的。

这个时候我们使用 where name= '张三' and age = '20'去查询数据的时候, B+Tree 会优先比较 name 来确定下一步应该搜索的方向,往左还是往右。如果 name 相同的时候再比较age。但是如果查询条件没有 name,就不知道下一步应该查哪个 节点,因为建立搜索树的时候 name 是第一个比较因子,所以就没用上索引。

9、B-Tree和B+Tree的区别?

  1. 在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。
  2. B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。

另外一个参考答案:

  1. B-树内部节点是保存数据的;而B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。
  2. B+树相邻的叶子节点之间是通过链表指针连起来的,B-树却不是。
  3. 查找过程中,B-树在找到具体的数值以后就结束,而B+树则需要通过索引找到叶子结点中的数据才结束
  4. B-树中任何一个关键字出现且只出现在一个结点中,而B+树可以出现多次。

10、事务的四大特征

11、mysql的隔离级别

12、InnoDB和MyISAM

13、页分裂

14、Segment基于什么思想实现的锁?

15、AQS

16、悲观锁与乐观锁的概念

17、哪些类使用到了CAS思想

18、什么时候使用表锁,什么时候使用行锁

19、间隙锁

20、select (*) from table A加什么锁?

SELECT * FROM table A WITH (NOLOCK)

Redis

1、Redis的数据类型/结构

2、Redis的命令操作

3、Redis为什么这么快?

  1. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速;
  2. 数据结构简单,对数据操作也简单;
  3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  4. 使用多路I/O复用模型,非阻塞IO。

4、Redis为什么效率比较高?

  1. 完全基于内存操作

Redis中绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap的数据结构,对数据操作也简单。

  1. 降低了CPU的消耗

采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

  1. 采用了更高效的非阻塞I/O

Redis采用epoll做为I/O多路复用技术的实现,再加上Redis自身的事件处理模型将epoll中的连接,读写,关闭都转换为了事件,不在I/O上浪费过多的时间,使得Redis在网络 IO 操作中能并发处理大量的客户端请求,实现了高吞吐率。

以上,就是我对Redis单线程设计以及Redis为什么这么高效的分析。在目前最新的Redis版本中,IO 多线程处理模式默认是不开启的,需要去配置文件中开启并配置线程数。

5、Redis的使用场景

Redis 适合的场景

  1. 缓存:减轻MySQL的查询压力,提升系统性能;
  2. 排行榜:利用Redis的SortSet(有序集合)实现;
  3. 计数器/限速器:利用Redis中原子性的自增操作,我们可以统计类似用户点赞数、用户访问数等。这类操作如果用MySQL,频繁的读写会带来相当大的压力;限速器比较典型的使用场景是限制某个用户访问某个APl的频率,常用的有抢购时,防止用户疯狂点击带来不必要的压力;
  4. 好友关系:利用集合的一些命令,比如求交集、并集、差集等。可以方便解决一些共同好友、共同爱好之 类的功能;
  5. 消息队列:除了Redis自身的发布/订阅模式,我们也可以利用List来实现一个队列机制,比如:到货通知、邮件发送之类的需求,不需要高可靠,但是会带来非常大的DB压力,完全可以用List来完成异步解耦;
  6. Session共享:Session是保存在服务器的文件中,如果是集群服务,同一个用户过来可能落在不同机器上,这就会导致用户频繁登陆;采用Redis保存Session后,无论用户落在哪台机器上都能够获取到对应的Session信息。

Redis 不适合的场景

数据量太大、数据访问频率非常低的业务都不适合使用Redis,数据太大会增加成本,访问频率太低,保存在内存中纯属浪费资源。

6、Redis的发布订阅模式

7、bitmap的原理是什么?

8、Redis持久化的原因,持久化机制

9、解释一下缓存穿透、击穿、雪崩的解决方案

开发框架

1、Spring中不同注解区别?

2、Spring源码中有哪些设计模式

3、SpringBoot的自动配置原理,自动配置最核心的接口

4、bean的生命周期

5、Spring如何解决循环依赖

6、beanfactory和factorybean的区别

7、Spring中注册Bean的方式?

消息队列

1、介绍一下RabbitMQ

2、rabbiitmq有哪几种发布模式

3、如果消费者重复消费了消息怎么办

4、如果发送的消息丢失怎么办

其他

1、说一下Maven?

2、Maven怎么解决版本冲突

3、Maven怎么统一版本号

4、git的常用命令

5、怎么解决合并冲突

6、项目帖子的字段如何设计的?内容字段设计的类型是什么?

7、帖子内容如果支持图片,你会怎么设计?

8、mybatis plus的使用以及优点?

9、让你实现一下mybatis plus你会怎么做,比如反射?

10、spring和springboot的区别

11、springboot怎么做到的自动装配

12、spring和springboot项目部署有什么不同

13、怎么部署一个java项目上线

14、知道接口幂等性吗

15、你是怎么实现的分布式锁

16、mybatis

一些问题:

  1. 你是怎么学习的,学习的时候都看什么书?
  2. 你现在还有课吗,学校的课程安排
  3. 未来规划
  4. 为啥选择去杭州

反问环节:

  1. 面试评价
  2. 学习建议
  3. 薪资待遇