Skip to content

Commit 1a7b276

Browse files
author
chenyong
committed
docs(readme): remove architecture from readme
1 parent c42f6b3 commit 1a7b276

3 files changed

Lines changed: 56 additions & 12 deletions

File tree

README.md

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44

55
### 目录
66

7-
| 英语 | Java | Spring生态 | 中间件 | 数据库 | 服务器 | 网络/系统 | 架构设计 | 内功 | 程序人生 |
8-
|:----|:-----|:------|:------|:------|:------|:------|:------|:------|:-----|
9-
|<a href="#英语" h2>英语</a>|<a href="#Java">Basic</a><br><a href="#Java">JVM</a><br><a href="#Java">Web</a><br>|<a href="#Java">Spring</a><br><a href="#Java">Spring Boot</a><br><a href="#Java">Spring Cloud</a>|<a href="#中间件">Keepalived</a><br><a href="#中间件">ActiveMQ</a><br><a href="#中间件">RabbitMQ</a><br><a href="#中间件">RocketMQ</a><br><a href="#中间件">MQTT</a><br><a href="#中间件">Netty</a><br><a href="#中间件">Mybatis</a><br><a href="#中间件">Redis</a><br><a href="#中间件">Log</a>|<a href="#数据库">MySQL</a><br><a href="#数据库">Postgresql</a><br><a href="#数据库">Mongodb</a>|<a href="#服务器">Tomcat</a><br><a href="#服务器">Nginx</a>|<a href="#网络">网络</a><br><a href="#服务器">Linux</a>|<a href="#架构设计">原则</a><br><a href="#架构设计">安全</a><br><a href="#架构设计">高可用</a><br><a href="#架构设计">扩展性</a><br><a href="#架构设计">伸缩性</a><br><a href="#架构设计">性能</a><br>|<a href="#内功">数据结构</a><br><a href="#内功">算法</a><br><a href="#内功">设计模式</a>|<a href="#程序人生">软文</a><br><a href="#程序人生">规范</a><br><a href="#程序人生">工具</a><br><a href="#程序人生">面试集锦</a><br><a href="#程序人生">实战训练</a>|
7+
| 英语 | Java | Spring生态 | 中间件 | 数据库 | 服务器 | 网络/系统 | 内功 | 程序人生 |
8+
|:----|:-----|:------|:------|:------|:------|:------|:------|:------|
9+
|<a href="#英语" h2>英语</a>|<a href="#Java">Basic</a><br><a href="#Java">JVM</a><br><a href="#Java">Web</a><br>|<a href="#Java">Spring</a><br><a href="#Java">Spring Boot</a><br><a href="#Java">Spring Cloud</a>|<a href="#中间件">Keepalived</a><br><a href="#中间件">ActiveMQ</a><br><a href="#中间件">RabbitMQ</a><br><a href="#中间件">RocketMQ</a><br><a href="#中间件">MQTT</a><br><a href="#中间件">Netty</a><br><a href="#中间件">Mybatis</a><br><a href="#中间件">Redis</a><br><a href="#中间件">Log</a>|<a href="#数据库">MySQL</a><br><a href="#数据库">Postgresql</a><br><a href="#数据库">Mongodb</a>|<a href="#服务器">Tomcat</a><br><a href="#服务器">Nginx</a>|<a href="#网络">网络</a><br><a href="#服务器">Linux</a>|<a href="#内功">数据结构</a><br><a href="#内功">算法</a><br><a href="#内功">设计模式</a>|<a href="#程序人生">软文</a><br><a href="#程序人生">规范</a><br><a href="#程序人生">工具</a><br><a href="#程序人生">面试集锦</a><br><a href="#程序人生">实战训练</a>|
1010

1111
### 英语
1212
* [计算机行业常用英语积累](tool/english.md)
@@ -34,13 +34,7 @@
3434
* [Tomcat服务器](plugins/tomcat.md)&emsp;[Nginx反向代理服务器搭建](plugins/nginx.md)&emsp;[Linux系统常用命令](tool/shell/linux.md)
3535

