Java面试题

1.hashMap和hashTable 的区别
1.hashmap是线程不安全的,hashtable是线程安全的
2.hashmap可以存放key为空,存在数组的第0个位置,hashtable不可以存放key为空

2.hashmap的底层实现
链表加数组,put方法 jdk1.7之前是根据key的hash值,计算该key存放在数组的index位置,如果发生index位置冲突,则会使用单向列表存放,1.8版本则基于数组加链表加红黑树数实现,当数组容量大于等于64,且链表长度大于等于8,则会将链表转化成红黑树,使用红黑树,是因为链表的的查询复杂度为on,需要从头查询到尾部,使用红黑树后,则查询效率更快,便于提升效率(1.7和1.8的扩容有什么区别)

3.hashmap是无序,散列存放的

4.在高并发的场景下,使用concurrenthHashMap的原因
实现原理,采用分段式锁,把大的map吃啊分成多个hashtable,默认是分成16个hashtable

5.为什么使用mq
mq是一个消息中间件,可以实现异步传送消息,可以解耦合,消峰的作用

6.mq解决消息堆积的问题
加快消费的速率,对消费者实现集群,同时让消费批量获取消息,减少网络传输的次数

7.mq如果宕机了,消息会丢失吗
不会丢失,因为会把消息持久化到硬盘

8.mq如何保证数据一致性问题
使用补偿机制,消息生产者发送消息到mq,mq收到消息,并成功储存,就返回确认的消息给生产者,发送给消费者也是如此,如果第一次发送给消费者,消费者超时,或者处理失败,则重新发送,知道消费者返回成功的消息。这里可能会有重复发生的问题,解决重复问题可以使用唯一键,当收到消息时,我们会对唯一键做校验,如果不存在则消费,如果存在则不消费,返回确认

9.索引为什么使用B+树
因为b数比平衡 数和红黑树更矮,也就是B树的子节点不是只有一个,分节点上可能有多个数据,使用B+而不使用B树,是因为B+最末端的的分支包含了整个数的数据集,且是哪顺序排放的,使用精确数据查询时,B树和B+数的处理次数是一样的,但是使用范围查询时B+树的效率更高

10.聚集索引和非聚集索引
聚集索引时全表唯一,且存储有序的,非聚集索引是不唯一,且罗旭有序,实际 物理存储无序的。唯一键只是默认是聚集索引,但是聚集索引不一定是唯一键

11.组合索引需要注意的事项
组合索引要注意索引失效的问题,类似组合索引时A、B、C 查询abc时是走索引的,查询ab也走索引,查询ac是a走索引,但是c不走索引,查询bc是不走索引的,查询cba也是走索引

12.数据库的锁
从锁的粒度可分为,表锁、行锁,mysql中还有页锁。
从锁的级别可分为:共享锁和排它锁。
从使用级别可分为:悲观锁和乐观锁。
当走索引时会使用行锁,当不走索引全表扫描时会使用表锁。
共享锁:当使用共享锁时,是有获取了共享锁的事务可以对该数据集进行增删改查,其他事务智能对它进行读取
排他锁:使用排他锁时,只有获取了该排他锁的事务可以对该数据集进行增删改查,其他事务都无法操作他

13:like什么情况下会走索引什么情况下不走索引
使用%xx%时不会走索引,使用%xx时也不会走索引,使用xx%时会走索引
原因:因为索引的低层是B+树,b+树从左到右都是有序的,我们通过字段去匹配时都是先比较第一个字,比如数据库里字段的值有张三,张四,王五,马六,我们要查询张三,走索引的都是先用张字去匹配然后再去匹配后面的,如果前面不确定,那么肯定就是要全都查询一遍
14.防止死锁
方式死锁:1、不要在锁中套用锁
2、只对需要加锁的资源加锁
3、建立死锁的检测机制
15.数据库的隔离级别
数据库有四大隔离级别: 1、读未提交:读到了事务为提交的内容,就比如存钱,我还没去确认,另一边就可查到 (这就是脏读)
2、读已提交:读到了已提交的内容,就比如我需要买个东西,我开始去查询时月是满足的,但是这个时候,刚好我的钱被其他事务扣除掉了,这个时候我再去扣钱的时候余额就不足了(这就是不可)
3、可重复读(数据库的默认隔离级别):就是可以重复读,当我需要买东西时,查询到月是满足的,这个时候其他事务想要从我卡里扣钱,就不行,得我这边先把钱扣了再说(这也是不可重复读)
4、序列化:就是把事务都序列化(解决幻读),就比一开始我查询今天的消费账单是2千,但是我去打印的时候,打印出来就是2万了,这可能就是中间数据可能被其他事务添加,这就导致了幻读

