SteveCode21年Java后端面试汇总

154 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  • 个人简介:微信公众号关注:SteveCode。为您分享更多的知识学术。生于忧患死于安乐
  • 专注Java技术干货分享,Java基础技术、数据结构、相关工具、Spring全家桶、intellij idea......

select (case when a>b when a else b end) as 列名,(case when b>c whenb b else b end) as 列名 form 表名 ;

第一次面试:

1、String 值得比较与分析为什么。

“==” 判断的是地址值,equals()方法判断的是内容。

引用在栈里面,堆里面存的都是内容(值)

image.png

1.     如果两个对象equals相等,那么这两个对象的HashCode一定也相同

2.     如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置

== 的作用:

基本数据类型: byte,short,char,int,long,float,double,boolean,比较他们的值

引用类型:比较堆内存的地址值

equals 的作用:

  引用类型:默认情况下,比较的是地址值。

String的equals()==:

String类中被复写的equals()方法其实是比较两个字符串的内容

String s = "hello"; String s1 = "hello"; System.out.println(s==s1);//true 指向同一常量池

  image.png

l   ==:比较的是两个字符串内存地址(堆内存)的数值是否相等,属于数值比较;

l   equals():比较的是两个字符串的内容,属于内容比较。

当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的

值相同的对象,如果有就把它赋给当前引用。String 的 equals方法比较的是对象的值。

blog.csdn.net/qq_36522306…

2、循环遍历的方式哪几种?

普通for

for(int i =0;i<list.size;i++){     sout(list.get(i)) } 先定义一个变量i ,i<list的大小,i++

增强for

for(类型 变量 : 需要遍历的集合){     sout(变量) }

迭代器

例如: Iterator iterator = list.iterator();     while(iterator.hsahNext()){         sout(iterator.next());     }

 

public class MyList {     public static void main(String[] args) {         List list = new ArrayList<>();         list.add(1);         list.add(2);         list.add(3);         for (int i = 0; i < list.size(); i++) {             System.out.println(list.get(i));         }         System.out.println("-------------------");         for (Integer i : list) {             System.out.println(i);         }         System.out.println("--------------------");         Iterator iterator = list.iterator();         while (iterator.hasNext()) {             System.out.println(iterator.next());         }     } }

4、遍历Map集合进行遍历的语法

public static class MyMapFor {     public static void main(String[] args) {         Map<Integer, String> map = new HashMap<>();         map.put(1, "song");         map.put(2, "xian");         map.put(3, "yang");         for (Integer integer : map.keySet()) {             System.out.println(map.get(integer));         }         for (Map.Entry<Integer, String> entry : map.entrySet()) {             System.out.println(entry.getKey()+"值"+entry.getValue());         }         Set<Map.Entry<Integer, String>> entries = map.entrySet();         Iterator<Map.Entry<Integer, String>> iterator = entries.iterator();         while (iterator.hasNext()) {             Map.Entry<Integer, String> next = iterator.next();             System.out.println(next.getKey()+"value==="+next.getValue());         }         for (Integer i : map.keySet()) {             System.out.println(i);         }         for ( String s: map.values()              ) {             System.out.println(s);         }     } } 输出: song xian yang 1值song 2值xian 3值yang 1value===song 2value===xian 3value===yang 1 2 3 song xian yang

5、有一张表表名叫table 有abc三列,当a>b的时候选择a否则选择b,当b>c的选择b否则选择C用sql来实现

select (case when id > age then id else age end) as i, (case when age > number then age else number end) as o from t_values;

输出: image.png

表设计:

image.png

6、使用Spring boot中与mybatis实现一个关联查询。使用spring boot 和mybatis框架实现。

7、MySQL删除表操作(delete、truncate、drop的区别)

delete dml(关系数据)语言

drop 、 truncate  ddl(关系表结构)语言

truncate清空表,重新建立一个新表、执行速度快;(自增变1)

truncate  table t_values;

drop直接删除表结构。(永久删除)

drop table table_name;

delete可以实现表的部分数据删除,也可以直接删除表中的数据。(保留自增id)

delete from t_values where id=?; delete from table_name;

www.jb51.net/article/175…

8、误删了数据库内容怎么恢复

先备份再恢复

备份与恢复都要再cmd窗口中没有登录的情况下进行

备份单个库

备份命令:MySQLdump -u 用户名 -p 表名 > 存放路径

image.png

备份所有库:

mysqldump -u 用户名 -p --all-detabase > 存放路径

 

使用cmd登录MySQL:

image.png

恢复

mysql -u root -p db1< D:\test.sql 登录MySQL系统: source D:\test.sql

 

联系DBA让他进行恢复。

第二次面试:

Java中想使用redis是调用那个包?如何进行排序?

jedis包

排序:

