培训首页  >  JAVA新闻  >  分享一些java后端面试题
沈阳Java零基础培训班4月火爆招生

分享一些java后端面试题

来源:

沈阳市和平区爱尚职业培训机构

    发表于:2022-08-16 16:09:45   27次浏览
相关标签: JAVA培训   沈阳JAVA培训

1、常用的状态码

200,请求正常处理;301,重定向;401未;403访问拒绝;404未找到资源;500服务器内部错误。4开头的状态码,后端接口接正确时,一般时前端出问题;5开头的状态码,一般都是后端的问题。

2、垃圾回收,JVM常用参数

将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、老年代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停

对新生代的对象收集称为minor GC

对老生代的对象收集称为full GC

程序中主动调用System.gc()强制执行的GC为full GC。

Xms堆内存的小大小,默认为物理内存的1/64

Xmx堆内存的大大小,默认为物理内存的1/4

Xmn堆内新生代的大小,通过这个值也可以得到老生代的大小:Xmx减去Xmn。

3、TCP传输可靠性怎么保证怎么保证

01、字节编号机制,为了更好的发送和接收;

02、数据段的确认机制,确认应答机制;

03、TCP超时重传机制,保证传输可靠性的一种重要保证。

4、TCP握手为什么不能是2次

(1)主要是为了防止已经失效的连接请求报文突然又传动到了服务器,从而导致不必要的错误和资源的浪费。

(2)两次握手只能保证单项连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,才能确保双向都可以接收到对方发送的数据。

5、char和byte区别:一个字符类型,无符号型的,占2个字节(Unicode码),Java用char来表示一个字符;一个是字节类型,有符号型,占1个字节。

6、int和byte能否相互转换,强制转换会有精度损失

可以相互转换,byte占1字节,而int占用4个字节,不会照成精度损失。

7、数组和链表的区别:数组是连续的内存空间,适合通过索引查找,查找和修改比较方便;链表不一定是连续的内存空间,添加和删除比较方便。

8、红黑树的特点

解决平衡二叉查找树的缺点:不适合需要大量插入、删除和查找的场景,需要左旋和右旋来保证平衡,引入红黑树,每条路径的节点数相同,红色节点不能相同,时间复杂度O(logn)。红黑树的特性:红黑树是近似平衡的二叉查找树,支持的查找、插入和删除元素,查找删除和插入的效率稳定。红黑树更适合应对实际开发过程中的复杂场景。

9、父节点为红,子节点还能是红色吗

不可以,需要把红色节点先变成。

10、排序算法哪些是稳定的,稳定性体现在相同数字在排序之后后面的不会出现到前面

稳定算法:插入排序、冒泡排序、归并排序、基数排序;不稳定算法:希尔排序、选择排序、堆排序、排序。

11、常用的锁有哪些

互斥锁、自旋锁、读写锁、乐观锁与悲观锁

12、三大范式

范式:要求一张表中的每一列是不可分割的原子数据

第二范式:部分依赖,要求一张表中的每一列都完全依赖于主键(针对于组合主键),也就是不会出现某一列只和部分主键相关;

第三范式:传递依赖,要求一张表中的每一列都和主键是直接依赖的,不是间接依赖。

13、数据库乐观锁和悲观锁,如何实现?

悲观锁:

①悲观锁总是认为数据会被其他线程修改,所以在修改前强制加锁,使其他线程阻塞等待,具有强烈的独占和排他特性。

②传统的关系型数据库的行锁,表锁,读锁,写锁等,以及Java中synchronized关键字都是悲观锁的实现。

③悲观锁比较适用于写多读少的情况(多写场景)。

乐观锁:

①乐观锁认为在一般情况下数据不会被其他线程修改,所以在修改前不会加锁,而是在数据提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。

②乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性,如加版本号字段、AtomicInteger类的CAS(比较并交换)、MySQL中InnoDB的MVCC(多版本控制)机制等都是乐观锁的实现。

③乐观锁比较适用于读多写少的情况(多读场景)。

14、数据库的主键是怎么设置的?

通过primary key关键字来。

15、设计模式有哪些?单例模式、工厂模式,单例模式怎么实现?spring中的单例模式和普通单例模式有什么区别?

