面试题目更新

pull/6/head
yuanguangxin 4 years ago
parent 148686a221
commit 594c2795ac

@ -1,14 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="af7ffdf2-4ddc-4ed6-8222-60ed5acbc2ed" name="Default Changelist" comment="add q141/q202/q258">
<list default="true" id="af7ffdf2-4ddc-4ed6-8222-60ed5acbc2ed" name="Default Changelist" comment="">
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/README.md" beforeDir="false" afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/hash相关/q141_环形链表/f1/ListNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/快慢指针遍历/q141_环形链表/f1/ListNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/hash相关/q141_环形链表/f1/Solution.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/快慢指针遍历/q141_环形链表/f1/Solution.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/hash相关/q141_环形链表/f2/ListNode.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/快慢指针遍历/q141_环形链表/f2/ListNode.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/hash相关/q141_环形链表/f2/Solution.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/快慢指针遍历/q141_环形链表/f2/Solution.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/src/数字操作/q202_快乐数/Solution.java" beforeDir="false" afterPath="$PROJECT_DIR$/src/快慢指针遍历/q202_快乐数/Solution.java" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Rocket.md" beforeDir="false" afterPath="$PROJECT_DIR$/Rocket.md" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@ -281,7 +276,8 @@
<workItem from="1582007077483" duration="2054000" />
<workItem from="1582286924766" duration="554000" />
<workItem from="1582552791282" duration="3963000" />
<workItem from="1582634245000" duration="12720000" />
<workItem from="1582634245000" duration="13006000" />
<workItem from="1582873496305" duration="4333000" />
</task>
<task id="LOCAL-00001" summary="add q5/q7/q172">
<created>1580045439607</created>
@ -556,7 +552,14 @@
<option name="project" value="LOCAL" />
<updated>1582718525647</updated>
</task>
<option name="localTasksCounter" value="40" />
<task id="LOCAL-00040" summary="更新分类目录">
<created>1582723258830</created>
<option name="number" value="00040" />
<option name="presentableId" value="LOCAL-00040" />
<option name="project" value="LOCAL" />
<updated>1582723258830</updated>
</task>
<option name="localTasksCounter" value="41" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@ -609,7 +612,6 @@
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="add q6" />
<MESSAGE value="add q14/q16/q20" />
<MESSAGE value="add q21" />
<MESSAGE value="add q26/q43" />
@ -634,7 +636,8 @@
<MESSAGE value="增加操作系统相关问题" />
<MESSAGE value="增加JVM相关问题" />
<MESSAGE value="add q141/q202/q258" />
<option name="LAST_COMMIT_MESSAGE" value="add q141/q202/q258" />
<MESSAGE value="更新分类目录" />
<option name="LAST_COMMIT_MESSAGE" value="更新分类目录" />
</component>
<component name="WindowStateProjectService">
<state x="320" y="115" key="#Inspections" timestamp="1581061018990">
@ -649,35 +652,35 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="533" y="166" key="#com.intellij.ide.util.MemberChooser/0.0.1440.900@0.0.1440.900" timestamp="1578548165321" />
<state x="303" y="50" key="CommitChangelistDialog2" timestamp="1582719938529">
<state x="303" y="50" key="CommitChangelistDialog2" timestamp="1582723258552">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="303" y="50" key="CommitChangelistDialog2/0.0.1440.900@0.0.1440.900" timestamp="1582719938529" />
<state x="303" y="50" key="CommitChangelistDialog2/0.0.1440.900@0.0.1440.900" timestamp="1582723258552" />
<state x="144" y="78" width="1152" height="720" key="DiffContextDialog" timestamp="1582714686712">
<screen x="0" y="23" width="1440" height="793" />
</state>
<state x="144" y="78" width="1152" height="720" key="DiffContextDialog/0.0.1440.900@0.0.1440.900" timestamp="1582714675233" />
<state x="144" y="78" width="1152" height="720" key="DiffContextDialog/0.23.1440.793@0.23.1440.793" timestamp="1582714686712" />
<state x="144" y="78" width="1152" height="720" key="DiffContextDialog/0.23.1440.797@0.23.1440.797" timestamp="1581927787180" />
<state width="1398" height="236" key="GridCell.Tab.0.bottom" timestamp="1582716274686">
<state width="1398" height="236" key="GridCell.Tab.0.bottom" timestamp="1582724240264">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state width="1398" height="236" key="GridCell.Tab.0.bottom/0.0.1440.900@0.0.1440.900" timestamp="1582716274686" />
<state width="1398" height="236" key="GridCell.Tab.0.bottom/0.0.1440.900@0.0.1440.900" timestamp="1582724240264" />
<state width="1398" height="177" key="GridCell.Tab.0.bottom/0.23.1440.797@0.23.1440.797" timestamp="1581533895880" />
<state width="1398" height="236" key="GridCell.Tab.0.center" timestamp="1582716274684">
<state width="1398" height="236" key="GridCell.Tab.0.center" timestamp="1582724240261">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state width="1398" height="236" key="GridCell.Tab.0.center/0.0.1440.900@0.0.1440.900" timestamp="1582716274684" />
<state width="1398" height="236" key="GridCell.Tab.0.center/0.0.1440.900@0.0.1440.900" timestamp="1582724240261" />
<state width="1398" height="177" key="GridCell.Tab.0.center/0.23.1440.797@0.23.1440.797" timestamp="1581533895878" />
<state width="1398" height="236" key="GridCell.Tab.0.left" timestamp="1582716274683">
<state width="1398" height="236" key="GridCell.Tab.0.left" timestamp="1582724240261">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state width="1398" height="236" key="GridCell.Tab.0.left/0.0.1440.900@0.0.1440.900" timestamp="1582716274683" />
<state width="1398" height="236" key="GridCell.Tab.0.left/0.0.1440.900@0.0.1440.900" timestamp="1582724240261" />
<state width="1398" height="177" key="GridCell.Tab.0.left/0.23.1440.797@0.23.1440.797" timestamp="1581533895878" />
<state width="1398" height="236" key="GridCell.Tab.0.right" timestamp="1582716274685">
<state width="1398" height="236" key="GridCell.Tab.0.right" timestamp="1582724240263">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state width="1398" height="236" key="GridCell.Tab.0.right/0.0.1440.900@0.0.1440.900" timestamp="1582716274685" />
<state width="1398" height="236" key="GridCell.Tab.0.right/0.0.1440.900@0.0.1440.900" timestamp="1582724240263" />
<state width="1398" height="177" key="GridCell.Tab.0.right/0.23.1440.797@0.23.1440.797" timestamp="1581533895879" />
<state width="1398" height="204" key="GridCell.Tab.1.bottom" timestamp="1581745235895">
<screen x="0" y="0" width="1440" height="900" />
@ -703,10 +706,10 @@
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="221" y="63" key="SettingsEditor/0.0.1440.900@0.0.1440.900" timestamp="1581061096545" />
<state x="320" y="190" key="Vcs.Push.Dialog.v2" timestamp="1582718527035">
<state x="320" y="190" key="Vcs.Push.Dialog.v2" timestamp="1582723259993">
<screen x="0" y="0" width="1440" height="900" />
</state>
<state x="320" y="190" key="Vcs.Push.Dialog.v2/0.0.1440.900@0.0.1440.900" timestamp="1582718527035" />
<state x="320" y="190" key="Vcs.Push.Dialog.v2/0.0.1440.900@0.0.1440.900" timestamp="1582723259993" />
<state x="100" y="100" width="1240" height="700" key="com.intellij.history.integration.ui.views.DirectoryHistoryDialog" timestamp="1581744794182">
<screen x="0" y="23" width="1440" height="797" />
</state>

