《JAVA开发工程师面试题汇总》----持续更新

Java

1、Java中的八大基本类型
答:byte、char、short、int、long、float、double、boolean

2、==与equals的区别
答:==是内存地址比较,equals是值比较。
equals取决于是否在类中被实现,如果实现了则是值比较,如果没实现则是内存地址比较。

3、Java面对对象的四大特征
答:封装、继承、多态、抽象
封装:尽可能的隐藏内部的细节,只保留对外的接口与外部发生联系。
继承:使已存在的类作为基础,在基础之上建立新类,新类可以增加数据和功能,也可以使用父类的功能。
多态:一个接口或基类的多种不同实现方式。分为编译时多态(主要指方法的重载)与运行时多态(主要指动态绑定)

4、抽象与接口的区别
答:接口是抽象的集合。抽象类中可以有非抽象方法,而接口不能。
抽象类是被子类继承的,接口类是被实现的。

5、重写与重载的区别
答:重载方法名必须相同,参数列表必须不同,返回类型可以相同也可以不同。
重载发生在同一个类中。
重写发生在父类与子类中。

6、解释修饰符
答:public可以被任何来源访问
       protected不能被其他包访问
       未修饰不能被子类和其他包访问
       private只能被当前类访问

7、Java支持多继承吗
答:不支持多继承,但可以被多个接口实现

8、解释序列化和反序列化
答:系列化是将Java对象转化为字节序列的过程
      反序列化是将字节序列转化为Java对象的过程

9、Exception与Error的区别
答:都是Throwable的子类
Exception表示程序需要捕获或需要处理的异常,可以处理的问题
Error表示系统级错误,不能处理,只能退出运行。

10、异常有哪几种
答:异常分为受检查异常和不受检查异常
受检查异常的基类是Exception
不受检查异常的基类是RuntimeException

11、Java集合框架
答:Java集合类主要由俩个根接口Collection和Map派生出来。
Collection派生了:List、Set、Queue

12、List、Map、Set的区别
答:List是有序集合,数据可以重复
       Map是键值对存储,数据可以重复
       Set是无序存储,数据不可以重复

13、ArrayList与LinkList的区别
答:ArrayList底层使用数组的数据结构,LinkList底层使用链表的数据结构
       随机访问时,ArrayList优于LinkList
       新增或删除操作时,LinkList优于ArrayList

14、ArrayList与Vector的区别
答:Vector类的所有方法都是同步的,ArrayList不是同步的

15、什么是HashMap
答:HashMap是一个散列表,是键值对存储的。
      HashMap线程不安全。允许键和值为null。

16、HashMap的底层原理
答:基于hashing的原理,采用数组+链表/红黑树的数据结构
      通过put和get来存储和获取对象。
      put时先对键做一个hashCode计算得到bucket数组来存储对象。
      get时获取bucket的位置,再通过equals方法找到正确的键值对。

17、HashMap与HashTable的区别
答:HashMap线程是不安全的,HashTable是线程安全的
      HashMap允许键和值为空,HashTable不允许
      HashTable的效率不如HashMap

18、HashMap与HashSet的区别
答:HashMap是键值对存储,HashSet仅存储对象
      HashMap是不允许有重复的键,HashSet是不允许有重复的值
      HashMap是使用键来计算hashCode值,HashSet是使用对象来计算hashCode值

19、final、finally与finalize的区别
答:final用来修饰类、方法、变量,使其不能被改变
       finally作为异常处理的一部分,只能在try/catch语句中使用,并且最终一定被执行
       finalize是Object中的方法,垃圾回收器准备释放内存的时候,会先调用finalize

20、JDK和JRE的区别
答:JRE是java运行时环境而JDK是java开发工具包,JDK包含JRE。

21、String、StringBuffer和StringBuffder的区别
答:运行速度:StringBuilder > StringBuffer > String
      线程安全:StringBuilder线程是不安全的、StringBuffer是线程安全的

22、Volatile关键字的作用
答:保持内存可见性

JVM

1、什么是JVM
答:JVM是Java虚拟机,任何平台只要装有针对该平台的Java虚拟机,字节码文件就可以在该平台上运行。
      JVM位于操作系统之上,于软件同级。

2、JVM内存结构
答:堆、栈、程序计数器、方法区、本地方法栈

3、类加载器机制
答:虚拟机把描述类的数据从class字节码文件加载到内存,并对数据进行检验,转换解析和初始化,最终形成可以被虚拟机
直接使用的Java类型

4、类的加载过程
答:加载--验证--准备--解析--初始化--使用--卸载

