HashMap面试题

HashMap与HashTable的区别

1.HashMap线程不安全 HashTable 线程是安全的采用synchronized

2.HashMap允许存放key 为null HashTable 不允许存放key 为null

3.在多线程的情况下,推荐使用ConcurrentHashMap 线程安全 且效率非常高

HashMap底层是如何实现的

在HashMap1.7版本中底层是基于数组+链表实现的,如果发生Hash冲突概率

比较大,会存放到同一个链表中,链表如果过长 会从头查询到尾部 效率非常低。

所以在HashMap1.8版本 (数组容量>=64&链表长度大于8) 就会将该链表转化红黑树。

HashMap根据Key查询时间复杂度?

1.Key没有产生冲突 时间复杂度是为o(1); 只需要查询一次

2.Key产生冲突 采用链表存放则为O(N) 从头查询到尾部

3.key产生冲突采用红黑树存放则为O(LogN)

HashMap底层是有序存放的吗?

是无序的,因为Hash 算法是散列计算的 没有顺序,如果需要顺序

可以使用LinkedHashMap集合采用双向链表存放。

HashMap7扩容产生死循环问题有了解过吗?

其实这个JDK官方不承认这个bug,因为HashMap本身是线程不安全的,不推荐在

多线程的情况下使用,是早期阿里一名员工 发生在多线程 的情况下使用HashMap1.7 扩容会发生死循环问题,因为HashMap1.7 采用头插入法 后来在在HashMap1.8 改为尾插法 。

如果是在多线程的情况下 推荐使用ConcurrentHashMap

HashMap Key 为null 存放在 什么位置

存放在数组 index为0的位置。

ConcurrentHashMap 底层是如何实现?

1.传统方式 使用HashTable保证线程问题,是采用synchronized锁将整个HashTable中的数组锁住,

在多个线程中只允许一个线程访问Put或者Get,效率非常低,但是能够保证线程安全问题。

2.多线程的情况下 JDK官方推荐使用ConcurrentHashMap

ConcurrentHashMap 1.7 采用分段锁设计 底层实现原理:数组+Segments分段锁+HashEntry链表实现

大致原理就是将一个大的HashMap 分成n多个不同的小的HashTable

不同的key 计算index 如果没有发生冲突 则存放到不同的小的HashTable中 ,从而可以实现多线程

同时做put操作,但是如果多个线程同时put操作 key 发生了index冲突落到同一个小的HashTable中

还是会发生竞争锁。

3.ConcurrentHashMap 1.7 采用 Lock锁+CAS乐观锁+UNSAFE类 里面有实现 类似于synchronized

锁的升级过程。

4.ConcurrentHashMap 1.8版本 put操作 取消segment分段设计 直接使用Node数组来保存数据

index没有发生冲突使用cas锁 index 如果发生冲突则 使用 synchronized

分布式解决方案

请问你在生产环境中,如何搜索日志的呢?

回答:

  1. 传统的方式采用tail 搜索文件日志,如果服务器是集群的

    使用tail 指令搜索日志效率是非常低;
  2. 所有我们构建分布式ELK+Kafka采集日志 ,统一将我们的日志输出到

    ES中,通过可视化界面查询。

    3.或者整合skywalking监控服务报警,直接通过skywalking定位服务追踪链

    报错信息。

    4.在一些较大的互联网企业中,保证服务器端安全性,生产环境一般是不允许直接连接生产环境

    服务器,而是通过日志采集系统查看日志。

生产环境中,你遇到了报错的问题 你是如何定位的?

回答:

  1. 传统的方式 在生产环境中遇到报错问题,我们是通过搜索日志的方式,排查具体的错误。

    2.采用aop形式拦截系统错误日志,在将这些错误日志调用微信公众号接口 主动告诉给我们的开发人员

    生产环境发生了故障。
  2. 我们公司采用apm系统 skywalking ,监控整个微服务 如果服务在一段时间

    内发生了故障或者报错 会主动调用微信模板接口通知给开发人员 生产环境发生了故障。在通过skywalking 追踪 链可以直接查看到具体的错误信息内容

