Skip to content

Commit e19b8e2

Browse files
author
guanzhenxing
committed
添加一些内容
1 parent b7aa48d commit e19b8e2

21 files changed

Lines changed: 203 additions & 37 deletions

File tree

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,16 @@
1212
- [集合](./java-basic/collections.md)
1313
- [多线程](./java-basic/multithread.md)
1414
- [JVM](./java-basic/jvm.md)
15-
- [NIO](./java-basic/nio.md)
15+
- [IO](./java-basic/io.md)
1616
- [设计模式](./design-pattern/index.md)
1717
- [数据结构与算法](./data-structures-and-algorithms/index.md)
1818
- [算法](./data-structures-and-algorithms/algorithms.md)
1919
- [数据结构](./data-structures-and-algorithms/data-structures.md)
2020
- [JavaWeb](./java-web/index.md)
21-
- [HTTP基础](./java-web/http.md)
2221
- [JavaWeb基础](./java-web/java-web-basic.md)
2322
- [Spring系列](./java-web/spring.md)
2423
- [MyBatis](./java-web/mybatis.md)
2524
- Hibernate
26-
- [Tomcat](./java-web/tomcat.md)
2725
- [数据库与缓存](./db-cache/index.md)
2826
- [数据库基本理论](./db-cache/db_basic.md)
2927
- [缓存基本理论](./db-cache/cache_basic.md)
@@ -42,6 +40,8 @@
4240
- [网络与服务器](./network-server/index.md)
4341
- [计算机网络](./network-server/network.md)
4442
- [Nginx](./network-server/nginx.md)
43+
- [Tomcat](./network-server/tomcat.md)
44+
- [Netty](./network-server/netty.md)
4545
- [软件工程](./software_engineering/index.md)
4646
- [UML](./software_engineering-server/uml.md)
4747
- [业务](./business/index.md)

data-structures-and-algorithms/algorithms.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,14 @@
2121

2222
## 限流算法
2323

