常见的50道java面试题及答案【java学习+面试指南】(十)

Dubbo必须依赖的包有哪些?

Dubbo 必须依赖 JDK,其他为可选。

常见的同步工具类?

CountDownLatch:递减计数器闭锁,直到达到某个条件时才放行,多线程可以调用await方法一直阻塞,直到计数器递减为零。比如我们连接zookeeper,由于连接操作是异步的,所以可以使用countDownLatch创建一个计数器为1的锁,连接挂起,当异步连接成功时,调用countDown通知挂起线程;再比如5V5游戏竞技,只有房间人满了才可以开始游戏。

FutureTask:带有计算结果的任务,在计算完成时才能获取结果,如果计算尚未完成,则阻塞 get

方法。FutureTask将计算结果从执行线程传递到获取这个结果的线程。

Semaphore:信号量,用来控制同时访问某个特定资源的数量,只有获取到许可acquire,才能够正常执行,并在完成后释放许可,acquire会一致阻塞到有许可或中断超时。使用信号量可以轻松实现一个阻塞队列。

CyclicBarrier:类似于闭锁,它可以阻塞一组线程,只有所有线程全部到达以后,才能够继续执行,so线程必须相互等待。这在并行计算中是很有用的,将一个问题拆分为多个独立的子问题,当线程到达栅栏时,调用await等待,一直阻塞到所有参与线程全部到达,再执行下一步任务。

ReentrantLock与synchronized的区别

ReentrantLock 有如下特点:

Netty 中有哪些重要组件?

Channel:Netty 网络操作抽象类,它除了包括基本的 I/O 操作,如 bind、connect、read、write 等。

kafka如何实现延迟队列?

Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能,而是基于时间轮自定义了一个用于实现延迟功能的定时器(SystemTimer)。JDK的Timer和DelayQueue插入和删除操作的平均时间复杂度为O(nlog(n)),并不能满足Kafka的高性能要求,而基于时间轮可以将插入和删除操作的时间复杂度都降为O(1)。时间轮的应用并非Kafka独有,其应用场景还有很多,在Netty、Akka、Quartz、Zookeeper等组件中都存在时间轮的踪影。

ACL权限控制机制

1)UGO(User/Group/Others)

目前在Linux/Unix文件系统中使用,也是使用最广泛的权限控制方式。是一种粗粒度的文件系统权限控制模式。

Dubbo启动时如果依赖的服务不可用会怎样?

Dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止 Spring 初始化完成,默认 check="true",可以通过 check="false" 关闭检查。

Redis是单线程还是多线程?

Redis6.0采用多线程IO,不过命令的执行还是单线程的。

Redis6.0之前,IO线程和执行线程都是单线程的。

如何估算 Kafka 集群的机器数量?

这道题目考查的是机器数量和所用资源之间的关联关系。所谓资源,也就是 CPU、内存、磁盘和带宽。

在 Provider 上可以配置的 Consumer 端的属性有哪些?

1)timeout:方法调用超时

2)retries:失败重试次数,默认重试 2 次

3)loadbalance:负载均衡算法,默认随机

4)actives 消费者端,最大并发调用限制

说说Elasticsearch常用的调优手段?

设计阶段调优

(1)根据业务增量需求,采取基于日期模板创建索引,通过 roll over API 滚动索引;

(2)使用别名进行索引管理;

(3)每天凌晨定时对索引做 force_merge 操作,以释放空间;

(4)采取冷热分离机制,热数据存储到 SSD,提高检索效率;冷数据定期进行 shrink操作,以缩减存储;

(5)采取 curator 进行索引的生命周期管理;

(6)仅针对需要分词的字段,合理的设置分词器;

(7)Mapping 阶段充分结合各个字段的属性,是否需要检索、是否需要存储等。.........

并发与并行的区别?

并发指的是多个任务交替进行,并行则是指真正意义上的"同时进行"。

Spring Boot的核心注解是哪些?他由哪几个注解组成的?

启动类上面的注解是@SpringBootApplication,他也是SpringBoot的核心注解,主要组合包含了以下3个注解:

String str = "i" 和String str = new String("1")一样吗?

不一样,因为内存的分配方式不一样。String str = "i"的方式JVM会将其分配到常量池中,而String str = new String("i")JVM会将其分配到堆内存中。

什么是方法的返回值?返回值的作用是什么?

方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。返回值的作用:接收出结果,使得它可以用于其他的操作!

Redis 集群方案什么情况下会导致整个集群不可用?

有 A,B,C 三个节点的集群,在没有复制模型的情况下,如果节点 B 失败了,那么整个集群就会以为缺少5501-11000 这个范围的槽而不可用。

Mycat是什么?

Mycat是基于MySQL的数据库中间件,目的是为了降低数据库的压力。