调用接口的时候,如果服务器端一直没有及时响应 怎么解决?

1.如果调用接口发生了响应延迟:是因为我们http请求是采用同步的形式,基于请求与响应模型如果服务器端没有及时响应给客户端,客户端就会认为接口超时,接口发生了超时客户端会不断重试 ,重试的过程中 会导致 幂等性问题

幂等性问题(需要保证业务唯一性。)

2.如果接口响应非常慢,就需要对代码做优化例如 加上缓存减轻db查询压力、减少GC回收频率

2.如果接口代码在怎么优化 就是执行非常耗时时间,因为采用mq异步的形式 不能够使用 同步形式。

举例子:接口代码里面 需要调用非常多接口 在响应客户端

接口代码:

1.调用征信报告接口---15s-30s

生产环境服务器宕机,如何解决呢?

  1. 我们公司生产环境,会对我们服务器 实现多个节点集群,如果某台服务器

    发生了宕机 会自动实现故障转移,保证服务的高可用。

  1. 如果服务器宕机 我们可以在服务器上安装keepalived 监听java进程,如果该java进程发生了宕机 会自动尝试重启该java进程,这是属于软件层面。如果是物理机器比如关机了,可以使用硬件方式自动重启服务器 例如向日葵

    3.如果服务器发生了宕机,尝试重启n多次还是失败,我们可以使用容器快速动态的实现扩容(docker或者k8s)

    4.重启该服务,如果重启多次还是失败 则会发送短信模板的形式通知给运维人员。

    注意:千万不要回答 直接重启服务器端。

SpringCloud

为什么不选择dubbo?却选择SpringCloud?

  1. dubbo 属于RPC框架;
  2. SpringCloud 不属于RPC框架,属于微服务全家桶框架,提供非常多

    在分布式微服务架构中遇到难题

    2.1服务治理---nacos eureka zk

    2.2分布式配置中心 nacos springcloud config 携程阿波罗

    3.3分布式事务 lcn(被淘汰)、seata

    3.4服务追踪 zipkin /skwalking

    3.5服务保护 hystry、sentinel

    3.6微服务网关 zuul gateway

    ....

    feign客户端 rpc框架 类似于 dubbo

dubbo rpc框架 底层 netty 封装dubbo 协议

整合分布式解决方案---自己单独整合 单一功能

而springcloud 提供了成熟一套微服务解决方案。

dubbox 属于当当网提供 http协议接口

feign 调用接口 http协议

开放平台(阿里、腾讯) http协议 跨平台

dubbo与feign 都是面向接口 调用 底层思想原理都是相同。

底层采用动态代理技术。

服务正在发布中?如何不影响用户使用?

服务正在发布中,该jar中正在启动...

客户端访问的时候,一直阻塞等待。

1.使用nginx 故障转移即可。

2.灰度发布 先发布一小部分 如果没有问题 在让所有用户都可以访问。

灰度发布 nginx+nacos gateway+nacos(推荐)

对方调用你接口响应比较慢?你会怎么排查?

项目搭建服务追踪监控系统

1.zipkin /skwalking 通过平台形式可以查询该接口响应速度时间。

对方调用你接口响应比较慢 多个维度思考?

带宽→服务处理(cpu)→数据库或者Redis→网络IO操作(例如调用别人接口)

1.走外网传输数据 会有带宽限制呢

2.请求如果达到服务端,服务足够线程处理请求 如果服务器没有足够的线程

处理该请求? 导致客户端会阻塞等待?

解决办法:

1.调整最大线程数

2.调整最大线程数 治标不治本,对接口做限流操作 例如服务器端没有足够

线程处理的时候(策略服务熔断 降级 限流策略。)

3.服务cpu处理性能(多核cpu) 体现多线程同时处理 降低cpu上下文切换的次数。

