一年经验Java开发0713面试,BAT常见的20道Java面试题详解

本文介绍了Java中的线程池创建、用户列表根据年龄排序的方法,包括Spring的线程池使用、Java8的Collections.sort和StreamAPI,以及JWT认证和数据库事务的原理。还涉及到了查询优化和Linux命令的实用技巧,以及ActiveMQ、Kafka和RabbitMQ等分布式技术的学习资源。
摘要由CSDN通过智能技术生成

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()

.setNameFormat(“consumer-queue-thread-%d”).build();

ExecutorService pool = new ThreadPoolExecutor(5, 5, 0L, TimeUnit.MILLISECONDS,

new ArrayBlockingQueue(5),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());

return pool ;

}

}

使用时:

@Resource(name = “consumerQueueThreadPool”)

private ExecutorService consumerQueueThreadPool;

@Override

public void execute() {

//消费队列

for (int i = 0; i < 5; i++) {

consumerQueueThreadPool.execute(new ConsumerQueueThread());

}

}

其实也挺简单,就是创建了一个线程池的 bean,在使用时直接从 Spring 中取出即可。

假如有一个List,其中存的是用户User对象,用户对象有很多属性,我要根据其中的年龄属性对List排序,这个该怎么办?

==============================================================================================================================

可以通过Collections类的sort方法。但需要注意,使用sort方法的时候:

  • 要么 User类实现Comparable接口,并在类中编写public int compareTo(T o)方法

public class User implements Comparable {

private int age;

private String name;

private String sex;

@Override

public int compareTo(User o) {

if (this.getAge() > o.getAge()) {

return 1;

} else if (this.getAge() < o.getAge()) {

return -1;

} else {

return 0;

}

}

// ……

}

List userList=new ArrayList();

userList.add(new User(10, “王二”, “男”));

userList.add(new User(8, “张三”, “男”));

userList.add(new User(17, “李四”, “女”));

Collections.sort(userList);

System.out.println(userList);

  • 或者在排序的时候,给sort()方法传入一个比较器。具体来说,就是传入一个实现比较器接口的匿名内部类。

List userList=new ArrayList();

userList.add(new User(10, “王二”, “男”));

userList.add(new User(8, “张三”, “男”));

userList.add(new User(17, “李四”, “女”));

//Collections.sort(userList);

Collections.sort(userList, new Comparator() {

@Override

public int compare(User o1,User o2) {

if(o1.getAge()>o2.getAge()) {

return 1;

}else if(o1.getAge()<o2.getAge()) {

return -1;

}else {

return 0;

}

}

});

System.out.println(userList);

在Java8以后可以使用Lamda表达式来进行函数式地编程:

userList.sort((a, b) -> Integer.compare(a.getAge(), b.getAge()));

jdk 1.8的Stream用的多吗?

=====================================================================================

Stream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不相关的东西。

Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。

下面是使用流的过程:

在这里插入图片描述

下面是一个使用流的实例,用于List的迭代:

List stringList = new ArrayList();

stringList.add(“one”);

stringList.add(“two”);

stringList.add(“three”);

stringList.add(“one”);

Stream stream = stringList.stream();

stream.forEach( element -> { System.out.println(element); });

JWT知道吗?

=========================================================================

JSON Web Token(缩写 JWT)是目前最流行的跨域认证解决方案。

传统的session认证一般是这样的流程:

  • 1、用户向服务器发送用户名和密码。

  • 2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色、登录时间等等。

  • 3、服务器向用户返回一个 session_id,写入用户的 Cookie。

  • 4、用户随后的每一次请求,都会通过 Cookie,将 session_id 传回服务器。

  • 5、服务器收到 session_id,找到前期保存的数据,由此得知用户的身份。

在这里插入图片描述

这种模式的问题在于,扩展性(scaling)不好。单机当然没有问题,如果是服务器集群,或者是跨域的服务导向架构,就要求 session 数据共享,每台服务器都能够读取 session。