为什么要使用Elasticsearch?

因为在我们的数据,将来会非常多,所以采用以往的模糊查询,模糊查询前置配置,会放弃索引,导致商品查询是全表扫面,在百万级别的数据库中,效率非常低下,而我们使用ES做一个全文索引,我们将经常查询的商品的某些字段,比如说商品名,描述、价格还有id这些字段我们放入我们索引库里,可以提高查询速度。

MVVC了解过吗

MySQL InnoDB存储引擎,实现的是基于多版本的并发控制协议------MVCC (Multi-Version Concurrency Control)

在浏览器中输入url地址到显示主页的过程

百度好像最喜欢问这个问题。

说一说三个范式

第一范式: 每个列都不可以再拆分. 第二范式: 非主键列完全依赖于主键,而不能是依赖于主键的一部分. 第三范式: 非主键列只依赖于主键,不依赖于其他非主键。

栈帧里面包含哪些东西?

局部变量表、操作数栈、动态连接、返回地址等

如何使用配置文件通过 Spring Boot 配置特定环境的配置?

配置文件不是设别环境的关键。

计算机系统5层层次结构从下到上由哪五层组成?哪些是物理机,哪些是虚拟机?

1)微程序机器、传统机器、操作系统机器、汇编语言机器、高级语言机器

2)微程序机器和传统机器是物理机,其他是虚拟机。

消息队列的弊端有哪些?

数据延迟;增加系统复杂度;可能产生数据不一致的问题。

非抢占式调度与抢占式调度的区别是什么?

非抢占式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生进程调度进程调度某事件而阻塞时,才把处理机分配给另一个进程

抢占式:操作系统将正在运行的进程强行暂停,由调度程序将CPU分配给其他就绪进程的调度方式

什么是索引?

索引是一种数据结构,可以帮助我们快速的进行数据的查找。

进程调度算法

实时系统 :FIFO(First Input First Output,先进先出算法),SJF(Shortest Job First,最短作业优先算法),SRTF(Shortest Remaining Time First,最短剩余时间优先算法)。
交互式系统:RR(Round Robin,时间片轮转算法),HPF(Highest Priority First,最高优先级算法),多级队列,最短进程优先,保证调度,彩票调度,公平分享调度。

在Java中定义一个不做事且没有参数的构造方法的作用

Java程序在执行子类的构造方法之前,如果没有用super()来调用父类特定的构造方法,则会调用父类中"没有参数的构造方法"。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用super()来调用父类中特定的构造方法,则编译时将发生错误,因为Java程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。

Redis key的淘汰策略有哪些?

8种:noeviction,volatile-lru,volatile-lfu,volatile-ttl,volatile-random,allkey-lru,allkeys-lfu,allkeys-random

df 命令

显示文件系统的磁盘使用情况,默认情况下 df -k 将以字节为单位输出磁盘的使用量。

使用 df -h 选项可以以更符合阅读习惯的方式显示磁盘使用量。

使用 df -T 选项显示文件系统类型。

将一个类声明为Spring的bean的注解有哪些?

我们一般使用@Autowired注解去自动装配bean。而想要把一个类标识为可以用@Autowired注解自动装配的bean,可以采用以下的注解实现:

1.@Component注解。通用的注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪一个层,可以使用@Component注解标注。

2.@Repository注解。对应持久层,即Dao层,主要用于数据库相关操作。

3.@Service注解。对应服务层,即Service层,主要涉及一些复杂的逻辑,需要用到Dao层(注入)。

4.@Controller注解。对应Spring MVC的控制层,即Controller层,主要用于接受用户请求并调用Service层的方法返回数据给前端页面。

什么是Minikube?

Minikube是一种工具,可以在本地轻松运行Kubernetes。这将在虚拟机中运行单节点Kubernetes群集。

微服务有哪些特点?

· 解耦 -- 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和扩展

· 组件化 -- 微服务被视为可以轻松更换和升级的独立组件

· 业务能力 -- 微服务非常简单,专注于单一功能

· 自治 -- 开发人员和团队可以彼此独立工作,从而提高速度

· 持续交付 -- 通过软件创建,测试和批准的系统自动化,允许频繁发布软件

· 责任 -- 微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品

· 分散治理 -- 重点是使用正确的工具来做正确的工作。这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题

· 敏捷 -- 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃

InnoDB的数据是怎么存储的?

InnoDB的主键索引文件上直接存放该行数据,称为聚簇索引,非主索引指向对主键的引用。

TCP建立连接时为什么要传回 SYN

接收端传回发送端所发送的 SYN 是为了告诉发送端,我接收到的信息确实就是你所发送的信号了。

一个程序从开始运行到结束的完整过程(四个过程)