事务的隔离级别:
脏读:读到了未提交的数据
不可重复读:2次读取到的数据都不一致
幻读:先取了100,然后另外的事务存了100,就像没取一样

16.redis分布式锁
单机下可以使用设置唯一键的方式,调用redis的set(lockkey,uuid,当key值不存在的时候才插入(NX),PX(设置过期时间,时间),这个会存在的一个问题就是如果业务处理时间过长,就会倒是锁过期,如果这个锁被其他线程复用了就可能出现把其他线程的所释放的问题,解决这个问题就是释放锁的时候,判断是不是已经过了之前的过期时间了
17.redis底层的数据结构:跳跃表

18.aqs

20.线程池的实现
21:springmvc的流程

22:分布式
23.redis的分布式锁,分布式缓存
分布式锁,通过调用set方法设置一个唯一key,设置成功则加锁成功,加锁成功后当其他请求来set的时候就会报错,则加锁失败
redis本来就是用来座分布式缓存的
24.mq的流程,及消息重复怎么处理
消息生产者连接到RabbitMQ Broker,创建connection,开启channel。
生产者声明交换机类型、名称、是否持久化等。
发送消息,并指定消息是否持久化等属性和routing key。
exchange收到消息之后,根据routing key路由到跟当前交换机绑定的相匹配的队列里面。
消费者监听接收到消息之后开始业务处理,然后发送一个ack确认告知消息已经被消费。
RabbitMQ Broker收到ack之后将对应的消息从队列里面删除掉
重复消息,可以通过设置一个消息的唯一key,消费完后后可以把对应的key保存起来,下次消费时如果存在就不在消费了

25。分布式缓存怎么实现缓存同步
26.spring 的bean注入流程

27.jdk1.8的新特性
28sy和lock锁底层实现的原理和区别

29:sy锁方法,锁对象头,锁代码块分别怎么实现
30.sy的锁升级过程
31:cas
32:myisam和innoDB的区别
myisam只有表锁,innoDB有表锁和行锁
myisam只有非集聚集索引(索引和数据文件是分离的,索引保存的是数据文件的指针),innoDB有聚集索引(数据文件是和(主键)索引绑在一起的)
myisam不支持外键,innoDB支持外键
InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快(注意不能加有任何WHERE条件)
MyISAM表格可以被压缩后进行查询操作
InnoDB支持事务,MyISAM不支持
InnoDB表必须有唯一索引(如主键)
Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI
MyISAM表格可以被压缩后进行查询操作

33.doubbl的调用链路
消费者通过代理对象发起远程调用,通过客户端将请求发送到服务的网络层,网络层进行解码,然后调用分大器,分发器调用线程池,然后线程池调用具体的服务
34.zookeepers实现分布式锁
上锁就和redis一样,判断对应的key值是否存在,如果不存在则上锁,如果存在就相当于获取锁失败
35:事务的4大原则
原子性:同成功,或者同失败
隔离性:不受其他事务干扰
持久性:保存后就将持久化
一致性:数据前后总值要保持不变

36、偏移量索引和稀疏索引
37…分布式事务的原则(CAP)
C:一致性,强一致性
A:可用性,用户操作如果超出请求时间范围,则认为系统不可以红
P:分区容错性,任何一个分区出现了错误,依旧不影响整个系统的运行

@Autowired

38.线程池
创建线程池:new ThreadPoolExecutor(核心线程数,最大线程数,最大空间时间,时间单位,任务队列,线程工厂,拒绝策略)
自带线程池:newCacheTreadPool(),创建一个没有核心线程池,无上线最大线程shu的线程池
newFixedThreadPool(int a),创建一个固定线程数的线程池,队列也是无上线
newSingThreaExcutor(),创建一个无界队列的线程池,只有只有一个线程
拒绝策略:直接拒绝报错
直接拒绝不报错
去掉队列中最早的等待任务
使用执行线程来执行该任务
ps:会优先执行最大线程池里的任务,队列里的会后面执行

JVM:
堆:new出来的对象都在堆内存,报错是:outOfMemoryErrr,改修大小使用:-Xmx
程序计数器:记住下一条jvm指令的执行地址(不会有内存溢出)
本地方法区:给本地方法提供一个内存空间(本地方法就是不是用java写的方法)
栈:运行方法的内存空间,一个栈贞就是一个方法需要开辟的空间
特点:垃圾回收不涉及栈内存;栈内存不是越大越好,越大线程数越少;
报错:StackoverFlowError
调整大小:-Xss
方法区:存放一些类信息,常量、静态变量,存放在元空间
常量池:就是一张常量表,虚拟机可以根据它找到需要执行的类名、方法名、参数类型、变量等信息
运行时常量,就是常量池加载到内存后的常量池
intern()将字符放入串池,如果串池有就无法放
HelloWorld的运行,先编译成二进制字节码(类基本信息、长两场、类方法定义、包含了虚拟机的指令等)
运行:1.先加载静态变量system.out
2.加载helloworld的参数
3.执行println()方法
4.retrun

redis的主从复制原理
从节点会发送一个同步命令,主节点接收到命令后,会在后台启动存盘进程,把所有的修改数据的
redis的多级缓存:就是把热点数据在本地缓存,不是热点的数据和热点数据在远程redis有缓存,读数据先去本地读,本地读不到再去远程读
redis的淘汰策略:
1.直接拒绝报错(noeviction)
2.从所有数据种选择使用较少的淘汰(allkeys - lru)
3.从设置了过期时间的数据中,选择使用较少的淘汰(volatile - lru)
4.从设置了过期时间的数据中,删除剩余时间较少的数据(volatile - random)
5.从所有数据中随机去掉部分数据(allkeys - random)
6.从设置了过期时间的数据中淘汰部分数据(volatile - ttl)

redis的持久化方式RDB和AOF的区别
RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘,实际操作过程就是有一个fork子进程,先将数据集写入到临时文件中,写入成功后,再替换之前的文件,用二进制压缩存储。AOF持久化以日志的形式记录服务器所处理的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录。如果遇到redis宕机,需要恢复的话,会以上2种都是用,先用快照恢复到特定时间,然后用aof把后买你的数据补全

springBean的作用域:
单列-多列-伴随着request请求,请求结束就结束了-伴随着session,session销毁了就结束了,整个applicationContext,随项目停止而停止

springBean的生命周期
有4个阶段:实列化-属性赋值-初始化-销毁
实列化就是通过读取xml的配置,将bean元素转成beanDefinition对象,然后spring会根据beanDefinition对象通过反射来实列化bean,并把bean注册到beanfactory中,beanfactory实际就是一个concurrentHashMap中。
属性赋值阶段就是会有一个方法对使用了注解@Aurowired、@value等进行属性注入
初始化就是执行对应bean配置的初始化方法的执行,有spring自带的的初始化方法,也可以自定义初始化方法(1.xml中使用使用init-method 2.@bean(initMethod))
销毁就是调用Destruction销毁

springboot的启动流程
1.实列化spingApplication,实列化的同时会会判断是否有主类,是否是web环境,同时会获取到初始化监听的全类名集合,还有应用类监听的集合,保存起来、
2.实列晚springApplication之后会执行他的run方法 :
2.1启动一个计数器,用来监听程序启动用了多久时间
2.2会加载headlss的环境
2.3获取所有的应用监听器,然后运行他们
3.4配置环境,会配置d

1.会创建一个spingApplication对象,创建对象里面会根据spi技术加载mate-inf下面的spring.factories文件,加载ApplicationContextInitializer、ApplicationListener 接口实例
2.运行springApplication.run
3.createApplicationContext()方法会初始化上下文对象,同时会加载spring的核心组件类ConfigurationClassPostProcessor 、AutowiredAnnotationBeanPostProcessor 等)
4.调用refreshContext方法启动spring容易,和内置的servrlt容器
同时在启动的时候还会利用观察者模式进行监听监听模块

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值