2022.03面试题

//阿里云项目组面试真题

1、image-20220211144617380

https://blog.csdn.net/justloveyou_/article/details/62893086

相同点:

hashmap和Hashtable都实现了map、Cloneable(可克隆)、Serializable(可序列化)这三个接口
不同点:

底层数据结构不同:jdk1.7底层都是数组+链表,但jdk1.8 HashMap加入了红黑树
Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。
添加key-value的hash值算法不同:HashMap添加元素时,是使用自定义的哈希算法,先调用hashCode方法计算出来一个hash值,再将hash与右移16位后相异或,从而得到新的hash值,使元素能更均匀的分布到各个桶里面,增加空间使用效率。而HashTable是直接采用key的hashCode()
实现方式不同:Hashtable 继承的是 Dictionary类,而 HashMap 继承的是 AbstractMap 类。
初始化容量不同:HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。
扩容机制不同:当已用容量>总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 +1。
支持的遍历种类不同:HashMap只支持Iterator遍历,而HashTable支持Iterator和Enumeration两种方式遍历
迭代器不同:HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。而Hashtable 则不会。
部分API不同:HashMap不支持contains(Object value)方法,没有重写toString()方法,而HashTable支持contains(Object value)方法,而且重写了toString()方法
同步性不同: Hashtable是同步(synchronized)的,适用于多线程环境,
而hashmap不是同步的,适用于单线程环境。多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。
由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

HashTable 与 HashMap 、ConcurrentHashMap 主要的区别在于HashMap不是同步的线程不安全的不适合应用于多线程并发环境下,而 ConcurrentHashMap 是线程安全的集合容器

Hashtable和SynchronizedMap使用synchronized来保证线程安全,使用当前对象作为锁,同一时刻只能有一个线程操作,其他线程会被阻塞,所以竞争越激烈效率越低。ConcurrentHashMap无论是读操作还是写操作都具有很高的性能:在进行读操作时不需要加锁,而在写操作时通过锁分段技术只对所操作的段加锁而不影响对其它段的访问。 ConcurrentHashMap只能保证单个方法是同步的,不能保证先读后写的原子性

2、image-20220211144650997

https://blog.csdn.net/qq_41170102/article/details/104650162

3、image-20220211144656814

IO
什么是IO? 它是指计算机与外部世界或者一个程序与计算机的其余部分的之间的接口。它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的。单独的程序一般是让系统为它们完成大部分的工作。

在 Java 编程中,直到最近一直使用 流 的方式完成 I/O。所有 I/O 都被视为单个的字节的移动,通过一个称为 Stream 的对象一次移动一个字节。流 I/O 用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换回对象。

BIO
Java BIO即Block I/O , 同步并阻塞的IO。

BIO就是传统的java.io包下面的代码实现。

NIO
什么是NIO? NIO 与原来的 I/O 有同样的作用和目的, 他们之间最重要的区别是数据打包和传输的方式。原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。

面向流 的 I/O 系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相对简单的。不利的一面是,面向流的 I/O 通常相当慢。

一个 面向块 的 I/O 系统以块的形式处理数据。每一个操作都在一步中产生或者消费一个数据块。按块处理数据比按(流式的)字节处理数据要快得多。但是面向块的 I/O 缺少一些面向流的 I/O 所具有的优雅性和简单性。

AIO
Java AIO即Async非阻塞,是异步非阻塞的IO。

区别及联系
BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。

NIO (New I/O):同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。

AIO ( Asynchronous I/O):异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。

各自适用场景
BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

4、image-20220211144705692

https://blog.csdn.net/wyl6019/article/details/80136000

5、image-20220211144716252

https://blog.csdn.net/m0_49243816/article/details/111087318 7.12

6、image-20220211144728244

https://blog.csdn.net/s1078229131/article/details/107622226

7、image-20220211144738916

调用关系说明:

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

8、image-20220211144800684

索引的作用:https://blog.csdn.net/guorui_java/article/details/118558095

创建索引:https://blog.csdn.net/weberhuangxingbo/article/details/83894153

9、image-20220211144816782

https://blog.csdn.net/m0_49243816/article/details/111087318 3.1 3.2

栈内存溢出:程序所要求的栈深度过大导致。
堆内存溢出: 分清 内存泄露还是 内存容量不足。泄露则看对象如何被 GC Root 引用。不足则通过 调大 -Xms,-Xmx参数。
持久带内存溢出:Class对象未被释放,Class对象占用信息过多,有过多的Class对象。
无法创建本地线程:总容量不变,堆内存,非堆内存设置过大,会导致能给线程的内存不足。

10、image-20220211144842244

4、事务实现原理
以 InnoDB引擎为例对事务的实现进行说明。我们知道事务的四个特点,那么这四个特点背后的意义是什么呢?首先我们得知道 实际运行事务的环境是什么样子的,很显然,当前的数据库支持的都是并发的事务,也就多个事务同时在操作数据库,因此就会出现多个事务 对数据库的同一内容进行操作,所以实现事务的的四个特性,也是基于事务的特点来设计的。下面基于事务的四个特性背后的原理以及机制进行说明:

4.1、原子性
原子性是事务的基本特性,保证了事务中的操作是不可拆分的整体,那么原子性是如何实现的呢?事务的原子性表现的两个方面:

事务提交成功时,那么事务中的操作总会完成
事务提交成功保证事务中的操作都会完成。1、是正确执行完事务,没有出现任何问题;2、是事务提交成功但是出异常,数据库恢复之后,提交完成的事务会保证数据库完成该事物的操作。对于第一种正常情况不予讨论,因为不存在 异常情况,那么第2种实际上是和上文说的持久性是相关联的,而这个是基于重做日志(redo log)来保证提交完成的事务在异常情况下保证数据操作能够进行:
事务提交失败,那么事务中的操作都失败
事务提交失败,那么事务中的操作都失败,这个是通过数据库的撤销操作日志来保证的,也称之为undo log,那么这两种日志如何保证事务的正确执行呢,后面将进行分析:
4.2、隔离性与一致性
隔离性与一致性是事务的特性,之所以要将其放在一起,是因为这两种特性相互制约,所以如何平衡他们之间的GAP需要我们自身的经验去判断。那为什么这么说呢,上文说过,对于单个事务来说甚至隔离性都不需要,但是对于多个事务并行执行的大场景来说,如果不用的事务对数据库同一数据进行读写,那么一致性就容易造成破坏,所以事务的隔离级别,意味着事务的并发处理是不一样,而不同的并发处理方式对于数据库的一致性是有影响的。那么就来说一说,不同的隔离级别是如何影响事务之间的并发程度的:

RAED UNCOMMITED:读未提交,任何

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值