@Test     public void SortedSetTest()     {         //存放数据         //jedis.lpush("collections", "1", "2", "3", "4", "5", "6", "7", "8", "9");         //获取所有元素         //System.out.println("collections的内容是:"+jedis.lrange("collections",0,-1));         //排序         SortingParams sortingParams = new SortingParams();         //System.out.println("排序后的结果:"+jedis.sort("collections",sortingParams.alpha()));         System.out.println("升序后的结果:"+jedis.sort("collections",sortingParams.asc()));         System.out.println("降序后的结果:"+jedis.sort("collections",sortingParams.desc()));     }

@Transactional 注解放在控制层还是业务服务层?

最好是放在service层,因为改层主要是写业务,出现错误的时候可以回滚。而在这一层会去加载数据资源。

尽量不要放在collection层,因为该层主要是数据进行交互的。如在自己当前的项目中没有service,把大量的业务逻辑都写在collection层里,可以选择加这个@Transactional 注解

第三次面试 软通动力:

cglib是不是final类?

如果委托类被final修饰,那么它不可被继承,即不可被代理。如何这个委托类中有final修饰的方法,那么该方法也不可被代理。

事务的传播行为有那些?

propagation_required如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
propagation_supports支持当前事务,如果没有当前事务,就以非事务方法执行。
propagation_mandatory使用当前事务,如果没有当前事务,就抛出异常。
propagation_required_new新建事务,如果当前存在事务,把当前事务挂起。
propagation_not_supported以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
propagation_never以非事务方式执行操作,如果当前事务存在则抛出异常。
propagation_nested如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作

blog.csdn.net/yanxin1213/…

定义serviceA.methodA()以PROPAGATION_REQUIRED修饰;定义serviceB.methodB()以表格中三种方式修饰;methodA中调用methodB
异常状态PROPAGATION_REQUIRES_NEW***(两个独立事务)***PROPAGATION_NESTED***(B的事务嵌套在A的事务中)***PROPAGATION_REQUIRED***(同一个事务)***
methodA抛异常****methodB正常A回滚,B正常提交A与B一起回滚A与B一起回滚
methodA正常****methodB抛异常1.如果A中捕获B的异常,并没有继续向上抛异常,则B先回滚,A再正常提交;2.如果A未捕获B的异常,默认则会将B的异常向上抛,则B先回滚,A再回滚B先回滚,A再正常提交A与B一起回滚
methodA抛异常****methodB抛异常B先回滚,A再回滚A与B一起回滚A与B一起回滚
methodA正常****methodB正常B先提交,A再提交A与B一起提交A与B一起提交

事务的隔离级别?

3.     读已提交

4.     读未提交

5.     可重复读

6.     串行化

jdk源码(也就是Java基础)

hashmap数据结构是什么?多少长度的时候用红黑树?数组加链表什么情况下会产生hash冲突

Java1.7采用的是 数组加链表

Java1.8采用 数组加链表加红黑树。查询比1.7要快,但是插入删除比较慢。

链表长度为8的时候转为红黑树,当长度为8的时候,概率是:0.00000006。千万分之一的概率,通常情况下不会发生转换。什么时候会发生转换?改变hash算法的策略,实现不好的hashcode方法,就会转换。

在开发中如果内部要实现红黑树,说明有实现不好的hashcode方法。进行改正

hashMap的默认容量及扩容机制?

默认容量为16 * 0.75的负载因子=12。扩容机制是二倍。

IO模型有那些?说说你的理解

阻塞io、非阻塞io、异步io、多路复用io、信号驱动io

hash冲突:两个不同对象,拥有相同的hashCode(两个key的hash值相同)

SpringBoot 启动机制和启动流程。

www.cnblogs.com/xiaopotian/… 从main方法开始:@SpringBootApplication (是一个组合注解),SpringApplication.run @SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan @Configuration本身其实是一个loc容器的配置类,Javaconfig的配置类,配合@bean这个 注解,替代了spring中的xml配置的 @ComponentScan 作用:自动扫描i加载加载符合条件的组件(@Component,@service,等)最终将这些bean加载到springioc容器中。

mq( 重复消费怎么避免、幂等性怎么处理 )。

www.jianshu.com/p/8d1c24287…

redis 持久化机制(一会自己实现一下)

4 、redis 主从复制机制有有了解吗?数据流向是什么样的?

zhuanlan.zhihu.com/p/112213386

数据的复制是单向的,只能由主节点到从节点。

一个主redis会有多个从的redis服务。主redis服务复制写,从redis负责读。

作用:

负载均衡、读写分离、故障恢复、

 

mybatis 中# $区别?

#号对数据加上引号,而$就直接显示数据。

#预编译成一个占位符?。

$一般都是传入一个对象,例如:表名

一级缓存二级缓存

 

MySQL 说说SQL优化,一个表键多个索引可以吗?

7.     尽量不要全表扫描,where 与order by 的列加上索引

8.     尽量避免在where语句后面有查询 null值判断,(导致放弃索引全表扫描)

9.     尽量不要在where语句后面是使用  or (导致放弃索引全表扫描)

使用 union 进行两个表的数据进行连接 UNION 操作符用于合并两个或多个 SELECT 语句的结果集。 SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2

一个表里可以建立多个索引,可以提高表的查询效率,索引越多,查询就越快。但是插入和修改就慢了点,因为插入修改都在不断地更新索引。

 

第4次面试:艾力泰尔

一个“.java”源代码中是否可以包括多个类 (不是内部类)?%有什么限制?

可以有包括多个类,但是只能有一个public来修饰的类,并且类名与文件名保持一致。

说说&与&&的区别?

相同点:

都是逻辑与的运算符,都是如果两边都是true的返回返回成功,如果有一方是false,结果就返回false。

不同点:

&两边都进行判断

&& 先判断第一个条件如果是false就直接返回false。否则,在判断第二个条件,若是true就返回成功。

静态变量与实例变量区别?

语法上:静态变量需要加上static关键字修饰,实例变量不用。

程序运行时区别:实例变量,都是对象的属性,必须创建对象的实例,这样才会给他分配内存空间,才能使用该实例。

静态变量属于类的,也成为类变量。调用方式:类名.变量名

是否可以从一个static方法内部发出对非static方法的调用?

不可以,因为:static方法不用创建对象就可以调用。而非static方法必须由类的引用来调用,前提是已经创建了对象。如果在static中掉用非static方法,他不知道是那个对象的方法。就会报错。

抽象类与接口的区别?

sleep()与wait()的区别?

方法属性上:sleep()是一个静态方法,wait()是一个实例方法。

作用域上:sleep()在Thread中,而wait()在Object类中。

唤醒方式:sleep()使用interrupt()方法,而wait()使用notify()或者notifyAll()来唤醒。

什么是java,如何实现java序列化?或者请解释Serialization接口的作用?

blog.csdn.net/meism5/arti…

序列化:Java对象转换成字节序列的过程。

反序列化:字节序列转换成Java对象的过程。

一边用的序列化都是要把信息保存到磁盘中。

作用:标注该对象是可被序列化的

是什么线程死锁?如何避免线程死锁?如何加一个线程死锁检查机制?

多个线程竞争资源产生的一种僵局现象称为死锁。(线程A持有资源1,而线程B持有资源2,且他们都想获得对方的资源,产生了一种他们之间的相互等待现象)

避免:顺序加锁(线程按照一定的顺序加锁)

    时限加锁(线程加上时间限制,若是超过限制就放弃锁请求)

有 两个表A与B,均有key和value两个字段,如果B的key在A中也有,就把B的value换成A中对应的value?写出Sql语句。

update b set b.value=(select a.value from a where a.key=b.key) where exists(select * from A c where b.key=c.key)

2-19北京浮点科技有限公司

类加载过程

www.cnblogs.com/jxxblogs/p/…

先是一个Java文件 通过Javac编译一次成class二进制文件加载到内存。然后加载、连接【验证、准备、解析】、初始化。

加载:将类的class二进制文件通过用类加载器加载到内存中

连接

验证:确保加载进来的字节流符合虚拟机的规范。不会造成安全错误。

准备:类变量分配内存,赋以初值。【基本数据类型,出值为:0,引用数据类型初值为null,final static tmp = 456, 那么该阶段tmp的初值就是456】

解析:常量池中的符号引用换成直接因引用的过程,【如果调用hello方法地址值为12345,调用hello方法称为符号引用,地址值123456称为直接引用。在解析阶段,虚拟机会把所有的类名,方法名,字段名这些符号引用替换为具体的内存地址或偏移量,也就是直接引用。】

初始化:主要对类的变量进行初始化,是执行构造器的过程。

换句话说,只对static修饰的变量或语句进行初始化。

如果初始化一个类的时候,其父类尚未初始化,则优先初始化其父类。

如果同时包含多个静态变量和静态代码块,则按照自上而下的顺序依次执行。

条件构造器,查询指定字段的值。他的父类是?

blog.csdn.net/bird_tp/art…

QueryWrapper queryWrapper = new QueryWrapper<>();     queryWrapper.select("指定字段");     userMapper.selsctList(queryWrapper);

顶级父类:wapper

下级:AbstractWrapper

QueryWrapper

UpdateWrapper

AbstractLambdaWrapper

LambdaQueryWrapper

LambdaUpdateWrapper

Linux系统压缩包存在哪?那个命令

Java数据结构

Java中有几种常用的数据结构,主要分为Collection和map两个主要接口接口只提供方法,并不提供实现),而程序中最终使用的数据结构是继承自这些接口的数据结构类。