如果发生了上下文切换会导致其他的线程 会短暂阻塞 有需要从新被cpu调度。

4.判断sql语句查询是否比较慢、做mysql调优 快速响应结果

5.网络IO操作(例如调用别人接口)代码在怎么优化还是比较慢,将耗时的操作

采用异步的形式处理 例如多线程(消耗cpu的资源) 建议使用MQ。

开发者不小心删除了生产环境数据?怎么恢复呢?

1.正常的情况下 在生产环境中 没有delete或者rm -rf 通过update

隐藏的形式, 后期淘汰策略删除。

2.构建mysql主从集群环境 可以通过备份节点恢复数据,一主一从。

3.如果执行delete 我们是可以通过binlog 快速恢复数据。

你在开发过程中,遇到哪些难题?你是怎么解决的呢

如果在面试的过程中被面试官问到:你在开发过程中,遇到哪些难题?

不要答:空指针异常、常见错误异常。

遇到问题→你是如何分析的?→如何排查的?→最终是怎么解决的?

1.分布式事务

2.分布式幂等

例如 我们公司提供了一个接口,被其他公司进行调用。

他的公司在调用我们公司接口的过程中,我们的接口响应超时了,

最终触发了客户端重试了,重试的过程当中请求的参数都是相同的,导致我们接口

会重复执行业务逻辑。

解决办法: 全局id 业务上防重复、 在db层面去重复 例如 创建唯一约束

3.定时任务调度

例如:我们项目在生产环境中做定时任务,如果集群的情况下 定时任务重复执行。

解决该问题

1.在打jar包的时候 加上一个开关 只让一个jar包执行定时任务

2.整合分布式任务调度平台 xxljob 最终分片执行 定时任务集群的执行

定时任务1 【】跑批 1-10万 定时任务2 11-20万

4.数据同步延迟问题

我们公司 使用canal 解决mysql与redis+kafka 数据同步问题

发现就是在并发的情况下同步非常延迟,我们整合kafka分区模型

根据每张表都有自己独立的topic主题,每个topic 主题有自己独立

分区 每个分区有自己独立消费者 ,解决消息顺序一致性问题。

6.安全性问题

7生产环境发生cpu飙高、内存泄漏

.......真实业务场景当中遇到难题

有了这份Java面试中的葵花宝典,让你面试起飞!!!的更多相关文章

  1. 面试中AOP这样说,面试官只有一个字:服!

  2. 面试中要注意的 3 个 JavaScript 问题

    JavaScript 是 所有现代浏览器 的官方语言.因此,各种语言的开发者面试中都会遇到 JavaScript 问题. 本文不讲最新的 JavaScript 库,通用开发实践,或任何新的 ES6 函 ...

  3. 面试中注意3个javascript的问题

    JavaScript 是所有现代浏览器的官方语言.因此,各种语言的开发者面试中都会遇到 JavaScript 问题. 本文不讲最新的 JavaScript 库,通用开发实践,或任何新的 ES6 函数. ...

  4. 历经70+场面试,我发现了大厂面试的bug,并总结其中心得

    想起了学弟在去年秋招时面试了50余家,加上暑期实习面试了20余家,加起来也面试了70余场. 基本把国内有名的互联网公司都面了一遍,不敢说自己的面试经验很丰富,但也是不差的. 这次专门把大厂的面试做了个 ...

  5. 面试大厂必看!就凭借这份Java多线程和并发面试题,我拿到了字节和美团的offer!

    最近好多粉丝私信我说在最近的面试中老是被问到多线程和高并发的问题,又对这一块不是很了解,很简单就被面试官给问倒了,被问倒的后果当然就是被刷下去了,因为粉丝要求,我最近也是花了两天时间 给大家整理了这一 ...

  6. 如何在面试中介绍自己的项目经验(面向java改进版)

    本人于3年前写的博文,如何在面试中介绍自己的项目经验,经过大家的捧场,陆续得到了将近7万个点击量,也得到了众多网站公众号的转载,不过自己感觉,这篇文章更多的是偏重于方法,没有具体给到Java方面相关的 ...

  7. 面试中关于Java你所需知道的的一切

    本篇文章会对面试中常遇到的Java技术点进行全面深入的总结,帮助我们在面试中更加得心应手,不参加面试的同学也能够借此机会梳理一下自己的知识体系,进行查漏补缺. 1. Java中的原始数据类型都有哪些, ...

  8. JAVA面试中问及HIBERNATE与 MYBATIS的对比,在这里做一下总结

    我是一名java开发人员,hibernate以及mybatis都有过学习,在java面试中也被提及问道过,在项目实践中也应用过,现在对hibernate和mybatis做一下对比,便于大家更好的理解和 ...

  9. 我给出的一份Java服务器端面试题-适合电话面试

    这部分内容,参考了<面试官的七种武器>一文. 电面与face2face的面试还是有区别的,很多考察方式无法使用. 从简历聊起,逐渐进入正题. Java语法 重载与重写的区别? java如何 ...

  10. java面试中的智力题

    智力题,每个正式的笔试.面试都会出,而且在面大企业的时候必然会问到,笔者曾在很多面试中,都被问到过,不过答得都不是很好,因为时间很短,加上我们有时候过于紧张,所以做出这类问题,还是有一定的难度,从这篇 ...