单例模式:枚举实现、静态内部类实现、利用Spring的依赖注入能力实现单例、双重检查锁。Spring中的单例模式和普通单例模式的区别:spring中的单例是相对于容器,即在ApplicationContext中是单例的。而平常所说的单例是相对于JVM的。另一个JVM可以有多个Spring容器,而且Spring中的单例也只是按bean的id来区分的。

16、线程的创建方式:

三种方式:①继承thread类,②实现Runnable()接口,都是重写Run方法;③通过Callable和Future创建线程,实现call方法。

17、创建一个线程一般用哪种方式:

一般继承thread类,重写run方法

18、线程池的七大参数:

corePollSize:核心线程数;maximumPoolSize:大线程数;keepAliveTime:空闲线程存活时间;TimeUnit: 时间单位;BlockingQueue: 线程池任务队列;ThreadFactory: 创建线程工厂;RejectedExecutionHandler: 拒绝策略

19、线程池的工作流程:

20、sleep和wait的区别

都是用来进行线程控制,他们大本质的区别是:sleep不释放同步锁,使用时间自动唤醒,可以用interrupt()来强行打断;wait释放同步锁,可以直接用notify()直接唤醒;sleep是thread类的静态方法。1,这两个方法来自不同的类分别是Thread和Object 2,主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。3,wait,notify和notify All只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

21、spring的IOC和AOP的理解

IOC,即控制反转,把对象的创建、初始化、销毁交给Spring来管理

AOP,面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通俗的说就是不用修改源代码,在主干功能里面添加新功能。

22、spring中的bean单例和多例,以及为什么用多例,什么情况下使用多例

对象含有可改变状态时,则使用多例,否则使用单例;单例可以提高性能。

23、单例模式怎么保证线程安全,volatile是防止指令重排

①加锁;②静态对象在类加载中被初始化了,loadClass对象加了锁

24、MySQL一条语句查询慢是什么原因以及如何排查

原因:①电脑系统内存不足;②网络突然降速了;③所写的SQL语句不是优解

解决方案:两条快于一条;精准快于全表;建立索引;

25、spring和spring boot的区别

(1)spring boot提供极其和简化的操作,让Spring开发者上手

(2)spring boot提供了spring运行的默认配置

(3)spring boot为通用spring项目提供了很多的非功能性特性

26、mybatis的取参方式,传参方式

有两种取参方式:${}和#{};${}本质是字符串拼接,若为字符串或者日期类型的话需要使用单引号;#{}本质是占位符赋值,若为字符串类型或者日期类型时,可以自动添加单引号。

传参:①顺序传递,②@Param传递参数,③map集合传递参数,④JavaBean的实体类传递,⑤集合类型参数List传递。

27、bean的注入方式

(1)Autowired注入方式、(2)构造方法注入、(3)@Bean方法形参注入、(4)直接在@Bean方法上使用@ConfigurationProperties(prefix=“jdbc”)

28、spring的两大思想IOC和AOP,AOP的实现方式

IOC控制反转,将对象的创建交给Spring容器去创建,只需要在spring的配置文件里配置相应的 bean,以及设置相关的属性,让spring容器生成类的实例对象以及管理对象。不需要new,大大降低了代码间的耦合度,使资源更加容易管理。

AOP,面向切面编程,利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。通俗的说就是不用修改源代码,在主干功能里面添加新功能。

AOP的实现方式,基于接口方式的实现;基于Aspectj的方式实现。

29、springMVC的执行流程

1)用户向服务器发送请求,请求被springmvc前端控制器dispatcherSevlet捕获

2)DispatcherServlet对请求URL进行解析,得到请求资源标识符,判断请求URL对应的映射。

3)根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。

4)DispatcherServlet根据获得的handler,选择一个的handlerAdapter。

5)如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler()方法

6)提取request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作。

7)Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象

8)此时将开始执行拦截器的postHandler()方法

9)根据返回的ModelAndView选择合适的ViewResolver进行试图解析,根据Model和View,来渲染视图。

10)渲染视图完毕执行拦截器的afterCompletion()方法。

11)将渲染结果返回给客户端。

30、序列化和反射是什么,序列化接口实现

反射指的是程序运行时透过反射API可以取得任何一个类的内部信息,包括修饰符、变量类型,返回类型,字段、方法等,并可以在运行时改变字段和唤醒方法。