你对Java的理解。Java是用来做什么的。

在电脑上安装jdk,那么电脑就有了jre的Java的运行环境。 有了这个环境就可以运行Java程序了。

做服务端的开发,我们吧Java代码放在服务器上,服务器也就是Linux服务器

Ajax实现原理?

blog.csdn.net/weixin_3758…

用户和服务器之间,加一个中间层(Ajax引擎),只有确定需要从服务器读取新数据时再由Ajax引擎向服务器提交请求。

2-20 艾融软件

分布式事务

blog.csdn.net/zyndev/arti…

image.png

什么是分布式事务:在分布式系统中保证不同节点数据的一致性。

2PC:强一致性

image.png

消息事务--最终一致性:

所谓的消息事务就是基于消息中间件的两阶段提交,本质上是对消息中间件的一种特殊利用,它是将本地事务和发消息放在了一个分布式事务里,保证要么本地操作成功成功并且对外发消息成功,要么两者都失败,开源的RocketMQ就支持这一特性.

该方案采用最终一致的,牺牲了一致性,换来了性能的大幅度提升。存在造成数据不一致的风险

TCC模式 事务的一直性:

try  commit  Cancel 三个操作。例如:用户下单 ---- try(下单的代码) commit( 减库存的代码)如果减库存代码出错,就进入cancel (实现数据回滚)