随机推荐

  1. 浅析大促备战过程中出现的fullGc,我们能做什么?

    作者:京东科技 白洋 前言: 背景: 为应对618.双11大促,消费金融侧会根据零售侧大促节奏进行整体系统备战.对核心流量入口承载的系统进行加固优化,排除系统风险,保证大促期间系统稳定. 由于大促期间 ...

  2. python2和python3的版本历史及入门书籍

    python版本历史 我们端游项目使用是python2.7版本 32位 python2 2.7.18 last version on 2020.4.20 2.7 first version on 20 ...

  3. statsvn只支持到svn1.3

    怎样找出svn修改次数最多的文件? 我想统计配置表中,那个配置文件修改次数最多,但经过实践发现statsvn只支持到1.3的版本. 通过svn的命令行接口,把提交记录保存到xml中,再通过自己写代码解 ...

  4. Django笔记四十二之model使用validator验证器

    本文首发于公众号:Hunter后端 原文链接:Django笔记四十二之model使用validator验证器 这一篇笔记介绍一下 model 里的 validator 验证器. 首先,这是个什么东西呢 ...

  5. go中channel源码剖析

    channel 前言 设计的原理 共享内存 csp channel channel的定义 源码剖析 环形队列 创建 写入数据 读取数据 channel的关闭 优雅的关闭 M个receivers,一个s ...

  6. silce的扩容,截取,使用规范总结

    切片 什么是slice slice的创建使用 slice使用的一点规范 slice和数组的区别 slice的append是如何发生的 复制Slice和Map注意事项 接收 Slice 和 Map 作为 ...

  7. Github最简单上传教程:真正的两分钟就可以学会! guitar

    相关链接: 码云(gitee)配置SSH密钥 码云gitee创建仓库并用git上传文件 git 上传错误This oplation equires one of the flowi vrsionsot ...

  8. 使用visio如何快速生成一个网格状图案,文档技巧!

    如何使用visio如何快速生成一个网格状图案 我的成果图: 操作步骤如下: 1.新建一个visio文件,选择"基本框图".点击创建. 2.从左侧形状窗口中基本形状中选中正方形拖动到 ...

  9. Shell常用命令与脚本实例

      #!/bin/sh echo "Hello shell" # ----------------------字符串---------------------# readonly ...

  10. CSS文本,字体设置与元素边框,阴影,显示模式

    什么是元素的显示模式 网页中的标签很多,在不同的地方使用不同类型的标签. 元素显示模式就是标签以什么方式进行显示.如:div自己占一行,span一行可以放多个. HTML元素一般分为块元素和行内元素两 ...