5、双亲委派机制
答:当一个类加载的过程中,它首先不会去加载,而是委托给自己的父加载器去加载,父加载器又委托给自己的父加载器。
因此所有的类加载都会委托给顶层的父类,即根启动器(Bootstrap Classloader)进行加载,然后父加载器自己无法完成
这个加载请求,子加载器才会尝试自己去加载。当所有子加载器都不能加载,则报ClassNotFound

6、解释Native修饰符
答:当一个方法用Native修饰,说明在Java的作用范围达不到了,需要调用底层C语言的库

7、什么情况下发生栈内存溢出
答:如果线程请求的栈深度大于虚拟机所允许的最大深度,就会抛出StackOverflowError异常。可能是类中一些死循环导致的

8、JVM内存为什么要分成新生区、老年区、永久区
答:新生区是类诞生和成长,甚至死亡的地方
     老年区是存放新生区存活下来的对象,不容易被清除
     永久区是存储Java运行时需要的一些环境

9、新生代中为什么要分为伊甸园区和幸存者区
答:如果没有幸存者区,伊甸园区每次轻GC都会把存活下来的对象放到老年区,这样老年区很快就会被填满。
 有幸存者区,就会减少被送到老年区的对象,只有经历15次重GC才会被送到老年区。

10、为什么要设置俩个幸存者区
答:为了解决复制算法产生的碎片。

11、对象如何晋升到老年区
答:当伊甸园区满时,触发一次轻GC,把存活下来的对象放进幸存者区
当幸存者区的对象经历15次GC后则会进入老年区。

12、列举几种JVM参数
答:-Xms8m:设置初始堆的大小为8m
       -Xmx8m:设置最大堆的大小为8m
       -XX:+PrintGCDetails:输出形式

13、GC涉及的算法
答:复制算法、标记清除算法、标记整理算法
复制算法:划分俩个区域,每次只使用一个区域,当垃圾回收时,将使用中的对象复制到另一个区域
标记清除算法:标记所有被引用的对象,清除所有未被引用的对象
标记整理算法:标记所有被引用的对象,清除所有未被引用的对象,将标记的对象压缩到一个堆中


线程与锁

1、什么是线程
答:线程是操作系统能够进行运算调度的最小单位

2、线程与进程的区别
答:进程是执行的应用程序,而线程是进程的一部分。
      一个进程包含多个线程,但一个线程只能属于一个进程。

3、创建线程的方式
答:实现Runnable接口,实现run方法,启动线程
       继承Thread类,重写run方法,启动线程
       实现Callable接口,重写call方法
        使用线程池

4、线程的状态
答:创建---就绪---运行---等待---超时等待---死亡

5、Thread中run()与start()的区别
答:start方法是真正意义上的多线程,而run方法是多线程的线程体

6、什么是锁
答:将某种资源私有化的一种方法

7、锁有几种
答:synchronized、重入锁、读写锁

8、锁的升级机制
答:无锁---偏向锁---轻锁---重锁
无锁:没有对资源进行锁定
偏向锁:对象的代码一直被同一个线程访问
轻锁:在偏向锁基础上被第二个线程访问
重锁:当一个线程获取锁时,其他线程都处于一个等待状态

9、synchronized的用法
答:在非静态方法上:锁对象
       在静态方法上:锁类
       在代码块中:锁指定对象

10、乐观锁和悲观锁
答:乐观锁:就是假设不会发生冲突,只在提交的时候检查是否违反数据完整性。主要读多写少
       悲观锁:就是假设每次拿数据都会发生冲突,拿数据的时候都会去检查是否违反数据完整性。主要读少写多

11、什么是死锁
答:俩个进程都在等待对方执行完毕才能继续下去执行,结果就发生了死锁

12、sleep与wait的区别
答:sleep来自Thread,wait来自Object
      sleep没有释放锁,而wait释放了锁


JavaWeb

1、什么是Servlet
答:Servlet是用来处理客服端请求并产生动态网页内容的Java类。

2、Servlet有几种形式
答:实现Servlet接口
       继承GenericServlet,重写servlet方法
       继承HttpServlet,重写doGet和doPost方法

3、Servlet的生命周期
答:加载、实例化、初始化、处理请求、销毁。

4、get和post的区别
答:get是用来从服务器上获取数据,而post是用来向服务器传递数据
      get是不安全的,因为传输过程中,数据被放在请求的URL上

5、传统JavaWeb开发流程
答:前端JSP访问后端Servlet,Servlet--Service--Dao--获取数据库数据

6、什么是cookie
答:cookie是Web服务器发送给浏览器的一块信息,浏览器会在本地文件中存储cookie。

7、session与cookie的区别
答:cookie数据存放在浏览器上,session数据存放在服务器上。

