Skip to content

Commit

Permalink
小米面试题
Browse files Browse the repository at this point in the history
  • Loading branch information
itwanger committed Jul 9, 2024
1 parent f7b856e commit d6c45c4
Show file tree
Hide file tree
Showing 9 changed files with 567 additions and 78 deletions.
21 changes: 18 additions & 3 deletions docs/sidebar/sanfene/collection.md
Original file line number Diff line number Diff line change
Expand Up @@ -229,22 +229,37 @@ LinkedList 因为是链表结构,插入和删除只需要改变前置节点、

①、ArrayList 是基于数组的,也实现了 RandomAccess 接口,所以它支持随机访问,可以通过下标直接获取元素。

![](https://cdn.tobebetterjavaer.com/stutymore/collection-20240319092907.png)
![二哥的 Java 进阶之路:ArrayList](https://cdn.tobebetterjavaer.com/stutymore/collection-20240319092907.png)

②、LinkedList 是基于链表的,所以它没法根据下标直接获取元素,不支持随机访问,所以它也没有实现 RandomAccess 接口。

![](https://cdn.tobebetterjavaer.com/stutymore/collection-20240319093038.png)
![二哥的 Java 进阶之路:LinkedList](https://cdn.tobebetterjavaer.com/stutymore/collection-20240319093038.png)

#### 内存占用有何不同?

ArrayList 是基于数组的,是一块连续的内存空间,所以它的内存占用是比较紧凑的;但如果涉及到扩容,就会重新分配内存,空间是原来的 1.5 倍,存在一定的空间浪费。

![](https://cdn.tobebetterjavaer.com/stutymore/collection-20240319093453.png)
![二哥的 Java 进阶之路:ArrayList的扩容](https://cdn.tobebetterjavaer.com/stutymore/collection-20240319093453.png)

LinkedList 是基于链表的,每个节点都有一个指向下一个节点和上一个节点的引用,于是每个节点占用的内存空间稍微大一点。

#### 使用场景有什么不同?

ArrayList 适用于:

- 随机访问频繁:需要频繁通过索引访问元素的场景。
- 读取操作远多于写入操作:如存储不经常改变的列表。
- 末尾添加元素:需要频繁在列表末尾添加元素的场景。

LinkedList 适用于:

- 频繁插入和删除:在列表中间频繁插入和删除元素的场景。
- 不需要快速随机访问:顺序访问多于随机访问的场景。
- 队列和栈:由于其双向链表的特性,LinkedList 可以高效地实现队列(FIFO)和栈(LIFO)。

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的京东同学 10 后端实习一面的原题:ArrayList 和 LinkedList 的时间复杂度
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米暑期实习同学 E 一面面试原题:你了解哪些集合?
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米面经同学 F 面试原题:ArrayList和LinkedList的区别和使用场景
### 3.ArrayList 的扩容机制了解吗?

Expand Down
1 change: 1 addition & 0 deletions docs/sidebar/sanfene/javase.md
Original file line number Diff line number Diff line change
Expand Up @@ -2260,6 +2260,7 @@ testMethod.invoke(testInstance);

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 2 Java 后端技术一面面试原题:Java 反射用过吗?
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 18 成都到家面试原题:反射及其应用场景
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米面经同学 F 面试原题:反射的介绍与使用场景
## JDK1.8 新特性

Expand Down
21 changes: 21 additions & 0 deletions docs/sidebar/sanfene/javathread.md
Original file line number Diff line number Diff line change
Expand Up @@ -1434,10 +1434,30 @@ volatile 关键字用于修饰变量,确保该变量的更新操作对所有

synchronized 关键字用于修饰方法或代码块,确保同一时刻只有一个线程能够执行该方法或代码块,从而实现互斥访问。

#### volatile加在基本类型和对象上的区别?

`volatile` 用于基本数据类型时,能确保该变量的读写操作是直接从主内存中读取或写入的。

```java
private volatile int count = 0;
```

`volatile` 用于引用类型时,它确保引用本身的可见性,即确保引用指向的对象地址是最新的。

但是,`volatile` 并不能保证引用对象内部状态的线程安全性。

```java
private volatile SomeObject obj = new SomeObject();
```
虽然 `volatile` 确保了 `obj` 引用的可见性,但对 `obj` 引用的具体对象的操作并不受 `volatile` 保护。如果需要保证引用对象内部状态的线程安全,需要使用其他同步机制(如 `synchronized``ReentrantLock`)。


> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯云智面经同学 16 一面面试原题:手写单例的过程中提到了 synchronized 和 volatile,顺便问了这两个的实现原理
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的携程面经同学 1 Java 后端技术一面面试原题:volatile 如何保证可见性(cup 缓存和主缓存)
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的 360 面经同学 3 Java 后端技术一面面试原题:volatile 关键字,说说别的你知道的关键字
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的快手面经同学 5 面试原题:synchronized和volatile的区别
> 5. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米面经同学 F 面试原题:volatile保证了什么(问了具体的内存屏障),volatile加在基本类型和对象上的区别

GitHub 上标星 10000+ 的开源知识库《[二哥的 Java 进阶之路](https://github.com/itwanger/toBeBetterJavaer)》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 10000+ 的 Java 教程](https://javabetter.cn/overview/)

Expand Down Expand Up @@ -1735,6 +1755,7 @@ Condition condition = lock.newCondition();
```

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米春招同学 K 一面面试原题:synchronized 和 lock 区别
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米面经同学 F 面试原题:synchronized和ReentrantLock区别和场景
### 29.AQS 了解多少?

Expand Down
1 change: 1 addition & 0 deletions docs/sidebar/sanfene/jvm.md
Original file line number Diff line number Diff line change
Expand Up @@ -707,6 +707,7 @@ obj = null;
缺点是移动对象的成本比较高。

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动面经同学 1 Java 后端技术一面面试原题:垃圾回收算法了解多少?
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米面经同学 F 面试原题:垃圾回收的算法及详细介绍
### 19.说一下新生代的区域划分?

Expand Down
24 changes: 22 additions & 2 deletions docs/sidebar/sanfene/redis.md
Original file line number Diff line number Diff line change
Expand Up @@ -571,7 +571,22 @@ sentinel parallel-syncs mymaster 1

④、**高可用基石:** 除了上述作用以外,主从复制还是哨兵和集群能够实施的 **基础**,因此说主从复制是 Redis 高可用的基础。

#### 主从复制出现数据不一致怎么办?

Redis 的主从复制是异步进行的,这意味着主节点在执行完写操作后,会立即返回给客户端,而不是等待从节点完成数据同步。

在主节点将数据同步到从节点的过程中,可能会出现网络延迟或中断,从而导致从节点的数据滞后于主节点。

为了解决数据不一致的问题,应该尽量保证主从节点之间的网络连接状况良好,比如说避免在不同机房之间部署主从节点,以减少网络延迟。但可能会带来新的问题,就是整个机房都挂掉的情况。

此外,Redis 本身也提供了一些机制来解决数据不一致的问题,比如说通过 Redis 的 `INFO replication` 命令监控主从节点的复制进度,及时发现和处理复制延迟。

具体做法是获取主节点的 master_repl_offset 和从节点的 slave_repl_offset,计算两者的差值。如果差值超过预设的阈值,采取措施(如停止从节点的数据读取)以减少读到不一致数据的情况。

![极客时间:Redis 核心技术与实战](https://cdn.tobebetterjavaer.com/stutymore/redis-20240709135618.png)

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的得物面经同学 1 面试原题:Redis分布式,主从,一个节点挂掉怎么办
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米面经同学 F 面试原题:redis的主从架构和主从哨兵区别
### 14.Redis 主从有几种常见的拓扑结构?

Expand All @@ -580,12 +595,15 @@ Redis 的复制拓扑结构可以支持单层或多层复制关系,根据拓
1.一主一从结构

一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持。

![一主一从结构](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/redis-5d91a67c-dbff-4a8d-bf9d-1fe7602d5a27.png) 2.一主多从结构

一主多从结构(又称为星形拓扑结构)使得应用端可以利用多个从节点实现读写分离(见图 6-5)。对于读占比较大的场景,可以把读命令发送到从节点来分担主节点压力。

![一主多从结构](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/redis-71074254-699a-480b-bbb0-c68f364a380b.png) 3.树状主从结构

树状主从结构(又称为树状拓扑结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入复制中间层,可以有效降低主节点负载和需要传送给从节点的数据量。

![树状主从结构](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/redis-dff14203-5e01-4d1b-a775-10ee444ada54.png)

### 15.Redis 的主从复制原理了解吗?
Expand Down Expand Up @@ -649,7 +667,7 @@ Redis 在 2.8 及以上版本使用 psync 命令完成主从数据同步,同

第一个问题是 Redis 的高可用问题,第二、三个问题属于 Redis 的分布式问题。

### 18.Redis Sentinel(哨兵)了解吗
### 18.Redis 哨兵了解吗

哨兵机制是 Redis 提供的一个高可用性解决方案,用于监控 Redis 的主从复制,以自动完成故障转移和通知管理员。

Expand All @@ -669,7 +687,7 @@ Redis 在 2.8 及以上版本使用 psync 命令完成主从数据同步,同

> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的比亚迪面经同学 1 面试原题:Redis的哨兵机制了解吗?
### 19.Redis Sentinel(哨兵)实现原理知道吗
### 19.Redis 哨兵实现原理知道吗

哨兵模式是通过哨兵节点完成对数据节点的监控、下线、故障转移。
![Redis Sentinel工作流程](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/redis-4074d72a-886a-4892-8f55-80112005aad8.png)
Expand Down Expand Up @@ -1005,6 +1023,7 @@ public UserPermissions loadPermissionsFromRedis(String userId) {
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的快手面经同学 7 Java 后端技术一面面试原题:说一下 缓存穿透、缓存击穿、缓存雪崩
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动同学 7 Java 后端实习一面的原题:Redis 宕机会不会对权限系统有影响?
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的字节跳动同学 7 Java 后端实习一面的原题:说一下 Redis 雪崩、穿透、击穿等场景的解决方案
> 5. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米同学 F 面试原题:缓存常见问题和解决方案(引申到多级缓存),多级缓存(redis,nginx,本地缓存)的实现思路
### 27.能说说布隆过滤器吗?

Expand Down Expand Up @@ -1714,6 +1733,7 @@ try {
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的腾讯 Java 后端实习一面原题:分布式锁用了 Redis 的什么数据结构
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小公司面经合集同学 1 Java 后端面试原题:Redisson 的底层原理?以及与 SETNX 的区别?
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的百度面经同学 1 文心一言 25 实习 Java 后端面试原题:redis分布式锁的实现原理?setnx?
> 4. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米同学 F 面试原题:自己实现redis分布式锁的坑(主动提了Redission)
GitHub 上标星 10000+ 的开源知识库《[二哥的 Java 进阶之路](https://github.com/itwanger/toBeBetterJavaer)》第一版 PDF 终于来了!包括 Java 基础语法、数组&字符串、OOP、集合框架、Java IO、异常处理、Java 新特性、网络编程、NIO、并发编程、JVM 等等,共计 32 万余字,500+张手绘图,可以说是通俗易懂、风趣幽默……详情戳:[太赞了,GitHub 上标星 10000+ 的 Java 教程](https://javabetter.cn/overview/)

Expand Down
Loading

0 comments on commit d6c45c4

Please sign in to comment.