序列化就是用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。为了解决在对对象进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需 要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的, 然后使用一个输出流(如:FileOutputStream)来构造一个 ObjectOutputStream(对 象流)对象,接着,使用 ObjectOutputStream 对象的 writeObject(Object obj)方 法就可以将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。

31、三大特性封装、继承、多态

1)封装是指把一个对象的状态(属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。但是可以提供一些可以被外部访问的方法来操作属性。

2)继承拓展已存在的代码模块,目的是为了代码复用。

3)多态:对象的编译时类型和运行时类型不一致,具体表现为父类的引用指向子类的实例。JAVA引用变量有两个类型(编译时类型和运行时类型)。其中,编译时类型由声明该变量时使用的类型(父类)决定,运行时类型由实际赋给该变量的对象决定(子类)。

32、list、set、map区别

线性表、集合(不能重复),map是k-v类型

33、接口和抽象类区别:

(1)抽象类要被子类继承,接口类要被类实现

(2)接口只能做方法声明,抽象类可以做方法实现

(3)接口里定义的变量只能是公共的静态常量,抽象类中的变量是普通变量

(4)接口是设计的结果,抽象类是重构的结果

(5)抽象类和接口都是用来抽象具体对象,接口的抽象高

(6)抽象类可以有具体的方法和属性,接口只能抽象方法和不可变常量

(7)抽象类主要用来抽象类别,接口主要用来抽象功能

34、JDK1.7和1.8接口的改变

Default关键字,接口中使用它定义方法体,实现类可以直接调用。

Lambda表达式,函数式编程,抽象程度很高的编程范式,纯粹的函数式编程语言编写函数没有变量。

函数式接口,局部变量限制。

35、redis的五大基本类型:

String字符串、List列表、Hash散列(value本身又是键值对)、set集合、zset有序集合

36、redis的两种持久化方式

(1)RDB将数据库中的数据定期以快照的方式存储到磁盘,保存到rdb中,并在启动时自动加载rdb文件,以达到持久化的需要;它的优点呢是数据恢复,缺点是保存不是实时产生的。会在设置的时间内进行保存。

(2)AOF,把每一次的操作都记录到一个文件中,当redis进行重启时会将AOF文件中所有操作都执行一遍,确保恢复数据。需要开启,也有设置;优点是任何写的数据不会丢失,缺点是文件大,耗能高,数据恢复,冗余多。

37、redis的默认持久化方式:

默认是RDB持久化方式

38、redis中的删除策略:

定时删除(时间换空间)、惰性删除(内存占用严重、空间换时间)、定期删除(随机清理删除)

39、ACID四大特性

原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

一致性:数据库总是从一个一致性状态转移到另一个一致性的状态。一致性确保了即使在执行第三、第四条语句之间时系统崩溃,前面执行的、第二条语句也不会生效,因为事务最终没有提交,所有事务中所作的修改也不会保存到数据库中。

隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

持续性:指一个事务一旦提交,它对数据库中的数据的改变就应该是性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

40、四个隔离、MySQL的默认隔离:默认隔离是可重复读。

序列化:如果隔离为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离提供了事务之间大限度的隔离。

可重复读:在可重复读在这一隔离上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。

提交读:READ COMMITTED 隔离的安全性比 REPEATABLE READ 隔离的安全性要差。处于 READ COMMITTED 的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果。

未提交读:READ UNCOMMITTED 提供了事务之间小限度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化。

41、聚簇索引和非聚簇索引区别:

聚簇索引:并不是一种单独的索引类型,而是一种数据存储方式。当表有了聚簇索引的时候,表的数据行都存放在索引树的叶子页中。无法把数据行放到两个不同的地方,所以一张表只允许有一个聚簇索引。InnoDB的聚簇索引实际上是将索引和数据保存中同一个B-Tree中。InnoDB通过主键聚集数据,如果没有定义主键,InnoDB会选择一个的的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

非聚簇索引:又叫二级索引。二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。

42、left join和inner join:

左连接:在 LEFT JOIN 左边的表里面数据全被全部查出来,右边的数据只会查出符合ON后面的符合条件的数据,不符合的会用NULL代替。

内连接:相当于左连接与右连接的合并,去掉所有含NULL的数据行,剩下的就是查询出来的数据了。其实就是两边的表都必须满足条件。