8、状态码表示的意思
答:200:请求成功
       300:转发或重定向
       401:未授权
       404:找不到资源
       500:服务器错误


MySQL

1、数据库的ACID特性
答:ACID指事务的:原子性、一致性、隔离性、持久性。

2、常见的SQL优化
答:在表中建立索引,优先考虑where、group by使用到的字段。
      尽量避免使用select *,因为会返回无用字段降低查询效率。

3、SQL语句
答:查找最新一条数据:order by 字段 desc limit 1
       模糊查询:%表示0或多个字符  _表示单个字符  []表示包括括号内的字符
      A表中所有字段,B表中部分字段连查:left join
      B表中所有字段,A表中部分字段连查:right join

4、什么是索引
答:索引是帮助MySQL高效获取数据的数据结构。

5、索引的四大分类
答:主键索引(primary key):唯一的标识,主键不可重复,只能有一列作为主键
       唯一索引(unique key):避免重复的列出现
       常规索引(key):默认的
       全文索引(fulltext):快速定位数据

6、什么时候该使用索引
答:数据量大的时候,加在常用来查询的字段上。

7、导致索引失效的语句
答:使用like关键字时,%放在前面索引不起作用,只有%不在第一位置,索引才会生效
       尽量避免在where子句中使用!=或><操作符,否则引擎将会放弃使用索引而进行全表扫描
       尽量避免在where子句中对字段进行函数操作,否则引擎将会放弃使用索引而进行全表扫描

8、俩表联查的几种方法
答:join
      在where条件后的 in 再写一个查询语句
       在where条件后的 EXISTS 再写一个查询语句

9、#{}与${}的区别
答:#{}是预编译处理、${}是字符串替换
      #{}更安全,可以防止SQL注入

10、MyBatis是如何进行分页
答:MyBatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。

11、MyBatis动态SQL
答:MyBatis动态SQL可以在Xml映射文件内,以标签的形式编写动态SQL,通过完成逻辑判断并动态拼接sql。
MyBatis提供九种SQL标签:trim、where、set、foreach、if、choose、when、otherwise、bind

12、MyBatis多表查询的使用
答:在XML映射文件中,使用resultMap标签。如果字段中有对象,可以在resultMap内使用collection标签。
使用association标签,嵌套XML映射文件中其他查询语句,只要填入对应的id。

13、mybatis的执行流程
答:实例化SqlSessionFactoryBuilder,创建SqlSessionFactory
      通过SqlSessionFactory创建SqlSession
      通过sqlsession执行数据库操作
      调用session.commit()提交事务
      关闭sqlsession

14、mybatis事务
答:编程式事务和声明式事务
编程式事务:需要在代码中,进行事务的管理。
声明式事务:类似AOP的应用,代码是横切进去的,不影响原有代码。

15、为什么需要事务
答:如果不配置事务,可能存在数据提交不一致的情况。我们需要保证数据的ACID原则。

16、mybatis与mybatis-plus的区别
答:mybatis-plus在mybatis基础上做了增强,却不做改变。
      mybatis-plus使用过程中可以减少mybatis中的CRUD的编写
    提高了开发效率,弥补了mybatis的不足

Spring

1、Spring七大模块
答:Core(核心模块)、AOP、ORM、DAO、Web、Context、WebMVC

2、IOC与AOP
答:IOC控制反转:A类与B类存在联系,B类想获取A类的对象,需要主动创建。有了SpringIOC之后,就是将对象的创建权交给Spring容器,
由容器控制程序之间的依赖关系,这样B类想获取A类的对象,就是由Spring容器给予获得。
       AOP面向切面编程:可以把几个类中共有的代码,提取到一个切片中,等到需要时再切入到指定对象的指定位置中去,从而改变原有的行为。
提高代码可用性、降低代码量、提高开发效率。AOP有三种应用场景:使用SpringAPI提供的接口、自定义类、注解。

3、IOC有什么作用
答:管理对象的创建和依赖关系的维护。
      解耦

4、SpringMVC的执行流程
答:用户发送请求时会经过一个前端控制器(DispatcherServlet),前端控制器会根据请求找映射器,然后返回给前端控制器,
前端控制器再请求适配器执行,适配器再找到具体的控制器,控制器返回一个ModelAndView给前端控制器,
前端控制器将ModelAndView发送给视图解析器,视图解析器返回对应的View给用户。

5、SpringBoot自动装配原理
答:SpringBoot所有的自动配置都是在启动的时候被扫描并加载。扫描spring.factories所有的自动配置类都在这里面,但是不一定生效,
要判断条件是否成立,只要导入了对应的starter,就会有对应的启动器,有了启动器,我们装配就会生效。然后就配置成功了!