kafka方面的知识:

消息中间件的一些知识:

mq的应用场景:

blog.csdn.net/wqc19920906…

异步:例如用户下单之后调用短信与邮件接口。

解耦:订单系统调用库存系统

流量销峰:

日志处理 kafka

 

2-20 艾融软件 复试:

索引方面:

索引结构可分:

B+Tree索引

Hash索引

索引失效七大场景:www.cnblogs.com/liehen2046/…

10.   or

11.   不加‘’单引号的时候

12.   like“%***”百分号在前

13.   where  有计算时索引失效

14.   where 后面有函数时 索引失效。

索引类型:

1.普通索引     加锁查询

2.唯一索引     加速查询   列值可以为null

3.主键索引    一个表里只有一个  主键索引  例如id

4.组合索引    多列组合成一个索引,组合搜索效率最佳

5.全文索引    对本文的内容 进行分词进行搜索

2-20 中国中医科学院:

21年10月13:国研软件

15.   MySQL中的函数有那些:

16.   MySQL连接 及作用

17.   索引类型:

1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引

18.   不会走索引的语句:

in() like or

10月23号:

两个集合得交集、并集、差集

www.cnblogs.com/JimShi/p/11…

retainAll()

并集先放到一个集合中,再用set集合来去重

removeAll();

两个没有外键关系的表  使用join连接   打印几条数据?A表两条数据    B表两条数据   

SELECT * from t_user INNER JOIN   role_user on 1=1

image.png

SELECT * from t_user LEFT JOIN  role_user on t_user.id=role_user.user_id WHERE t_user.id=1;

image.png

spring mvc controller层注解有那些?

10月28号:

       get与post区别

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《http请求中get和post方法的区别》,blog.csdn.net/phpwechat/a…

       nacos与open服务之间的调用关系、服务注册到nacos里面的是什么

www.jianshu.com/p/61608ff86…

blog.csdn.net/id5555/arti…

image.png

       为什么要用多线程

可以提升系统处理速度, 代码相对简单 程序处理效率提高 zhuanlan.zhihu.com/p/30985073

 

       线程的几种状态  之间的流程关系

我用#CSDN#这个app发现了有技术含量的博客,小伙伴们求同去《Java线程的6种状态及切换(透彻讲解)》, 一起来围观吧 blog.csdn.net/pange1991/a…

image.png     

image.png

分布式集群下如何做到唯一序列号:

用数据库来维护唯一id 用redis集群部署 生成唯一id 用Java中的UUID 用MySQL中的uuid zookeeper生成uuid mongodb生成id

什么是restful  ?

rest是一种约束条件和设计原则 restful:是满足rest约束条件及原则的一种程序设计,基于http协议来传输数据 blog.csdn.net/fengdijiang… rpc与restful区别:blog.csdn.net/sinat_14826…

线上系统突然变得异常缓慢,你如何查找问题

逐级排查(网络,磁盘,内存,cpu),数据库,日志,中间件等也可通过监控工具排查

如何保证消息不丢失?

消息补偿机制 消息持久化 ack确认机制 集群部署

11月17面试  某公司

springboot异步?

springboot  注解有哪些?

redis数据类型?

redis可以做什么?

创建线程的方式?

创建线程池的方式?

高并发的理解?

事物的隔离级别?

mybatis  # $区别?