3636
### 架构设计
37-
* `设计原则`: &emsp;[系统设计注意事项](system/architecture/系统设计注意事项.md)
38-
* `系统安全`: &emsp;[系统架构安全设计](system/architecture/系统架构安全设计.md)
39-
* `高可用性`: &emsp;[系统架构高可用设计](system/architecture/系统架构高可用设计.md)
40-
* `高扩展性`: &emsp;[系统架构扩展性设计](system/architecture/系统架构扩展性设计.md)
41-
* `高伸缩性`: &emsp;[系统架构伸缩性设计](system/architecture/系统架构伸缩性设计.md)
42-
* `系统性能`: &emsp;[系统架构性能设计](system/architecture/系统架构性能设计.md)
43-
* `其他事项`: &emsp;[系统架构设计其他注意事项](system/architecture/系统架构设计其他注意事项.md)
37+
TODO
4438

4539
### 内功
4640
* `设计模式`: [23种设计模式](system/algorithm/设计模式.md)

java/basic/java-collection.md

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,30 @@ Map 映射顺序。有些实现类,可以明确保证其顺序,如 TreeMap
120120
Map 的实现类应该提供2个“标准的”构造方法:第一个,void(无参数)构造方法,用于创建空映射;第二个,带有单个 Map 类型参数的构造方法,用于创建一个与其参数具有相同键-值映射关系的新映射。实际上,后一个构造方法允许用户复制任意映射,生成所需类的一个等价映射。尽管无法强制执行此建议(因为接口不能包含构造方法),但是 JDK 中所有通用的映射实现都遵从它。
121121
```
122122

123-
[Map的三种Collection视图例子 MapTest01.java](https://github.com/zhonghuasheng/JAVA/blob/master/basic/src/main/java/com/zhonghuasheng/basic/util/MapTest01.java)
123+
[Map的三种Collection视图例子 MapTest01.java]
124+
```java
125+
// key视图
126+
Set<String> keys = hashMap.keySet();
127+
Iterator<String> iteratorKeys = keys.iterator();
128+
while (iteratorKeys.hasNext()) {
129+
System.out.println(iteratorKeys.next());
130+
}
131+
132+
// value视图
133+
Collection<String> values = hashMap.values();
134+
Iterator<String> iteratorValues = values.iterator();
135+
while (iteratorValues.hasNext()) {
136+
System.out.println(iteratorValues.next());
137+
}
124138