一种解决方案是 session共享,将session持久化或者存入缓存。各种服务收到请求后,都向持久层或缓存请求数据。这种方案的优点是架构清晰,缺点是工程量比较大。另外,持久层或者缓存万一挂了,就会认证失败。

另一种方案是服务器索性不保存 session 数据了,所有数据都保存在客户端,每次请求都发回服务器。JWT 就是这种方案的一个代表。

JWT认证流程:

  • 1、 用户使用账号和密码发出post请求;

  • 2、 服务器使用私钥创建一个jwt;

  • 3、 服务器返回这个jwt给浏览器;

  • 4、 浏览器将该jwt串在请求头中像服务器发送请求;

  • 5、 服务器验证该jwt;

  • 6、 返回响应的资源给浏览器。

在这里插入图片描述

数据库事务知道吗?

===========================================================================

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作, 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行 。

事务是一个不可分割的工作逻辑单元事务必须具备以下四个属性,简称 ACID 属性:

  • 原子性(Atomicity) :事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。

  • 一致性(Consistency): 当事务完成时,数据必须处于一致状态。

  • 隔离性(Isolation) :对数据进行修改的所有并发事务是彼此隔离的, 这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。

  • 永久性(Durability) : 事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性

你写的代码用到事务吗?

=============================================================================

通过在方法加注解 @Transactional 来实现声明式的事务。

Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于 @Transactional 注解的方式。

常用的检索优化方式有哪些?

===============================================================================

  • 1、查询语句中不要使用select *

  • 2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代

  • 3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代

  • 4、or 的查询尽量用 union或者union all 代替(在确认没有重复数据或者不用剔除重复数据时,union all会更好)

  • 5、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

  • 6、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

Linux了解多少?

============================================================================

(这里应该是想问用过的命令)日产工作中,下面这些命令经常用到:

  • 查看当前目录:pwd

  • 切换目录 : cd

  • 查看目录下的文件 :ls/ls -lh

  • 创建目录:mkdir

  • 启动war包:java -jar xx.war

  • 后台启动war包:nohup java -jar * xx.war&

  • 查找进程:ps –aux|grep java

  • 杀死进程:kill -9 pid

参考:

【1】:SpringBoot学习笔记(十一:使用MongoDB存储文件 )

【2】:GridFS 基于 MongoDB 的分布式文件存储系统

【3】:Linux下shell脚本实现mongodb定时自动备份

【4】:Mybatis中#{}和${}的区别是什么

【5】:Redis五种数据类型及应用场景

【6】:Redis五种数据类型及应用场景

【7】:面试官:说说什么是线程安全?一图带你了解java线程安全

【8】:如何优雅的使用和理解线程池
【9】:深入理解 Java 线程池:ThreadPoolExecutor

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

image.png

  • RabbitMQ实战指南

image.png

  • 手写RocketMQ笔记

image.png

  • 手写“Kafka笔记”

image

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦
-j5p2E93Y-1711812643766)]

最后总结

ActiveMQ+Kafka+RabbitMQ学习笔记PDF

[外链图片转存中…(img-Q6B1zJ2G-1711812643767)]

  • RabbitMQ实战指南

[外链图片转存中…(img-gVOxUwPx-1711812643767)]

  • 手写RocketMQ笔记

[外链图片转存中…(img-XOY2KCqf-1711812643767)]

  • 手写“Kafka笔记”

[外链图片转存中…(img-hfrOGwxM-1711812643768)]

关于分布式,限流+缓存+缓存,这三大技术(包含:ZooKeeper+Nginx+MongoDB+memcached+Redis+ActiveMQ+Kafka+RabbitMQ)等等。这些相关的面试也好,还有手写以及学习的笔记PDF,都是啃透分布式技术必不可少的宝藏。以上的每一个专题每一个小分类都有相关的介绍,并且小编也已经将其整理成PDF啦

  • 20
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值