6、SpringBoot三大核心注解
答:Configuration、EnableAutoConfiguration、ComponentScan
Configuration:配置组件
EnableAutoConfiguration:开启自动配置
ComponentScan:开启组件扫描

6、SpringBoot中涉及的涉及模式
答:涉及了九种涉及模式。分别是:
抽象工厂、工厂方法、单例模式、适配器模式、装饰器模式、代理模式、观察者模式、策略模式、模板方法模式。

7、说自己有使用过的设计模式
答:单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点,Spring中的bean默认都是单例的
       代理模式:为其他对象提供一种代理,以控制对这个对象的访问,Spring中的AOP就是类似的原理

8、Spring、SpringMVC、SpringBoot联系与区别
答:Spring框架就像一个家族,衍生出很多例如SpringMVC、SpringBoot等,但它们的基础都是Spring的IOC和AOP
SpringMVC是Spring的一个模块式的web框架,围绕DispatcherServlet。
SpringBoot为了简化Spring的配置流程,约定优于配置。


TCP/IP

1、什么是三次握手
答:客户端向服务器发送SYN同步报文段,请求建立连接
       服务器确认收到客户端的连接请求,表示同意向客户端建立连接
       客户端收到服务器端的确认请求后,确认同步报文段,确认连接。
      
2、什么是四次挥手
答:A端向B端发送FIN结束报文段,准备关闭连接
      B端确认A端FIN结束报文段,表示已经收到关闭连接请求
      B端向A端发送FIN结束报文段,准备关闭连接
      A端确认B端FIN结束报文段,A端退出连接

3、为什么要进行三次握手
答:同步初始化与序列、防止重复连接

4、TCP与UDP的区别
答:TCP是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接,类似场景如:打电话
      UDP是一个非连接协议,传输数据时不建立连接,类似场景如:发信息

5、HTTP与HTTPS的区别
答:HTTP是超文本传输协议,信息是明文传输的,HTTPS是加密传输协议,因为在HTTP为基础上加入了SSL层。
       HTTP端口为:80    HTTPS端口为:443

6、网络分层架构,简要说明
答:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层
物理层:为数据端设备提供原始比特流的传输通路
数据链路层:在通信的实体间建立数据链路连接
网络层:为数据在结点之间传输创建逻辑链路,并分组转发数据
传输层:提供应用进程之间的逻辑通信
会话层:建立端连接并提供访问验证和会话管理
表示层:提供数据格式转换服务
应用层:访问网络服务的接口


算法

1、冒泡排序 
答:重复比较相邻的俩个元素。每次外层循环完,最后一个数都是最大的。内层循环则是置换相邻的俩个数

2、选择排序
答:分为无序区和有序去,每次循环把无序区最小的数添加至有序区
    
3、插入排序
答:取出第一个元素放入有序区,将无序区的下一个元素,与有序区的对比,放到对应的位置

4、归并排序
答:把序列分为若干组,每个数字分一组。将若干个组俩俩合并比较,直至合成为一组

5、快速排序
答:选定一个数为中心轴,将无序区中所有小于这个数的放在右边,将无序区中所有大于这个数的放在左边
分别对左右子序列重复操作。

Linux

1、基本命令、文件增删改查、磁盘调度、查看进程
答:https://blog.csdn.net/okForrest27/article/details/107032880?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163981763116780265432012%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163981763116780265432012&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-107032880.pc_search_em_sort&utm_term=%E7%8B%82%E7%A5%9E%E8%AF%B4linux%E7%AC%94%E8%AE%B0&spm=1018.2226.3001.4187


Redis

1、什么是Redis
答:远程字典服务

2、为什么要用Redis
答:因为在数据量大的时候,我们查询每次都要去访问数据库,而有了redis,就可以把数据放在缓存中
每次只要访问缓存即可,大大提高了系统访问的效率。

3、什么时候用Redis
答:不需要实时更新但是又极其消耗数据库的数据
       在某个时刻访问量极大而且更新也很频繁的数据

4、Redis事务
答:通过multi指令开启事务,之后命令入队,使用exec执行事务

5、Redis是单线程还是多线程,为什么
答:单线程。Redis是将所有的数据存放在内存中的,所以说使用单线程去操作效率就是最高的。

6、Redis的基本数据类型
答:String、List、Set、Hash、Zset

7、什么是Redis持久化
答:持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

8、持久化的机制是什么
答:RDB和AOF。默认是RDB
RDB:类似于快照,按照redis.conf配置文件中的设置自动保存。
AOF:通过记录redis的命令去记录数据库的变更,然后持久化到文件中


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值