139+
// key-value视图
140+
Set<Entry<String, String>> entrySets = hashMap.entrySet();
141+
Iterator<Entry<String, String>> iteratorEntrySets = entrySets.iterator();
142+
while (iteratorEntrySets.hasNext()) {
143+
Entry<String, String> entry = iteratorEntrySets.next();
144+
System.out.println(String.format("key: %s, value: %s", entry.getKey(), entry.getValue()));
145+
}
146+
```
125147
## Concurrent包下的集合概述
126148

127149
1. 概述
@@ -492,7 +514,7 @@ AbstractSet没有对Set做多少的实现,其继承了AbstractCollection
492514
`总结`
493515
```
494516
HashSet是一个没有重复元素的集合,它是由HashMap实现的(HashMap中key不能重复),不保证元素的顺序,而且HashSet允许使用null元素。
495-
HashSet是非同步的,因此如果多线程同时访问一个HashSet而其中至少有一个线程修改了该HashSet夺得话,那么需要保持外部同步,通常可以对该Set的对象封装来完成同步操作,也可以使用Collections.synchronizedSet方法来完成。
517+
HashSet是非同步的,因此如果多线程同时访问一个HashSet而其中至少有一个线程修改了该HashSet的话,那么需要保持外部同步,通常可以对该Set的对象封装来完成同步操作,也可以使用Collections.synchronizedSet方法来完成。
496518
HashSet是通过Iterator迭代遍历的
497519
```
498520

tool/interview.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,30 @@
11
# 目录
2+
* [知识点纪要](#知识点纪要)
23
* [面试题](#面试题)
34
* [面试技巧](#面试技巧)
45

6+
### 知识点纪要
7+
基础,集合,AQS,JVM,Spring,SpringBoot,SpringCloud,缓存,消息队列,数据库,搜索,架构
8+
9+
集合
10+
----
11+
Java的集合类位于java.util.*包下,大体分为2类,Collection和Map,另外就是2个工具类。
12+
Collection包含3个分支: List, Set, Queue
13+
Map包含1个分支:Map
14+
Concurrent主要有3个package组成:
15+
* java.util.concurrent
16+
```
17+
提供大部分关于并发的接口和类,如BlockingQueue, ConcurrentHashMap, ExecutorService等
18+
```
19+
* java.util.concurrent.atomic
20+
```
21+
提供所有的原子类操作,如AtomicInteger, AtomicLong等
22+
```
23+
* java.util.concurrent.locks
24+
```
25+
提供锁相关的类,如Lock, ReentrantLock, ReadWriteLock, Confition等
26+
```
27+
528
### 面试题
629
#### Java 基础
730
* [什么是面向对象](https://github.com/zhonghuasheng/Tutorial/issues/188)
@@ -223,6 +246,11 @@ epoll_wait() 多长时间去轮询一次,看有没有数据
223246
答:ArrayList的底层数据结构是数组,不指定ArrayList大小的时候初始化的大小是0,第一次add的时候size会变成10,扩容的话会是之前的1.5倍。ArrayList由于底层是数组,因此随机查找的速度很快,插入和删除效率比较低。因为它底层是数组,因此分配内存空间的时候要求是连续的内存单元,所以如果需要存储的数据量很大的情况下,不建议使用ArrayList。LinkedList的底层是一个带有头节点和尾节点的双向链表,提供了头插(LinkedFirst)和尾插(LinkedLast),插入和删除比较快,不支持随机查询,LinkedList数据的存储不要求内存空间是连续的。
224247
问:如果在多线程的情况下,我既想用List,又想保证线程安全,那怎么办?
225248
答:我知道的有三种方式:1. 使用Vector,它是一个线程安全的List集合,所有的方法都加了synchronized关键字来保证同步,但它性能很差。[读写都加锁,底层也是数组,扩容时是之前的2倍] 2. 使用Collections.SynchronizedList,它是Collections下的一个静态内部类,它把List下的所有方法都变成了线程安全的,于Vector不同的是,它把synchronized加到了方法内部的代码块上,提高了扩展性[锁的粒度变小] 3. 使用CopyOnWriteArrayList,add的时候加锁,读的时候不加锁,提高了读取性能 [锁粒度变小,同时锁范围变小]
249+
250+
CopyOnWriteArrayList:CopyOnWriteArrayList这是一个ArrayList的线程安全的变体,其原理大概可以通俗的理解为:初始化的时候只有一个容器,很常一段时间,这个容器数据、数量等没有发生变化的时候,大家(多个线程),都是读取(假设这段时间里只发生读取的操作)同一个容器中的数据,所以这样大家读到的数据都是唯一、一致、安全的,但是后来有人往里面增加了一个数据,这个时候CopyOnWriteArrayList 底层实现添加的原理是先copy出一个新的容器(可以简称副本),再往新的容器里添加这个新的数据,最后把新的容器的引用地址赋值给了之前那个旧的的容器地址,但是在添加这个数据的期间,其他线程如果要去读取数据,仍然是读取到旧的容器里的数
251+
Object[] newElements = Arrays.copyOf(elements, len + 1);
252+
newElements[len] = e;
253+
setArray(newElements);
226254
```
227255

228256
3. 常规的来聊一下HashMap

0 commit comments

Comments
 (0)