@ -55,6 +55,7 @@ Redis 中数据过期策略采用定期删除+惰性删除策略
6. 当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。
### Redis的LRU具体实现
传统的LRU是使用栈的形式每次都将最新使用的移入栈顶但是用栈的形式会导致执行select *的时候大量非热点数据占领头部数据所以需要改进。Redis每次按key获取一个值的时候都会更新value中的lru字段为当前秒级别的时间戳。Redis初始的实现算法很简单随机从dict中取出五个key,淘汰一个lru字段值最小的。在3.0的时候又改进了一版算法首先第一次随机选取的key都会放入一个pool中(pool的大小为16),pool中的key是按lru大小顺序排列的。接下来每次随机选取的keylru值必须小于pool中最小的lru才会继续放入直到将pool放满。放满之后每次如果有新的key需要放入需要将pool中lru最大的一个key取出。淘汰的时候直接从pool中选取一个lru最小的值然后将其淘汰。
### 如何解决 Redis 缓存雪崩问题
@ -344,7 +345,7 @@ AQS内部有3个对象一个是state用于计数器类似gc的回收计
1. 减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2. 可以根据系统的承受能力,调整线程池中工作线程的数目,放置因为消耗过多的内存,而把服务器累趴下
### 核心线程池ThreadPoolExecutor内部实现
### 核心线程池ThreadPoolExecutor内部参数
1. corePoolSize指定了线程池中的线程数量
2. maximumPoolSize指定了线程池中的最大线程数量
@ -354,12 +355,25 @@ AQS内部有3个对象一个是state用于计数器类似gc的回收计
6. threadFactory线程工厂用于创建线程一般用默认的即可。
7. handler拒绝策略。当任务太多来不及处理如何拒绝任务。
### 线程池的拒绝策略
1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
2. ThreadPoolExecutor.DiscardPolicy丢弃任务但是不抛出异常。
3. ThreadPoolExecutor.DiscardOldestPolicy丢弃队列最前面的任务然后重新提交被拒绝的任务
4. ThreadPoolExecutor.CallerRunsPolicy由调用线程提交任务的线程处理该任务
### 线程池的线程数量怎么确定
1. 一般来说如果是CPU密集型应用则线程池大小设置为N+1。
2. 一般来说如果是IO密集型应用则线程池大小设置为2N+1。
3. 在IO优化中线程等待时间所占比例越高需要越多线程线程CPU时间所占比例越高需要越少线程。这样的估算公式可能更适合最佳线程数目 = ((线程等待时间+线程CPU时间/线程CPU时间 * CPU数目
### ThreadLocal的原理和实现
ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。ThreadLocal 变量通常被private static修饰。当一个线程结束时它所使用的所有 ThreadLocal 相对的实例副本都可被回收。
一个线程内可以存在多个 ThreadLocal 对象,所以其实是 ThreadLocal 内部维护了一个 Map ,这个 Map 不是直接使用的 HashMap ,而是 ThreadLocal 实现的一个叫做 ThreadLocalMap 的静态内部类。而我们使用的 get()、set() 方法其实都是调用了这个ThreadLocalMap类对应的 get()、set() 方法。
### HashSet和HashMap
HashSet的value存的是一个static finial PRESENT = newObject()。而HashSet的remove是使用HashMap实现,则是map.remove而map的移除会返回value,如果底层value都是存null,显然将无法分辨是否移除成功。
@ -425,6 +439,10 @@ Spring使用了三级缓存解决了循环依赖的问题。在populateBean()给
解耦,异步处理,削峰/限流
### Kafka的文件存储机制
Kafka中消息是以topic进行分类的生产者通过topic向Kafka broker发送消息消费者通过topic读取数据。然而topic在物理层面又能以partition为分组一个topic可以分成若干个partition。partition还可以细分为segment一个partition物理上由多个segment组成segment文件由两部分组成分别为“.index”文件和“.log”文件分别表示为segment索引文件和数据文件。这两个文件的命令规则为partition全局的第一个segment从0开始后续每个segment文件名为上一个segment文件最后一条消息的offset值。
### Kafka 如何保证可靠性
如果我们要往 Kafka 对应的主题发送消息,我们需要通过 Producer 完成。前面我们讲过 Kafka 主题对应了多个分区,每个分区下面又对应了多个副本;为了让用户设置数据可靠性, Kafka 在 Producer 里面提供了消息确认机制。也就是说我们可以通过配置来决定消息发送到对应分区的几个副本才算消息发送成功。可以在定义 Producer 时通过 acks 参数指定。这个参数支持以下三种值:

Loading…
Cancel
Save