43、线程和进程的区别:

(1)进程是资源分配的小单位,线程是程序执行的小单位

(2)进程有自己的独立地址空间,每启动一个进程,系统就会自动为它分配地址空间,建立数据库表来维护代码段、堆栈段和数据段;线程是共享进程中的数据,使用相同的地址空间,因此CPU切换一个线程花费要更小,同时创建线程的花费也更小。

(3)线程之间通信更方便,同一进程下的线程共享全局变量、静态变量等数据;而进程之间的通信是以通信的方式进行。多线程要解决同步和互斥问题;

(4)多进程程序更加健壮,多线程程序只要一个线程死掉,整个进程就会死掉;而一个进程死掉并不会对另一个进程造成影响。

44、线程的几种状态:

新建(new):创建新线程、就绪(runnable):调用线程start方法、运行(running):获取cpu时间片,执行程序代码、阻塞(block):等待阻塞,同步阻塞(synchronized),其他阻塞(sleep(),join())、死亡(dead):结束线程,或是异常退出,其实通过thread类可以知道到其实还有一种状态是terminal(中止);线程首先被new创建,进入初始状态,然后线程调用start方法,进入就绪状态。这里要注意,线程只要了cpu时间片,可以不用获取全部的锁就可以运行,但是当运行到需要的锁没有获得时,会进入阻塞状态。

当一个线程被sleep后,线程会先进入超时等待状态,当时间结束后,会先进入等待阻塞状态,当有锁以后再进入就绪状态。

45、线程池的实现方式

1、newCachedThreadPool类,创建一个线程池,如果线程池中的线程数量过大,它可以有效的回收多余的线程,如果线程不足,那么它可以创建新的线程。

2、newFixedThreadPool,这种方式可以线程池中的线程数。数满之后需要排队等候。

3、newScheduledThreadPool,该线程池支持定时,以及周期性的任务执行,我们可以延迟任务的执行时间,也可以设置一个周期性的时间让任务重复执行。

4、newSingleThreadExecutor,这是一个单线程,至始至终都由一个线程来执行。

5、ThreadPoolTaskExecutor,这是spring包下的,是spring为我们提供的线程池类。

46、线程池的拒绝处理策略:

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。ThreadPoolExecutor.DiscardPolicy:丢弃任务,但是不抛出异常。ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列前面的任务,然后重新提交被拒绝的任务 ThreadPoolExecutor.CallerRunsPolicy:由调用线程(提交任务的线程)处理该任务

47、MQ了解吗:

Kafka

优点:吞吐量非常大,性能非常好,集群高可用。

缺点:会丢数据,功能比较单一

使用场景:日志分析、大数据采集

RebbitMQ

优点:消息可靠性高,功能。

缺点:吞吐量比较低,消息积累会严重影响性能。erlang语言不好定制。

使用场景:小规模场景。

RocketMQ (阿里产品)

优点:高吞吐、高性能、高可用,功能非常。

缺点:开源版功能不如云上商业版。文档和周边生态还不够成熟。客户端只支持java

使用场景:几乎是全场景。

48、Linux了解吗:

上过这个课,安装系统,会一些简单的命令,多用户多任务的操作系统。

沈阳爱尚实训开设JAVA,前端,UED,Python、大数据、新媒体等课程。5-10人小班教学,90天全程面授、课程每年同步名企需求、大厂项目案例、双五导师(5年以上名企+培训经验)授课、全流程团队开发、闯关式教育、双平台(OTO)巩固学习、就业薪水高,毕业一周内名企录取通知任您选、一次交费学会为止、老学员训练营助力职场技能提升、终身跳槽服务,详情可查看“沈阳爱尚实训”。


文中图片素材来源网络,如有侵权请联系删除

分享一些java后端面试题原创内容,请点击 沈阳JAVA培训

  • Adobe认证
  • Oracle认证
  • 思科认证
  • 微软认证
  • Linux认证
  • 其他
  • 职业技能提升
  • 考证找工作
  • 兴趣爱好
  • 周末班
  • 全日制白班
  • 随到随学

热门课程

  • java编程速成就业班

    询价

  • Java全栈工程师培训

    询价

  • web前端工程师零基础培训班

    询价

  • 沈阳java零基础就业班

    询价

  • javaweb实战课程

    询价