24-
参考:[限流算法](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Limiting.md)
24+
参考:[限流算法](https://github.com/crossoverJie/Java-Interview/blob/master/MD/Limiting.md)
25+
26+
## 深度有限算法
27+
28+
## 广度优先算法
29+
30+
## 克鲁斯卡尔算法
31+
32+
## 普林母算法
33+
34+
## 迪克拉斯算法

db-cache/db_basic.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,8 @@ Drop命令从数据库中删除表,所有的数据行,索引和权限也会
131131
|意向共享锁(IS) | 兼容 | 冲突 | 兼容 |兼容 |
132132
|意向排他锁(IX) | 冲突 | 冲突 | 兼容 |兼容|
133133

134-
参考地址:`http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html`
134+
参考地址:`http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html`
135+
136+
## DDL、DML、DCL分别指什么
137+
138+
## 左连接、右连接、内连接、外连接、交叉连接、笛卡儿积

db-cache/redis.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,11 @@ redis利用队列技术将并发访问变为串行访问,消除了传统数据
140140

141141
如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。
142142

143+
## 为什么Redis需要把所有数据放到内存中?
144+
145+
Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。
146+
如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。
147+
143148
## Redis 持久化机制
144149

145150
bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。在redis实例重启时,会使用bgsave持久化文件重新构建内存,再使用aof重放近期的操作指令来实现完整恢复重启之前的状态。
@@ -148,6 +153,20 @@ bgsave做镜像全量持久化,aof做增量持久化。因为bgsave会耗费
148153

149154
对方追问bgsave的原理是什么?你给出两个词汇就可以了,fork和cow。fork是指redis通过创建子进程来进行bgsave操作,cow指的是copy on write,子进程创建后,父子进程共享数据段,父进程继续提供读写服务,写脏的页面数据会逐渐和子进程分离开来。
150155

156+
## Redis提供了哪几种持久化方式?
157+
158+
1. RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储。
159+
1. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾。Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大。
160+
1. 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式。
161+
1. 你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
162+
1. 最重要的事情是了解RDB和AOF持久化方式的不同,让我们以RDB持久化方式开始。
163+
164+
## 如何选择合适的持久化方式?
165+
166+
一般来说, 如果想达到足以媲美PostgreSQL的数据安全性, 你应该同时使用两种持久化功能。如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。
167+
168+
有很多用户都只使用AOF持久化,但并不推荐这种方式:因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外, 使用RDB还可以避免之前提到的AOF程序的bug。
169+
151170
## Pipeline有什么好处,为什么要用pipeline?
152171

153172
可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。
@@ -162,4 +181,17 @@ Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为m
162181

163182
Redis Cluster着眼于扩展性,在单个redis内存不足时,使用Cluster进行分片存储。
164183

184+
## 一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?
185+
186+
理论上Redis可以处理多达232的keys,并且在实际中进行了测试,每个实例至少存放了2亿5千万的keys。我们正在测试一些较大的值。
187+
188+
任何list、set、和sorted set都可以放232个元素。
189+
190+
换句话说,Redis的存储极限是系统中的可用内存值。
191+
192+
## Redis持久化数据和缓存怎么做扩容?
193+
194+
- 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
195+
- 如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。
196+
165197
## Redis 为什么是单线程的

design-pattern/index.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,13 @@
4747
- 模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法(多态实现),从而实现不同的业务逻辑。
4848

4949
除此之外,还可以讲讲上面提到的门面模式、桥梁模式、单例模式、装潢模式(Collections工具类和I/O系统中都使用装潢模式)等,反正基本原则就是拣自己最熟悉的、用得最多的作答,以免言多必失。
50+
51+
## 设计模式在实际场景中的应用
52+
53+
## Spring中用到了哪些设计模式
54+
55+
## MyBatis中用到了哪些设计模式
56+
57+
## 你项目中有使用哪些设计模式
58+
59+
## 说说常用开源框架中设计模式使用分析

distributed/index.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,22 @@
142142

143143
9、分布式架构下实现分布式定时调度
144144

145+
分布式锁的应用场景、分布式锁的产生原因、基本概念
146+
147+
分布是锁的常见解决方案
148+
149+
分布式事务的常见解决方案
150+
151+
集群与负载均衡的算法与实现
152+
153+
说说分库与分表设计,可参考《数据库分库分表策略的具体实现方案》
154+
155+
分库与分表带来的分布式困境与应对之策
156+
145157
## 说说 CAP 定理、 BASE 理论
146158

147159
## 怎么考虑数据一致性问题
148160

149-
## 说说最终一致性的实现方案
161+
## 说说最终一致性的实现方案
162+
163+
## 请解释什么是C10K问题或者知道什么是C10K问题吗?

java-basic/basic.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ try语句可以嵌套,每当遇到一个try语句,异常的结构就会被
335335

336336
虚引用:顾名思义,就是形同虚设,如果一个对象仅持有虚引用,那么它相当于没有引用,在任何时候都可能被垃圾回收器回收。
337337

338-
更多了解参见深入对象引用: http://blog.csdn.net/dd864140130/article/details/49885811
338+
更多了解参见深入对象引用: `http://blog.csdn.net/dd864140130/article/details/49885811`
339339

340340
## 为什么要有不同的引用类型
341341

@@ -380,4 +380,8 @@ Java 中,可以使用 SimpleDateFormat 类或者 joda-time 库来格式日期
380380
实际开发中,例如我们要获取某个方法的调用日志,可以通过 AOP(动态代理机制)给方法添加切面,通过反射来获取方法包含的注解,如果包含日志注解,就进行日志记录。
381381
反射的实现在 Java 应用层面上讲,是通过对 Class 对象的操作实现的,Class 对象为我们提供了一系列方法对类进行操作。在 JVM 这个角度来说,Class 文件是一组以 8 位字节为基础单位的二进制流,各个数据项目按严格的顺序紧凑的排列在 Class 文件中,里面包含了类、方法、字段等等相关数据。
382382

383-
通过对 Class 数据流的处理我们即可得到字段、方法等数据。
383+
通过对 Class 数据流的处理我们即可得到字段、方法等数据。
384+
385+
## 什么要重写hashcode()和equals()以及他们之间的区别与关系?
386+
387+
## Object的hashcode()是怎么计算的?

java-basic/collections.md

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,7 @@ Map保存键值对(key-value pair)映射,映射关系可以是一对一或
3232

3333
Set和Map容器都有基于哈希存储和排序树的两种实现版本,基于哈希存储的版本理论存取时间复杂度为O(1),而基于排序树版本的实现在插入或删除元素时会按照元素或元素的键(key)构成排序树从而达到排序和去重的效果。
3434

35-
## poll()方法和remove()方法区别?
36-
37-
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
38-
39-
## List 和 Set 区别
35+
## List和Set区别
4036

4137
Set是最简单的一种集合。集合中的对象不按特定的方式排序,并且没有重复对象。
4238

@@ -70,7 +66,7 @@ Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
7066

7167
Array是指定大小的,而ArrayList大小是固定的
7268

73-
## ArrayList 与 Vector 区别
69+
## ArrayList与Vector区别
7470

7571
ArrayList和Vector在很多时候都很类似。
7672

@@ -85,7 +81,7 @@ ArrayList和Vector在很多时候都很类似。
8581
- ArrayList比Vector快,它因为有同步,不会过载。
8682
- ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。
8783

88-
## HashMap 和 Hashtable 的区别
84+
## HashMap和Hashtable的区别
8985

9086
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
9187

@@ -94,21 +90,31 @@ HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但
9490
- HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
9591
- 一般认为Hashtable是一个遗留的类。
9692

97-
## HashSet 和 HashMap 区别
93+
## HashSet和HashMap区别
9894

9995
- HashSet实现了Set接口,它不允许集合中有重复的值。它存储的是对象
10096
- HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。
10197

102-
## HashMap 和 ConcurrentHashMap 的区别
98+
## HashMap和ConcurrentHashMap的区别
10399

104100
- ConcurrentHashMap对整个桶数组进行了分段,而HashMap则没有。
105101
- ConcurrentHashMap在每一个分段上都用锁进行保护,从而让锁的粒度更精细一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。
106102

107103
引入ConcurrentHashMap是为了在同步集合HashTable之间有更好的选择,HashTable与HashMap、ConcurrentHashMap主要的区别在于HashMap不是同步的、线程不安全的和不适合应用于多线程并发环境下,而ConcurrentHashMap是线程安全的集合容器,特别是在多线程和并发环境中,通常作为Map的主要实现。
108104

109-
## ArrayList和HashMap默认大小?
105+
## Comparator和Comparable的区别?
106+
107+
Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。
108+
109+
## poll()方法和remove()方法区别?
110+
111+
poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。
110112

111-
在 Java 7 中,ArrayList 的默认大小是 10 个元素,HashMap 的默认大小是16个元素(必须是2的幂)。这就是 Java 7 中 ArrayList 和 HashMap 类的代码片段
113+
## ArrayList、HashMa和LinkedList的默认空间是多少?扩容机制是什么
114+
115+
- ArrayList 的默认大小是 10 个元素。扩容点规则是,新增的时候发现容量不够用了,就去扩容;扩容大小规则是:扩容后的大小= 原始大小+原始大小/2 + 1。
116+
- HashMap 的默认大小是16个元素(必须是2的幂)。扩容因子默认0.75,扩容机制.(当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍。例如:初始大小为 16 ,扩容因子 0.75 ,当容量为12的时候,比例已经是0.75 。触发扩容,扩容后的大小为 32.)
117+
- LinkedList 是一个双向链表,没有初始化大小,也没有扩容的机制,就是一直在前面或者后面新增就好。
112118

113119
```Java
114120
private static final int DEFAULT_CAPACITY = 10;
@@ -117,10 +123,6 @@ private static final int DEFAULT_CAPACITY = 10;
117123
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
118124
```
119125

120-
## Comparator和Comparable的区别?
121-
122-
Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户定制的顺序。Comparable 总是只有一个,但是可以有多个 comparator 来定义对象的顺序。
123-
124126
## 如何实现集合排序?
125127

126128
你可以使用有序集合,如 TreeSet 或 TreeMap,你也可以使用有顺序的的集合,如 list,然后通过 Collections.sort() 来排序。
@@ -162,6 +164,20 @@ ArrayMap是用两个数组来模拟map,更少的内存占用空间,更高的效
162164

163165
需要注意Jdk 1.8中对HashMap的实现做了优化,当链表中的节点数据超过八个之后,该链表会转为红黑树来提高查询效率,从原来的O(n)到O(logn)
164166

167+
也可以参考:
168+
169+
- [深入Java集合学习系列:HashMap的实现原理](http://zhangshixi.iteye.com/blog/672697)
170+
- [深入理解HashMap](https://github.com/guohongjun/HashMap-System-Learning)
171+
172+
## 解决Hash冲突的方法有哪些
173+
174+
开放地址法、链地址法、再哈希法、建立公共溢出区等
175+
176+
参考:
177+
178+
- [java 解决Hash(散列)冲突的四种方法--开放定址法(线性探测,二次探测,伪随机探测)、链地址法、再哈希、建立公共溢出区](https://blog.csdn.net/qq_27093465/article/details/52269862)
179+
- [Java 8中HashMap冲突解决](https://blog.csdn.net/cpcpcp123/article/details/52744331)
180+
165181
## ConcurrentHashMap 的工作原理及代码实现
166182

167183
ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。
@@ -200,4 +216,16 @@ Java.util.concurrent.BlockingQueue是一个队列,在进行检索或移除一
200216

201217
栈与队列很相似,但它允许对元素进行后进先出(LIFO)进行检索。
202218

203-
Stack是一个扩展自Vector的类,而Queue是一个接口。
219+
Stack是一个扩展自Vector的类,而Queue是一个接口。
220+
221+
## 多线程情况下HashMap死循环的问题
222+
223+
可以参考:[疫苗:JAVA HASHMAP的死循环](https://coolshell.cn/articles/9606.html)
224+
225+
## HashMap出现Hash DOS攻击的问题
226+
227+
可以参考:[HASH COLLISION DOS 问题](https://coolshell.cn/articles/6424.html)
228+
229+
## Java Collections和Arrays的sort方法默认的排序方法是什么?
230+
231+
参考:[Collections.sort()和Arrays.sort()排序算法选择](https://blog.csdn.net/TimHeath/article/details/68930482)

java-basic/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,4 @@
55
- [集合](./collections.md)
66
- [多线程](./multithread.md)
77
- [JVM](./jvm.md)
8-
- [数据结构与算法](./data-structures-and-algorithms.md)
8+
- [IO](./io.md)
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ IO 对 Java 应用的性能非常重要。理想情况下,你不应该在你
2828

2929
## BIO、NIO、AIO适用场景分析
3030

31-
- BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
32-
- NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
33-
- AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
31+
- BIO(同步并阻塞)方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。
32+
- NIO(同步非阻塞)方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。
33+
- AIO( 异步非阻塞)方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。
3434

3535
## Java NIO和IO的主要区别
3636

0 commit comments

Comments
 (0)