预处理:条件编译,头文件包含,宏替换的处理,生成.i文件。

为什么要用 Netty?

统一的 API,支持多种传输类型,阻塞和非阻塞的。

简单而强大的线程模型。

自带编解码器解决 TCP 粘包/拆包问题。

自带各种协议栈。

真正的无连接数据包套接字支持。

比直接使用 Java 核心 API 有更高的吞吐量、更低的延迟、更低的资源消耗和更少的内存复制。

安全性不错,有完整的 SSL/TLS 以及 StartTLS 支持。

社区活跃

成熟稳定,经历了大型项目的使用和考验,而且很多开源项目都使用到了 Netty, 比如我们经常接触的 Dubbo、RocketMQ 等等。

流一般需要不需要关闭,如果关闭的话在用什么方法,一般要在那个代码块里面关闭比较好,处理流是怎么关闭的,如果有多个流互相调用传入是怎么关闭的?

  1. 流一旦打开就必须关闭,使用close方法
  2. 放入finally语句块中(finally 语句一定会执行)
  3. 调用的处理流就关闭处理流
  4. 多个流互相调用只关闭最外层的流

你们项目中分片的实现方式是什么?

在rule.xml中配置PartitionByMod

SHA

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。该算法经过加密专家多年来的发展和改进已日益完善,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种"指纹"或是"摘要"所以对散列值的数字签名就可以视为对此明文的数字签名。

分布式 Session了解过吗?如何实现?

如果不做任何处理的话,用户将出现频繁登录的现象,比如集群中存在 A、B 两台服务器,用户在第一次访问网站时,Nginx 通过其负载均衡机制将用户请求转发到 A 服务器,这时 A 服务器就会给用户创建一个 Session。当用户第二次发送请求时,Nginx 将其负载均衡到 B 服务器,而这时候 B 服务器并不存在 Session,所以就会将用户踢到登录页面。这将大大降低用户体验度,导致用户的流失,这种情况是项目绝不应该出现的。

什么是B树?

B树是一种多叉树,也叫多路搜索树,适合用于文件索引上,减少磁盘IO次数,子节点存储最大数成为B树的阶,图中为2-3树。

什么是线程和进程?

进程:在操作系统中能够独立运行,并且作为资源分配的基本单位。它表示运行中的程序。系统运行一个程序就是一个进程从创建、运行到消亡的过程。

ConcurrentHashMap和Hashtable的区别?

ConcurrentHashMap 结合了 HashMap 和 HashTable 二者的优势。HashMap 没有考虑同步,HashTable 考虑了同步的问题。但是 HashTable 在每次同步执行时都要锁住整个结构。 ConcurrentHashMap 锁的方式是稍微细粒度的。

对象的访问定位有哪几种方式?

建立对象就是为了使用对象,我们的Java程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式有虚拟机实现而定,目前主流的访问方式有使用句柄和直接指针2种:

RabbitMQ有什么优缺点?

优点:解耦、异步、削峰;

如何实现动态Zuul网关路由转发?

通过path配置拦截请求,通过 Serviceld到配置中心获取转发的服务列表,zuul内部使用 Ribbon实现本地负载均衡和转发。

TCP对应的协议和UDP对应的协议

TCP对应的协议:

谈谈对HashMap 构造方法中初始容量、加载因子的理解

初始容量代表了哈希表中桶的初始数量,即 Entry< K,V>[] table 数组的初始长度。

加载因子是哈希表在其容量自动增加之前可以达到多满的一种饱和度百分比,其衡量了一个散列表的空间的使用程度,负载因子越大表示散列表的装填程度越高,反之愈小。

相关推荐
安之若素^7 分钟前
启用不安全的HTTP方法
java·开发语言
魔芋红茶12 分钟前
spring-initializer
python·学习·spring
ruanjiananquan9913 分钟前
c,c++语言的栈内存、堆内存及任意读写内存
java·c语言·c++
西岭千秋雪_36 分钟前
Redis性能优化
数据库·redis·笔记·学习·缓存·性能优化
随便取个六字37 分钟前
GIT操作 学习
git·学习
chuanauc40 分钟前
Kubernets K8s 学习
java·学习·kubernetes
小张是铁粉1 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
一头生产的驴1 小时前
java整合itext pdf实现自定义PDF文件格式导出
java·spring boot·pdf·itextpdf
YuTaoShao1 小时前
【LeetCode 热题 100】73. 矩阵置零——(解法二)空间复杂度 O(1)
java·算法·leetcode·矩阵
zzywxc7871 小时前
AI 正在深度重构软件开发的底层逻辑和全生命周期,从技术演进、流程重构和未来趋势三个维度进行系统性分析
java·大数据·开发语言·人工智能·spring