diff --git "a/Java\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" "b/Java\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" index a2d0087..91aeea9 100644 --- "a/Java\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" +++ "b/Java\345\267\245\347\250\213\345\270\210\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" @@ -1,58 +1,59 @@ ### Java工程师面试突击_目录 -#### 消息中间件 -- [如何进行消息队列的选型](./notes/待整理.md) -- [引入消息队列后如何保证其可用性](./notes/待整理.md) -- [为什么消息队列里消费到了重复数据](./notes/待整理.md) -- [发到消息队列的数据不见了](./notes/待整理.md) -- [如何保证从消息队列拿到的数据按照顺序执行](./notes/待整理.md) -- [几百万消息在小消息队列里积压了几小时](./notes/待整理.md) -- [如果让你开发一个消息中间件,你会怎么设计架构](./notes/待整理.md) -- [消息队列相关问题的面试技巧](./notes/待整理.md) +#### [消息中间件](./Java工程师面试突击/消息中间件) +     • [1. 如何进行消息队列的选型](./notes/待整理.md)
+     • [2. 引入消息队列后如何保证其可用性](./notes/待整理.md)
+     • [3. 为什么消息队列里消费到了重复数据](./notes/待整理.md)
+     • [4. 发到消息队列的数据不见了](./notes/待整理.md)
+     • [5. 如何保证从消息队列拿到的数据按照顺序执行](./notes/待整理.md)
+     • [6. 几百万消息在小消息队列里积压了几小时](./notes/待整理.md)
+     • [7. 如果让你开发一个消息中间件,你会怎么设计架构](./notes/待整理.md)
+     • [8. 消息队列相关问题的面试技巧](./notes/待整理.md)
-#### 分布式搜索 -- [分布式引擎架构是怎么设计的,为什么是分布式的](./notes/待整理.md) -- [分布式搜索引擎写入和查询的工作流程](./notes/待整理.md) -- [分布式搜索引擎在几十亿数据量级的场景下如何优化查询性能](./notes/待整理.md) -- [你们公司分布式搜索引擎是怎么部署的](./notes/待整理.md) -- [分布式搜索引擎相关问题的面试技巧](./notes/待整理.md) +#### [分布式搜索](./Java工程师面试突击/分布式搜索) +     • [1. 分布式引擎架构是怎么设计的,为什么是分布式的](./notes/待整理.md)
+     • [2. 分布式搜索引擎写入和查询的工作流程](./notes/待整理.md)
+     • [3. 分布式搜索引擎在几十亿数据量级的场景下如何优化查询性能](./notes/待整理.md)
+     • [4. 你们公司分布式搜索引擎是怎么部署的](./notes/待整理.md)
+     • [5. 分布式搜索引擎相关问题的面试技巧](./notes/待整理.md)
-#### 分布式缓存 -- [分布式缓存第一个问题]() -- [redis线程模型,为什么单线程还是有很高的效率]() -- [redis有哪些数据类型,分别在什么场景下使用比较合适]() -- [redis过期策略,手写LRU]() -- [怎么保证redis是高并发和高可用]() -- [怎么保证redis挂掉之后再重启数据可以恢复]() -- [redis cluster集群模式的原理]() -- [一般如何应对缓存雪崩以及穿透问题]() -- [如何保证缓存与数据库双写时的数据一致性]() -- [redis的并发竞争该如何解决]() -- [你们公司生产环境的redis集群的部署架构是什么样的]() -- [分布式缓存面试题的回答技巧]() +#### [分布式缓存](./Java工程师面试突击/分布式缓存) +     • [1. 分布式缓存第一个问题](./notes/待整理.md)
+     • [2. redis线程模型,为什么单线程还是有很高的效率](./notes/待整理.md)
+     • [3. redis有哪些数据类型,分别在什么场景下使用比较合适](./notes/待整理.md)
+     • [4. redis过期策略,手写LRU](./notes/待整理.md)
+     • [5. 怎么保证redis是高并发和高可用](./notes/待整理.md)
+     • [6. 怎么保证redis挂掉之后再重启数据可以恢复](./notes/待整理.md)
+     • [7. redis cluster集群模式的原理](./notes/待整理.md)
+     • [8. 一般如何应对缓存雪崩以及穿透问题](./notes/待整理.md)
+     • [9. 如何保证缓存与数据库双写时的数据一致性](./notes/待整理.md)
+     • [10. redis的并发竞争该如何解决](./notes/待整理.md)
+     • [11. 你们公司生产环境的redis集群的部署架构是什么样的](./notes/待整理.md)
+     • [12. 分布式缓存面试题的回答技巧](./notes/待整理.md)
-#### 分布式系统 -- [为什么要把系统拆分为分布式,为啥要用dubbo]() -- [dubbo的工作原理,注册中心挂了可以继续通信嘛]() -- [dubbo都支持哪写通信协议以及序列化协议]() -- [dubbo支持哪写负载均衡,高可用以及动态代理策略]() -- [SPI是啥意思,dubbo的SPI机制原理]() -- [基于dubbo如何做服务治理、服务降级以及重试]() -- [分布式接口的幂等性如何保证,比如不能重复扣款]() -- [分布式系统中的接口调用如何保证顺序性]() -- [如何设计一个类似dubbo的rpc框架,架构上如何考虑]() -- [zookeeper一般都有哪写使用场景]() -- [什么是分布式锁,对比redis和zk两种分布式锁的优劣]() -- [说说你们的分布式session方案,怎么做的]() -- [分布式事务方案,有啥坑]() -- [一般如何设计一个高并发的系统架构]() +#### [分布式系统](./Java工程师面试突击/分布式系统) +     • [1. 为什么要把系统拆分为分布式,为啥要用dubbo](./notes/待整理.md)
+     • [2. dubbo的工作原理,注册中心挂了可以继续通信嘛](./notes/待整理.md)
+     • [3. dubbo都支持哪写通信协议以及序列化协议](./notes/待整理.md)
+     • [4. dubbo支持哪写负载均衡,高可用以及动态代理策略](./notes/待整理.md)
+     • [5. SPI是啥意思,dubbo的SPI机制原理](./notes/待整理.md)
+     • [6. 基于dubbo如何做服务治理、服务降级以及重试](./notes/待整理.md)
+     • [7. 分布式接口的幂等性如何保证,比如不能重复扣款](./notes/待整理.md)
+     • [8. 分布式系统中的接口调用如何保证顺序性](./notes/待整理.md)
+     • [9. 如何设计一个类似dubbo的rpc框架,架构上如何考虑](./notes/待整理.md)
+     • [10. zookeeper一般都有哪写使用场景](./notes/待整理.md)
+     • [11. 什么是分布式锁,对比redis和zk两种分布式锁的优劣](./notes/待整理.md)
+     • [12. 说说你们的分布式session方案,怎么做的](./notes/待整理.md)
+     • [13. 分布式事务方案,有啥坑](./notes/待整理.md)
+     • [14. 一般如何设计一个高并发的系统架构](./notes/待整理.md)
+ +#### [数据库](./Java工程师面试突击/数据库) +     • [1. 如何分库分表](./notes/待整理.md)
+     • [2. 如何系统不停机迁移到分库分表](./notes/待整理.md)
+     • [3. 如何设计可动态扩容缩容的分库分表方案](./notes/待整理.md)
+     • [4. 分库分表后全局id如何生成](./notes/待整理.md)
+     • [5. MySQL读写分离的原理,主从同步如何解决](./notes/待整理.md)
-#### 数据库 -- [如何分库分表]() -- [如何系统不停机迁移到分库分表]() -- [如何设计可动态扩容缩容的分库分表方案]() -- [分库分表后全局id如何生成]() -- [MySQL读写分离的原理,主从同步如何解决]() --- diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/7.\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/1.\346\250\241\347\211\210.md" similarity index 100% rename from "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/7.\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221.md" rename to "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/1.\346\250\241\347\211\210.md" diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/\346\250\241\346\235\277.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/001.md" similarity index 100% rename from "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/\346\250\241\346\235\277.md" rename to "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/001.md" diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/002.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/002.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/002.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/003.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/003.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/003.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/004.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/004.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/004.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/005.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/005.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/005.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/006.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/006.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/006.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/007.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/007.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/007.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/008.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/008.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/008.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/009.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/009.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/009.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/010.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/010.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/010.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/011.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/011.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/011.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/012.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/012.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/012.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/013.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/013.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/013.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/014.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/014.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/014.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/015.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/015.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/015.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/016.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/016.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/016.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/017.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/017.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/017.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/018.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/018.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/018.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/019.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/019.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/019.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/020.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/020.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/020.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/021.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/021.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/021.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/022.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/022.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/022.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/023.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/023.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/023.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/024.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/024.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/024.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/025.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/025.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/025.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/026.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/026.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/026.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/027.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/027.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/027.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/028.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/028.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/028.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/029.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/029.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/029.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/030.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/030.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/030.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/031.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/031.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/031.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/032.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/032.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/032.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/033.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/033.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/033.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/034.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/034.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/034.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/035.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/035.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/035.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/036.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/036.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/036.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/037.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/037.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/037.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/038.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/038.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/038.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/039.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/039.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/039.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/040.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/040.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/040.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/041.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/041.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/041.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/042.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/042.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/042.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/043.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/043.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/043.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/044.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/044.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/044.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/045.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/045.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/045.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/046.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/046.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/046.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/047.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/047.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/047.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/048.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/048.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/048.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/049.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/049.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/049.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/050.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/050.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/050.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/051.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/051.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/051.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/052.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/052.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/052.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/053.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/053.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/053.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/054.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/054.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/054.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/055.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/055.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/055.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/056.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/056.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/056.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/057.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/057.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/057.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/058.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/058.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/058.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/059.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/059.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/059.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/060.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/060.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/060.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/061.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/061.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/061.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/062.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/062.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/062.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/063.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/063.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/063.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/064.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/064.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/064.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/065.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/065.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/065.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/066.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/066.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/066.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/067.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/067.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/067.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/068.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/068.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/068.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/069.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/069.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/069.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/070.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/070.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/070.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/071.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/071.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/071.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/072.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/072.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/072.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/073.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/073.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/073.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/074.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/074.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/074.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/075.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/075.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/075.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/076.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/076.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/076.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/077.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/077.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/077.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/078.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/078.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/078.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/079.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/079.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/079.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/080.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/080.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/080.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/081.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/081.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/081.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/082.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/082.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/082.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/083.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/083.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/083.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/084.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/084.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/084.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/085.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/085.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/085.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/086.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/086.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/086.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/087.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/087.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/087.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/088.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/088.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/088.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/089.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/089.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/089.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/090.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/090.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/090.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/091.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/091.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/091.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/092.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/092.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/092.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/093.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/093.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/093.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/094.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/094.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/094.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/095.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/095.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/095.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/096.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/096.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/096.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/097.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/097.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/097.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/098.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/098.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/098.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/099.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/099.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/099.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/100.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/100.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/LeetCode_Top100/100.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_1.\346\261\202\350\243\264\346\263\242\351\202\243\345\245\221\346\225\260\345\210\227\347\232\204\347\254\254n\351\241\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_1.\346\261\202\350\243\264\346\263\242\351\202\243\345\245\221\346\225\260\345\210\227\347\232\204\347\254\254n\351\241\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_1.\346\261\202\350\243\264\346\263\242\351\202\243\345\245\221\346\225\260\345\210\227\347\232\204\347\254\254n\351\241\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_2.\351\235\222\350\233\231\350\267\263\345\217\260\351\230\266\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_2.\351\235\222\350\233\231\350\267\263\345\217\260\351\230\266\351\227\256\351\242\230.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_2.\351\235\222\350\233\231\350\267\263\345\217\260\351\230\266\351\227\256\351\242\230.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_3.\345\217\230\346\200\201\350\267\263\345\217\260\351\230\266.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_3.\345\217\230\346\200\201\350\267\263\345\217\260\351\230\266.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/10_3.\345\217\230\346\200\201\350\267\263\345\217\260\351\230\266.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/11.\346\227\213\350\275\254\346\225\260\347\273\204\347\232\204\346\234\200\345\260\217\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/11.\346\227\213\350\275\254\346\225\260\347\273\204\347\232\204\346\234\200\345\260\217\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/11.\346\227\213\350\275\254\346\225\260\347\273\204\347\232\204\346\234\200\345\260\217\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/12.\347\237\251\351\230\265\344\270\255\347\232\204\350\267\257\345\276\204.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/12.\347\237\251\351\230\265\344\270\255\347\232\204\350\267\257\345\276\204.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/12.\347\237\251\351\230\265\344\270\255\347\232\204\350\267\257\345\276\204.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/13.\346\234\272\345\231\250\344\272\272\347\232\204\350\277\220\345\212\250\350\214\203\345\233\264.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/13.\346\234\272\345\231\250\344\272\272\347\232\204\350\277\220\345\212\250\350\214\203\345\233\264.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/13.\346\234\272\345\231\250\344\272\272\347\232\204\350\277\220\345\212\250\350\214\203\345\233\264.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/15.\344\272\214\350\277\233\345\210\266\344\270\2551\347\232\204\344\270\252\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/15.\344\272\214\350\277\233\345\210\266\344\270\2551\347\232\204\344\270\252\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/15.\344\272\214\350\277\233\345\210\266\344\270\2551\347\232\204\344\270\252\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/16.\346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/16.\346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/16.\346\225\260\345\200\274\347\232\204\346\225\264\346\225\260\346\254\241\346\226\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/17.\346\211\223\345\215\260\344\273\2161\345\210\260\346\234\200\345\244\247\347\232\204n\344\275\215\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/17.\346\211\223\345\215\260\344\273\2161\345\210\260\346\234\200\345\244\247\347\232\204n\344\275\215\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/17.\346\211\223\345\215\260\344\273\2161\345\210\260\346\234\200\345\244\247\347\232\204n\344\275\215\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/18_1.\345\234\250O(1)\346\227\266\351\227\264\345\206\205\345\210\240\351\231\244\351\223\276\350\241\250\350\212\202\347\202\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/18_1.\345\234\250O(1)\346\227\266\351\227\264\345\206\205\345\210\240\351\231\244\351\223\276\350\241\250\350\212\202\347\202\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/18_1.\345\234\250O(1)\346\227\266\351\227\264\345\206\205\345\210\240\351\231\244\351\223\276\350\241\250\350\212\202\347\202\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/18_2.\345\210\240\351\231\244\351\223\276\350\241\250\344\270\255\351\207\215\345\244\215\347\232\204\350\212\202\347\202\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/18_2.\345\210\240\351\231\244\351\223\276\350\241\250\344\270\255\351\207\215\345\244\215\347\232\204\350\212\202\347\202\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/18_2.\345\210\240\351\231\244\351\223\276\350\241\250\344\270\255\351\207\215\345\244\215\347\232\204\350\212\202\347\202\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/19.\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/19.\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/19.\346\255\243\345\210\231\350\241\250\350\276\276\345\274\217\345\214\271\351\205\215.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/20.\350\241\250\347\244\272\346\225\260\345\200\274\347\232\204\345\255\227\347\254\246\344\270\262.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/20.\350\241\250\347\244\272\346\225\260\345\200\274\347\232\204\345\255\227\347\254\246\344\270\262.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/20.\350\241\250\347\244\272\346\225\260\345\200\274\347\232\204\345\255\227\347\254\246\344\270\262.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/21.\350\260\203\346\225\264\346\225\260\347\273\204\351\241\272\345\272\217\344\275\277\345\245\207\346\225\260\344\275\215\344\272\216\345\201\266\346\225\260\345\211\215\351\235\242.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/21.\350\260\203\346\225\264\346\225\260\347\273\204\351\241\272\345\272\217\344\275\277\345\245\207\346\225\260\344\275\215\344\272\216\345\201\266\346\225\260\345\211\215\351\235\242.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/21.\350\260\203\346\225\264\346\225\260\347\273\204\351\241\272\345\272\217\344\275\277\345\245\207\346\225\260\344\275\215\344\272\216\345\201\266\346\225\260\345\211\215\351\235\242.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/22.\351\223\276\350\241\250\344\270\255\345\200\222\346\225\260\347\254\254k\344\270\252\347\273\223\347\202\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/22.\351\223\276\350\241\250\344\270\255\345\200\222\346\225\260\347\254\254k\344\270\252\347\273\223\347\202\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/22.\351\223\276\350\241\250\344\270\255\345\200\222\346\225\260\347\254\254k\344\270\252\347\273\223\347\202\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/23_\351\223\276\350\241\250\344\270\255\347\216\257\347\232\204\345\205\245\345\217\243\347\273\223\347\202\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/23_\351\223\276\350\241\250\344\270\255\347\216\257\347\232\204\345\205\245\345\217\243\347\273\223\347\202\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/23_\351\223\276\350\241\250\344\270\255\347\216\257\347\232\204\345\205\245\345\217\243\347\273\223\347\202\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/24.\345\217\215\350\275\254\351\223\276\350\241\250.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/24.\345\217\215\350\275\254\351\223\276\350\241\250.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/24.\345\217\215\350\275\254\351\223\276\350\241\250.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/25.\345\220\210\345\271\266\344\270\244\344\270\252\346\216\222\345\272\217\347\232\204\351\223\276\350\241\250.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/25.\345\220\210\345\271\266\344\270\244\344\270\252\346\216\222\345\272\217\347\232\204\351\223\276\350\241\250.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/25.\345\220\210\345\271\266\344\270\244\344\270\252\346\216\222\345\272\217\347\232\204\351\223\276\350\241\250.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/26.\346\240\221\347\232\204\345\255\220\347\273\223\346\236\204.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/26.\346\240\221\347\232\204\345\255\220\347\273\223\346\236\204.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/26.\346\240\221\347\232\204\345\255\220\347\273\223\346\236\204.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/27.\344\272\214\345\217\211\346\240\221\347\232\204\351\225\234\345\203\217.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/27.\344\272\214\345\217\211\346\240\221\347\232\204\351\225\234\345\203\217.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/27.\344\272\214\345\217\211\346\240\221\347\232\204\351\225\234\345\203\217.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/28.\345\257\271\347\247\260\347\232\204\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/28.\345\257\271\347\247\260\347\232\204\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/28.\345\257\271\347\247\260\347\232\204\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/29.\351\241\272\346\227\266\351\222\210\346\211\223\345\215\260\347\237\251\351\230\265.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/29.\351\241\272\346\227\266\351\222\210\346\211\223\345\215\260\347\237\251\351\230\265.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/29.\351\241\272\346\227\266\351\222\210\346\211\223\345\215\260\347\237\251\351\230\265.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/30.\345\214\205\345\220\253min\345\207\275\346\225\260\347\232\204\346\240\210.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/30.\345\214\205\345\220\253min\345\207\275\346\225\260\347\232\204\346\240\210.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/30.\345\214\205\345\220\253min\345\207\275\346\225\260\347\232\204\346\240\210.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/31.\346\240\210\347\232\204\345\216\213\345\205\245\343\200\201\345\274\271\345\207\272\345\272\217\345\210\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/31.\346\240\210\347\232\204\345\216\213\345\205\245\343\200\201\345\274\271\345\207\272\345\272\217\345\210\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/31.\346\240\210\347\232\204\345\216\213\345\205\245\343\200\201\345\274\271\345\207\272\345\272\217\345\210\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_1.\344\270\215\345\210\206\344\273\216\344\270\212\345\276\200\344\270\213\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_1.\344\270\215\345\210\206\344\273\216\344\270\212\345\276\200\344\270\213\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_1.\344\270\215\345\210\206\344\273\216\344\270\212\345\276\200\344\270\213\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_2.\345\210\206\350\241\214\344\273\216\344\270\212\345\276\200\344\270\213\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_2.\345\210\206\350\241\214\344\273\216\344\270\212\345\276\200\344\270\213\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_2.\345\210\206\350\241\214\344\273\216\344\270\212\345\276\200\344\270\213\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_3.\346\214\211\344\271\213\345\255\227\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_3.\346\214\211\344\271\213\345\255\227\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/32_3.\346\214\211\344\271\213\345\255\227\346\211\223\345\215\260\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/33.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/33.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/33.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\345\220\216\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/34.\344\272\214\345\217\211\346\240\221\344\270\255\345\222\214\344\270\272\346\237\220\344\270\200\345\200\274\347\232\204\350\267\257\345\276\204.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/34.\344\272\214\345\217\211\346\240\221\344\270\255\345\222\214\344\270\272\346\237\220\344\270\200\345\200\274\347\232\204\350\267\257\345\276\204.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/34.\344\272\214\345\217\211\346\240\221\344\270\255\345\222\214\344\270\272\346\237\220\344\270\200\345\200\274\347\232\204\350\267\257\345\276\204.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/35.\345\244\215\346\235\202\351\223\276\350\241\250\347\232\204\345\244\215\345\210\266.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/35.\345\244\215\346\235\202\351\223\276\350\241\250\347\232\204\345\244\215\345\210\266.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/35.\345\244\215\346\235\202\351\223\276\350\241\250\347\232\204\345\244\215\345\210\266.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/36.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\216\345\217\214\345\220\221\351\223\276\350\241\250.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/36.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\216\345\217\214\345\220\221\351\223\276\350\241\250.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/36.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\344\270\216\345\217\214\345\220\221\351\223\276\350\241\250.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/37.\345\272\217\345\210\227\345\214\226\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/37.\345\272\217\345\210\227\345\214\226\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/37.\345\272\217\345\210\227\345\214\226\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/38.\345\255\227\347\254\246\344\270\262\347\232\204\346\216\222\345\210\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/38.\345\255\227\347\254\246\344\270\262\347\232\204\346\216\222\345\210\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/38.\345\255\227\347\254\246\344\270\262\347\232\204\346\216\222\345\210\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/39.\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\346\254\241\346\225\260\350\266\205\350\277\207\344\270\200\345\215\212\347\232\204\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/39.\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\346\254\241\346\225\260\350\266\205\350\277\207\344\270\200\345\215\212\347\232\204\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/39.\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\346\254\241\346\225\260\350\266\205\350\277\207\344\270\200\345\215\212\347\232\204\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/3_1.\346\211\276\345\207\272\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/3_1.\346\211\276\345\207\272\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" similarity index 99% rename from "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/3_1.\346\211\276\345\207\272\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" rename to "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/3_1.\346\211\276\345\207\272\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" index 91e57b3..7262b2b 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/3_1.\346\211\276\345\207\272\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/3_1.\346\211\276\345\207\272\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" @@ -21,6 +21,7 @@ 如果它和第m个数字相等,就找到一个重复的数字(该数字在下标为i和m的位置都出现了)。如果它和第m个 数字不想等,就把第i个数字和第m个数字交换,把m放到属于它的位置。接下来再重复这个比较,交换的过程, 直到发现一个重复的数字。 + - 以数组{2,3,1,0,2,5,3}为例来分析找到重复数字的步骤。数组的第0个数字(从0开始计数,和数 组的下标保持一致)是2,与它的下标不相等,于是把它和下标为2的数字1交换,交换后的数组是{1,3,2, 0,2,5,3}。此时第0 个数字是1,仍然与它的下标不相等,继续把它和下标为1的数字3交换,得到数组 @@ -71,6 +72,8 @@ public class Solution { } ``` + + --- ### 搬运工信息 Author:Jason Lou
diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/3_2.\344\270\215\344\277\256\346\224\271\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/3_2.\344\270\215\344\277\256\346\224\271\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" similarity index 99% rename from "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/3_2.\344\270\215\344\277\256\346\224\271\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" rename to "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/3_2.\344\270\215\344\277\256\346\224\271\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" index de743b3..83843e7 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/3_2.\344\270\215\344\277\256\346\224\271\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/3_2.\344\270\215\344\277\256\346\224\271\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" @@ -102,6 +102,8 @@ public class Solution { } ``` + + --- ### 搬运工信息 Author:Jason Lou
diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/4.\344\272\214\347\273\264\346\225\260\347\273\204\344\270\255\347\232\204\346\237\245\346\211\276.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/4.\344\272\214\347\273\264\346\225\260\347\273\204\344\270\255\347\232\204\346\237\245\346\211\276.md" similarity index 99% rename from "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/4.\344\272\214\347\273\264\346\225\260\347\273\204\344\270\255\347\232\204\346\237\245\346\211\276.md" rename to "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/4.\344\272\214\347\273\264\346\225\260\347\273\204\344\270\255\347\232\204\346\237\245\346\211\276.md" index 5f873fb..8faf96a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/4.\344\272\214\347\273\264\346\225\260\347\273\204\344\270\255\347\232\204\346\237\245\346\211\276.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/4.\344\272\214\347\273\264\346\225\260\347\273\204\344\270\255\347\232\204\346\237\245\346\211\276.md" @@ -3,6 +3,7 @@ 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 例如如下数组中查找数字7,则返回true;如果查找数字5,则返回5。 + 1 2 8 9 2 4 9 12 diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/40.\346\234\200\345\260\217\347\232\204K\344\270\252\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/40.\346\234\200\345\260\217\347\232\204K\344\270\252\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/40.\346\234\200\345\260\217\347\232\204K\344\270\252\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/41.\346\225\260\346\215\256\346\265\201\344\270\255\347\232\204\344\270\255\344\275\215\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/41.\346\225\260\346\215\256\346\265\201\344\270\255\347\232\204\344\270\255\344\275\215\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/41.\346\225\260\346\215\256\346\265\201\344\270\255\347\232\204\344\270\255\344\275\215\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/42.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\347\232\204\346\234\200\345\244\247\345\222\214.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/42.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\347\232\204\346\234\200\345\244\247\345\222\214.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/42.\350\277\236\347\273\255\345\255\220\346\225\260\347\273\204\347\232\204\346\234\200\345\244\247\345\222\214.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/43.\344\273\2161~n\346\225\264\346\225\260\344\270\2551\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/43.\344\273\2161~n\346\225\264\346\225\260\344\270\2551\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/43.\344\273\2161~n\346\225\264\346\225\260\344\270\2551\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/44.\346\225\260\345\255\227\345\272\217\345\210\227\344\270\255\346\237\220\344\270\200\344\275\215\347\232\204\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/44.\346\225\260\345\255\227\345\272\217\345\210\227\344\270\255\346\237\220\344\270\200\344\275\215\347\232\204\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/44.\346\225\260\345\255\227\345\272\217\345\210\227\344\270\255\346\237\220\344\270\200\344\275\215\347\232\204\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/45.\346\212\212\346\225\260\347\273\204\346\216\222\346\210\220\346\234\200\345\260\217\347\232\204\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/45.\346\212\212\346\225\260\347\273\204\346\216\222\346\210\220\346\234\200\345\260\217\347\232\204\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/45.\346\212\212\346\225\260\347\273\204\346\216\222\346\210\220\346\234\200\345\260\217\347\232\204\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/46.\346\212\212\346\225\260\345\255\227\347\277\273\350\257\221\346\210\220\345\255\227\347\254\246\344\270\262.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/46.\346\212\212\346\225\260\345\255\227\347\277\273\350\257\221\346\210\220\345\255\227\347\254\246\344\270\262.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/46.\346\212\212\346\225\260\345\255\227\347\277\273\350\257\221\346\210\220\345\255\227\347\254\246\344\270\262.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/47.\347\244\274\347\211\251\347\232\204\346\234\200\345\244\247\345\200\274.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/47.\347\244\274\347\211\251\347\232\204\346\234\200\345\244\247\345\200\274.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/47.\347\244\274\347\211\251\347\232\204\346\234\200\345\244\247\345\200\274.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/48.\346\234\200\351\225\277\344\270\215\345\220\253\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/48.\346\234\200\351\225\277\344\270\215\345\220\253\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/48.\346\234\200\351\225\277\344\270\215\345\220\253\351\207\215\345\244\215\345\255\227\347\254\246\347\232\204\345\255\220\345\255\227\347\254\246\344\270\262.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/49.\344\270\221\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/49.\344\270\221\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/49.\344\270\221\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/5.\347\251\272\346\240\274\346\233\277\346\215\242.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5.\347\251\272\346\240\274\346\233\277\346\215\242.md" similarity index 58% rename from "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/5.\347\251\272\346\240\274\346\233\277\346\215\242.md" rename to "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5.\347\251\272\346\240\274\346\233\277\346\215\242.md" index ff9a867..fda69fb 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/5.\347\251\272\346\240\274\346\233\277\346\215\242.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5.\347\251\272\346\240\274\346\233\277\346\215\242.md" @@ -10,6 +10,28 @@ ## 分析 +*时间复杂度为O(n2)不足以拿到Offer* + +现在我们考虑怎么做替换操作。最直观的做法是从头到尾扫描字符串,每一次碰到空格字符的时候做替换。由于是把1个字符替换成3个字符,我们必须把空格后面的所有的字符都后移两个字节,否则就有两个字符被覆盖了。 + +![5_1](/data/images/Java应届生算法突击/《剑指offer》_66/5_1.jpg) + +我们替换了第一个空格,这个字符串变成图b中的内容,表格中灰色背景表示需要移动的字符。接着我们替换第二个空格,替换之后的内容如图c所示。同时我们注意到用深灰色的背景标注”happy“部分被移动了两次。 + +假设字符的长度是n。对每个空格字符,需要移动后面O(n)个字符,因此对含有O(n)个空格字符串而言总的时间效率是O(n2). + +当我们把这种思路阐述给面试官后,他不会就此满意,他将让我们寻找更快的方法。在前面的分析中,我们发现数组中的很多字符都移动了很多次,能不能减少移动的次数呢?我们换一种思路,把从前向后替换变为从后向前替换。 + +考虑时间复杂度为O(n)的解法,搞定Offer就靠它了 + +我们先遍历一次字符串,这样就能够统计出字符串中空格的总数,并可以计算出替换之后字符串的总长度。每替换一个空格,长度增加2,因此替换以后的字符串的长度等于原来的长度加上2乘以空格的数目,我们还是以前面的字符串”We are happy”为例,“We are happy”这个字符串的长度是14,里面有两个空格,因此替换之后的字符串的长度为18 + +我们从字符串的后面开始复制和替换。首先准备两个指针,P1和P2.   P1指向原始字符串的末尾,而P2指向替换之后的字符串的末尾。接下来我们向前移动指针P1,逐个把它指向的字符复制到P2指向的位置,直到碰到第一个空格为止。此时字符串包含如下图b所示,灰色阴影的区域是做了字符拷贝的区域。碰到第一个空格之后,把P1向前移动一格,在P2之前插入字符串”%20“,由于”%20“的长度为3,同时也要把P2向前移动3格如图所示。 + +我们接着向前复制,直到碰到第二个空格(d)所示。和上一次一样,我们再把P1向前移动1格,并把P2向前移动3格插入”%20“(如图e),此时P1,P2指向同一个位置,表明所有的空格都已经替换完毕。 + +![5_2](/data/images/Java应届生算法突击/《剑指offer》_66/5_2.jpg) + ## Java代码 diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/50_1.\345\255\227\347\254\246\344\270\262\347\254\254\344\270\200\344\270\252\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\345\255\227\347\254\246.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/50_1.\345\255\227\347\254\246\344\270\262\347\254\254\344\270\200\344\270\252\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\345\255\227\347\254\246.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/50_1.\345\255\227\347\254\246\344\270\262\347\254\254\344\270\200\344\270\252\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\345\255\227\347\254\246.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/50_2.\345\255\227\347\254\246\346\265\201\347\254\254\344\270\200\344\270\252\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\345\255\227\347\254\246.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/50_2.\345\255\227\347\254\246\346\265\201\347\254\254\344\270\200\344\270\252\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\345\255\227\347\254\246.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/50_2.\345\255\227\347\254\246\346\265\201\347\254\254\344\270\200\344\270\252\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\345\255\227\347\254\246.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/51.\346\225\260\347\273\204\344\270\255\347\232\204\351\200\206\345\272\217\345\257\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/51.\346\225\260\347\273\204\344\270\255\347\232\204\351\200\206\345\272\217\345\257\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/51.\346\225\260\347\273\204\344\270\255\347\232\204\351\200\206\345\272\217\345\257\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/52.\344\270\244\344\270\252\351\223\276\350\241\250\347\232\204\347\254\254\344\270\200\344\270\252\345\205\254\345\205\261\347\273\223\347\202\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/52.\344\270\244\344\270\252\351\223\276\350\241\250\347\232\204\347\254\254\344\270\200\344\270\252\345\205\254\345\205\261\347\273\223\347\202\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/52.\344\270\244\344\270\252\351\223\276\350\241\250\347\232\204\347\254\254\344\270\200\344\270\252\345\205\254\345\205\261\347\273\223\347\202\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_1.\346\225\260\345\255\227\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_1.\346\225\260\345\255\227\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_1.\346\225\260\345\255\227\345\234\250\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\345\207\272\347\216\260\347\232\204\346\254\241\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_2.0~1\344\270\255\347\274\272\345\244\261\347\232\204\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_2.0~1\344\270\255\347\274\272\345\244\261\347\232\204\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_2.0~1\344\270\255\347\274\272\345\244\261\347\232\204\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_3.\346\225\260\347\273\204\344\270\255\346\225\260\345\200\274\345\222\214\345\260\217\346\240\207\347\233\270\347\255\211\347\232\204\345\205\203\347\264\240.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_3.\346\225\260\347\273\204\344\270\255\346\225\260\345\200\274\345\222\214\345\260\217\346\240\207\347\233\270\347\255\211\347\232\204\345\205\203\347\264\240.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/53_3.\346\225\260\347\273\204\344\270\255\346\225\260\345\200\274\345\222\214\345\260\217\346\240\207\347\233\270\347\255\211\347\232\204\345\205\203\347\264\240.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/54.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\347\254\254k\345\244\247\350\212\202\347\202\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/54.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\347\254\254k\345\244\247\350\212\202\347\202\271.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/54.\344\272\214\345\217\211\346\220\234\347\264\242\346\240\221\347\232\204\347\254\254k\345\244\247\350\212\202\347\202\271.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/55_1.\344\272\214\345\217\211\346\240\221\347\232\204\346\267\261\345\272\246.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/55_1.\344\272\214\345\217\211\346\240\221\347\232\204\346\267\261\345\272\246.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/55_1.\344\272\214\345\217\211\346\240\221\347\232\204\346\267\261\345\272\246.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/55_2.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/55_2.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/55_2.\345\271\263\350\241\241\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/56_1.\346\225\260\347\273\204\344\270\255\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\344\270\244\344\270\252\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/56_1.\346\225\260\347\273\204\344\270\255\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\344\270\244\344\270\252\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/56_1.\346\225\260\347\273\204\344\270\255\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\344\270\244\344\270\252\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/56_2.\346\225\260\347\273\204\344\270\255\345\224\257\344\270\200\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/56_2.\346\225\260\347\273\204\344\270\255\345\224\257\344\270\200\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/56_2.\346\225\260\347\273\204\344\270\255\345\224\257\344\270\200\345\217\252\345\207\272\347\216\260\344\270\200\346\254\241\347\232\204\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/57_1.\345\222\214\344\270\272S\347\232\204\344\270\244\344\270\252\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/57_1.\345\222\214\344\270\272S\347\232\204\344\270\244\344\270\252\346\225\260\345\255\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/57_1.\345\222\214\344\270\272S\347\232\204\344\270\244\344\270\252\346\225\260\345\255\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/57_2.\345\222\214\344\270\272S\347\232\204\350\277\236\347\273\255\346\255\243\346\225\260\345\272\217\345\210\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/57_2.\345\222\214\344\270\272S\347\232\204\350\277\236\347\273\255\346\255\243\346\225\260\345\272\217\345\210\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/57_2.\345\222\214\344\270\272S\347\232\204\350\277\236\347\273\255\346\255\243\346\225\260\345\272\217\345\210\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/58_1.\347\277\273\350\275\254\345\215\225\350\257\215\351\241\272\345\272\217\345\272\217\345\210\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/58_1.\347\277\273\350\275\254\345\215\225\350\257\215\351\241\272\345\272\217\345\272\217\345\210\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/58_1.\347\277\273\350\275\254\345\215\225\350\257\215\351\241\272\345\272\217\345\272\217\345\210\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/58_2.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/58_2.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/58_2.\345\267\246\346\227\213\350\275\254\345\255\227\347\254\246\344\270\262.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/59_1.\346\273\221\345\212\250\347\252\227\345\217\243\347\232\204\346\234\200\345\244\247\345\200\274.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/59_1.\346\273\221\345\212\250\347\252\227\345\217\243\347\232\204\346\234\200\345\244\247\345\200\274.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/59_1.\346\273\221\345\212\250\347\252\227\345\217\243\347\232\204\346\234\200\345\244\247\345\200\274.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/59_2.\351\230\237\345\210\227\346\234\200\345\244\247\345\200\274.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/59_2.\351\230\237\345\210\227\346\234\200\345\244\247\345\200\274.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/59_2.\351\230\237\345\210\227\346\234\200\345\244\247\345\200\274.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/6.\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/6.\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250.md" similarity index 100% rename from "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/6.\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250.md" rename to "Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/6.\344\273\216\345\260\276\345\210\260\345\244\264\346\211\223\345\215\260\351\223\276\350\241\250.md" diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/60.n\344\270\252\351\252\260\345\255\220\347\232\204\347\202\271\346\225\260.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/60.n\344\270\252\351\252\260\345\255\220\347\232\204\347\202\271\346\225\260.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/60.n\344\270\252\351\252\260\345\255\220\347\232\204\347\202\271\346\225\260.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/61.\346\211\221\345\205\213\347\211\214\351\241\272\345\255\220.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/61.\346\211\221\345\205\213\347\211\214\351\241\272\345\255\220.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/61.\346\211\221\345\205\213\347\211\214\351\241\272\345\255\220.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/62.\345\255\251\345\255\220\344\273\254\347\232\204\346\270\270\346\210\217\357\274\210\345\234\206\345\234\210\344\270\255\346\234\200\345\220\216\345\211\251\344\270\213\347\232\204\346\225\260\357\274\211.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/62.\345\255\251\345\255\220\344\273\254\347\232\204\346\270\270\346\210\217\357\274\210\345\234\206\345\234\210\344\270\255\346\234\200\345\220\216\345\211\251\344\270\213\347\232\204\346\225\260\357\274\211.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/62.\345\255\251\345\255\220\344\273\254\347\232\204\346\270\270\346\210\217\357\274\210\345\234\206\345\234\210\344\270\255\346\234\200\345\220\216\345\211\251\344\270\213\347\232\204\346\225\260\357\274\211.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/63.\350\202\241\347\245\250\346\234\200\345\244\247\345\210\251\346\266\246.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/63.\350\202\241\347\245\250\346\234\200\345\244\247\345\210\251\346\266\246.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/63.\350\202\241\347\245\250\346\234\200\345\244\247\345\210\251\346\266\246.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/64.\346\261\2021+2+3+\342\200\246+n.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/64.\346\261\2021+2+3+\342\200\246+n.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/64.\346\261\2021+2+3+\342\200\246+n.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/65.\344\270\215\347\224\250\345\212\240\345\207\217\344\271\230\351\231\244\347\232\204\345\212\240\346\263\225.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/65.\344\270\215\347\224\250\345\212\240\345\207\217\344\271\230\351\231\244\347\232\204\345\212\240\346\263\225.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/65.\344\270\215\347\224\250\345\212\240\345\207\217\344\271\230\351\231\244\347\232\204\345\212\240\346\263\225.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/66.\346\236\204\345\273\272\344\271\230\347\247\257\346\225\260\347\273\204.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/66.\346\236\204\345\273\272\344\271\230\347\247\257\346\225\260\347\273\204.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/66.\346\236\204\345\273\272\344\271\230\347\247\257\346\225\260\347\273\204.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7.\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7.\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221.md" new file mode 100644 index 0000000..2815faa --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7.\351\207\215\345\273\272\344\272\214\345\217\211\346\240\221.md" @@ -0,0 +1,38 @@ +## 题目 +     + 输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。 +例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4,7,2,1,5,3,6,8},则重建出二叉树并输出它的头结点。
+ +## 分析 +     + 在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。但在中序遍历中,根节点的值在序列的中间, +左子树的结点的值位于根节点的值的左边,而右子树的结点的值位于根节点的右边。因此我们需要扫描中序遍历序列, +才能找到根节点的值。
+     + 如图所示,前序遍历序列的第一个数字1就是根节点的值。扫描中序遍历序列,就能确定根节点的值的位置。 +根据中序遍历的特点,在根节点的值1前面3个数字都是左子树结点的值,位于1后面的数字都是右子树结点的值。 + +![7_1](/data/images/Java应届生算法突击/《剑指offer》_66/7_1.jpg) + +由于中序遍历序列中,有3个数字是左子树结点的值,因此左子树总共有3个左子结点。同样,在前序遍历的序列中,根节点后面的3个数字就是3个左子树结点的值,再后面的所有数字都是右子树结点的值。这样我们就在前序遍历和中序遍历两个序列中,分别找到了左右子树对应的子序列。 + +![7_2](/data/images/Java应届生算法突击/《剑指offer》_66/7_2.jpg) + +既然我们已经分别找到了左、右子树的前序遍历序列和中序遍历序列,我们可以用同样的方法分别去构建左右子树。也就是说,接下来的事情可以用递归的方法去完成。 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/8.\344\272\214\345\217\211\346\240\221\347\232\204\344\270\213\344\270\200\344\270\252\347\273\223\347\202\271.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/8.\344\272\214\345\217\211\346\240\221\347\232\204\344\270\213\344\270\200\344\270\252\347\273\223\347\202\271.md" new file mode 100644 index 0000000..7a1f893 --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/8.\344\272\214\345\217\211\346\240\221\347\232\204\344\270\213\344\270\200\344\270\252\347\273\223\347\202\271.md" @@ -0,0 +1,65 @@ +## 题目 +     + 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。 +注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 + +## 分析 +根据中序遍历的特点,要找到一个节点的下一个节点无非就是三种情况: +1、有右子树,这时只需要把其右孩子作为下一个遍历的(并不是要找的)节点,然后沿着该节点的左子树(如果有的话)出发,直到遇到叶子节点,那么该叶子节点就是其下一个要找的节点; +2、没有右子树,则判断该节点是否是其父节点的左孩子,如果是则其下一个要找的节点是其父节点; +3、如果不是其父节点的左孩子,则把其父节点作为下一个遍历的节点,向上回溯,直到找到节点没有父节点或者节点是其父节点的左孩子为止。 +综合这三种情况就可以找到二叉树中任意一个节点的下一个节点。 + + +## Java代码 +```java +public class FindNextNode { + + public BinaryTreeNode getNextNode(BinaryTreeNode pNode) { + + if (pNode == null) { + return null; + } + BinaryTreeNode tempNode = null; + + // 如果该节点有右子节点 + if (pNode.getRight() != null) { + tempNode = pNode.getRight(); + while (tempNode.getLeft() != null) { + tempNode = tempNode.getLeft(); + } + return tempNode; + } + + // 如果该节点没有右子节点,它是其父节点的左子节点 + if (pNode.getFather() == null) + return null; + if (pNode.getFather().getLeft() == pNode) { + return pNode.getFather(); + } + + // 如果该节点没有右子节点,它是其父节点的右子节点 + tempNode = pNode.getFather(); + while (tempNode.getFather() != null) { + if(tempNode.getFather().getLeft() == tempNode){ + return tempNode.getFather(); + } + //继续向上找父节点 + tempNode = tempNode.getFather(); + } + return null; + + } + +} +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/9_1.\347\224\250\344\270\244\344\270\252\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/9_1.\347\224\250\344\270\244\344\270\252\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/9_1.\347\224\250\344\270\244\344\270\252\346\240\210\345\256\236\347\216\260\351\230\237\345\210\227.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/9_2.\347\224\250\344\270\244\344\270\252\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/9_2.\347\224\250\344\270\244\344\270\252\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" new file mode 100644 index 0000000..6388f2a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/9_2.\347\224\250\344\270\244\344\270\252\351\230\237\345\210\227\345\256\236\347\216\260\346\240\210.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" deleted file mode 100644 index 27763d5..0000000 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\344\270\264\346\227\266\346\226\207\344\273\266\345\244\271/\346\225\260\347\273\204\344\270\255\351\207\215\345\244\215\347\232\204\346\225\260\345\255\227.md" +++ /dev/null @@ -1,179 +0,0 @@ -https://blog.csdn.net/weixin_37672169/column/info/21680/3 -https://blog.csdn.net/weixin_37672169/column/info/21680/3 -https://blog.csdn.net/c406495762/article/details/79247243 -## 题目一 -     - 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字 -重复了,也不知道每个数字重复的次数。请找出数组中任意一个重复的数字。例如如果输入长度为7的数组{2,3, -1,0,2,5,3},那么对应的输出是重复的数字2或者3。 - -## 分析 -     - 解决这个问题的一个简单的方法是先把输入的数组排序。从排序的数组中找出重复的数字是件容易的事情, -只需要从头到尾扫描排序后的数组就可以了。排序一个长度为n的数组需要时间为O(nlogn)时间。 -     - 还可以利用哈希表来解决这个问题,从头到尾按顺序扫描数组中的每个数,每扫描到一个数字的时候,都可 -以用O(1)的时间来判断哈希表里是否已经包含了该数字。如果哈希表里没有这个数字,就把它加入到哈希表 -里。如果哈希表里已经存在该数字了,那么就找到一个重复的数字。这个算法的时间复杂度为O(n),但它提 -高时间效率是以一个大小为O(n)的哈希表为代价的。我们再看看有没有空间复杂度为O(1)的算法。 -     - 我们注意到数组中的数字都在0到n-1的范围内。如果这个数组中没有重复的数字,那么当数组排序后数字i -将出现在下标为i的位置。由于数组中有重复的数字,有些位置可能存在多个数字,同时有些位置可能没有数字。 -     - 现在让我们重排这个数组。从头到尾扫描这个数组中的每个数字。当扫描到下标为i的数字的时候,首先比 -较这个数字(用m表示)是不是i。如果是,接着扫描下一个数字。如果不是,再拿它和第m个数字进行比较。 -如果它和第m个数字相等,就找到一个重复的数字(该数字在下标为i和m的位置都出现了)。如果它和第m个 -数字不想等,就把第i个数字和第m个数字交换,把m放到属于它的位置。接下来再重复这个比较,交换的过程, -直到发现一个重复的数字。 -     - 以数组{2,3,1,0,2,5,3}为例来分析找到重复数字的步骤。数组的第0个数字(从0开始计数,和数 -组的下标保持一致)是2,与它的下标不相等,于是把它和下标为2的数字1交换,交换后的数组是{1,3,2, -0,2,5,3}。此时第0 个数字是1,仍然与它的下标不相等,继续把它和下标为1的数字3交换,得到数组 -{0,1,2,3,2,5,3}。此时第0 个数字为0,接着扫描下一个数字,在接下来的几个数字中,下标为1, -2,3的三个数字分别为1,2,3,他们的下标和数值都分别相等,因此不需要做任何操作。接下来扫描下标为4 -的数字2.由于它的值与它的下标不相等,再比较它和下标为2的数字。注意到此时数组中下标为2的数字也是2, -也就是数字2和下标为2和下标4的两个位置都出现了,因此找到一个重复的数字。 - -## 代码 - - public class Solution { - - public static int duplication; - - public static boolean duplicate(int[] arr) { - if (arr == null || arr.length == 0) { - return false; - } - - for (int i = 0; i < arr.length; i++) { - if (arr[i] < 0 || arr[i] >= arr.length) { - return false; - } - } - - for (int i = 0; i < arr.length; i++) { - while (arr[i] != i) { - if (arr[i] == arr[arr[i]]) { - duplication = arr[i]; - System.out.println(arr[i]); - return true; - } - - int temp = arr[i]; - arr[i] = arr[temp]; - arr[temp] = temp; - } - } - return false; - } - - public static void main(String[] args) { - int[] arr = { 0, 3, 1, 4, 2, 5, 7 }; - boolean result = duplicate(arr); - System.out.println(result); - } - - } - -## 题目二 -     - 在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的。请找出数组 -中任意一个重复的数字,但是不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7}, -那么对应的输出是重复的数字2或者3。 - -## 分析 -     - 由于不能修改输入的数组,我们可以创建一个长度为n+1的辅助数组,然后逐一把原数组的每个数字复制到辅 -助数组。如果原数组中被复制的数字是m,则把它复制到辅助数组中下标为m的位置。如果下标为m的位置上已 -经有数字了,则说明该数字重复了。由于使用了辅助空间,故该方案的空间复杂度是O(n) - -## 代码 - - public class Solution { - - public static int getDuplication(int[] arr) { - if (arr == null || arr.length == 0) { - return -1; - } - for (int i = 0; i < arr.length; i++) { - if (arr[i] < 1 || arr[i] >= arr.length) { - return -1; - } - } - - int[] tempArr = new int[arr.length]; - for (int i = 0; i < arr.length; i++) { - if (arr[i] == tempArr[arr[i]]) { - return arr[i]; - } - tempArr[arr[i]] = arr[i]; - } - return -1; - } - - public static void main(String[] args) { - int[] numbers = { 2, 1, 5, 4, 3, 2, 6, 7 }; - System.out.println(getDuplication(numbers)); - } - } - -## 分析二 -由于分析一的空间复杂度是O(n),因此我们需要想办法避免使用辅助空间。我们可以这样想:如果数组中有重复的数,那么n+1个1~n范围内的数中,一定有几个数的个数大于1。那么,我们可以利用这个思路解决该问题。 - -我们把从1~n的数字从中间的数字m分为两部分,前面一半为1~m,后面一半为m+1~n。如果1~m的数字的数目等于m,则不能直接判断这一半区间是否包含重复的数字,反之,如果大于m,那么这一半的区间一定包含重复的数字;如果小于m,另一半m+1~n的区间里一定包含重复的数字。接下来,我们可以继续把包含重复的数字的区间一分为二,直到找到一个重复的数字。 - -## 代码 - - public class Solution { - - public static int getDuplication(int[] arr) { - if (arr == null || arr.length == 0) { - return -1; - } - for (int i = 0; i < arr.length; i++) { - if (arr[i] < 1 || arr[i] >= arr.length) { - return -1; - } - } - - int start = 1; - int end = arr.length - 1; - int mid = 0; - int count = 0; - while (start <= end) { - if (start == end) { - count = countRange(arr, start, end); - if (count > 1) { - return start; - } else { - break; - } - } - mid = (start + end) / 2; - count = countRange(arr, start, mid); - if (count > mid - start + 1) { - end = mid; - } else { - start = mid + 1; - } - } - return -1; - } - - public static int countRange(int[] arr, int start, int end) { - int count = 0; - for (int i = 0; i < arr.length; i++) { - if (arr[i] >= start && arr[i] <= end) { - count++; - } - } - return count; - } - - public static void main(String[] args) { - int[] numbers = { 1, 3, 5, 4, 2, 5, 6, 7 }; - int result = Solution.getDuplication(numbers); - System.out.println(result); - } - } - diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\346\250\241\346\235\277.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\346\250\241\346\235\277.md" new file mode 100644 index 0000000..1692936 --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/\346\250\241\346\235\277.md" @@ -0,0 +1,26 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- + + +https://blog.csdn.net/weixin_37672169/column/info/21680/3 +https://blog.csdn.net/weixin_37672169/column/info/21680/3 +https://blog.csdn.net/c406495762/article/details/79247243 \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/1.Find Minimum in Rotated Sorted Array.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/1.Find Minimum in Rotated Sorted Array.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/1.Find Minimum in Rotated Sorted Array.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/1.Find Minimum in Rotated Sorted Array.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/2.Find Minimum in Rotated Sorted Array II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/2.Find Minimum in Rotated Sorted Array II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/2.Find Minimum in Rotated Sorted Array II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/2.Find Minimum in Rotated Sorted Array II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/3.Find Peak Element.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/3.Find Peak Element.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/3.Find Peak Element.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/3.Find Peak Element.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/4.Median of Two Sorted Arrays(\351\207\215\347\202\271).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/4.Median of Two Sorted Arrays(\351\207\215\347\202\271).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/4.Median of Two Sorted Arrays(\351\207\215\347\202\271).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/4.Median of Two Sorted Arrays(\351\207\215\347\202\271).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/5.Search a 2D Matrix.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/5.Search a 2D Matrix.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/5.Search a 2D Matrix.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/5.Search a 2D Matrix.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/6.Search a 2D Matrix II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/6.Search a 2D Matrix II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/6.Search a 2D Matrix II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/6.Search a 2D Matrix II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/7.Search for a Range.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/7.Search for a Range.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/7.Search for a Range.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/7.Search for a Range.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/8.Search in Rotated Sorted Array.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/8.Search in Rotated Sorted Array.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/8.Search in Rotated Sorted Array.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/8.Search in Rotated Sorted Array.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/9.Search in Rotated Sorted Array II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/9.Search in Rotated Sorted Array II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/9.Search in Rotated Sorted Array II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\272\214\345\210\206\347\261\273\346\237\245\346\211\276\344\270\223\351\242\230/9.Search in Rotated Sorted Array II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/1.Bitwise AND of Numbers Range(\346\261\202\344\270\200\344\270\252\350\214\203\345\233\264\345\206\205\346\211\200\346\234\211\346\225\260\345\255\227\346\214\211\344\275\215\344\270\216\347\232\204\347\273\223\346\236\234).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/1.Bitwise AND of Numbers Range(\346\261\202\344\270\200\344\270\252\350\214\203\345\233\264\345\206\205\346\211\200\346\234\211\346\225\260\345\255\227\346\214\211\344\275\215\344\270\216\347\232\204\347\273\223\346\236\234).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/1.Bitwise AND of Numbers Range(\346\261\202\344\270\200\344\270\252\350\214\203\345\233\264\345\206\205\346\211\200\346\234\211\346\225\260\345\255\227\346\214\211\344\275\215\344\270\216\347\232\204\347\273\223\346\236\234).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/1.Bitwise AND of Numbers Range(\346\261\202\344\270\200\344\270\252\350\214\203\345\233\264\345\206\205\346\211\200\346\234\211\346\225\260\345\255\227\346\214\211\344\275\215\344\270\216\347\232\204\347\273\223\346\236\234).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/2.Maximun Product of Word Lengths(\351\207\215\347\202\271!!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/2.Maximun Product of Word Lengths(\351\207\215\347\202\271!!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/2.Maximun Product of Word Lengths(\351\207\215\347\202\271!!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/2.Maximun Product of Word Lengths(\351\207\215\347\202\271!!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/3.Missing Number.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/3.Missing Number.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/3.Missing Number.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/3.Missing Number.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/4.Mumber of 1Bits.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/4.Mumber of 1Bits.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/4.Mumber of 1Bits.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/4.Mumber of 1Bits.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/5.Repeated DNA Sequences(\351\207\215\347\202\271!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/5.Repeated DNA Sequences(\351\207\215\347\202\271!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/5.Repeated DNA Sequences(\351\207\215\347\202\271!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/5.Repeated DNA Sequences(\351\207\215\347\202\271!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/6.Reverse Bits(\346\227\240\347\254\246\345\217\267\346\225\264\346\225\260\347\277\273\350\275\254\345\207\275\346\225\260\345\256\236\347\216\260)--(\351\207\215\347\202\271!!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/6.Reverse Bits(\346\227\240\347\254\246\345\217\267\346\225\264\346\225\260\347\277\273\350\275\254\345\207\275\346\225\260\345\256\236\347\216\260)--(\351\207\215\347\202\271!!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/6.Reverse Bits(\346\227\240\347\254\246\345\217\267\346\225\264\346\225\260\347\277\273\350\275\254\345\207\275\346\225\260\345\256\236\347\216\260)--(\351\207\215\347\202\271!!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/6.Reverse Bits(\346\227\240\347\254\246\345\217\267\346\225\264\346\225\260\347\277\273\350\275\254\345\207\275\346\225\260\345\256\236\347\216\260)--(\351\207\215\347\202\271!!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/7.Single Number.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/7.Single Number.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/7.Single Number.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/7.Single Number.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/8.Single Number II(\351\207\215\347\202\271!!!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/8.Single Number II(\351\207\215\347\202\271!!!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/8.Single Number II(\351\207\215\347\202\271!!!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/8.Single Number II(\351\207\215\347\202\271!!!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/9.Single Number III.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/9.Single Number III.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/9.Single Number III.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\344\275\215\350\277\220\347\256\227\344\270\223\351\242\230/9.Single Number III.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/1.Climbing Stairs.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/1.Climbing Stairs.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/1.Climbing Stairs.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/1.Climbing Stairs.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/10.Range Sum Query 2D - Immutable.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/10.Range Sum Query 2D - Immutable.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/10.Range Sum Query 2D - Immutable.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/10.Range Sum Query 2D - Immutable.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/2.Coin Change.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/2.Coin Change.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/2.Coin Change.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/2.Coin Change.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/3.House Robber.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/3.House Robber.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/3.House Robber.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/3.House Robber.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/4.Interleaving String.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/4.Interleaving String.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/4.Interleaving String.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/4.Interleaving String.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/5.Longest Increasing Subsequence.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/5.Longest Increasing Subsequence.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/5.Longest Increasing Subsequence.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/5.Longest Increasing Subsequence.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/6.Longest Valid Paraentheses.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/6.Longest Valid Paraentheses.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/6.Longest Valid Paraentheses.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/6.Longest Valid Paraentheses.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/7.Longest Valid Partitioning(\345\233\236\346\226\207\345\210\206\345\211\262).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/7.Longest Valid Partitioning(\345\233\236\346\226\207\345\210\206\345\211\262).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/7.Longest Valid Partitioning(\345\233\236\346\226\207\345\210\206\345\211\262).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/7.Longest Valid Partitioning(\345\233\236\346\226\207\345\210\206\345\211\262).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/8.Longest Valid Partitioning II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/8.Longest Valid Partitioning II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/8.Longest Valid Partitioning II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/8.Longest Valid Partitioning II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/9.Range Sum Query-Immutable(\344\270\215\345\217\257\346\224\271\345\217\230\347\232\204).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/9.Range Sum Query-Immutable(\344\270\215\345\217\257\346\224\271\345\217\230\347\232\204).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/9.Range Sum Query-Immutable(\344\270\215\345\217\257\346\224\271\345\217\230\347\232\204).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\212\250\346\200\201\350\247\204\345\210\222\344\270\223\351\242\230/9.Range Sum Query-Immutable(\344\270\215\345\217\257\346\224\271\345\217\230\347\232\204).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/1.Word Pattern.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/1.Word Pattern.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/1.Word Pattern.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/1.Word Pattern.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/10.Longest Substring Without Repeating Characters(\351\207\215\347\202\271).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/10.Longest Substring Without Repeating Characters(\351\207\215\347\202\271).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/10.Longest Substring Without Repeating Characters(\351\207\215\347\202\271).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/10.Longest Substring Without Repeating Characters(\351\207\215\347\202\271).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/2.Valid Anagram.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/2.Valid Anagram.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/2.Valid Anagram.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/2.Valid Anagram.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/3.SubString with Concatenation of All Worlds.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/3.SubString with Concatenation of All Worlds.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/3.SubString with Concatenation of All Worlds.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/3.SubString with Concatenation of All Worlds.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/4.Strobogrammatic Number I(\345\240\206\346\210\220\346\225\260).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/4.Strobogrammatic Number I(\345\240\206\346\210\220\346\225\260).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/4.Strobogrammatic Number I(\345\240\206\346\210\220\346\225\260).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/4.Strobogrammatic Number I(\345\240\206\346\210\220\346\225\260).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/5.Single Number.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/5.Single Number.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/5.Single Number.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/5.Single Number.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/6.Single Number II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/6.Single Number II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/6.Single Number II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/6.Single Number II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/7.Single Number III.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/7.Single Number III.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/7.Single Number III.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/7.Single Number III.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/8.Palindrome Permutation(\345\233\236\346\226\207\344\272\244\346\215\242).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/8.Palindrome Permutation(\345\233\236\346\226\207\344\272\244\346\215\242).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/8.Palindrome Permutation(\345\233\236\346\226\207\344\272\244\346\215\242).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/8.Palindrome Permutation(\345\233\236\346\226\207\344\272\244\346\215\242).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/9.Maximum Size Subarray Equals k.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/9.Maximum Size Subarray Equals k.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/9.Maximum Size Subarray Equals k.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\223\210\345\270\214\350\241\250\344\270\223\351\242\230/9.Maximum Size Subarray Equals k.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/1.Generate Parentheses(\346\213\254\345\217\267).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/1.Generate Parentheses(\346\213\254\345\217\267).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/1.Generate Parentheses(\346\213\254\345\217\267).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/1.Generate Parentheses(\346\213\254\345\217\267).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/2.Gray Code.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/2.Gray Code.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/2.Gray Code.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/2.Gray Code.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/3.Letter Combinations of a Phone Number.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/3.Letter Combinations of a Phone Number.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/3.Letter Combinations of a Phone Number.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/3.Letter Combinations of a Phone Number.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/4.N-Queens.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/4.N-Queens.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/4.N-Queens.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/4.N-Queens.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/5.N-Queens II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/5.N-Queens II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/5.N-Queens II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/5.N-Queens II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/6.Palindrome Partitoning(\345\233\236\346\226\207\345\210\206\345\211\262).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/6.Palindrome Partitoning(\345\233\236\346\226\207\345\210\206\345\211\262).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/6.Palindrome Partitoning(\345\233\236\346\226\207\345\210\206\345\211\262).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/6.Palindrome Partitoning(\345\233\236\346\226\207\345\210\206\345\211\262).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/7.Palindrome Partitoning II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/7.Palindrome Partitoning II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/7.Palindrome Partitoning II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/7.Palindrome Partitoning II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/8.Restore IP Addresses.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/8.Restore IP Addresses.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/8.Restore IP Addresses.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\233\236\346\272\257\344\270\223\351\242\230/8.Restore IP Addresses.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/1.Compare Version Numbers.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/1.Compare Version Numbers.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/1.Compare Version Numbers.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/1.Compare Version Numbers.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/10.Longest Common Prefix.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/10.Longest Common Prefix.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/10.Longest Common Prefix.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/10.Longest Common Prefix.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/11.Reverse Words in a String.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/11.Reverse Words in a String.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/11.Reverse Words in a String.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/11.Reverse Words in a String.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/12.Reverse Words in a String II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/12.Reverse Words in a String II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/12.Reverse Words in a String II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/12.Reverse Words in a String II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/2.Count and Say.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/2.Count and Say.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/2.Count and Say.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/2.Count and Say.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/3.Distinct Subsequences.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/3.Distinct Subsequences.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/3.Distinct Subsequences.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/3.Distinct Subsequences.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/4.Edit Distance.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/4.Edit Distance.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/4.Edit Distance.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/4.Edit Distance.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/5.One Edit Distance.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/5.One Edit Distance.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/5.One Edit Distance.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/5.One Edit Distance.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/6.Flip Game.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/6.Flip Game.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/6.Flip Game.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/6.Flip Game.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/7.Flip Game II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/7.Flip Game II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/7.Flip Game II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/7.Flip Game II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/8.Interleaving String.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/8.Interleaving String.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/8.Interleaving String.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/8.Interleaving String.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/9.Length of Last World.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/9.Length of Last World.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/9.Length of Last World.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\345\255\227\347\254\246\344\270\262\344\270\223\351\242\230/9.Length of Last World.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/1.Add Binary--\345\244\247\346\225\264\346\225\260\345\212\240\346\263\225!!!.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/1.Add Binary--\345\244\247\346\225\264\346\225\260\345\212\240\346\263\225!!!.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/1.Add Binary--\345\244\247\346\225\264\346\225\260\345\212\240\346\263\225!!!.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/1.Add Binary--\345\244\247\346\225\264\346\225\260\345\212\240\346\263\225!!!.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/10.Excel Sheet Column Number.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/10.Excel Sheet Column Number.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/10.Excel Sheet Column Number.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/10.Excel Sheet Column Number.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/11.Excel Sheet Column Title.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/11.Excel Sheet Column Title.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/11.Excel Sheet Column Title.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/11.Excel Sheet Column Title.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/2.Plus One(\351\207\215\347\202\271!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/2.Plus One(\351\207\215\347\202\271!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/2.Plus One(\351\207\215\347\202\271!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/2.Plus One(\351\207\215\347\202\271!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/3.Multiply Strings(\351\207\215\347\202\271!)--\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225!.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/3.Multiply Strings(\351\207\215\347\202\271!)--\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225!.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/3.Multiply Strings(\351\207\215\347\202\271!)--\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225!.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/3.Multiply Strings(\351\207\215\347\202\271!)--\345\244\247\346\225\264\346\225\260\344\271\230\346\263\225!.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/4.Add Digits(\351\207\215\347\202\271!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/4.Add Digits(\351\207\215\347\202\271!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/4.Add Digits(\351\207\215\347\202\271!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/4.Add Digits(\351\207\215\347\202\271!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/5.Best Meeting Point.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/5.Best Meeting Point.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/5.Best Meeting Point.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/5.Best Meeting Point.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/6.Count Primes(\351\207\215\347\202\271!!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/6.Count Primes(\351\207\215\347\202\271!!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/6.Count Primes(\351\207\215\347\202\271!!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/6.Count Primes(\351\207\215\347\202\271!!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/7.Divide Two Integers(\351\207\215\347\202\271!!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/7.Divide Two Integers(\351\207\215\347\202\271!!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/7.Divide Two Integers(\351\207\215\347\202\271!!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/7.Divide Two Integers(\351\207\215\347\202\271!!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/8.Reverse Intger(\351\207\215\347\202\271!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/8.Reverse Intger(\351\207\215\347\202\271!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/8.Reverse Intger(\351\207\215\347\202\271!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/8.Reverse Intger(\351\207\215\347\202\271!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/9.String to Integer(atoi)(\351\207\215\347\202\271!!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/9.String to Integer(atoi)(\351\207\215\347\202\271!!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/9.String to Integer(atoi)(\351\207\215\347\202\271!!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\346\225\260\345\255\246\347\261\273\344\270\223\351\242\230/9.String to Integer(atoi)(\351\207\215\347\202\271!!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/1.Add Tow Numbers.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/1.Add Tow Numbers.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/1.Add Tow Numbers.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/1.Add Tow Numbers.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/10.Linked List Cycle II.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/10.Linked List Cycle II.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/10.Linked List Cycle II.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/10.Linked List Cycle II.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/2.Copy List with Random Pointer.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/2.Copy List with Random Pointer.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/2.Copy List with Random Pointer.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/2.Copy List with Random Pointer.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/3.Delete Node in a Linked List.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/3.Delete Node in a Linked List.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/3.Delete Node in a Linked List.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/3.Delete Node in a Linked List.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/4.Insertion Sort List.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/4.Insertion Sort List.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/4.Insertion Sort List.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/4.Insertion Sort List.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/5.Sort List(\351\207\215\347\202\271!).md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/5.Sort List(\351\207\215\347\202\271!).md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/5.Sort List(\351\207\215\347\202\271!).md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/5.Sort List(\351\207\215\347\202\271!).md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/6.Merge Two Sort Lists.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/6.Merge Two Sort Lists.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/6.Merge Two Sort Lists.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/6.Merge Two Sort Lists.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/7.Merge k Sorted Lists.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/7.Merge k Sorted Lists.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/7.Merge k Sorted Lists.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/7.Merge k Sorted Lists.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/8.Intersection of Two Sort Lists.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/8.Intersection of Two Sort Lists.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/8.Intersection of Two Sort Lists.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/8.Intersection of Two Sort Lists.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/9.Linked List Cycle.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/9.Linked List Cycle.md" index e69de29..6388f2a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/9.Linked List Cycle.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\347\254\224\351\235\242\350\257\225\347\256\227\346\263\225\351\242\230\345\236\213\345\210\206\347\261\273\345\217\212\345\205\266\350\247\243\346\236\220(Java\347\211\210)/\351\223\276\350\241\250\344\270\223\351\242\230/9.Linked List Cycle.md" @@ -0,0 +1,21 @@ +## 题目 + + +## 分析 + + + +## Java代码 +```java + +``` + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" index 21658f5..f262645 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" @@ -1,12 +1,13 @@ ### Java应届生算法突击_目录
#### 预备知识 - +     • [算法的时间与空间复杂度](./Java应届生算法突击/预备知识/0_算法的时间与空间复杂度.md)
+     • [链表](./Java应届生算法突击/预备知识/1_链表.md)
--- #### 笔面试算法题型分类及其解析 -   ♦ [链表专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/链表专题)
+   ♦ 链表专题
     • [1.Add Tow Numbers](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/链表专题/1.Add%20Tow%20Numbers.md)
     • [2.Copy List with Random Pointer](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/链表专题/2.Copy%20List%20with%20Random%20Pointer.md)
     • [3.Delete Node in a Linked List](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/链表专题/3.Delete%20Node%20in%20a%20Linked%20List.md)
@@ -19,8 +20,7 @@      • [10.Linked List Cycle II](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/链表专题/10.Linked%20List%20Cycle%20II.md)
     • [11.Move Zeroes](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/双指针专题/11.Move%20Zeroes.md)
- -   ♦ [双指针专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/双指针专题)
+   ♦ 双指针专题
     • [1.Two Sum](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/双指针专题/1.Two%20Sum.md)
     • [2.Two Sum II - Input array is sorted](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/双指针专题/2.Two%20Sum%20II%20-%20Input%20array%20is%20sorted.md)
     • [3.Two Sum III - Data structure design](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/双指针专题/3.Two%20Sum%20III%20-%20Data%20structure%20design.md)
@@ -33,7 +33,7 @@      • [10.Merge Sorted Array](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/双指针专题/10.Merge%20Sorted%20Array.md)
     • [11.Move Zeroes](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/双指针专题/11.Move%20Zeroes.md)
-   ♦ [字符串专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/字符串专题)
+   ♦ 字符串专题
     • [1.Compare Version Numbers](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/字符串专题/1.Compare%20Version%20Numbers.md)
     • [2.Count and Say](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/字符串专题/2.Count%20and%20Say.md)
     • [3.Distinct Subsequences](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/字符串专题/3.Distinct%20Subsequences.md)
@@ -47,7 +47,7 @@      • [11.Reverse Words in a String](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/字符串专题/11.Reverse%20Words%20in%20a%20String.md)
     • [12.Reverse Words in a String II](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/字符串专题/12.Reverse%20Words%20in%20a%20String%20II.md)
-   ♦ [数学类专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/数学类专题)
+   ♦ 数学类专题
     • [1.Add Binary--大整数加法!!!](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/数学类专题/1.Add%20Binary--大整数加法!!!.md)
     • [2.Plus One(重点!!)](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/数学类专题/2.Plus%20One(重点!!).md)
     • [3.Multiply Strings(重点!)--大整数乘法!](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/数学类专题/3.Multiply%20Strings(重点!)--大整数乘法!.md)
@@ -60,7 +60,7 @@      • [10.Excel Sheet Column Number](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/数学类专题/10.Excel%20Sheet%20Column%20Number.md)
     • [11.Excel Sheet Column Title](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/数学类专题/11.Excel%20Sheet%20Column%20Title.md)
-   ♦ [动态规划专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/动态规划专题)
+   ♦ 动态规划专题
     • [1.Climbing Stairs](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/动态规划专题/1.Climbing%20Stairs.md)
     • [2.Coin Change](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/动态规划专题/2.Coin%20Change.md)
     • [3.House Robber](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/动态规划专题/3.House%20Robber.md)
@@ -73,7 +73,7 @@      • [10.Range Sum Query 2D - Immutable](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/动态规划专题/10.Range%20Sum%20Query%202D%20-%20Immutable.md)
-   ♦ [二分类查找专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/二分类查找专题)
+   ♦ 二分类查找专题
     • [1.Find Minimum in Rotated Sorted Array](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/二分类查找专题/1.Find%20Minimum%20in%20Rotated%20Sorted%20Array.md)
     • [2.Find Minimum in Rotated Sorted Array II](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/二分类查找专题/2.Find%20Minimum%20in%20Rotated%20Sorted%20Array%20II.md)
     • [3.Find Peak Element](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/二分类查找专题/3.Find%20Peak%20Element.md)
@@ -84,7 +84,7 @@      • [8.Search in Rotated Sorted Array](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/二分类查找专题/8.Search%20in%20Rotated%20Sorted%20Array.md)
     • [9.Search in Rotated Sorted Array II](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/二分类查找专题/9.Search%20in%20Rotated%20Sorted%20Array%20II.md)
-   ♦ [哈希表专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/哈希表专题)
+   ♦ 哈希表专题
     • [1.Word Pattern.md](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/哈希表专题/1.Word%20Pattern.md)
     • [2.Valid Anagram.md](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/哈希表专题/2.Valid%20Anagram.md)
     • [3.SubString with Concatenation of 0All Worlds.md](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/哈希表专题/3.SubString%20with%20Concatenation%20of%20All%20Worlds.md)
@@ -96,7 +96,7 @@      • [9.Maximum Size Subarray Equals k.md](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/哈希表专题/9.Maximum%20Size%20Subarray%20Equals%20k.md)
     • [10.Longest Substring Without Repeating Characters(重点)](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/哈希表专题/10.Longest%20Substring%20Without%20Repeating%20Characters(重点).md)
-   ♦ [回溯专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/回溯专题)
+   ♦ 回溯专题
     • [1.Generate Parentheses(括号)](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/回溯专题/1.Generate%20Parentheses(括号).md)
     • [2.Gray 0Code](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/回溯专题/2.Gray%20Code.md)
     • [3.Letter Combinations of a Phone Number](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/回溯专题/3.Letter%20Combinations%20of%20a%20Phone%20Number.md)
@@ -106,7 +106,7 @@      • [7.Palindrome Partitoning II](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/回溯专题/7.Palindrome%20Partitoning%20II.md)
     • [8.Restore IP Addresses](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/回溯专题/8.Restore%20IP%20Addresses.md)
-   ♦ [位运算专题](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/位运算专题)
+   ♦ 位运算专题
     • [1.Bitwise AND of Numbers Range(求一个范围内所有数字按位与的结果)](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/位运算专题/1.Bitwise%20AND%20of%20Numbers%20Range(求一个范围内所有数字按位与的结果).md)
     • [2.Maximun Product of Word Lengths(重点!!!)](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/位运算专题/2.Maximun%20Product%20of%20Word%20Lengths(重点!!!).md)
     • [3.Missing Number](./Java应届生算法突击/笔面试算法题型分类及其解析(Java版)/位运算专题/3.Missing%20Number.md)
@@ -120,112 +120,214 @@ --- #### 《剑指offer》_66 -* 电子书阅览:[剑指offer.PDF]() 
-* 配套源码:[《剑指Offer》第二版源代码](https://github.com/zhedahht/CodingInterviewChinese2) +* 电子书阅览:[剑指offer.PDF](data/books/算法/剑指Offer名企面试官精讲典型编程题_第2版.pdf) 
+* 配套源码:[《剑指Offer》第二版源代码](https://github.com/zhedahht/CodingInterviewChinese2) * 刷题平台:[牛客平台](https://www.nowcoder.com/ta/coding-interviews?query=&asc=true&order=&page=1) -   ♦ [链表(8道)](./Java应届生算法突击/《剑指offer》_66/链表)
-     • 面试题 6 :[从尾到头打印链表]()
-     • 面试题 18_1:[在O(1)时间内删除链表节点]()
-     • 面试题 18_2:[删除链表中重复的节点点]()
-     • 面试题 22:[链表中倒数第k个结点]()
-     • 面试题 23:[链表中环的入口结点]()
-     • 面试题 24:[反转链表]()
-     • 面试题 25:[合并两个排序的链表]()
-     • 面试题 35:[复杂链表的复制]()
-     • 面试题 52:[两个链表的第一个公共结点]()
- -   ♦ [二叉树(12道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 7 :[重建二叉树]()
-     • 面试题 26:[树的子结构]()
-     • 面试题 27:[二叉树的镜像]()
-     • 面试题 32_1:[不分从上往下打印二叉树]()
-     • 面试题 32_2:[分行从上往下打印二叉树]()
-     • 面试题 32_3:[按之字打印二叉树]()
-     • 面试题 34:[二叉树中和为某一值的路径]()
-     • 面试题 55_1:[二叉树的深度]()
-     • 面试题 55_2:[平衡二叉树]()
-     • 面试题 8 :[二叉树的下一个结点]()
-     • 面试题 28:[对称的二叉树]()
-     • 面试题 37:[序列化二叉树]()
- -   ♦ [二叉搜索树(3道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 33:[二叉搜索树的后序遍历序列]()
-     • 面试题 36:[二叉搜索树与双向链表]()
-     • 面试题 54:[二叉搜索树的第k大节点]()
- -   ♦ [数组(11道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 3_1 :[找出数组中重复的数字]()
-     • 面试题 3_2 :[不修改数组中重复的数字]()
-     • 面试题 4 :[二维数组中的查找]()
-     • 面试题 11:[旋转数组的最小数字]()
-     • 面试题 21:[调整数组顺序使奇数位于偶数前面]()
-     • 面试题 39:[数组中出现次数超过一半的数字]()
-     • 面试题 42:[连续子数组的最大和]()
-     • 面试题 45:[把数组排成最小的数]()
-     • 面试题 51:[数组中的逆序对]()
-     • 面试题 53_1:[数字在排序数组中出现的次数]()
-     • 面试题 53_2:[0~1中缺失的数字]()
-     • 面试题 53_3:[数组中数值和小标相等的元素]()
-     • 面试题 56_1:[数组中只出现一次的两个数字]()
-     • 面试题 56_2:[数组中唯一只出现一次的数字]()
-     • 面试题 59_1:[滑动窗口的最大值]()
-     • 面试题 66:[构建乘积数组]()
- - -   ♦ [字符串(8道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 5 :[替换空格]()
-     • 面试题 19 :[正则表达式匹配]()
-     • 面试题 20 :[表示数值的字符串]()
-     • 面试题 38 :[字符串的排列]()
-     • 面试题 48 :[最长不含重复字符的子字符串]()
-     • 面试题 50_1:[字符串第一个只出现一次的字符]()
-     • 面试题 50_2:[字符流第一个只出现一次的字符]()
-     • 面试题 58_1:[翻转单词顺序序列]()
-     • 面试题 58_2:[左旋转字符串]()
-     • 面试题 46 :[把数字翻译成字符串]()
- -   ♦ [栈(3道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 9_1 :[用两个栈实现队列]()
-     • 面试题 9_2 :[用两个队列实现栈]()
-     • 面试题 30 :[包含min函数的栈]()
-     • 面试题 31 :[栈的压入、弹出序列]()
-     • 面试题 59_2:[队列最大值]()
- -   ♦ [递归(4道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 10_1:[求裴波那契数列的第n项]()
-     • 面试题 10_2:[青蛙跳台阶问题]()
-     • 面试题 10_3:[变态跳台阶]()
- -   ♦ [回溯法(2道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 12:[矩阵中的路径]()
-     • 面试题 13:[机器人的运动范围]()
- -   ♦ [其他(15道)](./Java应届生算法突击/《剑指offer》_66/)
-     • 面试题 15:[二进制中1的个数]()
-     • 面试题 16:[数值的整数次方]()
-     • 面试题 17 :[打印从1到最大的n位数字]()
-     • 面试题 29:[顺时针打印矩阵]()
-     • 面试题 40:[最小的K个数]()
-     • 面试题 43:[从1~n整数中1出现的次数]()
-     • 面试题 43:[数字序列中某一位的数字]()
-     • 面试题 47:[礼物的最大值]()
-     • 面试题 49:[丑数]()
-     • 面试题 57_1:[和为S的两个数字]()
-     • 面试题 57_2:[和为S的连续正数序列]()
-     • 面试题 60:[n个骰子的点数]()
-     • 面试题 61:[扑克牌顺子]()
-     • 面试题 62:[孩子们的游戏(圆圈中最后剩下的数)]()
-     • 面试题 63:[股票最大利润]()
-     • 面试题 64:[求1+2+3+…+n]()
-     • 面试题 65:[不用加减乘除的加法]()
-     • 面试题 41:[数据流中的中位数]()
+   ♦ 链表(8道)
+     • 面试题 6 :[从尾到头打印链表](./Java应届生算法突击/《剑指offer》_66/6.从尾到头打印链表.md)
+     • 面试题 18_1:[在O(1)时间内删除链表节点](./Java应届生算法突击/《剑指offer》_66/18_1.在O(1)时间内删除链表节点.md)
+     • 面试题 18_2:[删除链表中重复的节点](./Java应届生算法突击/《剑指offer》_66/18_2.删除链表中重复的节点.md)
+     • 面试题 22:[链表中倒数第k个结点](./Java应届生算法突击/《剑指offer》_66/22.链表中倒数第k个结点.md)
+     • 面试题 23:[链表中环的入口结点](./Java应届生算法突击/《剑指offer》_66/23_链表中环的入口结点.md)
+     • 面试题 24:[反转链表](./Java应届生算法突击/《剑指offer》_66/24.反转链表.md)
+     • 面试题 25:[合并两个排序的链表](./Java应届生算法突击/《剑指offer》_66/25.合并两个排序的链表.md)
+     • 面试题 35:[复杂链表的复制](./Java应届生算法突击/《剑指offer》_66/35.复杂链表的复制.md)
+     • 面试题 52:[两个链表的第一个公共结点](./Java应届生算法突击/《剑指offer》_66/52.两个链表的第一个公共结点.md)
+ +   ♦ 二叉树(12道)
+     • 面试题 7 :[重建二叉树](./Java应届生算法突击/《剑指offer》_66/7.重建二叉树.md)
+     • 面试题 26:[树的子结构](./Java应届生算法突击/《剑指offer》_66/26.树的子结构.md)
+     • 面试题 27:[二叉树的镜像](./Java应届生算法突击/《剑指offer》_66/27.二叉树的镜像.md)
+     • 面试题 32_1:[不分从上往下打印二叉树](./Java应届生算法突击/《剑指offer》_66/32_1.不分从上往下打印二叉树.md)
+     • 面试题 32_2:[分行从上往下打印二叉树](./Java应届生算法突击/《剑指offer》_66/32_2.分行从上往下打印二叉树.md)
+     • 面试题 32_3:[按之字打印二叉树](./Java应届生算法突击/《剑指offer》_66/32_3.按之字打印二叉树.md)
+     • 面试题 34:[二叉树中和为某一值的路径](./Java应届生算法突击/《剑指offer》_66/34.二叉树中和为某一值的路径.md)
+     • 面试题 55_1:[二叉树的深度](./Java应届生算法突击/《剑指offer》_66/55_1.二叉树的深度.md)
+     • 面试题 55_2:[平衡二叉树](./Java应届生算法突击/《剑指offer》_66/55_2.平衡二叉树.md)
+     • 面试题 8 :[二叉树的下一个结点](./Java应届生算法突击/《剑指offer》_66/8.二叉树的下一个结点.md)
+     • 面试题 28:[对称的二叉树](./Java应届生算法突击/《剑指offer》_66/28.对称的二叉树.md)
+     • 面试题 37:[序列化二叉树](./Java应届生算法突击/《剑指offer》_66/37.序列化二叉树.md)
+ +   ♦ 二叉搜索树(3道)
+     • 面试题 33:[二叉搜索树的后序遍历序列](./Java应届生算法突击/《剑指offer》_66/33.二叉搜索树的后序遍历序列.md)
+     • 面试题 36:[二叉搜索树与双向链表](./Java应届生算法突击/《剑指offer》_66/36.二叉搜索树与双向链表.md)
+     • 面试题 54:[二叉搜索树的第k大节点](./Java应届生算法突击/《剑指offer》_66/54.二叉搜索树的第k大节点.md)
+ +   ♦ 数组(11道)
+     • 面试题 3_1 :[找出数组中重复的数字](./Java应届生算法突击/《剑指offer》_66/3_1.找出数组中重复的数字.md)
+     • 面试题 3_2 :[不修改数组中重复的数字](./Java应届生算法突击/《剑指offer》_66/3_2.不修改数组中重复的数字.md)
+     • 面试题 4 :[二维数组中的查找](./Java应届生算法突击/《剑指offer》_66/4.二维数组中的查找.md)
+     • 面试题 11:[旋转数组的最小数字](./Java应届生算法突击/《剑指offer》_66/11.旋转数组的最小数字.md)
+     • 面试题 21:[调整数组顺序使奇数位于偶数前面](./Java应届生算法突击/《剑指offer》_66/21.调整数组顺序使奇数位于偶数前面.md)
+     • 面试题 39:[数组中出现次数超过一半的数字](./Java应届生算法突击/《剑指offer》_66/39.数组中出现次数超过一半的数字.md)
+     • 面试题 42:[连续子数组的最大和](./Java应届生算法突击/《剑指offer》_66/42.连续子数组的最大和.md)
+     • 面试题 45:[把数组排成最小的数](./Java应届生算法突击/《剑指offer》_66/45.把数组排成最小的数.md)
+     • 面试题 51:[数组中的逆序对](./Java应届生算法突击/《剑指offer》_66/51.数组中的逆序对.md)
+     • 面试题 53_1:[数字在排序数组中出现的次数](./Java应届生算法突击/《剑指offer》_66/53_1.数字在排序数组中出现的次数.md)
+     • 面试题 53_2:[0~1中缺失的数字](./Java应届生算法突击/《剑指offer》_66/53_2.0~1中缺失的数字.md)
+     • 面试题 53_3:[数组中数值和小标相等的元素](./Java应届生算法突击/《剑指offer》_66/53_3.数组中数值和小标相等的元素.md)
+     • 面试题 56_1:[数组中只出现一次的两个数字](./Java应届生算法突击/《剑指offer》_66/56_1.数组中只出现一次的两个数字.md)
+     • 面试题 56_2:[数组中唯一只出现一次的数字](./Java应届生算法突击/《剑指offer》_66/56_2.数组中唯一只出现一次的数字.md)
+     • 面试题 59_1:[滑动窗口的最大值](./Java应届生算法突击/《剑指offer》_66/59_1.滑动窗口的最大值.md)
+     • 面试题 66:[构建乘积数组](./Java应届生算法突击/《剑指offer》_66/66.构建乘积数组.md)
+ + +   ♦ 字符串(8道)
+     • 面试题 5 :[替换空格](./Java应届生算法突击/《剑指offer》_66/5.空格替换.md)
+     • 面试题 19 :[正则表达式匹配](./Java应届生算法突击/《剑指offer》_66/19.正则表达式匹配.md)
+     • 面试题 20 :[表示数值的字符串](./Java应届生算法突击/《剑指offer》_66/20.表示数值的字符串.md)
+     • 面试题 38 :[字符串的排列](./Java应届生算法突击/《剑指offer》_66/38.字符串的排列.md)
+     • 面试题 48 :[最长不含重复字符的子字符串](./Java应届生算法突击/《剑指offer》_66/48.最长不含重复字符的子字符串.md)
+     • 面试题 50_1:[字符串第一个只出现一次的字符](./Java应届生算法突击/《剑指offer》_66/50_1.字符串第一个只出现一次的字符.md)
+     • 面试题 50_2:[字符流第一个只出现一次的字符](./Java应届生算法突击/《剑指offer》_66/50_2.字符流第一个只出现一次的字符.md)
+     • 面试题 58_1:[翻转单词顺序序列](./Java应届生算法突击/《剑指offer》_66/58_1.翻转单词顺序序列.md)
+     • 面试题 58_2:[左旋转字符串](./Java应届生算法突击/《剑指offer》_66/58_2.左旋转字符串.md)
+     • 面试题 46 :[把数字翻译成字符串](./Java应届生算法突击/《剑指offer》_66/46.把数字翻译成字符串.md)
+ +   ♦ 栈(3道)
+     • 面试题 9_1 :[用两个栈实现队列](./Java应届生算法突击/《剑指offer》_66/9_1.用两个栈实现队列.md)
+     • 面试题 9_2 :[用两个队列实现栈](./Java应届生算法突击/《剑指offer》_66/9_2.用两个队列实现栈.md)
+     • 面试题 30 :[包含min函数的栈](./Java应届生算法突击/《剑指offer》_66/30.包含min函数的栈.md)
+     • 面试题 31 :[栈的压入、弹出序列](./Java应届生算法突击/《剑指offer》_66/31.栈的压入、弹出序列.md)
+     • 面试题 59_2:[队列最大值](./Java应届生算法突击/《剑指offer》_66/59_2.队列最大值.md)
+ +   ♦ 递归(4道)
+     • 面试题 10_1:[求裴波那契数列的第n项](./Java应届生算法突击/《剑指offer》_66/10_1.求裴波那契数列的第n项.md)
+     • 面试题 10_2:[青蛙跳台阶问题](./Java应届生算法突击/《剑指offer》_66/10_2.青蛙跳台阶问题.md)
+     • 面试题 10_3:[变态跳台阶](./Java应届生算法突击/《剑指offer》_66/10_3.变态跳台阶.md)
+ +   ♦ 回溯法(2道)
+     • 面试题 12:[矩阵中的路径](./Java应届生算法突击/《剑指offer》_66/12.矩阵中的路径.md)
+     • 面试题 13:[机器人的运动范围](./Java应届生算法突击/《剑指offer》_66/13.机器人的运动范围.md)
+ +   ♦ 其他(15道)
+     • 面试题 15:[二进制中1的个数](./Java应届生算法突击/《剑指offer》_66/15.二进制中1的个数.md)
+     • 面试题 16:[数值的整数次方](./Java应届生算法突击/《剑指offer》_66/16.数值的整数次方.md)
+     • 面试题 17 :[打印从1到最大的n位数字](./Java应届生算法突击/《剑指offer》_66/17.打印从1到最大的n位数字.md)
+     • 面试题 29:[顺时针打印矩阵](./Java应届生算法突击/《剑指offer》_66/29.顺时针打印矩阵.md)
+     • 面试题 40:[最小的K个数](./Java应届生算法突击/《剑指offer》_66/40.最小的K个数.md)
+     • 面试题 43:[从1~n整数中1出现的次数](./Java应届生算法突击/《剑指offer》_66/43.从1~n整数中1出现的次数.md)
+     • 面试题 44:[数字序列中某一位的数字](./Java应届生算法突击/《剑指offer》_66/44.数字序列中某一位的数字.md)
+     • 面试题 47:[礼物的最大值](./Java应届生算法突击/《剑指offer》_66/47.礼物的最大值.md)
+     • 面试题 49:[丑数](./Java应届生算法突击/《剑指offer》_66/49.丑数.md)
+     • 面试题 57_1:[和为S的两个数字](./Java应届生算法突击/《剑指offer》_66/57_1.和为S的两个数字.md)
+     • 面试题 57_2:[和为S的连续正数序列](./Java应届生算法突击/《剑指offer》_66/57_2.和为S的连续正数序列.md)
+     • 面试题 60:[n个骰子的点数](./Java应届生算法突击/《剑指offer》_66/60.n个骰子的点数.md)
+     • 面试题 61:[扑克牌顺子](./Java应届生算法突击/《剑指offer》_66/61.扑克牌顺子.md)
+     • 面试题 62:[孩子们的游戏(圆圈中最后剩下的数)](./Java应届生算法突击/《剑指offer》_66/62.孩子们的游戏(圆圈中最后剩下的数).md)
+     • 面试题 63:[股票最大利润](./Java应届生算法突击/《剑指offer》_66/63.股票最大利润.md)
+     • 面试题 64:[求1+2+3+…+n](./Java应届生算法突击/《剑指offer》_66/64.求1+2+3+…+n.md)
+     • 面试题 65:[不用加减乘除的加法](./Java应届生算法突击/《剑指offer》_66/65.不用加减乘除的加法.md)
+     • 面试题 41:[数据流中的中位数](./Java应届生算法突击/《剑指offer》_66/41.数据流中的中位数.md)
#### LeetCode_Top100 -     • [整理中]()
-     • []()
-     • []()
+* LeetCode:[LeetCode_algorithms](https://leetcode.com/problemset/algorithms/) 
+* 力扣中文社区:[力扣_算法](https://leetcode-cn.com/problemset/algorithms/) 
+ +     • 001:[两数之和](Java应届生算法突击/LeetCode_Top100/001.md)
+     • 002:[两数相加](./Java应届生算法突击/LeetCode_Top100/002.md)
+     • 003:[无重复字符的最长子串](./Java应届生算法突击/LeetCode_Top100/003.md)
+     • 004:[寻找两个有序数组的中位数](./Java应届生算法突击/LeetCode_Top100/004.md)
+     • 005:[最长回文子串](./Java应届生算法突击/LeetCode_Top100/005.md)
+     • 006:[Z 字形变换](./Java应届生算法突击/LeetCode_Top100/006.md)
+     • 007:[整数反转](./Java应届生算法突击/LeetCode_Top100/007.md)
+     • 008:[字符串转换整数 (atoi)](./Java应届生算法突击/LeetCode_Top100/008.md)
+     • 009:[回文数](./Java应届生算法突击/LeetCode_Top100/009.md)
+     • 010:[正则表达式匹配](./Java应届生算法突击/LeetCode_Top100/010.md)
+     • 011:[盛最多水的容器](./Java应届生算法突击/LeetCode_Top100/011.md)
+     • 012:[整数转罗马数字](./Java应届生算法突击/LeetCode_Top100/012.md)
+     • 013:[罗马数字转整数](./Java应届生算法突击/LeetCode_Top100/013.md)
+     • 014:[最长公共前缀](./Java应届生算法突击/LeetCode_Top100/014.md)
+     • 015:[三数之和](./Java应届生算法突击/LeetCode_Top100/015.md)
+     • 016:[最接近的三数之和](./Java应届生算法突击/LeetCode_Top100/016.md)
+     • 017:[电话号码的字母组合](./Java应届生算法突击/LeetCode_Top100/017.md)> +     • 018:[四数之和](./Java应届生算法突击/LeetCode_Top100/018.md)
+     • 019:[删除链表的倒数第N个节点](./Java应届生算法突击/LeetCode_Top100/019.md)
+     • 020:[有效的括号](./Java应届生算法突击/LeetCode_Top100/020.md)
+     • 021:[合并两个有序链表](./Java应届生算法突击/LeetCode_Top100/021.md)
+     • 022:[括号生成](./Java应届生算法突击/LeetCode_Top100/022.md)
+     • 023:[合并K个排序链表](./Java应届生算法突击/LeetCode_Top100/023.md)
+     • 024:[两两交换链表中的节点](./Java应届生算法突击/LeetCode_Top100/024.md)
+     • 025:[K 个一组翻转链表](./Java应届生算法突击/LeetCode_Top100/025.md)
+     • 026:[删除排序数组中的重复项](./Java应届生算法突击/LeetCode_Top100/026.md)
+     • 027:[移除元素](./Java应届生算法突击/LeetCode_Top100/027.md)
+     • 028:[实现 strStr()](./Java应届生算法突击/LeetCode_Top100/028.md)
+     • 029:[两数相除](./Java应届生算法突击/LeetCode_Top100/029.md)
+     • 030:[串联所有单词的子串](./Java应届生算法突击/LeetCode_Top100/030.md)
+     • 031:[下一个排列](./Java应届生算法突击/LeetCode_Top100/031.md)
+     • 032:[最长有效括号](./Java应届生算法突击/LeetCode_Top100/032.md)
+     • 033:[搜索旋转排序数组](./Java应届生算法突击/LeetCode_Top100/033.md)
+     • 034:[在排序数组中查找元素的第一个和最后一个位置](./Java应届生算法突击/LeetCode_Top100/034.md)
+     • 035:[搜索插入位置](./Java应届生算法突击/LeetCode_Top100/035.md)
+     • 036:[有效的数独](./Java应届生算法突击/LeetCode_Top100/036.md)
+     • 037:[解数独](./Java应届生算法突击/LeetCode_Top100/037.md)
+     • 038:[报数](./Java应届生算法突击/LeetCode_Top100/038.md)
+     • 039:[组合总和](./Java应届生算法突击/LeetCode_Top100/039.md)
+     • 040:[组合总和 II](./Java应届生算法突击/LeetCode_Top100/040.md)
+     • 041:[缺失的第一个正数](./Java应届生算法突击/LeetCode_Top100/041.md)
+     • 042:[接雨水](./Java应届生算法突击/LeetCode_Top100/042.md)
+     • 043:[字符串相乘](./Java应届生算法突击/LeetCode_Top100/043.md)
+     • 044:[通配符匹配](./Java应届生算法突击/LeetCode_Top100/044.md)
+     • 045:[跳跃游戏 II](./Java应届生算法突击/LeetCode_Top100/045.md)
+     • 046:[全排列](./Java应届生算法突击/LeetCode_Top100/046.md)
+     • 047:[全排列 II](./Java应届生算法突击/LeetCode_Top100/047.md)
+     • 048:[旋转图像](./Java应届生算法突击/LeetCode_Top100/048.md)
+     • 049:[字母异位词分组](./Java应届生算法突击/LeetCode_Top100/049.md)
+     • 050:[Pow(x, n)](./Java应届生算法突击/LeetCode_Top100/050.md)
+     • 051:[N皇后](./Java应届生算法突击/LeetCode_Top100/051.md)
+     • 052:[N皇后 II](./Java应届生算法突击/LeetCode_Top100/052.md)
+     • 053:[最大子序和](./Java应届生算法突击/LeetCode_Top100/053.md)
+     • 054:[螺旋矩阵](./Java应届生算法突击/LeetCode_Top100/054.md)
+     • 055:[跳跃游戏](./Java应届生算法突击/LeetCode_Top100/055.md)
+     • 056:[合并区间](./Java应届生算法突击/LeetCode_Top100/056.md)
+     • 057:[插入区间](./Java应届生算法突击/LeetCode_Top100/057.md)
+     • 058:[最后一个单词的长度](./Java应届生算法突击/LeetCode_Top100/058.md)
+     • 059:[螺旋矩阵 II](./Java应届生算法突击/LeetCode_Top100/059.md)
+     • 060:[第k个排列](./Java应届生算法突击/LeetCode_Top100/060.md)
+     • 061:[旋转链表](./Java应届生算法突击/LeetCode_Top100/061.md)
+     • 062:[不同路径](./Java应届生算法突击/LeetCode_Top100/062.md)
+     • 063:[不同路径 II](./Java应届生算法突击/LeetCode_Top100/063.md)
+     • 064:[最小路径和](./Java应届生算法突击/LeetCode_Top100/064.md)
+     • 065:[有效数字](./Java应届生算法突击/LeetCode_Top100/065.md)
+     • 066:[加一](./Java应届生算法突击/LeetCode_Top100/066.md)
+     • 067:[二进制求和](./Java应届生算法突击/LeetCode_Top100/067.md)
+     • 068:[文本左右对齐](./Java应届生算法突击/LeetCode_Top100/068.md)
+     • 069:[x 的平方根](./Java应届生算法突击/LeetCode_Top100/069.md)
+     • 070:[爬楼梯](./Java应届生算法突击/LeetCode_Top100/070.md)
+     • 071:[简化路径](./Java应届生算法突击/LeetCode_Top100/071.md)
+     • 072:[编辑距离](./Java应届生算法突击/LeetCode_Top100/072.md)
+     • 073:[矩阵置零](./Java应届生算法突击/LeetCode_Top100/073.md)
+     • 074:[搜索二维矩阵](./Java应届生算法突击/LeetCode_Top100/074.md)
+     • 075:[颜色分类](./Java应届生算法突击/LeetCode_Top100/075.md)
+     • 076:[最小覆盖子串](./Java应届生算法突击/LeetCode_Top100/076.md)
+     • 077:[组合](./Java应届生算法突击/LeetCode_Top100/077.md)
+     • 078:[子集](./Java应届生算法突击/LeetCode_Top100/078.md)
+     • 079:[单词搜索](./Java应届生算法突击/LeetCode_Top100/079.md)
+     • 080:[删除排序数组中的重复项 II](./Java应届生算法突击/LeetCode_Top100/080.md)
+     • 081:[搜索旋转排序数组 II](./Java应届生算法突击/LeetCode_Top100/081.md)
+     • 082:[删除排序链表中的重复元素 II](./Java应届生算法突击/LeetCode_Top100/082.md)
+     • 083:[删除排序链表中的重复元素](./Java应届生算法突击/LeetCode_Top100/083.md)
+     • 084:[柱状图中最大的矩形](./Java应届生算法突击/LeetCode_Top100/084.md)
+     • 085:[最大矩形](./Java应届生算法突击/LeetCode_Top100/085.md)
+     • 086:[分隔链表](./Java应届生算法突击/LeetCode_Top100/086.md)
+     • 087:[扰乱字符串](./Java应届生算法突击/LeetCode_Top100/087.md)
+     • 088:[合并两个有序数组](./Java应届生算法突击/LeetCode_Top100/088.md)
+     • 089:[格雷编码](./Java应届生算法突击/LeetCode_Top100/089.md)
+     • 090:[子集 II](./Java应届生算法突击/LeetCode_Top100/090.md)
+     • 091:[解码方法](./Java应届生算法突击/LeetCode_Top100/091.md)
+     • 092:[反转链表 II](./Java应届生算法突击/LeetCode_Top100/092.md)
+     • 093:[复原IP地址](./Java应届生算法突击/LeetCode_Top100/093.md)
+     • 094:[二叉树的中序遍历](./Java应届生算法突击/LeetCode_Top100/094.md)
+     • 095:[不同的二叉搜索树 II](./Java应届生算法突击/LeetCode_Top100/095.md)
+     • 096:[不同的二叉搜索树](./Java应届生算法突击/LeetCode_Top100/096.md)
+     • 097:[交错字符串](./Java应届生算法突击/LeetCode_Top100/097.md)
+     • 098:[验证二叉搜索树](./Java应届生算法突击/LeetCode_Top100/098.md)
+     • 099:[恢复二叉搜索树](./Java应届生算法突击/LeetCode_Top100/099.md)
+     • 100:[相同的树](./Java应届生算法突击/LeetCode_Top100/100.md)
+ + --- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/01_JVM\347\233\270\345\205\263.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/01_JVM\347\233\270\345\205\263.md" index 6fae331..ffd1086 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/01_JVM\347\233\270\345\205\263.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/01_JVM\347\233\270\345\205\263.md" @@ -49,7 +49,7 @@ System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会 ### 3. JVM的4种引用和使用场景?      - 这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
+ 这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。
     (1)强引用(StrongReference)
     @@ -59,11 +59,10 @@ System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会 题。 ps:强引用其实也就是我们平时 A a = new A()这个意思。
     (2)软引用(SoftReference)
-     - 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它; +     + 如果一个对象只具有软引用, 则内存空间足够, 垃圾回收器就不会回收它; 如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它, -该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出 -示例)。
+该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存(下文给出示例)。
     软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所 引用的对象被垃圾回收器回收,Java 虚拟机就会把这个软引用加入到与之关联 @@ -71,27 +70,26 @@ System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会      示例:实现学生信息查询操作时有两套数据操作的方案。
     - 一、将得到的信息存放在内存中,后续查询则直接读取内存信息(优点: -读取速度快;缺点:内存空间一直被占,若资源访问量不高,则浪费内存空间)。
+ 一、将得到的信息存放在内存中, 后续查询则直接读取内存信息(优点: +读取速度快; 缺点: 内存空间一直被占, 若资源访问量不高,则浪费内存空间)。
     - 二、每次查询均从数据库读取,然后填充到 TO 返回。(优点:内存空间 -将被 GC 回收,不会一直被占用;缺点:在 GC 发生之前已有的 TO 依然存在, + 二、每次查询均从数据库读取, 然后填充到 TO 返回。(优点: 内存空间 +将被 GC 回收, 不会一直被占用;缺点: 在 GC 发生之前已有的 TO 依然存在, 但还是执行了一次数据库查询,浪费 IO)。可以通过软引用来解决。
     (3)弱引用(WeakReference)
-     - 弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。 -在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引 -用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾 -回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的 -对象。
+     + 弱引用与软引用的区别在于: 只具有弱引用的对象拥有更短暂的生命周期。 +在垃圾回收器线程扫描它所管辖的内存区域的过程中, 一旦发现了只具有弱引 +用的对象, 不管当前内存空间足够与否, 都会回收它的内存。不过,由于垃圾 +回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。
     弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所 引用的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用 队列中。
     (4)虚引用(PhantomReference)
-     +     “虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会 决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用 一样,在任何时候都可能被垃圾回收器回收。
@@ -102,18 +100,15 @@ System.gc(),通知 GC 运行,但是 Java 语言规范并不保证 GC 一定会 的内存之前,把这个虚引用加入到与之关联的引用队列中。
ReferenceQueue queue = new ReferenceQueue ();
PhantomReference pr = new PhantomReference (object, queue);
-     +     比较容易理解的是 Java 垃圾回收器会优先清理可达强度低的对象。
     那现在问题来了,若一个对象的引用类型有多个,那到底如何判断它的可 达性呢?其实规则如下:(“单弱多强”)
-     1. 单条引用链的可达性以最弱的一个引用类型来决定;
2. 多条引用链的可达性以最强的一个引用类型来决定;
![树型引用链](/data/images/Java应届生面试突击/Java基础/01_3.png)
- -      我们假设图 2 中引用1和3为强引用,5为软引用,7为弱引用,对于对 象 5 按照这两个判断原则,路径1-5取最弱的引用5,因此该路径对对象 5 的 @@ -128,14 +123,13 @@ PhantomReference pr = new PhantomReference (object, queue);
1.虚拟机栈中引用的对象。
2.本地方法栈中引用的对象。
3.方法区中静态成员或常量引用的对象。
-      引用计数法与可达性分析算法。 ### 6. 堆里面的分区和各自的特点。 -年轻代:
+*年轻代:*
     -年轻代又进一步可以划分为一个伊甸园(Eden)和两个存活区 + 年轻代又进一步可以划分为一个伊甸园(Eden)和两个存活区 (Survivor space),伊甸园是进行内存分配的地方,是一块连续的空闲内存区域, 在里面进行内存分配速度非常快,因为不需要进行可用内存块的查找。新对象 是总是在伊甸园中生成,只有经受住了一定的考验后才能后顺利地进入到存活 @@ -147,9 +141,10 @@ PhantomReference pr = new PhantomReference (object, queue);
区是交替使用,循环往复,在下一次垃圾回收时,之前被清除的存活区又用来 放置存活下来的对象了。一般来说,年轻代区域较小,而且大部分对象是需要 进行清除的,采用“复制算法”进行垃圾回收。
-年老代:
+ +*年老代:*
     -在年轻代中经历了 N 次回收后仍然没有被清除的对象,就会被放 + 在年轻代中经历了 N 次回收后仍然没有被清除的对象,就会被放 到年老代中,都是生命周期较长的对象。对于年老代和永久代,采用一种称为 “标记-清除-压缩(Mark-Sweep-Compact)”的算法。标记的过程是找出当前 还存活的对象,并进行标记;清除则是遍历整个年老区,找到已标记的对象并 @@ -163,7 +158,6 @@ PhantomReference pr = new PhantomReference (object, queue);
GC 才能 够进入到存活区中。这种形式的 GC 只会在年轻代中进行,因为大部分对象都是从 Eden 区开始的,同时 Eden 区不会分配得太大,所以对 Eden 区的 GC 会非常地频繁。 - (2) Full GC:
     对整个对进行整理,包括了年轻代、年老代和持久代。Full GC 要对整个 @@ -213,29 +207,29 @@ MyObject object = anotherObject.clone();
* 扩展:
     原型模式主要用于对象的复制,实现一个接口(实现 Cloneable 接口), - 重写一个方法(重写 Object 类中的 clone 方法),即完成了原型模式。 - 原型模式中的拷贝分为"浅拷贝"和"深拷贝": + 重写一个方法(重写 Object 类中的 clone 方法),即完成了原型模式。
+ 原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制 - 引用,不复制引用的对象. + 引用,不复制引用的对象.
深拷贝: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行 - 引用对象的复制. + 引用对象的复制.
(Object 类的 clone 方法只会拷贝对象中的基本数据类型的值,对于数组、 容器对象、引用对象等都不会拷贝,这就是浅拷贝。如果要实现深拷贝,必须 - 将原型模式中的数组、容器对象、引用对象等另行拷贝。) + 将原型模式中的数组、容器对象、引用对象等另行拷贝。)
原型模式的优点。
1.如果创建新的对象比较复杂时,可以利用原型模式简化对象的创建过程。
2.使用原型模式创建对象比直接 new 一个对象在性能上要好的多,因为 Object 类的 clone 方法是一个本地方法,它直接操作内存中的二进制流,特别 - 是复制大对象时,性能的差别非常明显。 - 原型模式的使用场景。 - 因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。 + 是复制大对象时,性能的差别非常明显。
+ 原型模式的使用场景。
+ 因为以上优点,所以在需要重复地创建相似对象时可以考虑使用原型模式。 比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数 很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能 提高很多。
- 3.运用反射手段, 使用 Class.forName() + 3.运用反射手段, 使用 Class.forName()
MyObject object = (MyObject) Class.forName("subin.rnd.MyObject - ").newInstance(); - 其他部分见“反射的原理”部分。 + ").newInstance();
+ 其他部分见“反射的原理”部分。
4.运用反序列化手段,调用 java.io.ObjectInputStream 对象的 readObject()方法。
其余部分见“序列化和反序列化”部分。
@@ -243,8 +237,8 @@ MyObject object = anotherObject.clone();
### 9. 说一下几种垃圾收集算法的原理和特点,应用的场景。怎么优化复制算法?      - 参见《深入理解 java 虚拟机》。 -      + 参见《深入理解 java 虚拟机》。
+     优化复制算法:由于每次执行复制算法的时候,所有存活的对象都要被复 制,这样效率很低。由于程序中创建的大部分对象的生命周期都很短,只有一 部分对象有较长的生命周期,因此可以针对这个特点对复制算法进行优化,采 @@ -255,23 +249,19 @@ MyObject object = anotherObject.clone();
参见《深入理解 java 虚拟机》。 ### 11. 什么是内存泄露和内存溢出。 -
![图](/data/images/Java应届生面试突击/Java基础/01_11.png)
-      +      内存泄漏的典型例子是一个没有重写 hashCode 和 equals 方法的 Key 类在 HashMap 中保存的情况,最后会生成很多重复的对象。所有的内存泄露最后都 -会 抛 出OutOfMemoryError异 常 ( Exceptionjava.lang.OutOfMemoryError: Java heap space)。
+会抛出OutOfMemoryError异 常 ( Exceptionjava.lang.OutOfMemoryError: Java heap space)。
造成内存泄露的原因:
- ![图](/data/images/Java应届生面试突击/Java基础/01_11_2.png)
![图](/data/images/Java应届生面试突击/Java基础/01_11_3.png)
![图](/data/images/Java应届生面试突击/Java基础/01_11_4.png)
- - * 内存泄露的解决方案(重要!!):
1、避免在循环中创建对象。
2、尽早释放无用对象的引用。(最基本的建议)
@@ -292,12 +282,12 @@ HashMap 中保存的情况,最后会生成很多重复的对象。所有的内 * 内存溢出的几种情况(OOM 异常):
OutOfMemoryError 异常:
-      +     除了程序计数器外,虚拟机内存的其他几个运行时区域都有发生OutOfMemoryError(OOM)异常的可能。
1.虚拟机栈和本地方法栈溢出
-      +     如果线程请求的栈深度大于虚拟机所允许的最大深度,将抛出StackOverflowError 异常。
-      +     如果虚拟机在扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError 异常。
2.堆 溢出
     @@ -346,18 +336,18 @@ HashMap 中保存的情况,最后会生成很多重复的对象。所有的内 ### 12. 如何减少GC出现的次数(Java内存管理)。(重点!!!!) (1)对象不用时最好显式置为 Null
-      +     一般而言,为 Null 的对象都会被作为垃圾处理,所以将不用的对象显式地设 为 Null,有利于 GC 收集器判定垃圾,从而提高了 GC 的效率。
(2)尽量少用 System.gc()
-      +     此函数建议 JVM 进行主 GC,虽然只是建议而非一定,但很多情况下它会触发 主 GC,从而增加主 GC 的频率,也即增加了间歇性停顿的次数。
(3)尽量少用静态变量
-      +     静态变量属于全局变量,不会被 GC 回收,它们会一直占用内存。
(4)尽量使用 StringBuffer,而不用 String 来累加字符串。
-      +     由于 String 是固定长的字符串对象,累加 String 对象时,并非在一个 String 对象中扩增,而是重新创建新的 String 对象,如 Str5=Str1+Str2+Str3+Str4,这条 语句执行过程中会产生多个垃圾对象,因为对次作“+”操作时都必须创建新 @@ -393,44 +383,43 @@ HashMap 中保存的情况,最后会生成很多重复的对象。所有的内 让对象实现 finalize()方法,一次对象的自我拯救。 ### 14. JVM 常见的启动参数。 -      +     -Xms: 设置堆的最小值。
-      +     -Xmx: 设置堆的最大值。
-      +     -Xmn: 设置新生代的大小。
-      +     -Xss: 设置每个线程的栈大小。
-      +     -XX:NewSize: 设置新生代的初始值。
-      +     -XX:MaxNewSize: 设置新生代的最大值。
-      +     -XX:PermSize: 设置永久代的初始值。
-      +     -XX:MaxPermSize: 设置永久代的最大值。
-      +     -XX:SurvivorRatio: 年轻代中 Eden 区与 Survivor 区的大小比值。
-      +     -XX:PretenureSizeThreshold: 令大于这个设置值的对象直接在老年代分配。
### 15. 说下几种常用的内存调试工具: jps、 jmap、 jhat、 jstack、 jconsole,jstat。 Java 内存泄露的问题调查定位: jmap,jstack 的使用等等。
-      +     jps: 查看虚拟机进程的状况,如进程 ID。
-      +     jmap: 用于生成堆转储快照文件(某一时刻的)。
-      +     jhat: 对生成的堆转储快照文件进行分析。
-      +     jstack: 用来生成线程快照(某一时刻的)。生成线程快照的主要目的是定位线程长时停顿的原因(如死锁,死循环,等待 I/O 等), 通过查看各个线程的调用堆栈,就可以知道没有响应的线程在后台做了什么或者等待什么资源。
-      +     jstat: 虚拟机统计信息监视工具。如显示垃圾收集的情况,内存使用的情况。
-      +     Jconsole: 主要是内存监控和线程监控。内存监控:可以显示内存的使用情况。线程监控:遇到线程停顿时,可以使用这个功能。
- ![图](/data/images/Java应届生面试突击/Java基础/01_15.png)
![图](/data/images/Java应届生面试突击/Java基础/01_15_2.png)
![图](/data/images/Java应届生面试突击/Java基础/01_15_3.png)
@@ -442,28 +431,28 @@ Java 内存泄露的问题调查定位: jmap,jstack 的使用等等。
### 17. 说下双亲委派模型。双亲委派模型中有哪些方法。用户如何自定义类加载器 。怎么打破双亲委托机制? 参见《深入理解 java 虚拟机》。
双亲委派模型中用到的方法:
-      +     findLoadedClass(),
-      +     loadClass()
-      +     findBootstrapClassOrNull()
-      +     findClass()
-      +     defineClass():把二进制数据转换成字节码。
-      +     resolveClass()
自定义类加载器的方法:
-      +     继承 ClassLoader 类,
-      +     重写 findClass()方法。
### 18. 描述Java类加载器的工作原理及其组织结构。 Java 类加载器的作用就是在运行时加载类。
Java 类加载器基于三个机制:委托性、可见性和单一性。
-      +     (1) 委托机制是指双亲委派模型。当一个类加载和初始化的时候,类仅在有需 要加载的时候被加载。假设你有一个应用需要的类叫作 Abc.class,首先加载这 个类的请求由 Application 类加载器委托给它的父类加载器 Extension 类加载器, @@ -472,49 +461,59 @@ Java 类加载器基于三个机制:委托性、可见性和单一性。
看 jre/lib/ext 目录下有没有这个类,如果这个类被 Extension 类加载器找到了, 那么它将被加载,而 Application 类加载器不会加载这个类;而如果这个类没有 被 Extension 类加载器找到,那么再由 Application 类加载器从 classpath 中寻找,如果没找到,就会抛出异常。
-      +     双亲委托机制的优点就是能够提高软件系统的安全性。因为在此机制下, 用户自定义的类加载器不可能加载本应该由父加载器加载的可靠类,从而防止 不可靠的恶意代码代替由父类加载器加载的可靠代码。如, java.lang.Object 类总 是由根类加载器加载的,其他任何用户自定义的类加载器都不可能加载含有恶 意代码的 java.lang.Object类。
-      +     (2) 可见性原理是子类的加载器可以看见所有的父类加载器加载的类,而父类 加载器看不到子类加载器加载的类。
-      +     (3) 单一性原理是指仅加载一个类一次,这是由委托机制确保子类加载器不会 -再次加载父类加载器加载过的类。 -      +再次加载父类加载器加载过的类。
+     Java 的类加载器有三个,对应 Java 的三种类:
-      +     Bootstrap Loader // 负责加载系统类 (指的是内置类,像 String)
-      +     | -      +     -- ExtClassLoader //负责加载扩展类(就是继承类和实现类)
-      +     | -      +     -- AppClassLoader //负责加载应用类(程序员自定义的类)
-      +     Java 提供了显式加载类的 API:Class.forName(classname)。 ### 21. Java编译的过程。 -见《深入理解 java 虚拟机》。P304 +见[《深入理解 java虚拟机》](/data/books/Java/[中文]深入理解Java虚拟机.pdf)。P304 ### 22. class文件是什么类型文件(字节码文件的格式)? -参见《深入理解 java 虚拟机》。 +参见[《深入理解 java虚拟机》](/data/books/Java/[中文]深入理解Java虚拟机.pdf)。 ### 23. 即时编译器的优化方法。 -参见《深入理解 java 虚拟机》。P345 +参见[《深入理解 java虚拟机》](/data/books/Java/[中文]深入理解Java虚拟机.pdf)。P345 ### 24.静态分派与动态分派。 -参见《深入理解 java 虚拟机》。 P246 +参见[《深入理解 java虚拟机》](/data/books/Java/[中文]深入理解Java虚拟机.pdf)。 P246 ### 25. 编译阶段对程序做了哪些优化? 编译期其实是个“不确定”的操作过程,它既可能指的是前端编译器的编译过程,也可能指的是后端运行期编译器的编译过程。
-详细参见《深入理解 java虚拟机》。 +详细参见[《深入理解 java虚拟机》](/data/books/Java/[中文]深入理解Java虚拟机.pdf)。 ### 26. new 的对象如何不分配在堆而分配在栈上? 方法逃逸。 + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/02_Java\344\270\255\347\232\204\351\233\206\345\220\210\347\261\273.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/02_Java\344\270\255\347\232\204\351\233\206\345\220\210\347\261\273.md" index f7a96fe..7821ef0 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/02_Java\344\270\255\347\232\204\351\233\206\345\220\210\347\261\273.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/02_Java\344\270\255\347\232\204\351\233\206\345\220\210\347\261\273.md" @@ -20,7 +20,7 @@      ArrayList 不具有线程安全性,用在单线程环境中。LinkedList 也是线程不安全的,**如 果在并发环境下使用它们**, 可 以 用 Colletions 类 中 的 静 态 方 法 **synchronizedList()** 对 -ArrayList 和 LinkedList 进行调用即可。 +ArrayList 和 LinkedList 进行调用即可。
     **Vector 是线程安全的**,即它的大部分方法都包含有关键字 synchronized。Vector 的效 率没有 ArrayList 和 LinkedList 高。 @@ -112,7 +112,7 @@ Vector 或 ArrayList 都可以。如果是对其它**指定位置的插入、删      再哈希,其目的是为了减少哈希冲突,使元素能够均匀的分布在数组上,从而提高数 组的存取效率。
-**扩展:为何数组的长度是 2 的 n 次方呢?** +**扩展:为何数组的长度是 2 的 n 次方呢?**
     1. 这 个 方 法 非 常 巧 妙 , 它 通 过 h & (table.length -1) 来 得 到 该 对 象 的 保 存 位 , 而 HashMap 底层**数组的长度总是 2 的 n 次方**,2 n -1 得到的二进制数的每个位上的值都为 1, @@ -298,16 +298,15 @@ k , V v, HashEntry next) 来创建的。如果另一个线程刚好 new 这个 注意:由于只能在表头插入,所以链表中节点的顺序和插入的顺序相反。
**3.remove(Object key)的实现**
     - 下面来分析 remove 操作,先让我们来看看 remove 操作的源代码实现。
+ 下面来分析 remove 操作,先让我们来看看 remove 操作的源代码实现。
![图02_2_15](/data/images/Java应届生面试突击/Java基础/02_2_16.png)
-![图02_2_15](/data/images/Java应届生面试突击/Java基础/02_2_17.png)
+![图02_2_15](/data/images/Java应届生面试突击/Java基础/02_2_17.png)
     首先根据散列码找到具体的链表,然后遍历这个链表找到要删除的节点; 最后把待删除节点之后的所有节点原样保留在新链表中,把待删除节点之前的 每个节点克隆到新链表中。下面通过图例来说明 remove 操作。假设写线程执 行 remove 操作,要删除链表的 C 节点,另一个读线程同时正在遍历这个链 表。
- 图 4. 执行删除之前的原链表:
![图02_2_15](/data/images/Java应届生面试突击/Java基础/02_2_18.png)
图 5. 执行删除之后的新链表
@@ -416,14 +415,15 @@ private static final Object PRESENT = new Object();
例如:假设存在两个线程(线程 1、线程 2),线程 1 通过 Iterator 在遍历 集合 A 中的元素,在某个时候线程 2 修改了集合 A 的结构(是结构上面的修改, 而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 -ConcurrentModificationException 异常,从而产生 fail-fast 机制。 +ConcurrentModificationException 异常,从而产生 fail-fast 机制。
     - 产生的原因: + 产生的原因:
     当调用容器的 iterator()方法返回 Iterater 对象时,把容器中包含对象 的个数赋值给了一个变量 expectedModCount,在调用 next()方法时,会比较 expectedModCount 与容器中实际对象的个数是否相等,若二者不相等,则会抛 -出 ConcurrentModificationException 异常。 +出 ConcurrentModificationException 异常。
+     如果在遍历集合的同时,需要删除元素的话,可以用 iterator 里面的 remove()方法删除元素。 @@ -444,7 +444,7 @@ List 接口中常用类
     LinkedList :线程不安全。增删速度快。底层数据结构是链表
-Set(集)元素无序的、不可重复。 +Set(集)元素无序的、不可重复。
     取出元素的方法只有迭代器。不可以存放重复元素,元素存取是无序的。因此存入 Set 中的每个对象都必须重写 equals()和 hashCode()方法来确保对象的唯一性。 @@ -475,3 +475,12 @@ key 时,需要重新改写该对象的 equals()和 hashCode()方法来确保 key Collections 是针对集合类的一个帮助类,*提供了操作集合的工具方法*:一系列**静态方法** 实现对各种集合的**搜索、排序、线程安全化**等操作。 + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/03_\350\256\276\350\256\241\346\250\241\345\274\217\347\233\270\345\205\263.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/03_\350\256\276\350\256\241\346\250\241\345\274\217\347\233\270\345\205\263.md" index b25dbec..73d6fd1 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/03_\350\256\276\350\256\241\346\250\241\345\274\217\347\233\270\345\205\263.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/03_\350\256\276\350\256\241\346\250\241\345\274\217\347\233\270\345\205\263.md" @@ -31,9 +31,6 @@ return T.t; } - public static Singleton getInstance(){ - return T.t; - } } * 实现方式二:
@@ -165,14 +162,34 @@ composite,template,absever 等。
**3.工厂设计模式**
     4.1 简单工厂模式
-简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建出哪一 +简单工厂模式的实质是由一个工厂类根据传入的参数, 动态决定应该创建出哪一 个产品类的实例。
     4.2 抽象工厂模式
-在这个模式中的几类角色,有抽象工厂,实体工厂,抽象产品,实体产品。
+在这个模式中的几类角色, 有抽象工厂, 实体工厂, 抽象产品, 实体产品。
[http://www.cnblogs.com/suizhouqiwei/archive/2012/06/26/2563332.html](http://www.cnblogs.com/suizhouqiwei/archive/2012/06/26/2563332.html)
     4.3 工厂方法模式
### 4. 详细的设计模式内容 -[24种设计模式介绍与6大设计原则.pdf](/data/books/24种设计模式介绍与6大设计原则.pdf) \ No newline at end of file +[24种设计模式介绍与6大设计原则.pdf](/data/books/24种设计模式介绍与6大设计原则.pdf) + +Java 中一般认为有23 种设计模式,我们不需要所有的都会,但是其中常用的几种设计模式应该去掌握。
+下面列出了所有的设计模式。需要掌握的设计模式我单独列出来了,当然能掌握的越多越好。
+总体来说设计模式分为三大类:
+创建型模式,共五种:
+工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
+结构型模式,共七种:
+适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
+行为型模式,共十一种:
+策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/04_Java\350\257\255\350\250\200\347\233\270\345\205\263.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/04_Java\350\257\255\350\250\200\347\233\270\345\205\263.md" index e268451..93d7a28 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/04_Java\350\257\255\350\250\200\347\233\270\345\205\263.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/04_Java\350\257\255\350\250\200\347\233\270\345\205\263.md" @@ -42,32 +42,48 @@ ### 1. 标识符的命名规则。      - 标识符只能由数字、字母(a-z、A-Z)、下划线(_)和$组成,并且第一 -个字符不能为数字。 + 标识符只能由数字、字母(a-z、A-Z)、下划线(_)和$组成,并且第一个字符不能为数字。 ### 2. instanceof 关键字的作用。      用法:对象 A instanceof 类 B。
     - instanceof 通过返回一个布尔值来指出,这个对象是否是这个特定类或者是 -它的子类的一个实例。注意:如果对象 A 为 null,则返回 false。
+ instanceof 通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。 +注意:如果对象 A 为 null,则返回 false。
### 3. strictfp 关键字的作用。      - strictfp 可以用来修饰一个类、接口或者方法,在所声明的范围内,所有浮 -点数的计算都是精确的。当一个类被 strictfp 修饰时,所有方法默认也被 strictfp + strictfp 可以用来修饰一个类、接口或者方法,在所声明的范围内, +所有浮点数的计算都是精确的。当一个类被 strictfp 修饰时, 所有方法默认也被 strictfp 修饰。
### 4. 什么是不可变类?      不可变类:当创建了一个类的实例后,就不允许修改它的值了。特别注意: -String 和包装类(Integer,Float......)都是不可变类。String 采用了享元设计模 -式(flyweight)。
+String 和包装类(Integer,Float......)都是不可变类。String 采用了享元设计模式(flyweight)。
-**扩展问题 1**:new String("abc");创建了几个对象?
+**扩展问题 1**:new String("abc"); 创建了几个对象?
     - 1 个或者 2 个对象。如果常量池中原来有”abc”,那么只创建一个对象;如 -果常量池中原来没有字符串”abc”,那么就会创建 2 个对象。
+ 1 个或者 2 个对象。如果常量池中原来有”abc”, 那么只创建一个对象; +如果常量池中原来没有字符串”abc”, 那么就会创建 2 个对象。
+ +代码片段1:
+String str1 = "ab";
+String str2 = "ab";
+//str1==str2 为true
+String str1 = “ab”;在字符串常量池创建一个对象"ab",后面str2时直接引用该对象,不用再创建,共创建一个对象。 + +代码片段2:
+String str3 = new String("ab");
+String str4 = new String("ab");
+//str3==str4 为false
+先在字符串常量池创建一个对象"ab",然后在堆空间创建两个对象,使str3和str4分别指向它们,共创建3个对象 + +代码片段3:
+String str5 = "ab"+"cd";
+在字符串常量区创建3个对象,分别是"ab" ,“cd”,“abcd”,但是一般编译器会优化成String str5 = "abcd"; + +[创建字符串详细原理](https://blog.csdn.net/stanxl/article/details/42360689) **扩展问题 2**:
@@ -110,6 +126,8 @@ String 和包装类(Integer,Float......)都是不可变类。String 采用了享 Hello world
Hello
+[引用传递与指传递](https://www.jianshu.com/p/36620c91b276) + ### 5. Java 中的基本数据类型占据几个字节? 在 java 中,
     @@ -144,33 +162,33 @@ null
0
其他需要注意的问题:
-1.默认声明的小数是 double 类型的,比如 1.2 默认就是 double 类型的,因此, +1. 默认声明的小数是 double 类型的,比如 1.2 默认就是 double 类型的, 因此, 在对 float 类型的变量进行赋值的时候需要进行类型转换。如 float i=1.2f;
-2.null **不是一个合法的 object 实例,所以并没有为其分配内存**。null 仅仅用于 -表明该引用目前没有指向任何对象。
+2. null **不是一个合法的 object 实例,所以并没有为其分配内存**。null 仅仅用于表明该引用目前没有指向任何对象。
-3.Integer 的缓存策略。
+3. Integer 的缓存策略。
     在类加载时就将-128 到 127 的 Integer 对象创建了,并保存在 cache 数 -组中(**Integer cache[]**),一旦程序调用 **Integer.valueOf( i )** 方法,如果 i 的 -值是在 **-128** 到 **127** 之间就直接在 cache 缓存数组中**去取 Integer 对象,不 -在的话,就创建新的包装类对象**。
+组中(**Integer cache[]**), 一旦程序调用 **Integer.valueOf( i )** 方法, +如果 i 的值是在 **-128** 到 **127** 之间就直接在 cache 缓存数组中**去取 Integer 对象, +不在的话,就创建新的包装类对象**。
Short(-128 — 127 缓存)
Long(-128 — 127 缓存)
Float(没有缓存)
Doulbe(没有缓存)
+ public static Integer valueOf(int i) { - if(i >= -128 && i <= IntegerCache.high) - return IntegerCache.cache[i + 128]; - else - return new Integer(i); + if(i >= -128 && i <= IntegerCache.high) + return IntegerCache.cache[i + 128]; + else + return new Integer(i); } **例子:**
     - 装箱是将一个原始数据类型赋值给相应封装类的变量,而拆箱则是将一个 -封装类的变量赋值给相应原始数据类型的变量。
+ 装箱是将一个原始数据类型赋值给相应封装类的变量, +而拆箱则是将一个封装类的变量赋值给相应原始数据类型的变量。
//装箱。装箱就是 jdk 自己帮你完成了调用 Integer.valueOf(100)。 Integer integer1 = 3; @@ -230,39 +248,41 @@ true
**例子:** public static void main(String[] args) { - byte a = 5; - int b = 5; - int c = a >> 2 + b >> 2; - System.out.println(c); + byte a = 5; + int b = 5; + int c = a >> 2 + b >> 2; + System.out.println(c); } 输出是 0. public static void main(String[] args) { - int a = 10, b = 4, c = 5, d = 9; - System.out.println(++a * b + c * --d); + int a = 10, b = 4, c = 5, d = 9; + System.out.println(++a * b + c * --d); } 输出是 84. ### 7. 强制类型转换时的规则有哪些。      - 1.当对小于 int 的数据类型(byte,char,short)进行运算时,首先会把这些 -类型的**变量值**强制转为 int 类型,对 int 类型的值进行运算,最后得到的值也是 -int 类型的。因此,如果把 2 个 short 类型的值相加,最后得到的结果是 int 类型, -如果需要得到 short 类型的结果,就必须显示地运算结果转为 short 类型。 -**例子:** short s1=1; s1=s1+1; -编译出错。正确的写法是 short s1 = 1; s1 = (short) (s1 + 1); -**例子:** short s1 = 1;s1 += 1; -编译通过。 + 1.当对小于 int 的数据类型(byte,char,short)进行运算时,首先会把这些类型的**变量值**强制转为 int 类型, +对 int 类型的值进行运算,最后得到的值也是 int 类型的。因此,如果把 2 个 short 类型的值相加, +最后得到的结果是 int 类型, 如果需要得到 short 类型的结果,就必须显示地运算结果转为 short 类型。
+**例子:**
+short s1=1;
+s1=s1+1;
+编译出错。正确的写法是 short s1 = 1; s1 = (short) (s1 + 1);
+**例子:**
+short s1 = 1;
+s1 += 1;
+编译通过。
     - 2.基本数据类型和 boolean 类型是不能相互转换的。 + 2.基本数据类型和 boolean 类型是不能相互转换的。
     3.char 类型的数据转为高级类型时,会转换为对应的 ASCII 码。 **例题 1:** int i=1; - if(i) - System.out.println(i); + if(i)System.out.println(i); 编译出错。基本数据类型和 boolean 类型是不能相互转换的。 **例题 2:** @@ -284,10 +304,10 @@ int 类型的。因此,如果把 2 个 short 类型的值相加,最后得到的 ### 8. 数组初始化时需要注意的问题。      - 1.数组被创建后会根据数组存放的数据类型默认初始化为对应的初始值, + 1. 数组被创建后会根据数组存放的数据类型默认初始化为对应的初始值,
例如,int 类型会初始化为 0,对象类型会初始化为 null。
     - 2.2 维数组中,每行元素个数可以不同。
+ 2. 2 维数组中, 每行元素个数可以不同。
### 9. 如何在 main()方法执行前输出“Hello world”?      @@ -299,11 +319,9 @@ int 类型的。因此,如果把 2 个 short 类型的值相加,最后得到的      2.子类的静态变量、子类的静态代码块(谁在前,谁先初始化)
     - 3.父类的非静态变量、父类的非静态代码块(谁在前,谁先初始化) - 、父类的构造函数
+ 3.父类的非静态变量、父类的非静态代码块(谁在前,谁先初始化)、父类的构造函数
     - 4.子类的非静态变量、子类的非静态代码块(谁在前,谁先初始化) - 、子类的构造函数
+ 4.子类的非静态变量、子类的非静态代码块(谁在前,谁先初始化)、子类的构造函数
![04_10](/data/images/Java应届生面试突击/Java基础/04_10.png)
### 11. 构造函数的特点。 @@ -319,15 +337,15 @@ int 类型的。因此,如果把 2 个 short 类型的值相加,最后得到的 4.子类可以通过 super()来显示调用父类的构造函数。
public class Test { - public Test() { - System.out.println("constructor..."); - } - public void Test() { - System.out.println("call test14...."); - } - public static void main(String[] args) { - new Test().Test(); - } + public Test() { + System.out.println("constructor..."); + } + public void Test() { + System.out.println("call test14...."); + } + public static void main(String[] args) { + new Test().Test(); + } } 输出结果为:
constructor...
@@ -336,78 +354,77 @@ call test14....
带返回值,而普通方法是必须有返回值的,这就是区别他们的方法。**
### 12. 序列化与反序列化。 -* 1.定义
+1. 定义
     把 **Java 对象**转换为**字节序列**的过程称为对象的序列化。 把**字节序列**恢复为 **Java 对象**的过程称为对象的反序列化。
-* 2.实现方式
+2. 实现方式
+     + 所有实现序列化的类都必须实现 Serializable 接口,它是一种标记接口, 里面没有任 +何方法。当序列化的时候,需要用到 **ObjectOutputStream** 里面的 **writeObject()**; +当反序列化的时候, 需要用到 **ObjectInputStream** 里面的 **readObject()**方法。
+3. 特点
     - 所有实现序列化的类都必须实现 Serializable 接口,它是一种标记接口,里面没有任 -何方法。当序列化的时候,需要用到 **ObjectOutputStream** 里面的 **writeObject()**;当反序 -列化的时候,需要用到 **ObjectInputStream** 里面的 **readObject()**方法。
-* 3.特点
+ 3.1 序列化时, **只对对象的状态进行保存**, 而不管对象的方法。
     - 3.1 序列化时,**只对对象的状态进行保存**,而不管对象的方法。
+ 3.2 当一个**父类实现序列化**时, 子类自动实现序列化, 不需要显示实现 Serializable 接口。
     - 3.2 当一个**父类实现序列化**时,子类自动实现序列化,不需要显示实现 Serializable 接口。
+ 3.3 当一个对象的实例变量引用了其他对象时, 序列化该对象时, 也把引用对象进行序列化。
     - 3.3 当一个对象的实例变量引用了其他对象时,序列化该对象时,也把引用对象进行序列 -化。
+ 3.4 对象中**被 static 或者 transient 修饰的变量**, 在序列化时其变量值是不被保存的。
+4. 好处
     - 3.4 对象中**被 static 或者 transient 修饰的变量**,在序列化时其变量值是不被保存的。
-* 4.好处
+ 一是, 实现了**数据的持久化**,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里);
     - 一是,实现了**数据的持久化**,通过序列化可以把数据永久地保存到硬盘上(通常存放在 -文件里);二是,利用序列化实现**远程通信**,即在网络上传送对象的字节序列。 + 二是, 利用序列化实现**远程通信**,即在网络上传送对象的字节序列。
下面说下版本号。
     - 我们在写程序的时候,最好在被序列化的类中显示声明 serialVersionUID.这么做的好 -处:
+ 我们在写程序的时候,最好在被序列化的类中显示声明 serialVersionUID.
+这么做的好处:
     - 1.提高程序的运行效率。如果在类中没有显示声明 serialVersionUID,那么在序列化的 -时候会通过计算得到该值。如果显示声明该值的话,会省去计算的过程。
+ 1. 提高程序的运行效率。如果在类中没有显示声明 serialVersionUID, +那么在序列化的时候会通过计算得到该值。如果显示声明该值的话, 会省去计算的过程。
     - 2. 如 果 你 的 类 没 有 提 供 serialVersionUID , 那 么 编 译 器 会 自 动 生 成 , 而 这 个 -serialVersionUID 就是对象的 hashcode 值。那么如果加入新的成员变量,重新生成的 -serialVersionUID 将 和 之 前 的 不 同 , 那 么 在 进 行 反 序 列 化 的 时 候 就 会 产 生 + 2. 如果你的类没有提供 serialVersionUID , 那么编译器会自动生成, 而这个 +serialVersionUID 就是对象的 hashcode 值。那么如果加入新的成员变量, 重新生成的 +serialVersionUID 将和之前的不同, 那么在进行反序列化的时候就会产生 java.io.InvalidClassException 的异常。
     **扩展:ArrayList 和 LinkedList 能否序列化?**
     都可以序列化。 ArrayList 里面的数组 elementData 是声明为 transient 的,表示 ArrayList -在序列化的时候,默认不会序列化这些数组元素。因为 ArrayList 实际上是动态数组,每次 -在放满以后会扩容,如果数组扩容后,实际上只放了一个元素,那就会序列化很多 null 元 -素,浪费空间,所以 ArrayList **把元素数组设置为 transient,仅仅序列化已经保存的数据**。
+在序列化的时候, 默认不会序列化这些数组元素。因为 ArrayList 实际上是动态数组,每次在放满以后会扩容, +如果数组扩容后, 实际上只放了一个元素,那就会序列化很多 null 元素, 浪费空间, +所以 ArrayList **把元素数组设置为 transient, 仅仅序列化已经保存的数据**。
     - 对象实现 java.io.Serializable 接口以后,序列化的动作不仅取决于对象本身,还取决 + 对象实现 java.io.Serializable 接口以后, 序列化的动作不仅取决于对象本身, 还取决 于执行序列化的对象。
     - 以 ObjectOutputStream 为例,如果 ArrayList 或自定义对象实现了 writeObject(), -readObject(),那么在序列化和反序列化的时候,就按照自己定义的方法来执行动作,所以 -**ArrayList 就自定义了 writeObject 和 readObject 方法**,然后在 writeObject 方法内完成 -数组元素的自定义序列化动作,在 readObject 方法内完成数组元素的自定义反序列化动作。
+ 以 ObjectOutputStream 为例, 如果 ArrayList 或自定义对象实现了 writeObject(), +readObject(), 那么在序列化和反序列化的时候, 就按照自己定义的方法来执行动作, 所以 +**ArrayList 就自定义了 writeObject 和 readObject 方法**, 然后在 writeObject 方法内完成 +数组元素的自定义序列化动作, 在 readObject 方法内完成数组元素的自定义反序列化动作。
### 13. Switch 能否用 string 做参数?      - 在 Java 7 之前,switch 只能支持 byte、short、char、int 或者其对 -应的包装类以及 Enum 类型。在 Java 7 中,String 支持被加上了。
+ 在 Java 7 之前,switch 只能支持 byte、short、char、int 或者其对应的包装类以及 Enum 类型。 +在 Java 7 中, String 支持被加上了。
     - 在使用 switch 时,需要注意另外一个问题,如果和匹配的 case 情况中 -省略了 break,那么匹配的 case 值后的所有情况都会执行,而不管 case 是 -否匹配,一直遇到 break 结束。
+ 在使用 switch 时, 需要注意另外一个问题, 如果和匹配的 case 情况中省略了 break, +那么匹配的 case 值后的所有情况都会执行, 而不管 case 是否匹配, 一直遇到 break 结束。
int x = 2; switch (x) { - case 2: - System.out.println(x); - case 3: - System.out.println(x); - case 4: - System.out.println(x); - break; - default: - System.out.println("dddddd"); + case 2: + System.out.println(x); + case 3: + System.out.println(x); + case 4: + System.out.println(x); + break; + default: + System.out.println("dddddd"); } 输出结果为:
2
@@ -416,58 +433,56 @@ readObject(),那么在序列化和反序列化的时候,就按照自己定义的 ### 14. equals 与==的区别。      - “==”可用于比较基本数据类型(比较的是他们的值是否相等),也 -可以用于比较对象在内存中的存放地址是否相等。
+ “==”可用于比较基本数据类型(比较的是他们的值是否相等), +也可以用于比较对象在内存中的存放地址是否相等。
     - JAVA 当中所有的类都是继承于 Object 这个基类的,在 Object 中的基 -类中定义了一个 equals 的方法,**这个方法的初始行为是比较对象的内存地 -址,但在一些类库当中这个方法被覆盖掉了,如 String,包装类**在这些类 -当中 equals 有其自身的实现,而不再是比较类在堆内存中的存放地址了(**对 -于 String 的 equals()方法比较二个对象的内容是否相等**)。
+ JAVA 当中所有的类都是继承于 Object 这个基类的, 在 Object 中的基类中定义了一个 equals 的方法, +**这个方法的初始行为是比较对象的内存地址, 但在一些类库当中这个方法被覆盖掉了, 如 String,包装类**在这些类 +当中 equals 有其自身的实现, 而不再是比较类在堆内存中的存放地址了(**对于 String 的 equals()方法比较二个对象的内容是否相等**)。
     - 因此,对于复合数据类型之间进行 equals 比较,**在没有覆写 equals -方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址 -值的**,因为 Object 的 equals 方法也是用双等号(==)进行比较的,所以比 -较后的结果跟双等号(==)的结果相同。
+ 因此, 对于复合数据类型之间进行 equals 比较, **在没有覆写 equals +方法的情况下, 他们之间的比较还是基于他们在内存中的存放位置的地址值的**, +因为 Object 的 equals 方法也是用双等号(==)进行比较的, +所以比较后的结果跟双等号(==)的结果相同。
public class Example4 { public static void main(String[] args) { - Example4 e=new Example4(); - Example4 e4=new Example4(); + Example4 e = new Example4(); + Example4 e4 = new Example4(); System.out.println(“用 equals(Object) 比较结果”); System.out.println(e.equals(e4)); //结果为 false System.out.println(“用 == 比较结果”); - System.out.println(e==e4); + System.out.println(e == e4); //结果为 false } } **扩展**: 当调用 **intern 方法**时, 如果池已经包含一个等于此 String 对象 -的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则, -将此 String 对象添加到池中,并且返回此 String 对象的引用。
+的字符串(该对象由 equals(Object) 方法确定), 则返回池中的字符串。否则, +将此 String 对象添加到池中, 并且返回此 String 对象的引用。
### 15. Hashcode 的作用。      hashCode()方法是从 Object 类继承过来的, Object 类中的 hashCode() -方法返回的是对象在内存中的地址转换成的 int 值,如果对象没有重写 -hashCode()方法,任何对象的 hashCode()方法的返回值都是不相等的。
+方法返回的是对象在内存中的地址转换成的 int 值, 如果对象没有重写 +hashCode()方法, 任何对象的 hashCode()方法的返回值都是不相等的。
     - 重写方法:Java 中的 hashCode 方法就是根据一定的规则将与对象相 -关的信息(比如对象的存储地址,对象的字段等)映射成一个数值,这个数 + 重写方法: Java 中的 hashCode 方法就是根据一定的规则将与对象相 +关的信息(比如对象的存储地址,对象的字段等)映射成一个数值, 这个数 值称作为散列值。
     - 主要作用是用于查找的,为了配合基于散列的集合一起正常运行,这样 + 主要作用是用于查找的, 为了配合基于散列的集合一起正常运行, 这样 的散列集合包括 HashSet、 HashMap 以及 HashTable, hashCode 是用来 在散列存储结构中确定对象的存储地址的。
     - 考虑一种情况,当向集合中插入对象时,如何判别在集合中是否已经存 -在该对象了?(注意:集合中不允许重复的元素存在)。
+ 考虑一种情况, 当向集合中插入对象时, 如何判别在集合中是否已经存 +在该对象了? (注意: 集合中不允许重复的元素存在)。
     - 当集合要添加新的对象时,先调用这个对象的 hashCode 方法,得到对 -应的 hashcode 值;如果在该位置有值,就调用它的 equals 方法与新元素 -进行比较,相同的话就不存了,不相同就散列其它的地址。
+ 当集合要添加新的对象时, 先调用这个对象的 hashCode 方法, 得到对 +应的 hashcode 值; 如果在该位置有值, 就调用它的 equals 方法与新元素 +进行比较, 相同的话就不存了, 不相同就散列其它的地址。
     扩展:为什么在重写 equals 方法的同时,必须重写 hashCode 方法?
@@ -525,27 +540,18 @@ true
true
[com.ubs.sae.test.HashTest@1]
-     - Java 对于 equals()方法和 hashCode()方法是这样规定的:
-     - 1.如果 2 个对象的 equals()方法返回 true,则 hashCode()返回的值也 -相同。
-     - 2.如果 2 个对象的 equals()方法返回 false,则 hashCode()返回的值可 -能相同,也可能不相同。
-     - 3.如果 2 个对象的 hashCode()方法返回值相同,则 equals()返回的值 -可能为 true,也可能为 false。
-     - 4.如果 2 个对象的 hashCode()方法返回值不同,则 equals()返回的值 -为 false。
+* Java 对于 equals()方法和 hashCode()方法是这样规定的: + 1. 如果 2 个对象的 equals()方法返回 true, 则 hashCode()返回的值也相同。 + 2. 如果 2 个对象的 equals()方法返回 false, 则 hashCode()返回的值可能相同, 也可能不相同。 + 3. 如果 2 个对象的 hashCode()方法返回值相同, 则 equals()返回的值可能为 true,也可能为 false。 + 4. 如果 2 个对象的 hashCode()方法返回值不同, 则 equals()返回的值为 false。 ### 16. hashCode() 与 equals() 生成算法、方法怎么重写。      - 1.尽量保证使用对象的同一个属性来生成 hashCode()和 equals()两个 + 1. 尽量保证使用对象的同一个属性来生成 hashCode()和 equals()两个 方法。
     - 2.在重写 equals 方法的同时,必须重写 hashCode 方法(二者必须同时 + 2. 在重写 equals 方法的同时,必须重写 hashCode 方法(二者必须同时 重写)。
//age 是 int 类型的,id 是 Integer 类型的 @@ -576,30 +582,21 @@ true
} ### 17. Object 有哪些公用方法? -     - 1.clone() :创建并返回此对象的一个副本。
- -     - 2.equals(Object obj):指示其他某个对象是否与此对象的地址“相等”。 +1. clone() :创建并返回此对象的一个副本。
+2. equals(Object obj):指示其他某个对象是否与此对象的地址“相等”。
+   hashCode():返回该对象的哈希码值。
+3. wait() :
+   + notify() :唤醒在此对象监视器上等待的单个线程。
+   + notifyAll():唤醒在此对象监视器上等待的所有线程。
+4. toString():返回该对象的字符串表示。
+5. finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
+6. getClass():返回此 Object 的运行时类。
-     - 3.wait() : - notify() :唤醒在此对象监视器上等待的单个线程。 - notifyAll():唤醒在此对象监视器上等待的所有线程。 - -     - 4.toString():返回该对象的字符串表示。
- -     - 5.finalize():当垃圾回收器确定不存在对该对象的更多引用时,由对象的 - 垃圾回收器调用此方法。
- -     - 6.getClass():返回此 Object 的运行时类。
- ### 18. String、StringBuffer 与 StringBuilder 的区别。 -1.可变与不可变
+1. 可变与不可变
     string 对象是不可变的;StringBuilder 与 StringBuffer 对象是可变的。 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后 @@ -607,10 +604,10 @@ true
生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就 会开始工作,性能就会降低。
     - 修改 String 对象的原理:首先创建一个 StringBuffer 对象,然后调用 append()方 + 修改 String 对象的原理:首先创建一个 StringBuffer 对象, 然后调用 append()方 法,最后调用 toString()方法。
-     - + + String s=”Hello”; S+=”World”; 等价于: @@ -619,8 +616,8 @@ true
sb.append(“World”); sb.toString();      - 使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生 -成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对 + 使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作, 而不是生 +成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer , 特别是字符串对 象经常改变的情况下。
2.是否多线程安全
@@ -630,29 +627,28 @@ true
3.初始化方式的不同
     - StringBuffer 和 StringBuilder 只能用构造函数的形式来初始化。 String 除了用构 + StringBuffer 和 StringBuilder 只能用构造函数的形式来初始化。String 除了用构 造函数进行初始化外,还可以直接赋值。
-### 19. try catch finally,try 里有 return,finally 还执行么?如果会的话,什么时候执行,在 return 之前还是 return 之后? + +### 19. try catch finally, try 里有 return,finally 还执行么?如果会的话, 什么时候执行, 在 return 之前还是 return 之后? 1.finally 块里的代码在 return 之前执行。
-2.如果 finally 块中有 return 语句的话,它将覆盖掉函数中其他 return 语 -句。
+2.如果 finally 块中有 return 语句的话, 它将覆盖掉函数中其他 return 语句。
-1.如果 finally 块中,改变了 try 块中返回变量的值,该变量为基本数据类 -型的话,则 finally 块中改变变量值的语句将不起作用;如果该变量为引用 -变量的话,则起作用。
-2.Finally 块中的代码不一定执行。 -比如,try 块执行之前,出现了异常,则程序终止。 -比如,在 try 块中执行了 -System.exit(0)。
+1.如果 finally 块中,改变了 try 块中返回变量的值, 该变量为基本数据类 +型的话,则 finally 块中改变变量值的语句将不起作用; 如果该变量为引用 +变量的话, 则起作用。
+2.Finally 块中的代码不一定执行。
+比如,try 块执行之前,出现了异常,则程序终止。
+比如,在 try 块中执行了 System.exit(0)。
### 20. 说下异常的原理。 异常是指程序运行时所发生的错误。
-Throwable 是所有异常的父类,它有 2 个子类:Error 和 Exception。
+Throwable 是所有异常的父类, 它有 2 个子类: Error 和 Exception。
-1.Error 表示程序在运行期间发生了非常严重的错误,并且该错误是不可恢 +1. Error 表示程序在运行期间发生了非常严重的错误,并且该错误是不可恢 复的。Error 不需要捕捉。如 OutOfMemoryError。
-2.Exception 是可恢复的异常。它包含 2 种类型:检查异常和运行时异常。
+2. Exception 是可恢复的异常。它包含 2 种类型:检查异常和运行时异常。
     2.1 检查异常(Checked Exception)
比如 IOException、SQLException 和 FileNotFoundException 都是检查 @@ -667,39 +663,39 @@ Throwable 是所有异常的父类,它有 2 个子类:Error 和 Exception。
+ ### 21. Java 面向对象的三个特征与含义。      - 封装:属性的封装和方法的封装。把属性定义为私有的,get(),set()方法。 + 封装: 属性的封装和方法的封装。把属性定义为私有的, get(), set()方法。 好处是信息隐藏和模块化,提高安全性。封装的主要作用在于对外隐藏内 -部实现细节,增强程序的安全性。
+部实现细节, 增强程序的安全性。
     继承:子类可以继承父类的成员变量和成员方法。继承可以提高代码的复 用性。
继承的特性:
-1.单一继承。
-2.子类只能继承父类的非私有成员变量和方法。
-3.成员变量的隐藏和方法的覆盖。
+1. 单一继承。 +2. 子类只能继承父类的非私有成员变量和方法。 +3. 成员变量的隐藏和方法的覆盖。      - 多态:当同一个操作作用在不同对象时,会产生不同的结果。实现原理见 + 多态: 当同一个操作作用在不同对象时, 会产生不同的结果。实现原理见 下面。
### 22. java 多态的实现原理(实现机制)。      - 有 2 种方式来实现多态,一种是编译时多态,另外一种是运行时多态;编 -译时多态是通过方法的重载来实现的,运行时多态是通过方法的重写来实现的。
+ 有 2 种方式来实现多态,一种是编译时多态,另外一种是运行时多态; +编译时多态是通过方法的重载来实现的, 运行时多态是通过方法的重写来实现的。
     - 方法的重载,指的是同一个类中有多个同名的方法,但这些方法有着不同 + 方法的重载, 指的是同一个类中有多个同名的方法, 但这些方法有着不同 的参数。在编译时就可以确定到底调用哪个方法。
     - 方法的重写,子类重写父类中的方法。父类的引用变量不仅可以指向父类 -的实例对象,还可以指向子类的实例对象。当父类的引用指向子类的对象时, + 方法的重写, 子类重写父类中的方法。父类的引用变量不仅可以指向父类 +的实例对象, 还可以指向子类的实例对象。当父类的引用指向子类的对象时, 只有在运行时才能确定调用哪个方法。
     - 特别注意:只有类中的方法才有多态的概念,类中成员变量没有多态的概 -念。
+ 特别注意: 只有类中的方法才有多态的概念, 类中成员变量没有多态的概念。
     其余部分见“重载和覆盖的区别”。
@@ -707,33 +703,28 @@ Throwable 是所有异常的父类,它有 2 个子类:Error 和 Exception。
     - 重载是在一个类中多态性的一种表现,是指在一个类中定义了多个同名的 -方法,但是他们有不同的参数个数或有不同的参数类型。
+ 重载是在一个类中多态性的一种表现, 是指在一个类中定义了多个同名的方法, +但是他们有不同的参数个数或有不同的参数类型。
在使用重载时要注意以下几点:
     - 1.重载只能通过不同的方法参数来区分。例如不同的参数类型,不同的 -参数个数,不同的参数顺序。
+ 1.重载只能通过不同的方法参数来区分。例如不同的参数类型, 不同的参数个数, 不同的参数顺序。
     - 2.不能通过访问权限、返回类型、抛出的异常进行重载。 -覆盖是指子类函数覆盖父类中的函数。
+ 2.不能通过访问权限、返回类型、抛出的异常进行重载。覆盖是指子类函数覆盖父类中的函数。
在覆盖时要注意以下几点(重点!!):
     - 1.覆盖的方法的函数名和参数必须要和被覆盖的方法的函数名和参数完全 -匹配,才能达到覆盖的效果;
+ 1.覆盖的方法的函数名和参数必须要和被覆盖的方法的函数名和参数完全匹配, 才能达到覆盖的效果;
     2.覆盖的方法的返回值必须和被覆盖的方法的返回值类型一致;
     - 3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者 -是其子类;
+ 3.覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致, 或者是其子类;
     - 4.被覆盖的方法不能为 private,否则在其子类中只是新定义了一个方法, + 4.被覆盖的方法不能为 private, 否则在其子类中只是新定义了一个方法, 并没有对其进行覆盖。
     - 5.子类函数的访问修饰权限要大于等于父类的 -(public>protected>default>private) 。(重要!!!)
-特别注意:Java 中,子类无法覆盖父类的 static 方法或 private 方法。
+ 5.子类函数的访问修饰权限要大于等于父类的 (public>protected>default>private) 。(重要!!!)
+特别注意: Java 中, 子类无法覆盖父类的 static 方法或 private 方法。
class Parent { public static void p() { @@ -756,42 +747,27 @@ parent....
原因:Java 中,子类无法覆盖父类的 static 方法。
### 24. 接口与抽象类的区别。 -* 1.语法层面上的区别
-     - 1)抽象类可以提供成员方法的实现细节(注:可以只包含非抽象方法), -而接口中只能存在 public abstract 方法,方法默认是 public abstract 的, -但是,java8 中接口可以有 default 方法;
-     - 2)抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 -public static final 类型的;
-     - 3)抽象类可以有静态代码块和静态方法和构造方法;接口中不能含有静态 -代码块以及静态方法以及构造方法。但是,java8 中接口可以有静态方法;
-     - 4)一个类只能继承一个抽象类,而一个类却可以实现多个接口。
+1. 语法层面上的区别
+ 1) 抽象类可以提供成员方法的实现细节(注:可以只包含非抽象方法), +而接口中只能存在 public abstract 方法, 方法默认是 public abstract 的,但是,java8 中接口可以有 default 方法;
+ 2) 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final 类型的;
+ 3) 抽象类可以有静态代码块和静态方法和构造方法;接口中不能含有静态代码块以及静态方法以及构造方法。但是,java8 中接口可以有静态方法;
+ 4) 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
-* 2.设计层面上的区别
-     - 1) 抽象层次不同。抽象类是对类的整体抽象,包括属性和行为的抽象。 -而接口只是对行为的抽象。
-     - 2)跨域不同。抽象类所体现的是一种继承关系,父类和派生类之间必须 -存在"is-a" 关系,即父类和派生类在概念本质上应该是相同的。对于接口 -则不然,并不要求接口的实现者和接口定义在概念本质上是一致的, 仅仅 -是实现了接口定义的契约而已,其设计理念是“has-a”的关系(有没有、 -具备不具备的关系),实现它的子类可以不存在任何关系,共同之处。例如 -猫、狗可以抽象成一个动物类抽象类,具备叫的方法。鸟、飞机可以实现飞 -Fly 接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!
-     - 3) 设计层次不同。对于抽象类而言,它是自下而上来设计的,我们要先 -知道子类才能抽象出父类,而接口则不同,它根本就不需要知道子类的存在, -只需要定义一个规则即可,至于什么子类、什么时候怎么实现它一概不知。 -比如我们只有一个猫类在这里,如果你这时就抽象成一个动物类,是不是设 -计有点儿过度?我们起码要有两个动物类,猫、狗在这里,我们再抽象他们 -的共同点形成动物抽象类吧!所以说抽象类往往都是通过重构而来的!但是 -接口就不同,比如说飞,我们根本就不知道会有什么东西来实现这个飞接口, -怎么实现也不得而知,我们要做的就是事前定义好飞的行为接口。所以说抽 -象类是自底向上抽象而来的,接口是自顶向下设计出来的。
+2. 设计层面上的区别
+ 1) 抽象层次不同。抽象类是对类的整体抽象, 包括属性和行为的抽象。而接口只是对行为的抽象。
+ 2) 跨域不同。抽象类所体现的是一种继承关系, 父类和派生类之间必须存在"is-a" 关系, +即父类和派生类在概念本质上应该是相同的。对于接口则不然, 并不要求接口的实现者和接口定义在概念本质上是一致的, +仅仅是实现了接口定义的契约而已, 其设计理念是“has-a”的关系(有没有、具备不具备的关系), +实现它的子类可以不存在任何关系, 共同之处。例如猫、狗可以抽象成一个动物类抽象类,具备叫的方法。 +鸟、飞机可以实现飞Fly 接口, 具备飞的行为,这里我们总不能将鸟、飞机共用一个父类吧!
+ 3) 设计层次不同。对于抽象类而言, 它是自下而上来设计的, 我们要先知道子类才能抽象出父类, +而接口则不同, 它根本就不需要知道子类的存在, 只需要定义一个规则即可, 至于什么子类、 +什么时候怎么实现它一概不知。比如我们只有一个猫类在这里, 如果你这时就抽象成一个动物类, +是不是设计有点儿过度? 我们起码要有两个动物类, 猫、狗在这里, 我们再抽象他们的共同点形成动物抽象类吧! +所以说抽象类往往都是通过重构而来的! 但是接口就不同, 比如说飞, 我们根本就不知道会有什么东西来实现这个飞接口, +怎么实现也不得而知, 我们要做的就是事前定义好飞的行为接口。所以说抽象类是自底向上抽象而来的, 接口是自顶向下设计出来的。
+ ### 25. 静态内部类和非静态内部类的区别。 /* 下面程序演示如何在 java 中创建静态内部类和非静态内部类 */ class OuterClass { @@ -843,25 +819,18 @@ Fly 接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个 静态内部类和非静态内部类主要的不同:
     - (1)静态内部类不依赖于外部类实例而被实例化,而非静态内部类需要在 -外部类实例化后才可以被实例化。
+ (1) 静态内部类不依赖于外部类实例而被实例化,而非静态内部类需要在外部类实例化后才可以被实例化。
     - (2)静态内部类不需要持有外部类的引用。但非静态内部类需要持有对外 -部类的引用。
+ (2) 静态内部类不需要持有外部类的引用。但非静态内部类需要持有对外部类的引用。
     - (3)静态内部类不能访问外部类的非静态成员和非静态方法。它只能访问 -外部类的静态成员和静态方法。非静态内部类能够访问外部类的静态和非静态 -成员和方法。
+ (3) 静态内部类不能访问外部类的非静态成员和非静态方法。它只能访问外部类的静态成员和静态方法。 +非静态内部类能够访问外部类的静态和非静态成员和方法。
扩展:内部类都有哪些?
-     有四种:静态内部类,非静态内部类,局部内部类,匿名内部类。
-     - 1.静态内部类和 2.非静态内部类的讲解见上面的部分。
-     - 3.局部内部类:在外部类的方法中定义的类。其作用的范围是所在的方法
-内。它不能被 public,private,protected 来修饰。它只能访问方法中定义为 final -类型的局部变量。
+1.静态内部类和 2.非静态内部类的讲解见上面的部分。
+3.局部内部类:在外部类的方法中定义的类。其作用的范围是所在的方法内。 +它不能被 public,private,protected 来修饰。它只能访问方法中定义为 final 类型的局部变量。
class outerClass{ public void f(){ @@ -888,8 +857,7 @@ Fly 接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个 需要注意的是:
     - 4.1 匿名内部类一定是在 new 的后面,这个匿名内部类必须继承一个父类 -或者实现一个接口。
+ 4.1 匿名内部类一定是在 new 的后面,这个匿名内部类必须继承一个父类或者实现一个接口。
     4.2 匿名内部类不能有构造函数。
     @@ -900,49 +868,42 @@ Fly 接口,具备飞的行为,这里我们总不能将鸟、飞机共用一个 ### 26. static 的使用方式。      - static 有 4 种使用方式:修饰类(静态内部类),修饰成员变量(静态变 -量),修饰成员方法(静态成员方法),静态代码块。。
+ static 有 4 种使用方式:修饰类(静态内部类), 修饰成员变量(静态变量), +修饰成员方法(静态成员方法),静态代码块。
     1.修饰类(静态内部类)。
参考上面的介绍。      2.修饰成员变量(静态变量)。
- 静态变量属于类,只要静态变量所在的类被加载,这个静态变量就会被分 -配空间,在内存中只有一份,所有对象共享这个静态变量。使用有二种方式, -一个是类名.静态变量,还有一种是对象.静态变量。**特别注意:不能在方法体中 -定义静态变量(无论该方法是静态的或是非静态的)。VS **实例变量属于类,只 -有对象创建后,实例变量才会分配空间。。
+ 静态变量属于类,只要静态变量所在的类被加载,这个静态变量就会被分配空间, +在内存中只有一份,所有对象共享这个静态变量。使用有二种方式,一个是类名.静态变量, +还有一种是对象.静态变量。**特别注意: 不能在方法体中定义静态变量(无论该方法是静态的或是非静态的)。 +VS **实例变量属于类,只有对象创建后, 实例变量才会分配空间。。
     3.修饰成员方法(静态成员方法) - 静态成员方法属于类,不需要创建对象就可以使用。而非静态方法属于对 -象,只有在对象创建出来以后才可以被使用。静态方法里面只能访问所属类的 -静态成员变量和静态成员方法。。
+ 静态成员方法属于类, 不需要创建对象就可以使用。而非静态方法属于对象, +只有在对象创建出来以后才可以被使用。静态方法里面只能访问所属类的静态成员变量和静态成员方法。
     4.静态代码块。
- 静态代码块经常被用来初始化静态变量,在类加载的初始化阶段会执行为 -静态变量赋值的语句和静态代码块的内容,静态代码块只会被执行一次。 - + 静态代码块经常被用来初始化静态变量, 在类加载的初始化阶段会执行为静态变量赋值的语句和静态代码块的内容, 静态代码块只会被执行一次。 ### 27. 反射的作用与原理。如何提高反射效率?      - 1.定义:反射机制是在运行时,对于任意一个类,都能够知道这个类的所 -有属性和方法;对于任意一个对象,都能够调用它的任意一个方法。在 java 中, -只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
+ 1.定义: 反射机制是在运行时,对于任意一个类, 都能够知道这个类的所有属性和方法; +对于任意一个对象, 都能够调用它的任意一个方法。在 java 中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。
     2.反射机制主要提供了以下功能:在运行时判定任意一个对象所属的类; -在运行时创建对象;在运行时判定任意一个类所具有的成员变量和方法;在运 -行时调用任意一个对象的方法;生成动态代理。
+在运行时创建对象; 在运行时判定任意一个类所具有的成员变量和方法; +在运行时调用任意一个对象的方法;生 成动态代理。
     3.哪里用到反射机制?
jdbc 中有一行代码:
Class.forName('com.mysql.jdbc.Driver.class'); //加载 MySql 的驱动类。 这就 -是反射,现在很多框架都用到反射机制,hibernate,struts 都是用反射机制实 -现的。
+是反射, 现在很多框架都用到反射机制, hibernate, struts 都是用反射机制实现的。
     4.反射的实现方式
-在 Java 中实现反射最重要的一步,也是第一步就是获取 Class 对象,得到 -Class 对象后可以通过该对象调用相应的方法来获取该类中的属性、方法以及调 -用该类中的方法。
+在 Java 中实现反射最重要的一步, 也是第一步就是获取 Class 对象, +得到Class 对象后可以通过该对象调用相应的方法来获取该类中的属性、方法以及调用该类中的方法。
     有 4 种方法可以得到 Class 对象:
     @@ -952,18 +913,17 @@ Class 对象后可以通过该对象调用相应的方法来获取该类中的      3.对象名.getClass()。
     - 4.如果是基本类型的包装类,则可以通过调用包装类的 Type 属性来获得 -该包装类的 Class 对象。
+ 4.如果是基本类型的包装类,则可以通过调用包装类的 Type 属性来获得该包装类的 Class 对象。
     - 例如:Class clazz = Integer.TYPE;
+ 例如: Class clazz = Integer.TYPE;
5.实现 Java 反射的类
-1)Class:它表示正在运行的 Java 应用程序中的类和接口。
-2)Field:提供有关类或接口的属性信息,以及对它的动态访问权限。
-3)Constructor:提供关于类的单个构造方法的信息以及对它的访问权限
-4)Method:提供关于类或接口中某个方法信息。
-注意:Class 类是 Java 反射中最重要的一个功能类,所有获取对象的信息(包 -括:方法/属性/构造方法/访问权限)都需要它来实现。
+1)Class: 它表示正在运行的 Java 应用程序中的类和接口。
+2)Field: 提供有关类或接口的属性信息, 以及对它的动态访问权限。
+3)Constructor: 提供关于类的单个构造方法的信息以及对它的访问权限
+4)Method: 提供关于类或接口中某个方法信息。
+注意: Class 类是 Java 反射中最重要的一个功能类, 所有获取对象的信息(包括: +方法/属性/构造方法/访问权限)都需要它来实现。
6.反射机制的优缺点?
@@ -972,8 +932,7 @@ Class 对象后可以通过该对象调用相应的方法来获取该类中的 (2)与 Java 动态编译相结合,可以实现无比强大的功能。
缺点:
-(1)使用反射的性能较低。 java 反射是要解析字节码,将内存中的对象进 -行解析。
+(1)使用反射的性能较低。 java 反射是要解析字节码,将内存中的对象进行解析。
     解决方案:
     @@ -988,9 +947,8 @@ Class 对象后可以通过该对象调用相应的方法来获取该类中的 ### 28. Java 和 C++/C 的区别,JAVA 的优点。      - 1.运行过程的不同。JAVA 源程序经过编译器编译成字节码文件,然后由 JVM -解释执行。而 C++/C 经过编译、链接后生成可执行的二进制代码。因此 C/C++ -的执行速度比 JAVA 快。
+ 1.运行过程的不同。JAVA 源程序经过编译器编译成字节码文件, 然后由 JVM解释执行。而 C++/C 经过编译、 +链接后生成可执行的二进制代码。因此 C/C++的执行速度比 JAVA 快。
     2.跨平台性。JAVA 可以跨平台,而 C++/C 不可以跨平台。
     @@ -1007,12 +965,10 @@ C++支持多重继承。
7.JAVA 中每个数据类型在不同的平台上所占字节数固定的,而 C/C++则不 然。
-JAVA 的优点: +JAVA 的优点:
     - 1.跨平台。JAVA 语言可以“一次编译,到处运行”。跨平台的含义:无论是 -在 windows 平台还是在 Linux 平台对 Java 程序进行编译,编译后的程序都可以 -在其他平台上运行。编译器会把 JAVA 代码编译成字节码文件,然后在 JVM 上解 -释执行,由于字节码与平台无关,因此,JAVA 可以很好地跨平台执行。
+ 1.跨平台。JAVA 语言可以“一次编译,到处运行”。跨平台的含义: 无论是在 windows 平台还是在 Linux 平台对 Java 程序进行编译, +编译后的程序都可以在其他平台上运行。编译器会把 JAVA 代码编译成字节码文件, 然后在 JVM 上解释执行,由于字节码与平台无关,因此,JAVA 可以很好地跨平台执行。
     2.垃圾回收机制。
     @@ -1043,13 +999,13 @@ Test main
### 30. JAVA 中的类和成员的访问控制。      - 类的访问控制。可以用 public 和不含 public 的来修饰。
+ *类的访问控制。*可以用 public 和不含 public 的来修饰。
     - 成员的访问控制。
+ *成员的访问控制。*
     如果一个类是用 public 来修饰的,它的成员用第一列的访问修饰符时,在 不同范围的类和对象是否有权访问它们。
-[04_30](/data/images/Java应届生面试突击/Java基础/04_30.png)
+![04_30](/data/images/Java应届生面试突击/Java基础/04_30.png)
### 31. System.out.println()方法使用时需要注意的问题。 @@ -1068,28 +1024,24 @@ Test main
     1.组合是在新类里面创建原有类的对象,重复利用已有类的功能。
     - 2.组合关系在运行期决定,而继承关系在编译期就已经决定了。
+ 2.组合关系*在运行期决定*,而继承关系*在编译期*就已经决定了。
     - 3.使用继承关系时,可以实现类型的回溯,即用父类变量引用子类对象,这样 -便可以实现多态,而组合没有这个特性。
+ 3.*使用继承关系*时,可以实现类型的回溯,即用父类变量引用子类对象, +这样便可以*实现多态*, 而组合没有这个特性。
     - 4.从逻辑上看,组合最主要地体现的是一种整体和部分的思想,例如在电脑类 -是由内存类,CPU 类,硬盘类等等组成的,而继承则体现的是一种可以回溯的父子 -关系,子类也是父类的一个对象。
+ 4.从逻辑上看, 组合最主要地体现的是一种整体和部分的思想, 例如在电脑类是由内存类, CPU 类, +硬盘类等等组成的,而继承则体现的是一种可以回溯的父子关系, 子类也是父类的一个对象。
### 33. final finally finalize 的区别。 -final 可以用来修饰类,变量和方法。 +final 可以用来修饰类,变量和方法。
     - 1.当一个类被 final 修饰的时候,表示该类不能被继承。类中方法默认被 -final 修饰。
+ 1.当一个类被 final 修饰的时候, 表示该类不能被继承。类中方法默认被final 修饰。
     2.当 final 修饰基本数据类型的变量时,表示该值在被初始化后不能更改; -当 final 修饰引用类型的变量时,表示该引用在初始化之后不能再指向 -其他的对象。
-注意:final 修饰的变量必须被初始化。可以在定义的时候初始化,也可 -以在构造函数中进行初始化。
+当 final 修饰引用类型的变量时,表示该引用在初始化之后不能再指向其他的对象。
+注意:final 修饰的变量必须被初始化。可以在定义的时候初始化, 也可以在构造函数中进行初始化。
     - 3.当 final 修饰方法时,表示这个方法不能被子类重写。
+ 3.当 final 修饰方法时, 表示这个方法不能被子类重写。
使用 final 方法的原因有 2 个:
第一、把方法锁定,防止任何继承类修改它的实现。
第二、高效。当要使用一个被声明为 final 的方法时,直接将方法主体插 @@ -1118,23 +1070,21 @@ final 的。
synchronization(不用同步了)。.
     4.为了防止扩展类无意间破坏原来方法的实现。
+ +finally 的用法:
     - finally 的用法:
-         - finally 是异常处理的一部分,只能用在 try-catch 语句中,表示这段代码 - 一般情况下,一定会执行。经常用在需要释放资源的情况下。
+ finally 是异常处理的一部分,只能用在 try-catch 语句中, 表示这段代码一般情况下, +一定会执行。经常用在需要释放资源的情况下。
+finalize 的用法:
     - finalize 的用法:
-         - 它是 Object 类的一个方法,在垃圾回收器执行时会调用被回收对象的 - finalize()方法。 + 它是 Object 类的一个方法,在垃圾回收器执行时会调用被回收对象的 finalize()方法。 ### 34. JDK1.7 和 1.8 的区别。 -接口的默认方法。 -Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default -关键字即可,这个特征又叫做扩展方法,Default 方法带来的好处是,往接口新 -增一个 Default 方法,在接口添加新功能特性,而不破坏现有的实现架构。示 -例如下: +接口的默认方法。
+Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可, +这个特征又叫做扩展方法,Default 方法带来的好处是, 往接口新增一个 Default 方法, +在接口添加新功能特性, 而不破坏现有的实现架构。
+示例如下: interface Formula { double calculate(int a); @@ -1142,9 +1092,8 @@ Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 return Math.sqrt(a); } } -Formula 接口在拥有 calculate 方法之外同时还定义了 sqrt 方法,实 -现了 Formula 接口的子类只需要实现一个 calculate 方法,默认方法 sqrt 将 -在子类上可以直接使用。 +Formula 接口在拥有 calculate 方法之外同时还定义了 sqrt 方法, +实现了 Formula 接口的子类只需要实现一个 calculate 方法, 默认方法 sqrt 将在子类上可以直接使用。 Formula formula = new Formula() { public double calculate(int a) { @@ -1154,12 +1103,19 @@ Formula 接口在拥有 calculate 方法之外同时还定义了 sqrt 方法,实 formula.calculate(100);// 100.0 formula.sqrt(16);// 4.0 -### 35. List能否转为List?能否Listlist=newArrayList()?Listlist=new ArrayList()?原因? +### 35. List\ 能否转为List\? 能否List\list = newArrayList\()? List\list = new ArrayList\()? 原因?      - 都不可以,会出现编译错误。List可以存储任何类型的对象, -包括 String,Integer 等,而 ArrayList只能用来存储字符串。 + 都不可以, 会出现编译错误。List可以存储任何类型的对象, 包括 String, Integer 等, 而 ArrayList只能用来存储字符串。 ### 36. 泛型的好处?      - 在编译的时候检查类型安全,确保只能把正确类型的对象放入集合中;消 -除强制类型转换。 + 在编译的时候检查类型安全, 确保只能把正确类型的对象放入集合中; 消除强制类型转换。 + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/05_Java\345\237\272\347\241\200\344\270\223\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/05_Java\345\237\272\347\241\200\344\270\223\351\242\230.md" index f197a07..240add4 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/05_Java\345\237\272\347\241\200\344\270\223\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/Java\345\237\272\347\241\200/05_Java\345\237\272\347\241\200\344\270\223\351\242\230.md" @@ -6,14 +6,14 @@ 1. String 中的”+”操作是怎么回事?
2. StringBuilder和StringBuffer 底层是怎么实现的。
3. String 类中常用的方法。
-4. 创建虚引用的时候,构造方法传入一个 ReferenceQueue,作用是什么。
+4. 创建虚引用的时候, 构造方法传入一个 ReferenceQueue, 作用是什么。
5. 栈溢出的原因和解决方法。
6. HashMap的加载因子的作用。
7. HashMap中的 key 可以是任意对象吗?(Set 中元素的内容可以改变吗?)
-8. 如果你定义一个类,包括学号,姓名,分数,如何把这个对象作为 key?
+8. 如果你定义一个类,包括学号, 姓名, 分数, 如何把这个对象作为 key?
9. Java是如何实现跨平台的。
10. 什么是泛型,为什么要使用以及类型擦除。
-11. Java中的 NIO,BIO 分别是什么。NIO 主要用来解决什么问题。
+11. Java中的 NIO, BIO 分别是什么。NIO 主要用来解决什么问题。
12. 面向对象的 6 个基本原则(设计模式的 6 个基本原则)。
13. JDK 源码中用到的设计模式 。
14. 执行 Student s = new Student();在内存中做了哪些事情?
@@ -35,31 +35,29 @@ System.out.println((a == b)); “String+变量”因为编译时无法进行优化,所以这一条语句的操作是在运行时进行的,且 会产生新的对象,而不是直接从 jvm 的 string 池中获取。 -java 中 String 的+运算符编译后其实是转换成了这样的代码: -3. String b = new StringBuilder().append("a").append(bb).toString(); -其中,StringBuilder 的 toString 方法,使用 new String(...);来构造一个 String 对象。 - public String toString() { // StringBuilder 的 toString 方法 - // Create a copy, don't share the array - return new String(value, 0, count); +java 中 String 的+运算符编译后其实是转换成了这样的代码: +3. String b = new StringBuilder().append("a").append(bb).toString();
+其中,StringBuilder 的 toString 方法,使用 new String(...);来构造一个 String 对象。
+ + public String toString() { // StringBuilder 的 toString 方法
+ // Create a copy, don't share the array
+ return new String(value, 0, count);
} #### 情况 2: -一个特殊的例子: - String str = “This is only a” + “ simple” + “ test”;//“+”连接的都是字符串常量 - StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).appe -nd(“ test”); - 你会很惊讶的发现,生成 str 对象的速度简直太快了,而这个时候 StringBuffer 居 -然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,实际上: - String str = “This is only a” + “ simple” + “test”; - 其实就是: - String str = “This is only a simple test”; - 所以不需要太多的时间。但大家这里要注意的是,如果你的字符串是来自另外的 -String 对象的话,速度就没那么快了,譬如: - String str2 = “This is only a”; - String str3 = “ simple”; - String str4 = “ test”; - String str1 = str2 +str3 + str4; //“+”连接的是字符串变量 - 这时候 JVM 会规规矩矩的按照原来的方式去做。 +一个特殊的例子:
+ String str = “This is only a” + “ simple” + “ test”;//“+”连接的都是字符串常量
+ StringBuffer builder = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
+ 你会很惊讶的发现,生成 str 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,实际上:
+ String str = “This is only a” + “ simple” + “test”;
+ 其实就是:
+ String str = “This is only a simple test”;
+ 所以不需要太多的时间。但大家这里要注意的是,如果你的字符串是来自另外的String 对象的话,速度就没那么快了,譬如:
+ String str2 = “This is only a”;
+ String str3 = “ simple”;
+ String str4 = “ test”;
+ String str1 = str2 +str3 + str4; //“+”连接的是字符串变量
+ 这时候 JVM 会规规矩矩的按照原来的方式去做。
### 2. StringBuilder和StringBuffer底层是怎么实现的。 @@ -76,8 +74,8 @@ char[]中的。 2. intern() :返回字符串对象的规范化表示形式。 3. isEmpty() :当且仅当 length() 为 0 时返回 true。 4. length() :返回此字符串的长度。 -5. substring(int beginIndex) :返回一个新的字符串,它是此字符串的一个 -子字符串。
+5. substring(int beginIndex) :返回一个新的字符串,它是此字符串的一个子字符串。
+     substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字 符串的一个子字符串。 6. toLowerCase() :将此 String 中的所有字符都转换为小写。 @@ -97,17 +95,17 @@ toUpperCase():将此 String 中的所有字符都转换为大写。 ### 5. 栈溢出的原因和解决方法。 -原因: -(1)大量的递归调用,在不断的压栈过程中,造成栈容量超过而导致溢出。 -(2)由于分配了过大的局部变量。 - +原因:
+(1)大量的递归调用,在不断的压栈过程中,造成栈容量超过而导致溢出。
+(2)由于分配了过大的局部变量。
**解决方法:** -(1)用栈把递归转换成非递归。 -(2)使用静态对象替代非静态局部对象。 -在递归函数设计中,可以使用静态对象替代非静态局部对象(即栈对象), +(1)用栈把递归转换成非递归。
+(2)使用静态对象替代非静态局部对象。
+     + 在递归函数设计中,可以使用静态对象替代非静态局部对象(即栈对象), 这不仅可以减少每次递归调用和返回时产生和释放非静态对象的开销,而且静 -态对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。 -(3)增加堆栈的大小 +态对象还可以保存递归调用的中间状态,并且可为各个调用层所访问。
+(3)增加堆栈的大小
### 6. HashMap的加载因子的作用。 @@ -123,7 +121,8 @@ toUpperCase():将此 String 中的所有字符都转换为大写。      可变对象和不可变对象都可以。可变对象是指创建后自身状态能改变的对 象。换句话说,可变对象是该对象在创建后它的哈希值(由类的 hashCode() -方法可以得出哈希值)可能被改变。 +方法可以得出哈希值)可能被改变。
+     如果可变对象在 HashMap 中被用作 key,当对象中的属性改变时,则对象 HashCode 也可能进行相应的改变,这将导致下次无法查找到已存在 Map 中的 数据;或者当想删除被改变对象的时候,由于找不到该对象,无法删除,会造 @@ -136,36 +135,42 @@ HashCode 也可能进行相应的改变,这将导致下次无法查找到已存 时,其 hashCode()返回值不能改变。 ### 9. Java是如何实现跨平台的。 +     java 跨平台的实质是虚拟机的跨平台。JVM 也是一个软件,不同的平台有 不同的版本。我们编写的 Java 源码,编译后会生成一种 .class 文件,称为字 节码文件。Java 虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后 运行。也就是说,只要在不同平台上安装对应的 JVM,就可以运行字节码文件, 运行我们编写的 Java 程序。 ### 10. 什么是泛型,为什么要使用以及类型擦除。 -泛型的本质就是“参数化类型”,也就是说所操作的数据类型被指定为一个参数。 +     + 泛型的本质就是“参数化类型”,也就是说所操作的数据类型被指定为一个参数。 创建集合时就指定集合元素的数据类型,该集合只能保存其指定类型的元素, -避免使用强制类型转换。 -Java 编译器生成的字节码是不包含泛型信息的,泛型类型信息将在编译处理时 +避免使用强制类型转换。
+     + Java 编译器生成的字节码是不包含泛型信息的,泛型类型信息将在编译处理时 被擦除,这个过程即类型擦除。类型擦除可以简单的理解为将泛型 java 代码转 换为普通 java 代码,只不过编译器更直接点,将泛型 java 代码直接转换成普通 -java 字节码。 -类型擦除的主要过程如下: -一.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。 -二.移除所有的类型参数。 +java 字节码。
+类型擦除的主要过程如下:
+一.将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。
+二.移除所有的类型参数。
### 11. Java中的 NIO,BIO 分别是什么。NIO 主要用来解决什么问题。 -NIO 的主要作用就是用来解决速度差异的。 -Java 中 NIO 和 IO 之间的区别。 -1.面向流与面向缓冲 -Java NIO 和 IO 之间第一个最大的区别是,IO 是面向流的,NIO 是面向缓 -冲区的。 -Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节, +NIO 的主要作用就是用来解决速度差异的。
+Java 中 NIO 和 IO 之间的区别。
+1. 面向流与面向缓冲
+     + Java NIO 和 IO 之间第一个最大的区别是,IO 是面向流的,NIO 是面向缓 +冲区的。
+     + Java IO 面向流意味着每次从流中读一个或多个字节,直至读取所有字节, 它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。在 Java NIO 中把数据读取到一个缓冲区中,需要时可在缓冲区中前后移动。这就增加了处 理过程中的灵活性。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲 区里尚未处理的数据。 -2.阻塞与非阻塞 IO -Java IO 的各种流是阻塞的。这意味着,当一个线程调用 read() 或 write() +2. 阻塞与非阻塞 IO
+     + Java IO 的各种流是阻塞的。这意味着,当一个线程调用 read() 或 write() 时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期 间不能再干任何事情了。Java NIO 的非阻塞模式,使一个线程从某通道发送请 求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就 @@ -174,8 +179,9 @@ Java IO 的各种流是阻塞的。这意味着,当一个线程调用 read() 或 到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程 通常将非阻塞 IO 的空闲时间用于在其它通道上执行 IO 操作,所以一个单独的 线程现在可以管理多个输入和输出通道(channel)。 -3.选择器(Selector) -Java NIO 的选择器允许一个单独的线程来监视多个输入通道,你可以注册 +3. 选择器(Selector)
+     + Java NIO 的选择器允许一个单独的线程来监视多个输入通道,你可以注册 多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里 已经有可以处理的输入,或者选择已准备写入的通道。为了将 Channel 和 Selector 配合使用,必须将 channel 注册到 selector 上,通过 @@ -183,63 +189,71 @@ SelectableChannel.register()方法来实现。这种选择机制,使得一个单 很容易来管理多个通道。只要 Channel 向 Selector 注册了某种特定的事件, Selector 就会监听这些事件是否会发生,一旦发生某个事件,便会通知对应的 Channel。使用选择器,借助单一线程,就可对数量庞大的活动 I/O 通道实施 -监控和维护。 -例如,在一个聊天服务器中。这是在一个单线程中使用一个 Selector 处理 3 个 -Channel 的图示: -[05_11_1](/data/images/Java应届生面试突击/Java基础/05_11_1.png)
- +监控和维护。
+     + 例如,在一个聊天服务器中。这是在一个单线程中使用一个 Selector 处理 3 个 +Channel 的图示:
+![05_11_1](/data/images/Java应届生面试突击/Java基础/05_11_1.png)
-要使用 Selector,得向 Selector 注册 Channel,然后调用它的 select()方法。 +     + 要使用 Selector,得向 Selector 注册 Channel,然后调用它的 select()方法。 这个方法会一直阻塞到某个注册的通道有事件就绪。一旦这个方法返回,线程 就可以处理这些事件,事件的例子有如新连接进来,数据接收等。反应器模式。 -NIO 的原理。 -在 NIO 中有几个核心对象:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。 -一.缓冲区(Buffer) -缓冲区实际上是一个容器对象,其实就是一个数组,在 NIO 库中,所有数 +NIO 的原理。
+在 NIO 中有几个核心对象:缓冲区(Buffer)、通道(Channel)、选择器(Selector)。
+一. 缓冲区(Buffer)
+     + 缓冲区实际上是一个容器对象,其实就是一个数组,在 NIO 库中,所有数 据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的;在写入数 据时,它也是写入到缓冲区中的;任何时候访问 NIO 中的数据,都是将它放到 缓冲区中。在 NIO 中,所有的缓冲区类型都继承于抽象类 Buffer,最常用的就 是 ByteBuffer。 而在面向流 I/O 系统中,所有数据都是直接写入或者直接将数据读取到 -Stream 对象中。 -[05_11_2](/data/images/Java应届生面试突击/Java基础/05_11_2.png)
+Stream 对象中。
+![05_11_2](/data/images/Java应届生面试突击/Java基础/05_11_2.png)
-二.通道(Channel) -通道是一个对象,通过它可以读取和写入数据,所有数据都通过 Buffer 对 +二. 通道(Channel)
+     + 通道是一个对象,通过它可以读取和写入数据,所有数据都通过 Buffer 对 象来处理。我们永远不会将字节直接写入通道中,相反是将数据写入包含一个 或者多个字节的缓冲区。同样不会直接从通道中读取字节,而是将数据从通道 读入缓冲区,再从缓冲区获取这个字节。通道与流的不同之处在于通道是双向 的。而流只是在一个方向上移动(一个流必须是 InputStream 或者 OutputStream 的子类,比如 InputStream 只能进行读取操作,OutputStream -只能进行写操作),而通道是双向的,可以用于读、写或者同时用于读写。 -[05_11_3](/data/images/Java应届生面试突击/Java基础/05_11_3.png)
+只能进行写操作),而通道是双向的,可以用于读、写或者同时用于读写。
+![05_11_3](/data/images/Java应届生面试突击/Java基础/05_11_3.png)
-从图中可以看出,当有读或写等任何注册的事件发生时,可以从 Selector +     + 从图中可以看出,当有读或写等任何注册的事件发生时,可以从 Selector 中获得相应的 SelectionKey,同时从 SelectionKey 中可以找到发生的事件和该 -事件所发生的具体的 SelectableChannel,以获得客户端发送过来的数据。 -三.选择器(Selector) -NIO 有一个主要的类 Selector,这个类似一个观察者,只要我们把需要探知 +事件所发生的具体的 SelectableChannel,以获得客户端发送过来的数据。
+三. 选择器(Selector)
+     + NIO 有一个主要的类 Selector,这个类似一个观察者,只要我们把需要探知 的 socketchannel 告诉 Selector,我们接着做别的事情,当有事件发生时,他会 通知我们,传回一组 SelectionKey,我们读取这些 Key,就会获得我们刚刚注册 过的 socketchannel,然后,我们从这个 Channel 中读取数据,放心,包准能 -够读到,接着我们可以处理这些数据。 -Selector 内部原理实际是在做一个对所注册的 channel 的轮询访问,不断 +够读到,接着我们可以处理这些数据。
+ Selector 内部原理实际是在做一个对所注册的 channel 的轮询访问,不断 地轮询,一旦轮询到一个 channel 有所注册的事情发生,比如数据来了,他就 会站起来报告,交出一把钥匙,让我们通过这把钥匙来读取这个 channel 的内 -容。 -Selector 的作用就是用来轮询每个注册的 Channel,一旦发现 Channel 有注 +容。
+      + Selector 的作用就是用来轮询每个注册的 Channel,一旦发现 Channel 有注 册的事件发生,便获取事件然后进行处理。用单线程处理一个 Selector,然后 通过 Selector.select()方法来获取到达事件,在获取了到达事件之后,就可以逐 -个地对这些事件进行响应处理。 -Selector 类是 NIO 的核心类, Selector 能够检测多个注册的通道上是否有事 +个地对这些事件进行响应处理。
+     + Selector 类是 NIO 的核心类, Selector 能够检测多个注册的通道上是否有事 件发生,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。 这样一来,只是用一个单线程就可以管理多个通道,也就是管理多个连接。这 样使得只有在连接真正有读写事件发生时,才会调用函数来进行读写,就大大 地减少了系统开销,并且不必为每个连接都创建一个线程,不用去维护多个线 -程,并且避免了多线程之间的上下文切换导致的开销。 -[05_11_4](/data/images/Java应届生面试突击/Java基础/05_11_4.png)
+程,并且避免了多线程之间的上下文切换导致的开销。
+![05_11_4](/data/images/Java应届生面试突击/Java基础/05_11_4.png)
-Java NIO 的服务端只需启动一个专门的线程来处理所有的 IO 事件,这种通 +     + Java NIO 的服务端只需启动一个专门的线程来处理所有的 IO 事件,这种通 信模型是怎么实现的呢?java NIO 采用了双向通道(channel)进行数据传输, 而不是单向流(stream),在通道上可以注册我们感兴趣的事件。一共有以下 四种事件: @@ -258,22 +272,23 @@ Java NIO 的服务端只需启动一个专门的线程来处理所有的 IO 事 一个读事件。服务端的处理线程会轮询地访问 selector,如果访问 selector 时发 现有感兴趣的事件到达,则处理这些事件,如果没有感兴趣的事件到达,则处 理线程会一直阻塞直到感兴趣的事件到达为止。下面是我理解的 java NIO 的通 -信模型示意图: +信模型示意图:
-[05_11_5](/data/images/Java应届生面试突击/Java基础/05_11_5.png)
+![05_11_5](/data/images/Java应届生面试突击/Java基础/05_11_5.png)
### 12. 面向对象的 6 个基本原则(设计模式的 6 个基本原则)。 -s( Single-Resposibility Principle ): 单一职责原则。 -o( Open-Closed principle ): 开放封闭原则。 -l( Liskov-Substituion Principle ): 里氏替换原则。 -i( Interface-Segregation Principle ): 接口隔离原则。 -d( Dependecy-Inversion Principle ): 依赖倒置原则。 -合成/聚合复用。 +s( Single-Resposibility Principle ): 单一职责原则。
+o( Open-Closed principle ): 开放封闭原则。
+l( Liskov-Substituion Principle ): 里氏替换原则。
+i( Interface-Segregation Principle ): 接口隔离原则。
+d( Dependecy-Inversion Principle ): 依赖倒置原则。
+ 合成/聚合复用。
     单一职责:是指一个类的功能要单一,一个类只负责一个职责。一个类只 做它该做的事情(高内聚)。在面向对象中,如果只让一个类完成它该做的事,而 -不涉及与它无关的领域就是践行了高内聚的原则。 +不涉及与它无关的领域就是践行了高内聚的原则。
+     开放封闭:软件实体应当对扩展开放,对修改关闭。对扩展开放,意味着 有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。对修改封 闭,意味着类一旦设计完成,就可以独立其工作,而不要对类尽任何修改。在 @@ -281,26 +296,31 @@ d( Dependecy-Inversion Principle ): 依赖倒置原则。 行修改,可能会造成一些问题,诸如可能会引入新的 bug,或者增加代码的复 杂度,对代码结构造成破坏、冗余,还需要重新进行全面的测试。那么该怎么 解决这些问题?很简单,这就需要系统能够支持扩展,只有扩展性良好的系统, -才能在不进行修改已有实现代码的基础上,引进新的功能。 +才能在不进行修改已有实现代码的基础上,引进新的功能。
+     里氏替换:任何使用基类的地方,都能够使用子类替换,而且在替换子类 后,系统能够正常工作。子类一定是增加父类的能力而不是减少父类的能力, 因为子类比父类的能力更多,把能力多的对象当成能力少的对象来用当然没有 任何问题。 一个软件实体如果使用的是一个基类,那么当把这个基类替换成继 承该基类的子类,程序的行为不会发生任何变化。软件实体察觉不出基类对象 -和子类对象的区别。 +和子类对象的区别。
+     接口隔离: 即应该将接口粒度最小化,将功能划分到每一个不能再分的子 角色,为每一个子角色创建接口,通过这样,才不会让接口的实现类实现一些 不必要的功能。 建立单一的接口,不要建立臃肿的庞大的接口,也就是说接口 的方法尽量少。接口要小而专,绝不能大而全。臃肿的接口是对接口的污染, 既然接口表示能力,那么一个接口只应该描述一种能力,接口也应该是高度内 -聚的。 +聚的。
+     依赖倒置:即我们的类要依赖于抽象,而不是依赖于具体,也就是我们经 常听到的“要面向接口编程”。(该原则说得具体一些就是声明方法的参数类 型、方法的返回类型、变量的引用类型时,尽可能使用抽象类型而不用具体类 型,因为抽象类型可以被它的任何一个子类型所替代) 。 依赖倒置原则的本质 就是通过抽象(抽象类或接口)使各个类或模块的实现彼此独立,不相互影响, -实现模块间的松耦合。减少类间的耦合性。 +实现模块间的松耦合。减少类间的耦合性。
+     合成/聚合复用:优先使用聚合或合成关系复用代码。 + ### 13. JDK 源码中用到的设计模式 。 1.单例模式: java.lang.Runtime 。
     @@ -345,7 +365,7 @@ Object.wait();
condition.await();
### 19. IO 里面常见的类。 -[05_19_1](/data/images/Java应届生面试突击/Java基础/05_19_1.png)
+![05_19_1](/data/images/Java应届生面试突击/Java基础/05_19_1.png)
### 20. xml 解析方式。 DOM 和 SAX 的不同:
@@ -362,3 +382,11 @@ XML 进行读取,而不能在文件中插入数据。
档开始执行遍历的,并且只能遍历一次。也就是说不能随机访问 XML 文件,只 能从头到尾的将 XML 文件遍历一次,但可以随时停止解析。
+ +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/01_\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221\344\270\223\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/01_\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221\344\270\223\351\242\230.md" index b4cd385..f7aa64b 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/01_\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221\344\270\223\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/01_\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221\344\270\223\351\242\230.md" @@ -12,18 +12,404 @@ 7. Java 中堆和栈有什么不同?
8. Java 中的活锁,死锁,饥饿有什么区别?
-### -### -### -### -### -### -### -### -### -### -### -### +### 1.什么是缓存一致性问题?如何解决呢? +     + 当程序在运行过程中,会将运算需要的数据从主存复制一份到***CPU 的高速*** +缓存当中,那么 CPU 进行计算时就可以直接从它的高速缓存读取数据和向其中 +写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。举个简 +单的例子,比如下面的这段代码: + +```java +i = i+1 +``` +     + 当线程执行这个语句时,会先从主存当中读取 i 的值,然后复制一份到高 +速缓存当中,然后 CPU 执行指令对 i 进行加 1 操作,然后将数据写入高速缓存, +最后将高速缓存中 i 最新的值刷新到主存当中。
+     + 这个代码在单线程中运行是没有任何问题的,但是在多线程中运行就会有 +问题了。在多核 CPU 中,每条线程可能运行于不同的 CPU 中,因此每个线程 +运行时有自己的高速缓存(对单核 CPU 来说,其实也会出现这种问题,只不过 +是以线程调度的形式来分别执行的)。***本文我们以多核 CPU 为例***。
+     + 比如同时有 2 个线程执行这段代码,假如初始时 i 的值为 0,那么我们希望 +两个线程执行完之后 i 的值变为 2。但是事实会是这样吗?
+     + 可能存在下面一种情况:初始时,两个线程分别读取 i 的值存入各自所在的 +CPU 的高速缓存当中,然后线程 1 进行加 1 操作,然后把 i 的最新值 1 写入到 +内存。此时线程 2 的高速缓存当中 i 的值还是 0,进行加 1 操作之后,i 的值为 +1,然后线程 2 把 i 的值写入内存。
+     + 最终结果 i 的值是 1,而不是 2。这就是著名的缓存一致性问题。通常称这 +种被多个线程访问的变量为共享变量。
+     + ***也就是说,如果一个变量在多个 CPU 中都存在缓存(一般在多线程编程 +时才会出现),那么就可能存在缓存不一致的问题。***
+ +为了解决缓存不一致性问题,通常来说有以下 2 种解决方法:
+ 1)通过在总线加 LOCK#锁的方式
+ 2)通过缓存一致性协议
+     + 在早期的 CPU 当中,是通过在总线上加 LOCK#锁的形式来解决缓存不一 +致的问题。***因为 CPU 和其他部件进行通信都是通过总线来进行的,如果对总线 +加 LOCK#锁的话,也就是说阻塞了其他 CPU 对其他部件访问(如内存)***, +从而使得只能有一个 CPU 能使用这个变量的内存。比如上面例子中 如果一个 +线程在执行 i = i +1,如果在执行这段代码的过程中,在总线上发出了 LCOK# +锁的信号,那么只有等待这段代码完全执行完毕之后,其他 CPU 才能从变量 i +所在的内存读取变量,然后进行相应的操作。这样就解决了缓存不一致的问题。
+     + 但是上面的方式会有一个问题,由于在锁住总线期间,其他 CPU 无法访问 +内存,导致效率低下。
+     + 所以就出现了缓存一致性协议。该协议保证了每个缓存中使用的***共享变量 +的副本是一致的***。它核心的思想是:***当 CPU 向内存写入数据***时,如果发现操作 +的变量是共享变量,即在其他 CPU 中也存在该变量的副本,会发出信号***通知其 +他 CPU 将该变量的缓存行置为无效状态***,因此当其他 CPU 需要读取这个变量 +时,发现自己缓存中缓存该变量的缓存行是无效的,那么它***就会从内存重新读 +取***。
+ + +### 2.简述 volatile 关键字(或 volatile 的内存语义或 volatile 的 2 个特性)。 +     + 一旦一个共享变量(类的成员变量、类的静态成员变量)被 volatile 修饰 +之后,那么就具备了两层语义:
+ 1)***保证了不同线程对这个变量进行读取时的可见性,即一个线程修改 +了某个变量的值,这新值对其他线程来说是立即可见的。(volatile 解决了 +线程间共享变量的可见性问题)。***
+     + 第一:使用 volatile 关键字会强制将修改的值立即写入主存;
+     + 第二:使用 volatile 关键字的话,当线程 2 进行修改时,会导致线程 1 的 +工作内存中缓存变量 stop 的缓存行无效(反映到硬件层的话,就是 CPU 的 L1 +或者 L2 缓存中对应的缓存行无效);
+     + 第三:由于线程 1 的工作内存中缓存变量 stop 的缓存行无效,所以线程 1 +再次读取变量 stop 的值时会去主存读取。
+     + 那么,在线程 2 修改 stop 值时(当然这里包括 2 个操作,修改线程 2 工 +作内存中的值,然后将修改后的值写入内存),会使得线程 1 的工作内存中缓 +存变量 stop 的缓存行无效,然后线程 1 读取时,发现自己的缓存行无效,它会 +等待缓存行对应的主存地址被更新之后,然后去对应的主存读取最新的值。
+     + 那么线程 1 读取到的就是最新的正确的值。
+ 2)***禁止进行指令重排序,阻止编译器对代码的优化。***
+     + volatile 关键字禁止指令重排序有两层意思:
+     + I)当程序执行到 volatile 变量的读操作或者写操作时,在其前面的操作的 +更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定 +还没有进行;
+     + II)在进行指令优化时,不能把 volatile 变量前面的语句放在其后面执行, +也不能把 volatile 变量后面的语句放到其前面执行。
+     + 为了实现 volatile 的内存语义,加入 volatile 关键字时,编译器在生成字节码时, +会在指令序列中插入内存屏障,会多出一个 lock 前缀指令。内存屏障是一组处理器指 +令,解决禁止指令重排序和内存可见性的问题。编译器和 CPU 可以在保证输出结果一 +样的情况下对指令重排序,使性能得到优化。处理器在进行重排序时是会考虑指令之间 +的数据依赖性。
+     + 内存屏障,有 2 个作用:1.先于这个内存屏障的指令必须先执行,后于这个内存屏障 +的指令必须后执行。2.使得内存可见性。所以,如果你的字段是 volatile,在读指令前插入 +读屏障,可以让高速缓存中的数据失效,重新从主内存加载数据。在写指令之后插入写屏 +障,能让写入缓存的最新数据写回到主内存。
+     + lock 前缀指令在多核处理器下会引发了两件事情:
+     + 1.将当前处理器中这个变量所在缓存行的数据会写回到系统内存。这个写回内存的 +操作会引起在其他 CPU 里缓存了该内存地址的数据无效。但是就算写回到内存,如果 +其他处理器缓存的值还是旧的,再执行计算操作就会有问题,所以在多处理器下,为了 +保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总 +线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内 +存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进 +行修改操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。
+     + 2.它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面 +的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全 +部完成。
+     + 内存屏障可以被分为以下几种类型:
+     + LoadLoad 屏障:对于这样的语句 Load1; LoadLoad; Load2,在 Load2 及后续读取 +操作要读取的数据被访问前,保证 Load1 要读取的数据被读取完毕。
+     + StoreStore 屏障:对于这样的语句 Store1; StoreStore; Store2,在 Store2 及后续写 +入操作执行前,保证 Store1 的写入操作对其它处理器可见。
+     + LoadStore 屏障:对于这样的语句 Load1; LoadStore; Store2,在 Store2 及后续写 +入操作被刷出前,保证 Load1 要读取的数据被读取完毕。
+     + StoreLoad 屏障:对于这样的语句 Store1; StoreLoad; Load2,在 Load2 及后续所 +有读取操作执行前,保证 Store1 的写入对所有处理器可见。它的开销是四种屏障中最 +大的。在大多数处理器的实现中,这个屏障是个万能屏障,兼具其它三种内存屏障的功 +能。
+ +***扩展:使用 volatile 关键字的场景。***
+双重校验锁 DCL(double checked locking)--使用 volatile 的场景之一。
+ + +### 3.简述 JAVA 的内存模型。 +     + ***区别于“JVM 的内存模型”。***
+     + Java 内存模型规定所有的变量都是存在***主存***当中(类似于前面说的物理内 +存),每个线程都有自己的***工作内存***(类似于前面的高速缓存)。线程对变量 +的所有操作都必须在工作内存中进行,而不能直接对主存进行操作,并且每个 +线程不能访问其他线程的工作内存。
+     + Java 内 存 模 型 的 Volatile 关 键 字 和 原 子 性 、 可 见 性 、 有 序 性 和 +happens-before 关系等。
+ +     + ***一.Volatile 关键字 解析见上面。***
+ +     + ***二.要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。 +只要有一个没有被保证,就有可能会导致程序运行不正确。***
+***1.原子性***
+     + 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任 +何因素打断,要么就都不执行。
+     + 可以通过 Synchronized 和 Lock 实现“原子性”。
+例题:请分析以下哪些操作是原子性操作。 +```java +x = 10; +//语句 1 +y = x; //语句 2 +x++; //语句 3 +x = x + 1; //语句 4 +``` +     + ***特别注意,在 java 中,只有对除 long 和 double 外的基本类型进行简 +单的赋值(如 int a=1)或读取操作,才是原子的。只要给 long 或 double +加上 volatile,操作就是原子的了。***
+     + 语句 1 是原子性操作,其他三个语句都不是原子性操作。
+     + 语句 2 实际上包含 2 个操作,它先要去读取 x 的值,再将 x 的值写入工作 +内存,虽然读取 x 的值以及将 x 的值写入工作内存这 2 个操作都是原子性操作, +但是合起来就不是原子性操作了。
+     + 同样的,x++和 x = x+1 包括 3 个操作:读取 x 的值,进行加 1 操作, +写入新的值。
+***2.可见性***
+     + 可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线 +程能够立即看得到修改的值。
+     + 通过 Synchronized 和 Lock 和 volatile 实现“可见性”。
+***3.有序性***
+     + 有序性:即程序执行的顺序按照代码的先后顺序执行。
+     + 我的理解就是一段程序代码的执行在单个线程中看起来是有序的。这个应该是程序看 +起来执行的顺序是按照代码顺序执行的,因为虚拟机可能会对程序代码进行指令重排序。 +虽然进行重排序,但是最终执行的结果是与程序顺序执行的结果一致的,它只会对不存在 +数据依赖性的指令进行重排序。因此,在单个线程中,程序执行看起来是有序执行的,这 +一点要注意理解。事实上,这个规则是用来保证程序在单线程中执行结果的正确性,但无 +法保证程序在多线程中执行的正确性。
+ +     + ***三.happens-before 原则(先行发生原则):*** +- 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在 +后面的操作 +- 锁定规则:一个 unLock 操作先行发生于后面对同一个锁的 lock 操作 +- volatile 变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作 +- 传递规则:如果操作 A 先行发生于操作 B,而操作 B 又先行发生于操作 C,则可以 +得出操作 A 先行发生于操作 C +- 线程启动规则:Thread 对象的 start()方法先行发生于此线程的每个一个动作 +- 线程中断规则:对线程 interrupt()方法的调用先行发生于被中断线程的代码检测 +到中断事件的发生 +- 线程终结规则:线程中所有的操作都先行发生于线程的终止检测,我们可以通过 T +hread.join()方法结束、Thread.isAlive()的返回值手段检测到线程已经终止执行 +- 对象终结规则:一个对象的初始化完成先行发生于他的 finalize()方法的开始 + + +### 4.Java 中的同步容器类和缺陷。 +在 Java 中,同步容器主要包括 2 类:
+     + 1)Vector、HashTable。
+     + 2)Collections 类中提供的***静态工厂方法创建的类***。 +Collections.synchronizedXXX()。
+***缺陷:***
+     + ***1.性能问题。***
+     + 在有多个线程进行访问时,如果***多个线程都只是进行读取操作***,那么每个 +时刻就只能有一个线程进行读取,其他线程便只能等待,这些线程必须竞争同 +一把锁。
+     + ***2.ConcurrentModificationException 异常。***
+     + 在对 Vector 等容器进行***迭代修改***时,会报 +ConcurrentModificationException 异常。但是在***并发容器中***(如 +***ConcurrentHashMap,CopyOnWriteArrayList*** 等)不会出现这个问 +题。 + + +### 5.为什么说 ConcurrentHashMap 是弱一致性的?以及为何多个 线 程 并 发 修 改 ConcurrentHashMap 时 不 会 报ConcurrentModificationException? +***1.ConcurrentHashMap#get()*** +     + 正 是 因 为 get 操 作 几 乎 所 有 时 候 都 是 一 个 无 锁 操 作 ( get 中 有 一 个 +readValueUnderLock 调用,不过这句执行到的几率极小),使得同一个 +Segment 实例上的 ***put 和 get 可以同时进行,这就是 get 操作是弱一致的根 +本原因。*** +***2.ConcurrentHashMap#clear()***
+     + clear 方法很简单,看下代码即知。
+```java +public void clear() { + for(int i= 0; i< segments.length; ++i) + segments[i].clear; +} +``` + +     + 因为没有全局的锁,在清除完一个 segment 之后,正在清理下一个 +segment 的时候,***已经清理的 segment 可能又被加入了数据,因此 clear +返回的时候,ConcurrentHashMap 中是可能存在数据的。因此,clear 方 +法是弱一致的。***
+***ConcurrentHashMap 中的迭代器***
+     + 在遍历过程中,如果已经遍历的数组上的内容变化了,迭代器不会抛出 +ConcurrentModificationException 异常。如果未遍历的数组上的内容发生了 +变化,则有可能反映到迭代过程中。这就是 ConcurrentHashMap ***迭代器弱一 +致***的表现。
+     + 在这种迭代方式中,当 iterator 被创建后,集合再发生改变就不再是抛出 +ConcurrentModificationException,取而代之的是在改变时 new 新的数据 +从而不影响原有的数据,iterator 完成后再将头指针替换为新的数据,这样 +iterator 线程可以使用原来老的数据,而写线程也可以并发的完成改变,更重 +要的,这保证了多个线程并发执行的连续性和扩展性,是性能提升的关键。
+     + 总结,ConcurrentHashMap 的弱一致性主要是为了提升效率,是一致性 +与效率之间的一种权衡。要成为强一致性,就得到处使用锁,甚至是全局锁, +这就与 Hashtable 和同步的 HashMap 一样了。
+ + +### 6.CopyOnWriteArrayList 的实现原理。 +     + ***CopyOnWrite 容器***即写时复制的容器,也就是当我们往一个容器添加元 +素的时候,不直接往当前容器添加,而是先将当前容器进行 Copy,复制出一个 +新的容器,然后新的容器里添加元素,添加完元素之后,***再将原容器的引用指 +向新的容器(改变引用的指向)***。这样做的好处是我们可以对 CopyOnWrite +容器进***行并发的读,而不需要加锁***,因为当前容器不会添加任何元素。所以 +***CopyOnWrite 容器也是一种读写分离的思想,读和写在不同的容器上进行, +注意,写的时候需要加锁***。
+     + 1.以下代码是向 CopyOnWriteArrayList 中 ***add 方法***的实现,可以发现 +在***添加的时候是需要加锁的***,否则多线程写的时候会 Copy 出 N 个副本出来。 +```java +public boolean add(E e) { + final ReentrantLock lock = this.lock;//加的是 lock 锁 + lock.lock(); + try { + Object[] elements = getArray(); + int len = elements.length; + Object[] newElements = Arrays.copyOf(elements, len + 1); + newElements[len] = e; + setArray(newElements);// 将原容器的引用指向新的容器; + return true; + } finally { + lock.unlock(); + } +} +``` +     + 在 ***CopyOnWriteArrayList*** 里处理写操作(包括 add、remove、set 等)是***先将原始的 +数据通过 Arrays.copyof()来生成一份新的数组,然后在新的数据对象上进行写,写完后 +再将原来的引用指向到当前这个数据对象,这样保证了每次写都是在新的对象上***。然后读 +的时候就是在引用的当前对象上进行读(包括 get,iterator 等),不存在加锁和阻塞。
+     + ***CopyOnWriteArrayList 中写操作需要大面积复制数组,所以性能肯定很差***,但是***读操 +作因为操作的对象和写操作不是同一个对象,读之间也不需要加锁,读和写之间的同步处 +理只是在写完后通过一个简单的“=”将引用指向新的数组对象上来,这个几乎不需要时间, +这样读操作就很快很安全,适合在多线程里使用。***
+ +     + 2. ***读的时候不需要加锁***, 如 果 读 的 时 候 有 线 程 正 在 向 +CopyOnWriteArrayList 添加数据,读还是会读到旧的数据(***在原容器中进行 +读***)。
+```java +public E get(int index) { + return get(getArray(), index); +} +``` +     + CopyOnWriteArrayList 在***读上效率很高***,由于,写的时候每次都要将源 +数组复制到一个新组数中,所以***写的效率不高***。
+     + CopyOnWrite 容器有很多优点,但是同时也存在两个问题,即内存占用 +问题和数据一致性问题。
+ +##### 内存占用问题 +     + 因为 CopyOnWrite 的写时复制机制,所以在进行写操 +作的时候,内存里会同时驻扎两个对象的内存,旧的对象和新写入的对象。针 +对内存占用问题,可以
+     + 1)通过***压缩容器中的元素***的方法来减少大对象的内存消耗,比如,如果元 +素全是 10 进制的数字,可以考虑把它压缩成 36 进制或 64 进制。
+     + 2) 不使用 CopyOnWrite 容器, 而使用其他的并发容器, 如 +ConcurrentHashMap。
+ +##### 数据一致性问题 +     + CopyOnWrite 容器只能保证数据的最终一致性,不 +能保证数据的实时一致性。所以如果你希望写入的数据,马上能读到,请不要 +使用 CopyOnWrite 容器!!
+ + +### 7. Java 中堆和栈有什么不同? +     + ***栈是一块和线程紧密相关的内存区域。每个线程都有自己的栈内存,***用于 +存储本地变量,方法参数和栈调用,一个线程中存储的变量对其它线程是不可 +见的。而***堆是所有线程共享的一片公用内存区域***。对象都在堆里创建,***为了提 +升效率线程会从堆中弄一个缓存到自己的栈***,如果多个线程使用该变量就可能 +引发问题,这时 volatile 变量就可以发挥作用了,它要求线程从主存中读取变 +量的值。 + + +### 8.Java 中的活锁,死锁,饥饿有什么区别? +     + ***死锁***:是指***两个或两个以上的进程***在执行过程中,***因争夺资源***而造成的一 +种互相等待的现象,若无外力作用,它们都将无法推进下去,此时称系统处于 +死锁状态或系统产生了死锁。 +     + ***饥饿***:考虑一台打印机分配的例子,当有多个进程需要打印文件时,系统 +***按照短文件优先的策略排序***,该策略具有平均等待时间短的优点,似乎非常合 +理,但当短文件打印任务源源不断时,长文件的打印任务将被无限期地推迟, +导致***饥饿***以至饿死。 +     + ***活锁***:与饥饿相关的另外一个概念称为***活锁***,***在忙式等待条件下发生的饥 +饿,称为活锁***。 +     + ***不进入等待状态的等待称为忙式等待***。另一种等待方式是***阻塞式等待***,进 +程得不到共享资源时将进入阻塞状态,让出 CPU 给其他进程使用。忙等待和阻 +塞式等待的相同之处在于进程都不具备继续向前推进的条件,不同之处在于***处 +于忙等待的进程不主动放弃 CPU***,尽管 CPU 可能被剥夺,因而是低效的;而 +处于***阻塞状态的进程主动放弃 CPU*** ,因而是高效的。 +     + ***活锁***的例子:如果事务 T1 封锁了数据 R,事务 T2 又请求封锁 R,于是 T2 +等待。T3 也请求封锁 R,当 T1 释放了 R 上的封锁后,***系统首先批准了 T3 的 +请求***,T2 仍然等待。然后 T4 又请求封锁 R,当 T3 释放了 R 上的封锁之后, +***系统又批准了 T4 的请求***......T2 可能永远等待(***在整个过程中,事务 T2 在不 +断的重复尝试获取锁 R***)。 +     + 活锁的时候,进程是***不会阻塞的***,这会导致耗尽 CPU 资源,***这是与死锁最 +明显的区别。*** +     + 活锁指的是任务或者执行者***没有被阻塞***,由于某些条件没有满足,***导致一 +直重复尝试,失败,尝试,失败***。 活锁和死锁的区别在于,处于活锁的实体是 +在不断的改变状态,所谓的“活”, 而处于死锁的实体表现为等待;***活锁有一定 +几率解开***,而死锁是无法解开的。 +     + 避免活锁的简单方法是采***用先来先服务的策略***。当多个事务请求封锁同一 +数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁 +一旦释放就批准申请队列中第一个事务获得锁。 --- diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_\347\272\277\347\250\213\346\261\240\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_\347\272\277\347\250\213\346\261\240\347\232\204\351\227\256\351\242\230.md" index a708cde..b0e66d7 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_\347\272\277\347\250\213\346\261\240\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_\347\272\277\347\250\213\346\261\240\347\232\204\351\227\256\351\242\230.md" @@ -10,9 +10,305 @@ ### 1. 什么是线程池?线程池的工作原理? -### 2. 使用线程池的好处? -### 3. 线程池的注意事项。 -### 4. 简单线程池的设计。 +     + 一个线程池管理了一组***工作线程***,同时它还包括了一个用于放置等待执行 +任务的任务队列(阻塞队列)。
+     + 默认情况下,在创建了线程池后,线程池中的线程数为 ***0***。当***任务提交给 +线程池之后的处理策略如下***:
+     + 1. 如果此时线程池中的数量***小于 corePoolSize(核心池的大小)***,即 +使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务(***也 +就是每来一个任务,就要创建一个线程来执行任务***)。
+     + 2. 如果此时线程池中的数量***大于等于 corePoolSize***,但是***缓冲队列 +workQueue 未满***,那么任务被放入缓冲队列,则该任务会等待空闲线程将其 +取出去执行。
+     + 3. 如果此时线程池中的数量***大于等于 corePoolSize***, ***缓冲队列 +workQueue 满***,并且线程池中的数量***小于 maximumPoolSize(线程池 +最大线程数)***,建新的线程来处理被添加的任务。
+     + 4. 如果此时线程池中的数量***大于等于 corePoolSize , 缓冲队列 +workQueue 满***,并且线程池中的数量***等于 maximumPoolSize***,那么通 +过 RejectedExecutionHandler 所指定的策略(***任务拒绝策略***)来处理此任务。 +也就是处理任务的优先级为: ***核 心 线 程 corePoolSize 、 任 务 队 列 +workQueue、最大线程 maximumPoolSize,如果三者都满了,使用 +handler 处理被拒绝的任务***。
+     + ***5. 特别注意,在 corePoolSize 和 maximumPoolSize 之间的线程 +数会被自动释放。当线程池中线程数量大于 corePoolSize 时,如果某线程 +空闲时间超过 keepAliveTime,线程将被终止,直至线程池中的线程数目不 +大于 corePoolSize。这样,线程池可以动态的调整池中的线程数。***
+![02_1_1](/data/images/Java应届生面试突击/多线程和并发/02_1_1.png)
+ + +#### 使用线程池的好处: +     + 1.通过重复利用已创建的线程,***减少在创建和销毁线程上***所花的时间以及***系 +统资源的开销***。
+     + 2.提高响应速度。当任务到达时,任务可以不需要等到线程创建就可以立即 +执行。
+     + 3.提高线程的可管理性。使用线程池可以对线程进行统一的分配和监控。
+     + 4.***如果不使用线程池***,有可能造成系统创建大量线程而***导致消耗完系统内 +存***。
+ + +#### 对于原理,有几个接口和类值得我们关注: +     + ***Executor 接口***
+     + ***Executors 类***
+     + ***ExecutorService 接口***
+     + ***AbstractExecutorService 抽象类***
+     + ***ThreadPoolExecutor 类***
+ +     + Executor 是一个顶层接口,在它里面只声明了一个方法 execute(Runnable),返回 +值为 void,参数为 Runnable 类型,从字面意思可以理解,就是用来执行传进去的任务的;
+     + 然后 ExecutorService 接口继承了 Executor 接口,并声明了一些方法:submit、 +invokeAll、invokeAny 以及 shutDown 等;
+     + 抽象类 AbstractExecutorService 实现了 ExecutorService 接口,基本实现了 +ExecutorService 中声明的所有方法;
+     + 然后 ThreadPoolExecutor 继承了类 AbstractExecutorService。 +public static ScheduledExecutorService ***newScheduledThreadPool***(int +corePoolSize)
+     + 创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代 Timer 类。
+![02_1_2](/data/images/Java应届生面试突击/多线程和并发/02_1_2.png)
+ + + +##### Executor 接口 +public interface Executor { +void execute(Runnable command); +} +     + Executor 接口只有一个方法 execute(),并且需要传入一个 Runnable +类型的参数。那么它的作用自然是 具体的执行参数传入的任务。
+ +##### ExecutorService 接口 +```java +public interface ExecutorService extends Executor { + void shutdown(); + List shutdownNow(); + boolean isShutdown(); + Future submit(Callable task); + Future submit(Runnable task, T result); + Future submit(Runnable task); + List> invokeAll(Collection> tasks) + throws InterruptedException; + ...... +} +``` + + +##### Executors 类: + +它主要用来创建线程池。 + +Executors.newSingleThreadExecutor(); //创建容量为 1 的缓冲池 +Executors.newFixedThreadPool(int n); //创建固定容量大小的缓冲池 +Executors.newCachedThreadPool(); //创建一个缓冲池,缓冲池最大容量为Integer.MAX_VALUE(无界线程池) + +下面是这三个静态方法的具体实现: +```java +public static ExecutorService newSingleThreadExecutor() { + return new FinalizableDelegatedExecutorService + (new ThreadPoolExecutor(1, 1, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue())); +} + +public static ExecutorService newFixedThreadPool(int nThreads) { + return new ThreadPoolExecutor(nThreads, nThreads, + 0L, TimeUnit.MILLISECONDS, + new LinkedBlockingQueue()); +} + +public static ExecutorService newCachedThreadPool() { + return new ThreadPoolExecutor(0, Integer.MAX_VALUE, + 60L, TimeUnit.SECONDS, + new SynchronousQueue()); +} +``` + +     + ***1. newSingleThreadExecutor***
+     + 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串 +行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。 +此线程池保证所有任务的执行顺序按照任务的提交顺序执行。
+     + ***2.newFixedThreadPool***
+     + 创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的 +最大大小。线程池的大小一旦达到最大值就会保持不变,***如果某个线程因为执行异常而结 +束,那么线程池会补充一个新线程***。
+     + ***3. newCachedThreadPool***
+     + 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就 +会回收部分空闲(60 秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添 +加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系 +统(或者说 JVM)能够创建的最大线程大小。 + +##### ThreadPoolExecutor 类 +![02_1_3](/data/images/Java应届生面试突击/多线程和并发/02_1_3.png)
+ + +在 ThreadPoolExecutor 类中提供了四个构造方法:
+```java +public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit, + BlockingQueue workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler); + +``` + +     + 不过在 java doc 中,并***不提倡我们直接使用 ThreadPoolExecutor 创 +建线程池,而是使用 Executors 类中提供的几个静态方法来创建线程池***。
+ +下面解释一下构造器中各个参数的含义:
+     + ***corePoolSize***:核心池的大小。默认情况下,在创建了线程池后,线程池中 +的线程数为 0,当有任务来之后,就会创建一个线程去执行任务,当线程池中 +的线程数目达到 corePoolSize 后,就会把到达的任务放到缓存队列当中。
+     + ***maximumPoolSize***:线程池最大线程数,它表示在线程池中最多能创建多 +少个线程。
+     + ***keepAliveTime***:默认情况下,只有当线程池中的线程数大于 corePoolSize +时, keepAliveTime 才会起作用,直到线程池中的线程数不大于 corePoolSize, +即当线程池中的线程数大于 corePoolSize 时,如果一个线程空闲的时间达到 +keepAliveTime,则会终止,直到线程池中的线程数不超过 corePoolSize。
+     + ***unit***:参数 keepAliveTime 的时间单位。 +     + ***workQueue***:一个阻塞队列,任务缓存队列,即 workQueue,它用来存 +放等待执行的任务。
+     + workQueue 的类型为 BlockingQueue,通常可以取下面三种类型:
+     + 1)ArrayBlockingQueue:基于数组的先进先出队列,此队列创建时必须指定大小;
+     + 2)LinkedBlockingQueue:基于链表的先进先出队列,如果创建时没有指定此队列 +大小,则默认为 Integer.MAX_VALUE;
+     + 3)synchronousQueue:这个队列比较特殊,它不会保存提交的任务,而是将直接 +新建一个线程来执行新来的任务。在某次添加元素后必须等待其他线程取走后才能继续添 +加。
+     + ThreadFactory:线程工厂,主要用来创建线程。
+     + handler:表示当拒绝处理任务时的策略,有以下***四种取值***:
+     + 1.***AbortPolicy***:直接抛出异常(默认的)
+     + 2.***DiscardPolicy***:直接丢弃任务
+     + 3.***DiscardOldestPolicy***:丢弃队列中最旧(队头)的任务,并执行当前 +任务
+     + 4.***CallerRunsPolicy***:不用线程池中的线程执行,用调用者所在线程执 +行。
+     + 在 ThreadPoolExecutor 类中有几个非常重要的方法:
+     + ***execute()
+     + submit()
+     + shutdown()
+     + shutdownNow()***
+ + +###### execute 和 submit 区别: +     + submit 有返回值,execute 没有返回值。 所以说可以根据任务有无返回 +值选择对应的方法。
+     + *** submit 方便异常的处理。 如果任务可能会抛出异常,而且希望外面的调 +用者能够感知这些异常,那么就需要调用 submit 方法,通过捕获 Future.get +抛出的异常。***
+ + +###### shutdown()和 shutdownNow()的区别: +     + shutdown()和 shutdownNow()是用来关闭线程池的。
+     + shutdown 方法:此方法执行后不得向线程池再提交任务,如果有空闲线 +程则销毁空闲线程,等待所有正在执行的任务及位于阻塞队列中的任务执行结 +束,然后销毁所有线程。
+     + shutdownNow 方法:此方法执行后不得向线程池再提交任务,如果有空 +闲线程则销毁空闲线程,取消所有位于阻塞队列中的任务,并将其放入 +List容器,作为返回值。取消正在执行的线程(实际上仅仅是设 +置正在执行线程的中断标志位,调用线程的 interrupt 方法来中断线程)。 + +#### 线程池的注意事项 +虽然线程池是构建多线程应用程序的强大机制,但使用它并不是没有风险的。
+     + (1)***线程池的大小***。多线程应用并非线程越多越好,需要根据系统运行的软硬件环境以及 +应用本身的特点决定线程池的大小。一般来说,如果代码结构合理的话,线程数目与 CPU +数量相适合即可。如果线程运行时可能出现阻塞现象,可相应增加池的大小;如有必要可 +采用自适应算法来动态调整线程池的大小,以提高 CPU 的有效利用率和系统的整体性能。
+     + (2)***并发错误***。多线程应用要特别注意并发错误,要从逻辑上保证程序的正确性,注意***避 +免死锁***现象的发生。
+     + (3)***线程泄漏***。这是线程池应用中一个严重的问题,当任务执行完毕而线程没能返回池中 +就会发生线程泄漏现象。
+ +#### 简单线程池的设计 +一个典型的线程池,应该包括如下几个部分:
+1、线程池管理器(ThreadPool),用于启动、停用,管理线程池
+2、工作线程(WorkThread),线程池中的线程
+3、***请求接口***(WorkRequest),***创建请求对象***,以供工作线程调度任务的执行
+4、***请求队列***(RequestQueue),用于存放和提取请求
+5、***结果队列***(ResultQueue),用于存储请求执行后返回的结果
+ +     + 线程池管理器,通过添加请求的方法(putRequest)向请求队列(RequestQueue) +添加请求,***这些请求事先需要实现请求接口***,即传递工作函数、参数、结果处理函数、以 +及异常处理函数。之后初始化一定数量的工作线程,这些线程通过轮询的方式不断查看请 +求队列(RequestQueue),只要有请求存在,则会提取出请求,进行执行。然后,线程池 +管理器调用方法(poll)查看结果队列(resultQueue)是否有值,如果有值,则取出,调 +用结果处理函数执行。通过以上讲述,不难发现,这个系统的核心资源在于请求队列和结 +果队列,工作线程通过轮询 requestQueue 获得任务,主线程通过查看结果队列,获得执 +行结果。因此,***对这个队列的设计,要实现线程同步***,以及一定阻塞和超时机制的设计, +以防止因为不断轮询而导致的过多 cpu 开销。
+![02_1_4](/data/images/Java应届生面试突击/多线程和并发/02_1_4.png)
+ +##### 问: +     + ***如何合理的配置 java 线程池?如 CPU 密集型的任务,基本线程池 +应该配置多大?IO 密集型的任务,基本线程池应该配置多大?用有界 +队列好还是无界队列好?任务非常多的时候,使用什么阻塞队列能获取 +最好的吞吐量?***
+ +##### 答: +     + 1)配置线程池时,CPU 密集型任务可以少配置线程数,大概和机器的 cpu 核数相 +当,可以使得每个线程都在执行任务。
+     + 2)IO 密集型任务则由于需要等待 IO 操作,线程并不是一直在执行任务,则配置尽 +可能多的线程,2*cpu 核数。
+     + 3)有界队列和无界队列的配置需区分业务场景,一般情况下配置有界队列,在一些 +可能会有爆发性增长的情况下使用无界队列。
+     + 4)任务非常多时,使用非阻塞队列使用 CAS 操作替代锁可以获得好的吞吐量。 +synchronousQueue 吞吐率最高。
--- diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/03_\345\271\266\345\217\221\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/03_\345\271\266\345\217\221\347\232\204\351\227\256\351\242\230.md" index e169b47..e002cc1 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/03_\345\271\266\345\217\221\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/03_\345\271\266\345\217\221\347\232\204\351\227\256\351\242\230.md" @@ -8,8 +8,84 @@ ### 1. 网站的高并发,大流量访问怎么解决? +#### 1.HTML 页面静态化 +     + 访问频率较高但内容变动较小,使用网站 HTML 静态化方案来优化访问速度。将社区 +内的帖子、文章进行实时的静态化,有更新的时候再重新静态化也是大量使用的策略。
+     + 优势:
+     + 一、减轻服务器负担。
+     + 二、加快页面打开速度,***静态页面无需访问数据库***,打开速度较动态页面有明显提高;
+     + 三、很多搜索引擎都会优先收录静态页面,不仅被收录的快,还收录的全,容易被搜 +索引擎找到;
+     + 四、HTML 静态页面不会受程序相关漏洞的影响,减少攻击 ,提高安全性。
+#### 2.图片服务器和应用服务器相分离 +     + 现在很多的网站上都会用到大量的图片,而图片是网页传输中占主要的数据量,也是影 +响网站性能的主要因素。因此很多网站都会将图片存储从网站中分离出来,另外架构一个 +或多个服务器来存储图片,将图片放到一个虚拟目录中,而网页上的图片都用一个 URL 地 +址来指向这些服务器上的图片的地址,这样的话网站的性能就明显提高了。
+     + 优势:
+     + 一、 分担 Web 服务器的 I/O 负载-将耗费资源的图片服务分离出来,提高服务器的性能 +和稳定性。
+     + 二、 能够专门对图片服务器进行优化-为图片服务设置有针对性的***缓存***方案,减少带宽 +成本,提高访问速度。
+     + 三、 提高网站的可扩展性-通过增加图片服务器,提高图片吞吐能力。
+#### 3.数据库 +     + 见“数据库部分的---如果有一个特别大的访问量到数据库上,怎么做优化?”。
+#### 4.缓存 +     + 尽量使用缓存,包括用户缓存,信息缓存等,多花点内存来做缓存,可以大量减少与 +数据库的交互,提高性能。
+假如我们能减少数据库频繁的访问,那对系统肯定大大有利的。比如一个电子商务系 +统的商品搜索,如果某个关键字的商品经常被搜,那就可以考虑这部分商品列表存放到缓 +存(内存中去),这样不用每次访问数据库,性能大大增加。
+#### 5.镜像 +     + 镜像是冗余的一种类型,一个磁盘上的数据在另一个磁盘上存在一个完全相同的副本 +即为镜像。
+#### 6.负载均衡 +     + 在网站高并发访问的场景下,使用负载均衡技术(负载均衡服务器)为一个应用构建 +一个由多台服务器组成的服务器集群,将并发访问请求分发到多台服务器上处理,避免单 +一服务器因负载压力过大而响应缓慢,使用户请求具有更好的响应延迟特性。
+#### 7.并发控制 +     + 加锁,如乐观锁和悲观锁。
+#### 8. 消息队列 +     + 通过 mq 一个一个排队方式,跟 12306 一样。
+ + ### 2. 可扩展到任何高并发网站要考虑的并发读写问题 +     + ***订票系统,某车次只有一张火车票,假定有 1w 个人同 +时打开 12306 网站来订票,如何解决并发问题?(可扩展 +到任何高并发网站要考虑的并发读写问题)。***
+     + 不但要保证 1w 个人能同时看到有票(数据的可读性),还要保证最终只能 +由一个人买到票(数据的排他性)。
+     + 使用数据库层面的并发访问控制机制。采用乐观锁即可解决此问题。乐观 +锁意思是不锁定表的情况下,利用业务的控制来解决并发问题,这样既保证数 +据的并发***可读性***,又保证保存数据的***排他性***,保证性能的同时解决了并发带来 +的脏数据问题。hibernate 中实现乐观锁。
+     + 银行两操作员同时操作同一账户就是典型的例子。比如 A、B 操作员同 +时读取一余额为 1000 元的账户,A 操作员为该账户增加 100 元,B 操作员同时 +为该账户减去 50 元, A 先提交, B 后提交。 最后实际账户余额为 1000-50=950 +元,但本该为 1000+100-50=1050。这就是典型的并发问题。如何解决?可以 +用锁。
--- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_\345\271\266\345\217\221\345\214\205\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_\345\271\266\345\217\221\345\214\205\347\232\204\351\227\256\351\242\230.md" index 180bd7a..4d667d8 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_\345\271\266\345\217\221\345\214\205\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_\345\271\266\345\217\221\345\214\205\347\232\204\351\227\256\351\242\230.md" @@ -4,21 +4,125 @@ --- 1. 并发包(Concurrent 包)中含有的类。
-2. CountDownLatch 和 CyclicBarrier 的区别?
### 1. 并发包(Concurrent 包)中含有的类。 -### 2. CountDownLatch 和 CyclicBarrier 的区别? -### -### -### -### -### -### -### -### -### -### +***并发包(Concurrent 包)中含有的类:***
+![04_1_1](/data/images/Java应届生面试突击/多线程和并发/04_1_1.png)
+ +     +***ConcurrentHashMap / CopyOnWriteArrayList。
+     +阻塞队列。
+     +同步辅助类。
+     +和线程池相关的类。
+     +Lock 接口。
+     +原子类。***
+ +#### 同步辅助类的介绍如下: + +##### 1.CountDownLatch: +![04_1_2](/data/images/Java应届生面试突击/多线程和并发/04_1_2.png)
+![04_1_3](/data/images/Java应届生面试突击/多线程和并发/04_1_3.png)
+![04_1_4](/data/images/Java应届生面试突击/多线程和并发/04_1_4.png)
+ + +     + 它相当于一个计数器。用一个给定的数值初始化 CountDownLatch,之后计 +数器就从这个值开始倒计数,直到计数值达到零。
+      + CountDownLatch 是通过“共享锁”实现的。在创建 CountDownLatch 时, +会传递一个 int 类型参数,该参数是“锁计数器”的初始状态,表示该“共享锁” +最多能被 count 个线程同时获取, 这个值只能被设置一次, 而且 +CountDownLatch 没有提供任何机制去重新设置这个计数值。***主线程必须在启 +动其他线程后立即调用 await()方法。这样主线程的操作就会在这个方法上阻 +塞,直到其他线程完成各自的任务***。当某线程调用该 CountDownLatch 对象的 +await()方法时,该线程会等待“共享锁”可用时,才能获取“共享锁”进而继 +续运行。而“共享锁”可用的条件,就是“锁计数器”的值为 0!而“***锁计数器***” +的初始值为 count,每当一个线程调用该 CountDownLatch 对象的 countDown() +方法时,才将“锁计数器 ”-1;通过这种方式,必须有 count 个线程调 用 +countDown()之后,“锁计数器”才为 0,而前面提到的等待线程才能继续运行!
+ +###### 2 个重要的函数: +     + await()函数的作用是让线程阻塞等待其他线程,直到 CountDownLatch 的计 +数值变为 0,才继续执行之后的操作。
+      + countDown()函数:这个函数用来将 CountDownLatch 的计数值减 1,如果计 +数达到 0,则释放所有等待的线程。
+它的应用场景:
+     + 一个任务,它需要等待其他的一些任务都执行完毕之后它才能继续执行。
+     + 比如:开 5 个多线程去下载,当 5 个线程都执行完了才算下载成功。
+ +##### 2.CyclicBarrier +![04_1_5](/data/images/Java应届生面试突击/多线程和并发/04_1_5.png)
+![04_1_6](/data/images/Java应届生面试突击/多线程和并发/04_1_6.png)
+ +     + CyclicBarrier 翻译过来就是:循环的屏障,这个类是一个可以重复利用的 +屏障类。它允许一组线程相互等待,直到全部到达某个公共屏障点,然后所有 +的这组线程再同步往后执行。
+###### 1 个重要的函数: +     + ***await()函数每被调用一次,计数便会减少 1 ( CyclicBarrier 设置了初始值), +并阻塞住当前线程。当计数减至 0 时,阻塞解除***,所有在此 CyclicBarrier 上面 +阻塞的线程开始运行。
+ +###### CountDownLatch 和 CyclicBarrier 的区别? +     + (1) CountDownLatch 的作用是允许 1 个线程等待其他线程执行完成之后, +它才执行;而 CyclicBarrier 则是允许 N 个线程相互等待到某个公共屏障点,然 +后这一组线程再同时执行。
+     + (2) CountDownLatch 的***计数器的值无法被重置***,这个初始值只能被设置一 +次,是不能够重用的;CyclicBarrier 是可以重用的。
+ +##### 3.Semaphore +     + 可以***控制某个资源可被同时访问的个数***,通过构造函数设定一定数量的许 +可,通过 ***acquire()*** 获取一个许可,如果没有就等待,而 ***release()*** 释放一个许 +可。
+     + 下面的例子只允许 5 个线程同时进入执行 acquire()和 release()之间的代码:
+ +```java +public class SemaphoreTest { + public static void main(String[] args) { + // 线程池 + ExecutorService exec = Executors.newCachedThreadPool(); + // 只能 5 个线程同时访问 + final Semaphore semp = new Semaphore(5); + // 模拟 20 个客户端访问 + for (int index = 0; index < 20; index++) { + final int NO = index; + Runnable run = new Runnable() { + public void run() { + try { + // 获取许可 + semp.acquire(); + System.out.println("Accessing: " + NO); + Thread.sleep((long) (Math.random() * 10000)); + // 访问完后,释放 ,如果屏蔽下面的语句,则在控制台只能打印 5 条记录,之后线程一直阻塞 + semp.release(); + } catch (InterruptedException e) { + } + } + }; + exec.execute(run); + } + // 退出线程池 + exec.shutdown(); + } +} + +``` + --- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/05_\351\230\273\345\241\236\351\230\237\345\210\227\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/05_\351\230\273\345\241\236\351\230\237\345\210\227\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" index ee2be87..273457c 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/05_\351\230\273\345\241\236\351\230\237\345\210\227\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/05_\351\230\273\345\241\236\351\230\237\345\210\227\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" @@ -11,10 +11,679 @@ ### 1. 阻塞队列 +     + 阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是: +在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等 +待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程, +消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从 +容器里拿元素。
+ +#### 1.ArrayBlockingQueue +     + ArrayBlockingQueue 是一个由数组支持的有界缓存的阻塞队列。在读写操作上都需要 +锁住整个容器,因此吞吐量与一般的实现是相似的,适合于实现“生产者消费者”模式。
+     ArrayBlockingQueue 内部还保存着两个整形变量,分别标识着队列的头部和尾部在数组中 +的位置。这个类是线程安全的。生产者和消费者共用一把锁。
+     + 源码: +```java +/** The queued items */ +final Object[] items; +/** items index for next take, poll, peek or remove */ +int takeIndex; +/** items index for next put, offer, or add */ +int putIndex; +/** Number of elements in the queue */ +int count; +/** Main lock guarding all access */ +final ReentrantLock lock; +/** Condition for waiting takes */ +private final Condition notEmpty; +/** Condition for waiting puts */ +private final Condition notFull; + +public ArrayBlockingQueue(int capacity, boolean fair) { + if (capacity <= 0) + throw new IllegalArgumentException(); + this.items = new Object[capacity]; + lock = new ReentrantLock(fair); + notEmpty = lock.newCondition(); + notFull = lock.newCondition(); +} + +private void enqueue(E x) { + // assert lock.getHoldCount() == 1; + // assert items[putIndex] == null; + final Object[] items = this.items; + items[putIndex] = x; + if (++putIndex == items.length) + putIndex = 0; + count++; + notEmpty.signal(); +} + +private E dequeue() { + // assert lock.getHoldCount() == 1; + // assert items[takeIndex] != null; + final Object[] items = this.items; + @SuppressWarnings("unchecked") + E x = (E) items[takeIndex]; + items[takeIndex] = null; + if (++takeIndex == items.length) + takeIndex = 0; + // 循环队列 + count--; + if (itrs != null) + itrs.elementDequeued(); + notFull.signal(); + return x; +} + +public void put(E e) throws InterruptedException { + checkNotNull(e); + final ReentrantLock lock = this.lock; + lock.lockInterruptibly(); + try { + while (count == items.length) + notFull.await(); + enqueue(e); + } finally { + lock.unlock(); + } +} + +public E take() throws InterruptedException { + final ReentrantLock lock = this.lock; + lock.lockInterruptibly(); + try { + while (count == 0) + notEmpty.await(); + return dequeue(); + } finally { + lock.unlock(); + } +} + +public boolean offer(E e) { + checkNotNull(e); + final ReentrantLock lock = this.lock; + lock.lock(); + try { + if (count == items.length) + return false; + else { + enqueue(e); + return true; + } + } finally { + lock.unlock(); + } +} + +public E poll() { + final ReentrantLock lock = this.lock; + lock.lock(); + try { + return (count == 0) ? null : dequeue(); + } finally { + lock.unlock(); + } +} + +``` + +#### 2.LinkedBlockingQueue +     + 基于链表的阻塞队列,内部维持着一个数据缓冲队列(该队列由链表构成)。
+     + 只有当队列缓冲区达到最大值缓存容量时(LinkedBlockingQueue 可以通过构造函数 +指定该值),才会阻塞生产者线程,直到消费者从队列中消费掉一份数据,生产者线程会 +被唤醒,反之对于消费者这端的处理也基于同样的原理。
+     + LinkedBlockingQueue 之所以能够高效的处理并发数据,还因为其对于生产者端和消 +费者端分别采用了独立的锁来控制数据同步,这也意味着在高并发的情况下生产者和消费 +者可以并行地操作队列中的数据,以此来提高整个队列的并发性能。
+     + 源码: +```java +/** The capacity bound, or Integer.MAX_VALUE if none */ +private final int capacity; +/** Current number of elements */ +private final AtomicInteger count = new AtomicInteger(); +/** +* Head of linked list. +* Invariant: head.item == null +*/ +transient Node head; +/** +* Tail of linked list. +* Invariant: last.next == null +*/ +private transient Node last; +/** Lock held by take, poll, etc */ +private final ReentrantLock takeLock = new ReentrantLock(); +/** Wait queue for waiting takes */ +private final Condition notEmpty = takeLock.newCondition(); +/** Lock held by put, offer, etc */ +private final ReentrantLock putLock = new ReentrantLock(); +/** Wait queue for waiting puts */ +private final Condition notFull = putLock.newCondition(); + +private void enqueue(Node node) { + // assert putLock.isHeldByCurrentThread(); + // assert last.next == null; + last = last.next = node; +} + +private E dequeue() { + // assert takeLock.isHeldByCurrentThread(); + // assert head.item == null; + Node h = head; + Node first = h.next; + h.next = h; // help GC + head = first; + E x = first.item; + first.item = null; + return x; +} + +public void put(E e) throws InterruptedException { + if (e == null) throw new NullPointerException(); + // Note: convention in all put/take/etc is to preset local + var + // holding count negative to indicate failure unless set. + int c = -1; + Node node = new Node(e); + final ReentrantLock putLock = this.putLock; + final AtomicInteger count = this.count; + putLock.lockInterruptibly(); + try { + //当队列满时,调用 notFull.await()方法释放锁,陷入等待状态。 + //有两种情况会激活该线程 + //第一、 某个 put 线程添加元素后,发现队列有空余,就调用 notFull.signal()方法激 + 活阻塞线程 + //第二、take 线程取元素时,发现队列已满。则其取出元素后,也会调用 notFull.signal() + 方法激活阻塞线程 + while (count.get() == capacity) { + notFull.await(); + } + enqueue(node); + c = count.getAndIncrement(); + //发现队列未满,调用 notFull.signal()激活阻塞的 put 线程(可能存在) + if (c + 1 < capacity) + notFull.signal(); + } finally { + putLock.unlock(); + } + if (c == 0) + signalNotEmpty(); +} + +public E take() throws InterruptedException { + E x; + int c = -1; + final AtomicInteger count = this.count; + final ReentrantLock takeLock = this.takeLock; + takeLock.lockInterruptibly(); + try { + while (count.get() == 0) { + notEmpty.await(); + } + x = dequeue(); + c = count.getAndDecrement(); + if (c > 1) + notEmpty.signal(); + } finally { + takeLock.unlock(); + } + if (c == capacity) + signalNotFull(); + return x; +} + +public boolean offer(E e) { + if (e == null) throw new NullPointerException(); + final AtomicInteger count = this.count; + if (count.get() == capacity) + return false; + int c = -1; + Node node = new Node(e); + final ReentrantLock putLock = this.putLock; + putLock.lock(); + try { + if (count.get() < capacity) { + enqueue(node); + c = count.getAndIncrement(); + if (c + 1 < capacity) + notFull.signal(); + } + } finally { + putLock.unlock(); + } + if (c == 0) + signalNotEmpty(); + return c >= 0; +} + +public E poll() { + final AtomicInteger count = this.count; + if (count.get() == 0) + return null; + E x = null; + int c = -1; + final ReentrantLock takeLock = this.takeLock; + takeLock.lock(); + try { + if (count.get() > 0) { + x = dequeue(); + c = count.getAndDecrement(); + if (c > 1) + notEmpty.signal(); + } + } finally { + takeLock.unlock(); + } + if (c == capacity) + signalNotFull(); + return x; +} +``` + +##### ArrayBlockingQueue 和 LinkedBlockingQueue 的区别: +###### 1. 队列大小的初始化方式不同 +     + ArrayBlockingQueue 是有界的,必须指定队列的大小;
+     + LinkedBlockingQueue 是分情况的,指定队列的大小时,就是有界的;不指定队列的大小 +时,默认是 Integer.MAX_VALUE,看成无界队列,但当生产速度大于消费速度时候,有可能 +会内存溢出。 +###### 2. 队列中锁的实现不同 +     + ArrayBlockingQueue 实现的队列中的锁是没有分离的,即生产和消费用的是同一个锁;进 +行 put 和 take 操作,共用同一个锁对象。也即是说,put 和 take 无法并行执行!
+     + LinkedBlockingQueue 实 现 的 队 列 中 的 锁 是 分 离 的 , 即 生 产 用 的 是 putLock , 消 费是 +takeLock。也就是说,生成端和消费端各自独立拥有一把锁,避免了读(take)写(put)时互 +相竞争锁的情况,可并行执行。 +###### 3. 在生产或消费时操作不同 +     + ArrayBlockingQueue 基于数组,在插入或删除元素时,是直接将枚举对象插入或移除的, +不会产生或销毁任何额外的对象实例;
+     + LinkedBlockingQueue 基于链表,在插入或删除元素时,需要把枚举对象转换为 Node +进行插入或移除,会生成一个额外的 Node 对象,这在长时间内需要高效并发地处理大批量数 +据的系统中,其对于 GC 的影响还是存在一定的区别,会影响性能。 + +##### Put()和 take()方法。 +     + 都可以实现阻塞的功能。
+     + Put()方法:把元素加入到阻塞队列中,如果阻塞队列没有空间,则调用此方法的线程被阻塞, +直到有空间的时候再继续。
+     + take()方法:取出排在阻塞队列首位的对象,若阻塞队列为空,则调用此方法的线程被阻塞, +直到有新的对象被加入的时候再继续。 + +##### offer()和 poll()方法。 +     + 不具有阻塞的功能。
+     + offer()方法:把元素加入到阻塞队列中,如果可以容纳,则返回 true。如果不可以容纳,则返 +回 false。
+     + poll()方法:取出排在阻塞队列首位的对象,若阻塞队列为空,则返回 null,如果不为空,则返 +回取出来的那个元素。 + +#### 3.PriorityBlockingQueue VSPriorityQueue +     + 此阻塞队列为基于数组的无界阻塞队列。它会按照元素的优先级对元素进行排序,按照优 +先级顺序出队,每次出队的元素都是优先级最高的元素。注意,不会阻塞生产者,但会阻塞消 +费者。 PriorityBlockingQueue 里面存储的对象必须是实现 Comparable 接口,队列通过这个接 +口的 compare 方法确定对象的 priority。
+     + 队列的元素并不是全部按优先级排序的,但是队头的优先级肯定是最高的。每取一个头元 +素时候,都会对剩余的元素做一次调整,这样就能保证每次队头的元素都是优先级最高的元素。 + +#### 4.DelayQueue +     + DelayQueue 是一个无界阻塞队列,用于放置实现了 Delayed 接口的对象,只有在延迟期 +满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的 Delayed 元素。 这个 +队列里面所存储的对象都带有一个时间参数,采用 take 获取数据的时候,如果时间没有到, +取不出来任何数据。而加入数据的时候,是不会阻塞的(不会阻塞生产者,但会阻塞消费者)。 +DelayQueue 内部使用 PriorityQueue 实现的。 DelayQueue 是一个使用 PriorityQueue +实 现 的 BlockingQueue , 优 先 队 列 的 比 较 基 准 值 是 时 间 。 本 质 上 即 : DelayQueue = +BlockingQueue +PriorityQueue + Delayed。
+优势:
+     + 如果不使用 DelayQueue,那么常规的解决办法就是:使用一个后台线程,遍历所有对象, +挨个检查。这种笨笨的办法简单好用,但是对象数量过多时,可能存在性能问题,检查间隔时 +间不好设置,间隔时间过大,影响精确度,过小则存在效率问题。而且做不到按超时的时间顺 +序处理。
+应用场景:
+     + 缓存系统的设计。缓存中的对象,超过了有效时间,需要从缓存中移出。使用一个线程循 +环查询 DelayQueue,一旦能从 DelayQueue 中获取元素时,表示缓存有效期到了。 +```java +class Wangming implements Delayed { + private String name; + // 身份证 + private String id; + // 截止时间 + private long endTime; + + public Wangming(String name, String id, long endTime) { + this.name = name; + this.id = id; + this.endTime = endTime; + } + + public String getName() { + return this.name; + } + + public String getId() { + return this.id; + } + /** + * 用来判断是否到了截止时间 + */ + @Override + public long getDelay(TimeUnit unit) { + // TODO Auto-generated method stub + return endTime - System.currentTimeMillis(); + } + /** + * 相互比较排序用 + */ + @Override + public int compareTo(Delayed o) { + // TODO Auto-generated method stub + Wangming jia = (Wangming) o; + return endTime - jia.endTime > 0 ? 1 : 0; + } + + public class WangBa implements Runnable { + private DelayQueue queue = new DelayQueue(); + public boolean yinye = true; + public void shangji(String name, String id, int money) { + Wangming man = new Wangming(name, id, 1000 * 60 * money + + System.currentTimeMillis()); + System.out.println("网名" + man.getName() + " 身份证" + + man.getId() + "交钱" + money + "块,开始上机..."); + this.queue.add(man); + } + + public void xiaji(Wangming man) { + System.out.println("网名" + man.getName() + " 身份证" + + man.getId() + "时间到下机..."); + } + + @Override + public void run() { + // TODO Auto-generated method stub + while (yinye) { + try { + System.out.println("检查 ing"); + Wangming man = queue.take(); + xiaji(man); + } catch (InterruptedException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + } + + public static void main(String args[]) { + try { + System.out.println("网吧开始营业"); + WangBa siyu = new WangBa(); + Thread shangwang = new Thread(siyu); + shangwang.start(); + siyu.shangji("路人甲", "123", 1); + siyu.shangji("路人乙", "234", 2); + siyu.shangji("路人丙", "345", 3); + } catch (Exception ex) { + } + } +} +``` +#### 5.SynchronousQueue +     + 同步队列是一个不存储元素的队列,它的 size()方法总是返回 0。每个线 +程的插入操作必须等待另一个线程的移除操作,同样任何一个线程的移除操作 +都必须等待另一个线程的插入操作。可以认为 SynchronousQueue 是一个缓存 +值为 1 的阻塞队列。 + + ### 2. 生产者/消费者问题的多种实现方式 +####1.使用阻塞队列实现 +```java +// Producer Class in java +class Producer implements Runnable { + private final BlockingQueue sharedQueue; + + public Producer(BlockingQueue sharedQueue) { + this.sharedQueue = sharedQueue; + } + + public void run() { + for (int i = 0; i < 10; i++) { + try { + System.out.println("Produced: " + i); + sharedQueue.put(i); + } catch (InterruptedException ex) { + System.out.println(ex); + } + } + } +} + +// Consumer Class in Java +class Consumer implements Runnable { + private final BlockingQueue sharedQueue; + + public Consumer(BlockingQueue sharedQueue) { + this.sharedQueue = sharedQueue; + } + + public void run() { + while (true) { + try { + int i = (Integer) sharedQueue.take(); + System.out.println("Consumed: " + i); + } catch (InterruptedException ex) { + System.out.println(ex); + } + } + } +} + +public class ProducerConsumerPattern { + public static void main(String args[]) { + // Creating shared object + BlockingQueue sharedQueue = new LinkedBlockingQueue(); + // Creating Producer and Consumer Thread + Thread prodThread = new Thread(new Producer(sharedQueue)); + Thread consThread = new Thread(new Consumer(sharedQueue)); + // Starting producer and Consumer thread + prodThread.start(); + consThread.start(); + } +} + +``` +#### 2.使用 Object 的 wait()和 notify()实现 +```java +PriorityQueue queue = new PriorityQueue(10);//充当缓冲区 + +class Consumer extends Thread { + public void run() { + while (true) { + synchronized (queue) { + while (queue.size() == 0) {//队列空的条件下阻塞 + try { + queue.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + queue.notify(); + } + } + queue.poll(); // 每次移走队首元素 + queue.notify(); + } + } + } +} + +class Producer extends Thread { + public void run() { + while (true) { + synchronized (queue) { + while (queue.size() == 10) {//队列满了的条件下阻塞 + try { + queue.wait(); + + } catch (InterruptedException e) { + e.printStackTrace(); + queue.notify(); + } + } + queue.offer(1); // 每次插入一个元素 + queue.notify(); + } + } + } +} +``` +#### 3.使用 Condition 实现 +```java + +private PriorityQueue queue = new PriorityQueue(10); +private Lock lock = new ReentrantLock(); +private Condition notFull = lock.newCondition(); +private Condition notEmpty = lock.newCondition(); + +class Consumer extends Thread { + public void run() { + while (true) { + lock.lock(); + try { + while (queue.size() == 0) { + try { + notEmpty.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + queue.poll(); // 每次移走队首元素 + notFull.signal(); + } finally { + lock.unlock(); + } + } + } +} + +class Producer extends Thread { + public void run() { + while (true) { + lock.lock(); + try { + while (queue.size() == 10) { + try { + notFull.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + queue.offer(1); // 每次插入一个元素 + notEmpty.signal(); + } finally { + lock.unlock(); + } + } + } +} +``` + + ### 3. 编程实现一个最大元素为 100 的阻塞队列。 +```java +Lock lock = new ReentrantLock(); +Condition notFull = lock.newCondition(); +Condition notEmpty = lock.newCondition(); + +Object[] items = new Object[100]; + +int putptr, takeptr, count; + +public void put(Object x) throws InterruptedException { + lock.lock(); + try { + while (count == items.length) + notFull.await(); + items[putptr] = x; + if (++putptr == items.length) + putptr = 0; + ++count; + notEmpty.signal(); + } finally { + lock.unlock(); + } +} + +public Object take() throws InterruptedException { + lock.lock(); + try { + while (count == 0) + notEmpty.await(); + Object x = items[takeptr]; + if (++takeptr == items.length) + takeptr = 0; + --count; + notFull.signal(); + return x; + } finally { + lock.unlock(); + } +} +``` + + + + ### 4. 设计一个双缓冲阻塞队列,写代码。 +     + 在服务器开发中,通常的做法是把逻辑处理线程和 I/O 处理线程分离。
+     + 逻辑处理线程:对接收的包进行逻辑处理。
+     + I/0 处理线程:网络数据的发送和接收,连接的建立和维护。
+     + 通常逻辑处理线程和 I/O 处理线程是通过数据队列来交换数据,就是生产 +者--消费者模型。
+     + 这个数据队列是多个线程在共享,每次访问都需要加锁,因此如何减少互 +斥/同步的开销就显得尤为重要。解决方案:双缓冲队列。 +     + 两个队列,将读写分离,一个给逻辑线程读,一个给 IO 线程用来写,当 +逻辑线程读完队列后会将自己的队列与 IO 线程的队列相调换。这里需要加锁的 +地方有两个,一个是 IO 线程每次写队列时都要加锁,另一个是逻辑线程在调换 +队列时也需要加锁,但逻辑线程在读队列时是不需要加锁的。如果是一块缓冲 +区,读、写操作是不分离的,双缓冲区起码节省了单缓冲区时读部分操作互斥/ +同步的开销。本质是采用空间换时间的优化思路。
+ + ### 5. Java 中的队列都有哪些,有什么区别。 +     + 队列都实现了 Queue 接口。
+     + 阻塞队列和非阻塞队列。
+     + 阻塞队列:见上面的讲解。
+     + 非阻塞队列:LinkedList,PriorityQueue。
+ --- diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_\345\244\232\347\272\277\347\250\213\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_\345\244\232\347\272\277\347\250\213\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" index c085efa..1c11c66 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_\345\244\232\347\272\277\347\250\213\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_\345\244\232\347\272\277\347\250\213\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" @@ -5,72 +5,900 @@ --- 1. 如果不用锁机制如何实现共享数据访问。
2. 说一下 java 中的多线程。
-3. Java 中 Runnable 和 Callable 有什么不同?
-4. 一个类是否可以同时继承 Thread 和实现 Runnable接口?
-5. 实现多线程的同步。
-6. volatile 和 synchronized 区别。
-7. 什么场景下可以使用 volatile 替换 synchronized?
-8. wait()/notify()/notifyAll()的用法(Java 中怎样唤醒一个阻塞的线程?)。
-9. 为什么 wait(),notify(),notifyAll()等方法都定义在 Object 类中?
-10. notify()和 notifyAll()有什么区别?
-11. CAS
-12. 同步锁的分类?
-13. 锁的分类?
-14. java 中的悲观锁和乐观锁?
-15. 实现线程之间的通信?
-16. 如何确保线程安全?
-17. 多线程的优点和缺点?
-18. 写出 3 条你遵循的多线程最佳实践。
-19. 多线程的性能一定就优于单线程吗?
-20. 多线程中锁的种类。
-21. 锁优化
-22. wait()和 sleep()的区别。
-23. Java 中 interrupted() 和 isInterrupted()方法的区别?
-24. Java 创建线程之后,直接调用 start()方法和 run()的区别 ?
-25. 什么是线程的上下文切换?
-26. 怎么检测一个线程是否拥有锁?
-27. 用户线程和守护线程有什么区别?
-28. 什么是线程调度器?
-29. 线程的状态。
-30. 有三个线程 T1,T2,T3,怎么确保它们按顺序执行?
-31. 在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成。多种方式,考虑效率。
-32. java 程序如何停止一个线程?
- - - - -### 1. 如果不用锁机制如何实现共享数据访问。 +3. 实现线程之间的通信?
+4. 如何确保线程安全?
+5. 多线程的优点和缺点?
+6. 写出 3 条你遵循的多线程最佳实践。
+7. 多线程的性能一定就优于单线程吗?
+8. 多线程中锁的种类。
+9. 锁优化
+10. wait()和 sleep()的区别。
+11. Java 中 interrupted() 和 isInterrupted()方法的区别?
+12. Java 创建线程之后,直接调用 start()方法和 run()的区别 ?
+13. 什么是线程的上下文切换?
+14. 怎么检测一个线程是否拥有锁?
+15. 用户线程和守护线程有什么区别?
+16. 什么是线程调度器?
+17. 线程的状态。
+18. 有三个线程 T1,T2,T3,怎么确保它们按顺序执行?
+19. 在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成。多种方式,考虑效率。
+20. java 程序如何停止一个线程?
+ + + +### 1. 如果不用锁机制如何实现共享数据访问。(不要用锁,不要用sychronized 块或者方法,也不要直接使用 jdk 提供的线程安全的数据结构,需要自己实现一个类来保证多个线程同时读写这个类中的共享数据是线程安全的,怎么办?) +     + 无锁化编程的常用方法:硬件 CPU 同步原语 CAS(Compare a +nd Swap),如无锁栈,无锁队列(ConcurrentLinkedQueue)等等。现在 +几乎所有的 CPU 指令都支持 CAS 的原子操作, X86 下对应的是 CMPXCHG 汇 +编指令,处理器执行 CMPXCHG 指令是一个原子性操作。有了这个原子操作, +我们就可以用其来实现各种无锁(lock free)的数据结构。
+     + CAS 实现了区别于 sychronized 同步锁的一种乐观锁,当多个线程尝试使 +用 CAS 同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线 +程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再 +次尝试。CAS 有 3 个操作数,内存值 V,旧的预期值 A,要修改后的新值 B。 +当且仅当预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都不做。 +其实 CAS 也算是有锁操作,只不过是由 CPU 来触发,比 synchronized 性能 +好的多。 CAS 的关键点在于,系统在硬件层面保证了比较并交换操作的原子性, +处理器使用基于对缓存加锁或总线加锁的方式来实现多处理器之间的原子操 +作。CAS 是非阻塞算法的一种常见实现。
+     + 一个线程间共享的变量,首先在主存中会保留一份,然后每个线程的工作 +内存也会保留一份副本。这里说的预期值,就是线程保留的副本。当该线程从 +主存中获取该变量的值后,主存中该变量可能已经被其他线程刷新了,但是该 +线程工作内存中该变量却还是原来的值,这就是所谓的预期值了。当你要用 CAS +刷新该值的时候,如果发现线程工作内存和主存中不一致了,就会失败,如果 +一致,就可以更新成功。
+     + Atomic 包提供了一系列原子类。这些类可以保证多线程环境下,当某个 +线程在执行 atomic 的方法时,不会被其他线程打断,而别的线程就像自旋锁一 +样,一直等到该方法执行完成,才由 JVM 从等待队列中选择一个线程执行。 +Atomic 类在软件层面上是非阻塞的,它的原子性其实是在硬件层面上借助相关 +的指令来保证的。
+     + AtomicInteger 是一个支持原子操作的 Integer 类,就是保证对 +AtomicInteger 类型变量的增加和减少操作是原子性的,不会出现多个线程下 +的数据不一致问题。如果不使用 AtomicInteger,要实现一个按顺序获取的 +ID,就必须在每次获取时进行加锁操作,以避免出现并发时获取到同样的 ID +的现象。Java 并发库中的 AtomicXXX 类均是基于这个原语的实现,拿出 +AtomicInteger 来研究在没有锁的情况下是如何做到数据正确性的:
+     + 来看看++i 是怎么做到的。 + +```java +public final int incrementAndGet() { + for (;;) { + int current = get(); + int next = current + 1; + if (compareAndSet(current, next)) + return next; + } +} +``` + +     + 在这里采用了 CAS 操作,每次从内存中读取数据然后将此数据和+1 后的 +结果进行 CAS 操作,如果成功就返回结果,否则重试直到成功为止。
+     + 而 compareAndSet 利用 JNI 来完成 CPU 指令的操作,非阻塞算法。 +```java +public final boolean compareAndSet(int expect, int update) { + return unsafe.compareAndSwapInt(this, valueOffset, expect, update); +} +``` + +     + 其中,unsafe.compareAndSwapInt()是一个 native 方法,正是调用 +CAS 原语完成该操作。
+     + 首先假设有一个变量 i, i 的初始值为 0。每个线程都对 i 进行+1 操作。 CAS +是这样保证同步的:
+假设有两个线程,线程 1 读取内存中的值为 0,current = 0,next = 1,然 +后挂起,然后线程 2 对 i 进行操作,将 i 的值变成了 1。线程 2 执行完,回到线 +程 1,进入 if 里的 compareAndSet 方法,该方法进行的操作的逻辑是,(1) +如果操作数的值在内存中没有被修改,返回 true,然后 compareAndSet 方法 +返回 next 的值(2)如果操作数的值在内存中被修改了,则返回 false,重新 +进入下一次循环,重新得到 current 的值为 1,next 的值为 2,然后再比较, +由于这次没有被修改,所以直接返回 2。
+     + 那么,为什么自增操作要通过 CAS 来完成呢?仔细观察 +incrementAndGet()方法,发现自增操作其实拆成了两步完成的:
+     + int current = get();
+     + int next = current + 1;
+     + 由于 volatile 只能保证读取或写入的是最新值,那么可能出现以下情况:
+     + 1.A 线程执行 get()操作,获取 current 值(假设为 1)
+     + 2.B 线程执行 get()操作,获取 current 值(为 1)
+     + 3.B 线程执行 next = current + 1 操作,next = 2
+     + 4.A 线程执行 next = current + 1 操作,next = 2
+     + 这样的结果明显不是我们想要的,所以,自增操作必须采用 CAS 来完成。 +CAS 的优缺点
+     + CAS 由于是在硬件层面保证的原子性,不会锁住当前线程,它的效 +率是很高的。
+     + CAS 虽然很高效的实现了原子操作,但是它依然存在三个问题。
+ +#### 1、ABA 问题。 +     + CAS 在操作值的时候检查值是否已经变化,没有变化的情况下 +才会进行更新。但是如果一个值原来是 A,变成 B,又变成 A,那么 CAS 进行 +检查时会认为这个值没有变化,操作成功。 ABA 问题的解决方法是使用版本号。 +在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么 A-B-A +就变成 1A-2B-3A。从 Java1.5 开始 JDK 的 atomic 包里提供了一个类 +AtomicStampedReference 来解决 ABA 问题。从 Java1.5 开始 JDK 的 +atomic 包里提供了一个类 AtomicStampedReference 来解决 ABA 问题。这 +个类的 compareAndSet 方法作用是首先检查当前引用是否等于预期引用,并 +且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标 +志的值设置为给定的更新值。
+     + CAS 算法实现一个重要前提是需要取出内存中某时刻的数据,而在下一时 +刻把取出后的数据和内存中原始数据比较并替换,那么在这个时间差内会导致 +数据的变化。
+     + 比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 也从 +内存中取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数 +据变成 A,这时候线程 one 进行 CAS 操作发现内存中仍然是 A,然后 one 操 +作成功。尽管线程 one 的 CAS 操作成功,但是不代表这个过程就是没有问题 +的。如果链表的头在变化了两次后恢复了原值,但是不代表链表就没有变化。 +因此前面提到的原子操作 +AtomicStampedReference/AtomicMarkableReference 就很有用了。这允 +许一对变化的元素进行原子操作。
+     + 现有一个用单向链表实现的堆栈,栈顶为 A,这时线程 T1 已经知道 A.next +为 B,然后希望用 CAS 将栈顶替换为 B:
+     + head.compareAndSet(A,B);
+     + 在 T1 执行上面这条指令之前,线程 T2 介入,将 A、B 出栈,再 pushD、 +C、A,此时堆栈结构如下图,而对象 B 此时处于游离状态:
+![06_1_1](/data/images/Java应届生面试突击/多线程和并发/06_1_1.png)
+ +     + 此时轮到线程 T1 执行 CAS 操作,检测发现栈顶仍为 A,所以 CAS 成功, +栈顶变为 B,但实际上 B.next 为 null,所以此时的情况变为:
+ +![06_1_2](/data/images/Java应届生面试突击/多线程和并发/06_1_2.png)
+ +     + 其中堆栈中只有 B 一个元素,C 和 D 组成的链表不再存在于堆栈中,平白 +无故就把 C、D 丢掉了。
+     + 以上就是由于 ABA 问题带来的隐患,各种乐观锁的实现中通常都会用版本 +号 version 来对记录或对象标记,避免并发操作带来的问题。在 Java 中, +AtomicStampedReference也实现了这个作用,它通过包装[E,Integer] +的元组来对对象标记版本戳 stamp,从而避免 ABA 问题。 + +#### 2、循环时间长开销大。 +     + 自旋 CAS 如果长时间不成功,会给 CPU 带来非常大的 +执行开销。因此 CAS 不适合竞争十分频繁的场景。 + +#### 3. 只能保证一个共享变量的原子操作。 +     + 当对一个共享变量执行操作时,我们可 +以使用循环 CAS 的方式来保证原子操作,但是对多个共享变量操作时,循环 +CAS 就无法保证操作的原子性,这个时候就可以用锁。
+     + 这里粘贴一个,模拟 CAS 实现的计数器: +```java +public class CASCount implements Runnable { + private SimilatedCAS counter = new SimilatedCAS(); + + public void run() { + for (int i = 0; i < 10000; i++) { + System.out.println(this.increment()); + } + } + + public int increment() { + int oldValue = counter.getValue(); + int newValue = oldValue + 1; + while (!counter.compareAndSwap(oldValue, newValue)) { //如果 CAS 失败,就去拿新值继续执行 CAS + oldValue = counter.getValue(); + newValue = oldValue + 1; + } + return newValue; + } + + public static void main(String[] args) { + Runnable run = new CASCount(); + + new Thread(run).start(); + new Thread(run).start(); + new Thread(run).start(); + new Thread(run).start(); + new Thread(run).start(); + new Thread(run).start(); + } + +} + +class SimilatedCAS { + private int value; + + public int getValue() { + return value; + } + + // 这里只能用 synchronized 了,毕竟无法调用操作系统的 CAS + public synchronized boolean compareAndSwap(int expectedValue, int newValue) { + if (value == expectedValue) { + value = newValue; + return true; + } + return false; + } +} + +``` + ### 2. 说一下 java 中的多线程。 -### 3. Java 中 Runnable 和 Callable 有什么不同? -### 4. 一个类是否可以同时继承 Thread 和实现 Runnable接口? -### 5. 实现多线程的同步。 -### 6. volatile 和 synchronized 区别。 -### 7. 什么场景下可以使用 volatile 替换 synchronized? -### 8. wait()/notify()/notifyAll()的用法(Java 中怎样唤醒一个阻塞的线程?)。 -### 9. 为什么 wait(),notify(),notifyAll()等方法都定义在 Object 类中? -### 10. notify()和 notifyAll()有什么区别? -### 11. CAS -### 12. 同步锁的分类? -### 13. 锁的分类? -### 14. java 中的悲观锁和乐观锁? -### 15. 实现线程之间的通信? -### 16. 如何确保线程安全? -### 17. 多线程的优点和缺点? -### 18. 写出 3 条你遵循的多线程最佳实践。 -### 19. 多线程的性能一定就优于单线程吗? -### 20. 多线程中锁的种类。 -### 21. 锁优化 -### 22. wait()和 sleep()的区别。 -### 23. Java 中 interrupted() 和 isInterrupted()方法的区别? -### 24. Java 创建线程之后,直接调用 start()方法和 run()的区别 ? -### 25. 什么是线程的上下文切换? -### 26. 怎么检测一个线程是否拥有锁? -### 27. 用户线程和守护线程有什么区别? -### 28. 什么是线程调度器? -### 29. 线程的状态。 -### 30. 有三个线程 T1,T2,T3,怎么确保它们按顺序执行? -### 31. 在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成。多种方式,考虑效率。 -### 32. java 程序如何停止一个线程? +*1. Java 中实现多线程的四种方式(创建多线程的四种方式)?* +#### 一、继承 Thread 类创建线程类 +(1)定义 Thread 类的子类,并重写该类的 run 方法,该 run 方法的方 +法体就代表了线程要完成的任务。因此把 run()方法称为执行体。
+(2)创建 Thread 子类的实例,即创建了线程对象。
+(3)调用线程对象的 start()方法来启动该线程。
+#### 二、通过 Runnable 接口创建线程类 +(1)定义 Runnable 接口的实现类,并重写该接口的 run()方法,该 run() +方法的方法体同样是该线程的线程执行体。
+(2)创建 Runnable 实现类的实例,并依此实例作为 Thread 的 target +来创建 Thread 对象,该 Thread 对象才是真正的线程对象。
+(3)调用线程对象的 start()方法来启动该线程。
+#### 三、通过 Callable 和 Future 创建线程 +(1)创建 Callable 接口的实现类,并实现 call()方法,该 call()方法将作 +为线程执行体,并且有返回值。
+(2)创建 Callable 实现类的实例,使用 FutureTask 类来包装 Callable +对象,该 FutureTask 对象封装了该 Callable 对象的 call()方法的返回值。
+(3)使用 FutureTask 对象作为 Thread 对象的 target 创建并启动新线 +程。
+(4)调用 FutureTask 对象的 get()方法来获得子线程执行结束后的返回 +值。
+#### 四、通过线程池创建线程 +利用线程池不用 new 就可以创建线程,线程可复用,利用 Executors 创 +建线程池。
+ + +#### 扩展1:Java 中 Runnable 和 Callable 有什么不同? +I. Callable 定义的方法是 call(),而 Runnable 定义的方法是 run()。
+II. Callable 的 call 方法可以有返回值,而 Runnable 的 run 方法不能有 +返回值。
+III. Callable 的 call 方法可抛出异常,而 Runnable 的 run 方法不能抛出 +异常。
+ +#### 扩展2:一个类是否可以同时继承 Thread 和实现 Runnable接口?< +     + 可以。比如下面的程序可以通过编译。因为 Test 类从 Thread 类中继承了 +run()方法,这个 run()方法可以被当作对 Runnable 接口的实现。 +```java +public class Test extends Thread implements Runnable { + public static void main(String[] args) { + Thread t = new Thread(new Test()); + t.start(); + } +} +``` + +*2. 实现多线程的同步。*
+      + 在多线程的环境中,经常会遇到数据的共享问题,即当多个线程需要访问同 +一资源时,他们需要以某种顺序来确保该资源在某一时刻只能被一个线程使用, +否则,程序的运行结果将会是不可预料的,在这种情况下,就必须对数据进行 +同步。
+      + 在 Java 中,提供了四种方式来实现同步互斥访问: synchronized 和 Lock +和 wait()/notify()/notifyAll()方法和 CAS。
+### 一.synchronized 的用法。 +1. 同步代码块
+synchronized 块写法:
+synchronized(object)
+{
+}
+     + 表示线程在执行的时候会将 object 对象上锁。(注意这个对象可以是任意 +类的对象,也可以使用 this 关键字或者是 class 对象)。
+      + 可能一个方法中只有几行代码会涉及到线程同步问题,所以 synchronized +块 比 synchronized 方法更加细粒度地控制了多个线程的访问, 只有 +synchronized 块中的内容不能同时被多个线程所访问,方法中的其他语句仍然 +可以同时被多个线程所访问(包括 synchronized 块之前的和之后的)。
+2. 修饰非静态的方法
+     + 当 synchronized 关键字修饰一个方法的时候,该方法叫做同步方法。
+     + Java 中的每个对象都有一个锁(lock),或者叫做监视器(monitor), +当一个线程访问某个对象的 synchronized 方法时,将该对象上锁,其他任何 +线程都无法再去访问该对象的 synchronized 方法了(这里是指所有的同步方 +法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是 +抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的 +synchronized 方法。
+      + 注意这时候是给对象上锁,如果是不同的对象,则各个对象之间没有限制 +关系。
+      + 注意,如果一个对象有多个 synchronized 方法,某一时刻某个线程已经进入 +到了某个 synchronized 方法,那么在该方法没有执行完毕前,其他线程是无法访 +问该对象的任何 synchronized 方法的。
+3. 修饰静态的方法
+     + 当一个 synchronized 关键字修饰的方法同时又被 static 修饰,之前说过, +非静态的同步方法会将对象上锁,但是静态方法不属于对象,而是属于类,它 +会将这个方法所在的类的 Class 对象上锁。一个类不管生成多少个对象,它们 +所对应的是同一个 Class 对象。
+      + 因此,当线程分别访问同一个类的两个对象的两个 static,synchronized +方法时,它们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行 +完毕后另一个线程才开始。
+*结论:*
+     + synchronized 方法是一种粗粒度的并发控制,某一时刻,只能有一个线 +程执行该 synchronized 方法。
+     + synchronized 块则是一种细粒度的并发控制,只会将块中的代码同步, +位于方法内,synchronized 块之外的其他代码是可以被多个线程同时访问到 +的。 +### 二.Lock 的用法。 +     + 使用 Lock 必须在 try-catch-finally 块中进行,并且将释放锁的操作放在 +finally 块中进行,以保证锁一定被释放,防止死锁的发生。通常使用 Lock 来 +进行同步的话,是以下面这种形式去使用的: +```java +Lock lock = ...; +lock.lock(); +try{ + //处理任务 +}catch(Exception ex){ + +}finally{ + lock.unlock();//释放锁 +} + +``` +     + Lock 和 synchronized 的区别和 Lock 的优势。你需要实现 +一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此 +来保持它的完整性,你会怎样去实现它?
+      + 1)Lock 是一个接口,而 synchronized 是 Java 中的关键字, +synchronized 是内置的语言实现;
+      + 2)synchronized 在发生异常时,会自动释放线程占有的锁,因此不会导 +致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放 +锁,则很可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁;
+     + 3)Lock 可以让等待锁的线程响应中断(可中断锁),而 synchronized +却不行,使用 synchronized 时,等待的线程会一直等待下去,不能够响应中 +断(不可中断锁);
+      + 4)通过 Lock 可以知道有没有成功获取锁(tryLock()方法:如果获取 +了锁,则返回 true;否则返回 false,也就说这个方法无论如何都会立即返回。 +在拿不到锁时不会一直在那等待。),而 synchronized 却无法办到。
+     + 5)Lock 可以提高多个线程进行读操作的效率(读写锁)。
+     + 6)Lock 可以实现公平锁,synchronized 不保证公平性。 +在性能上来说,如果线程竞争资源不激烈时,两者的性能是差不多的,而 +当竞争资源非常激烈时(即有大量线程同时竞争),此时 Lock 的性能要远远优 +于 synchronized。所以说,在具体使用时要根据适当情况选择。
+ +#### 扩展1: volatile 和 synchronized 区别。 +1. volatile 是变量修饰符,而 synchronized 则作用于代码块或方法。 +2. volatile 不会对变量加锁,不会造成线程的阻塞;synchronized 会 +对变量加锁,可能会造成线程的阻塞。 +3. volatile 仅能实现变量的修改可见性,并不能保证原子性;而 +synchronized 则 可 以 保 证 变 量 的 修 改 可 见 性 和 原 子 性 。 +(synchronized 有两个重要含义:它确保了一次只有一个线程可以执 +行代码的受保护部分(互斥),而且它确保了一个线程更改的数据对于 +其它线程是可见的(更改的可见性),在释放锁之前会将对变量的修改 +刷新到主存中)。 +4. volatile 标记的变量不会被编译器优化,禁止指令重排序; +synchronized 标记的变量可以被编译器优化。 + +#### 扩展 2:什么场景下可以使用 volatile 替换 synchronized? +     + 只需要保证共享资源的可见性的时候可以使用 volatile 替代, +synchronized 保证可操作的原子性,一致性和可见性。 + +### 三.wait()\notify()\notifyAll()的用法(Java 中怎样唤醒一个阻塞的线程?)。 +     + 在 Java 发展史上曾经使用 suspend()、resume()方法对于线程进行阻塞唤醒,但随之出 +现很多问题,比较典型的还是死锁问题。
+     + 解决方案可以使用以对象为目标的阻塞,即利用 Object 类的 wait()和 notify()方法实现 +线程阻塞。
+     + 首先,wait、notify 方法是针对对象的,调用任意对象的 wait()方法都将导致线程阻塞, +阻塞的同时也将释放该对象的锁,相应地,调用任意对象的 notify()方法则将随机解除该对 +象阻塞的线程,但它需要重新获取改对象的锁,直到获取成功才能往下执行;其次,wait、 +notify 方法必须在 synchronized 块或方法中被调用,并且要保证同步块或方法的锁对象与调 +用 wait、notify 方法的对象是同一个,如此一来在调用 wait 之前当前线程就已经成功获取 +某对象的锁,执行 wait 阻塞后当前线程就将之前获取的对象锁释放。 +#### 扩展 1: 为什么 wait(),notify(),notifyAll()等方法都定义在 Object 类中? +      + 因为这三个方法都需要定义在同步代码块或同步方法中,这些方法的调用是依赖锁对 +象的,而同步代码块或同步方法中的锁对象可以是任意对象,那么能被任意对象调用的方 +法一定定义在 Object 类中。 +#### 扩展 2: notify()和 notifyAll()有什么区别? +notify()和 notifyAll()都是 Object 对象用于通知处在等待该对象的线程的方法。
+void notify(): 唤醒一个正在等待该对象的线程,进入就绪队列等待 CPU 的调度。
+void notifyAll(): 唤醒所有正在等待该对象的线程,进入就绪队列等待 CPU 的调度。
+两者的最大区别在于:
+notifyAll 使所有原来在该对象上等待被 notify 的线程统统退出 wait 的状态,变成等待该对 +象上的锁,一旦该对象被解锁,他们就会去竞争。 +notify 他只是选择一个 wait 状态线程进行通知,并使它获得该对象上的锁,但不惊动其他 +同样在等待被该对象 notify 的线程们,当第一个线程运行完毕以后释放对象上的锁,此时 +如果该对象没有再次使用 notify 语句,即便该对象已经空闲,其他 wait 状态等待的线程由 +于没有得到该对象的通知,继续处在 wait 状态,直到这个对象发出一个 notify 或 notifyAll, +它们等待的是被 notify 或 notifyAll,而不是锁。 +### 四.CAS +     + 它是一种非阻塞的同步方式。具体参见上面的部分。 +#### 扩展一:同步锁的分类? +      + Synchronized 和 Lock 都是悲观锁。 +     + 乐观锁,CAS 同步原语,如原子类,非阻塞同步方式。 +#### 扩展二:锁的分类? +     + 一种是代码层次上的,如 java 中的同步锁,可重入锁,公平锁,读写锁。 +     + 另外一种是数据库层次上的,比较典型的就是悲观锁和乐观锁,表锁,行锁,页锁。 +#### 扩展三:java 中的悲观锁和乐观锁? +     + 悲观锁:悲观锁是认为肯定有其他线程来争夺资源,因此不管到底会不会发生争夺, +悲观锁总是会先去锁住资源,会导致其它所有需要锁的线程挂起,等待持有锁的线程释放 +锁。Synchronized 和 Lock 都是悲观锁。
+     + 乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直 +到成功为止。就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操 +作(竞争),这是一种乐观的态度,通常是基于 CAS 原子指令来实现的。CAS 通常不会将 +线程挂起,因此有时性能会好一些。乐观锁的一种实现方式——CAS。 + + +### 3. 实现线程之间的通信? +当线程间是可以共享资源时,线程间通信是协调它们的重要的手段。 +1. Object 类中 wait()\notify()\notifyAll()方法。 + +2. 用 Condition 接口。
+     + Condition 是被绑定到 Lock 上的,要创建一个 Lock 的 Condition 对 +象必须用 newCondition()方法。在一个 Lock 对象里面可以创建多个 +Condition 对象,线程可以注册在指定的 Condition 对象中,从而可以有 +选择性地进行线程通知,在线程调度上更加灵活。
+      + 在 Condition 中,用 await()替换 wait(),用 signal()替换 notify(), +用 signalAll()替换 notifyAll(),传统线程的通信方式, Condition 都可以实现。 +调用 Condition 对象中的方法时,需要被包含在 lock()和 unlock()之间。
+ +3. 管道实现线程间的通信。
+      + 实现方式:一个线程发送数据到输出管道流,另一个线程从输入管道流中 +读取数据。
+     + 基本流程:
+     + 1)创建管道输出流 PipedOutputStream pos 和管道输入流 +PipedInputStream pis。
+     + 2)将 pos 和 pis 匹配,pos.connect(pis)。
+     + 3)将 pos 赋给信息输入信息的线程,pis 赋给获取信息的线程,就可以实 +现线程间的通讯了。
+     + 缺点:
+     + 1)管道流只能在两个线程之间传递数据。
+     + 线程 consumer1 和 consumer2 同时从 pis 中 read 数据,当线程 +producer 往管道流中写入一段数据(1,2,3,4,5,6)后,每一个时刻只有一个 +线程能获取到数据,并不是两个线程都能获取到 producer 发送来的数据,因 +此一个管道流只能用于两个线程间的通讯。
+      + 2)管道流只能实现单向发送,如果要两个线程之间互通讯,则需要两个管道 +流。
+     + 线程 producer 通过管道流向线程 consumer 发送数据,如果线程 +consumer 想给线程 producer 发送数据,则需要新建另一个管道流 pos1 和 +pis1,将 pos1 赋给 consumer1,将 pis1 赋给 producer1。
+ +4. 使用 volatile 关键字
+见上面部分。 + + +### 4. 如何确保线程安全? +     + 如果多个线程同时运行某段代码,如果每次运行结果和单线程运行的结果 +是一样的,而且其他变量的值也和预期的是一样的,就是线程安全的。 +     + Synchronized,Lock,原子类(如 atomicinteger 等),同步容器、并 +发容器、 阻塞队列 、 同步辅助类(比 如 CountDownLatch, Semaphore, +CyclicBarrier)。 + + +### 5. 多线程的优点和缺点? +优点:
+1.充分利用 cpu,避免 cpu 空转。
+2.程序响应更快。
+缺点:
+1.上下文切换的开销
+     + 当 CPU 从执行一个线程切换到执行另外一个线程的时候,它需要先存储当 +前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据,程序指 +针等,最后才开始执行。这种切换称为“上下文切换”。CPU 会在一个上下文 +中执行一个线程,然后切换到另外一个上下文中执行另外一个线程。上下文切 +换并不廉价。如果没有必要,应该减少上下文切换的发生。
+2.增加资源消耗
+     + 线程在运行的时候需要从计算机里面得到一些资源。 除了 CPU,线程还需 +要一些内存来维持它本地的堆栈。它也需要占用操作系统中一些资源来管理线 +程。
+3.编程更复杂
+     + 在多线程访问共享数据的时候,要考虑线程安全问题。
+ + +### 6. 写出 3 条你遵循的多线程最佳实践。 +1. 给线程起个有意义的名字。 +2. 避免锁定和缩小同步的范围 。 +相对于同步方法我更喜欢同步块,它给我拥有对锁的绝对控制权。 +3. 多用同步辅助类,少用 wait 和 notify 。 +首先,CountDownLatch, Semaphore, CyclicBarrier 这些同步辅助 +类简化了编码操作,而用 wait 和 notify 很难实现对复杂控制流的控制。其次, +这些类是由最好的企业编写和维护在后续的 JDK 中它们还会不断优化和完善, +使用这些更高等级的同步工具你的程序可以不费吹灰之力获得优化。 +4. 多用并发容器,少用同步容器。 +如果下一次你需要用到 map,你应该首先想到用 ConcurrentHashMap。 + +### 7. 多线程的性能一定就优于单线程吗? +      + 不一定,要看具体的任务以及计算机的配置。比如说:
+      + 对于单核 CPU,如果是 CPU 密集型任务,如解压文件,多线程的性能反 +而不如单线程性能,因为解压文件需要一直占用 CPU 资源,如果采用多线程, +线程切换导致的开销反而会让性能下降。如果是交互类型的任务,肯定是需要 +使用多线程的。
+     + 对于多核 CPU,对于解压文件来说,多线程肯定优于单线程,因为多个线 +程能够更加充分利用每个核的资源。 + +### 8. 多线程中锁的种类。 +1. 可重入锁
+     + ReentrantLock 和 synchronized 都是可重入锁。
+     + 如果当前线程已经获得了某个监视器对象所持有的锁,那么该线程在该方法 +中调用另外一个同步方法也同样持有该锁。
+比如:
+ +```java +public sychrnozied void test() { + xxxxxx; + test2(); +} +public sychronized void test2() { + yyyyy; +} +``` +     + 在上面代码段中,执行 test 方法需要获得当前对象作为监视器的对象锁, +但方法中又调用了 test2 的同步方法。
+     + 如果锁是具有可重入性的话,那么该线程在调用 test2 时并不需要再次获 +得当前对象的锁,可以直接进入 test2 方法进行操作。
+     + 可重入锁最大的作用是避免死锁。如果锁是不具有可重入性的话,那么该 +线程在调用 test2 前会等待当前对象锁的释放,实际上该对象锁已被当前线程 +所持有,不可能再次获得,那么线程在调用同步方法、含有锁的方法时就会产 +生死锁。
+2. 可中断锁
+     + 顾名思义,就是可以响应中断的锁。
+     + 在 Java 中,synchronized 不是可中断锁,而 Lock 是可中断锁。 +lockInterruptibly()的用法已经体现了 Lock 的可中断性。如果某一线程 A 正 +在执行锁中的代码,另一线程 B 正在等待获取该锁,可能由于等待时间过长, +线程 B 不想等待了,想先处理其他事情,我们可以让它中断自己或者在别的线 +程中断它,这种就是可中断锁。
+3. 公平锁
+     + 在 Java 中,synchronized 就是非公平锁,它无法保证等待的线程获取锁 +的顺序。而对于 ReentrantLock 和 ReentrantReadWriteLock,它默认情况 +下是非公平锁,但是可以设置为公平锁。
+      + 公平锁即尽量以请求锁的顺序来获取锁。比如同是有多个线程在等待一个 +锁,当这个锁被释放时,等待时间最久的线程(最先请求的线程)会获得该锁, +这种就是公平锁。
+4. 读写锁
+     + 正因为有了读写锁,才使得多个线程之间的读操作不会发生冲突。 +ReadWriteLock 就是读写锁,它是一个接口,ReentrantReadWriteLock 实 +现了这个接口。可以通过 readLock()获取读锁,通过 writeLock()获取写锁。 + +### 9. 锁优化 +1. 自旋锁
+     + 为了让线程等待,让线程执行一个忙循环(自旋)。需要物理机器有一个以 +上的处理器。自旋等待虽然避免了线程切换的开销,但它是要占用处理器时间 +的,所以如果锁被占用的时间很短,自旋等待的效果就会非常好,反之自旋的 +线程只会白白消耗处理器资源。自旋次数的默认值是 10 次,可以使用参数 +-XX:PreBlockSpin 来更改。
+      + 自适应自旋锁:自旋的时间不再固定,而是由前一次在同一个锁上的自旋 +时间及锁的拥有者的状态来决定。
+2. 锁清除
+      + 指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不 +可能存在共享数据竞争的锁进行清除(逃逸分析技术:在堆上的所有数据都不会 +逃逸出去被其它线程访问到,可以把它们当成栈上数据对待)。
+3. 锁粗化
+     + 如果虚拟机探测到有一串零碎的操作都对同一个对象加锁,将会把加锁同 +步的范围扩展到整个操作序列的外部。
+4. 轻量级锁
+      + 在代码进入同步块时,如果此同步对象没有被锁定,虚拟机首先将在当前 +线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储所对象目 +前的 Mark Word 的拷贝。然后虚拟机将使用 CAS 操作尝试将对象的 Mark +Word 更新为执行 Lock Record 的指针。如果成功,那么这个线程就拥有了该 +对象的锁。如果更新操作失败,虚拟机首先会检查对象的 Mark Word 是否指 +向当前线程的栈帧,如果是就说明当前线程已经拥有了这个对象的锁,否则说 +明这个对象已经被其它线程抢占。如果有两条以上的线程争用同一个锁,那轻 +量级锁就不再有效,要膨胀为重量级锁。
+      + 解锁过程:如果对象的 Mark Word 仍然指向着线程的锁记录,那就用 CAS +操作把对象当前的 Mark Word 和和线程中复制的 Displaced Mark Word 替 +换回来,如果替换成功,整个过程就完成。如果失败,说明有其他线程尝试过 +获取该锁,那就要在释放锁的同时,唤醒被挂起的线程。
+     + 轻量级锁的依据:对于绝大部分的锁,在整个同步周期内都是不存在竞争 +的。
+      + 传统锁(重量级锁)使用操作系统互斥量来实现的。 + +HotSpot 虚拟机的对象的内存布局:对象头(Object Header)分为两部分信息吗,第 +一部分(Mark Word)用于存储对象自身的运行时数据,另一个部分用于存储指向方法区 +对象数据类型的指针,如果是数组的话,还会由一个额外的部分用于存储数组的长度。
+32 位 HotSpot 虚拟机中对象未被锁定的状态下, Mark Word 的 32 个 Bits 空间中 25 位 +用于存储对象哈希码,4 位存储对象分代年龄,2 位存储锁标志位,1 位固定为 0。
+HotSpot 虚拟机对象头 Mark Word
+ + |--------------------------------------------------| + |存储内容 |标志位 |状态 | + | -------------------------------------------------| + |对象哈希码、对象分代年龄 |01 |未锁定 | + |--------------------------------------------------| + |指向锁记录的指针 |00 |轻量级锁定 | + |--------------------------------------------------| + |指向重量级锁的指针 |10 |膨胀(重量级锁)| + |--------------------------------------------------| + |空,不记录信息 |11 |GC 标记 | + |--------------------------------------------------| + |偏向线程 ID,偏向时间戳、对象分代年龄 |01 |可偏向 | + |--------------------------------------------------| + +5. 偏向锁 +      + 目的是消除在无竞争情况下的同步原语,进一步提高程序的运行性能。锁 +会偏向第一个获得它的线程,如果在接下来的执行过程中,该锁没有被其它线 +程获取,则持有锁的线程将永远不需要再进行同步。
+     + 当锁第一次被线程获取的时候,虚拟机将会把对象头中的标志位设为 01, +同时使用 CAS 操作把获取到这个锁的线程的 ID 记录在对象的 Mark Word 之 +中,如果成功,持有偏向锁的线程以后每次进入这个锁相关的同步块时,都可 +以不进行任何同步操作。
+     + 当有另一个线程去尝试获取这个锁时,偏向模式就宣告结束。根据锁对象 +目前是否处于被锁定的状态,撤销偏向后恢复到未锁定或轻量级锁定状态。 + +### 10. wait()和 sleep()的区别。 +1. 这两个方法来自不同的类,sleep()来自 Thread 类,是静态方法;wait() +是 Object 类里面的方法,和 notify()或者 notifyAll()方法配套使用,来实现 +线程间的通信。 +2. 最主要是 sleep 是将当前线程挂起指定的时间,没有释放锁;而 wait 方法 +释放了锁,使得其他线程可以使用同步控制块或者方法。 +3. 使用范围:wait,notify 和 notifyAll 只能在同步控制方法或者同步控制块 +里面使用,而 sleep 可以在任何地方使用 。
+synchronized(x){
+x.notify()
+//或者 wait()
+}
+     + 特别注意: sleep 和 wait 必须捕获异常(Thread.sleep()和 Object.wait() +都会抛出 InterruptedException), notify 和 notifyAll 不需要捕获异常。 + + +### 11. Java 中 interrupted() 和 isInterrupted()方法的区别? +二个方法都是判断线程是否停止的方法。
+1. 前者是静态方法,后者是非静态方法。interrupted 是作用于当前正在运 +行的线程, isInterrupted 是作用于调用该方法的线程对象所对应的线程。 +(线程对象对应的线程不一定是当前运行的线程。例如我们可以在 A 线程中去调用 +B 线程对象的 isInterrupted 方法,此时,当前正在运行的线程就是 A 线程。) +2. 前者会将中断状态清除而后者不会。 + + +### 12. Java 创建线程之后,直接调用 start()方法和 run()的区别 ? +1. start()方法来启动线程,并在新线程中运行 run()方法,真正实现了 +多线程运行。这时无需等待 run 方法体代码执行完毕,可以直接继续执行下面 +的代码;通过调用 Thread 类的 start()方法来启动一个线程,这时此线程是 +处于就绪状态,并没有运行,然后通过此 Thread 类调用方法 run()来完成其 +运行操作,这里方法 run()称为线程体,它包含了要执行的这个线程的内容, run +()方法运行结束,此线程终止。然后 CPU 再调度其它线程。 +2. 直接调用 run()方法的话,会把 run()方法当作普通方法来调用,会 +在当前线程中执行 run()方法,而不会启动新线程来运行 run()方法。程序还 +是要顺序执行, 要等待 run 方法体执行完毕后,才可继续执行下面的代码; 程 +序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有 +达到多线程的目的。 + +### 13. 什么是线程的上下文切换? +     + 对于单核 CPU,CPU 在一个时刻只能运行一个线程,当在运行一个线程的 +过程中转去运行另外一个线程,这个叫做线程上下文切换(对于进程也是类似)。
+     + 线程上下文切换过程中会记录*程序计数器、CPU 寄存器的状态*等数据。
+     + 虽然多线程可以使得*任务执行的效率得到提升*,但是由于在*线程切换时同 +样会带来一定的开销代价*,并且多个线程会导致*系统资源占用的增加*,所以在 +进行多线程编程时要注意这些因素。 + + +### 14. 怎么检测一个线程是否拥有锁? +     + 在 java.lang.Thread 中有一个方法叫 holdsLock(Object obj),它返回 +true,如果当且仅当当前线程拥有某个具体对象的锁。 + +### 15. 用户线程和守护线程有什么区别? +     + 当我们在 Java 程序中创建一个线程,它就被称为用户线程。将一个用户线 +程设置为守护线程的方法就是*在调用start()方法之前*, 调用对象的 +setDamon(true)方法。一个守护线程是在后台执行并且不会阻止 JVM 终止的 +线程,守护线程的作用是为其他线程的运行提供便利服务。当没有用户线程在 +运行的时候, *JVM 关闭程序并且退出*。一个守护线程创建的子线程依然是守护 +线程。
+     + 守护线程的一个典型例子就是垃圾回收器。 + + +### 16. 什么是线程调度器? +     + 线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 +CPU 时间。一旦我们创建一个线程并启动它,它的执行便依赖于线程调度器的 +实现。 + +### 17. 线程的状态。 +*版本 1.*
+在 Java 当中,*线程通常都有五种状态*,创建、就绪、运行、阻塞和死亡。
+     + 第一是创建状态。在生成线程对象,并没有调用该对象的 start 方法,这是 +线程处于创建状态。
+     + 第二是就绪状态。当调用了线程对象的 start 方法之后,该线程就进入了就 +绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就 +绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
+      + 第三是运行状态。线程调度程序将处于就绪状态的线程设置为当前线程, +此时线程就进入了运行状态,开始运行 run 函数当中的代码。
+     + 第四是阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个事 +件的发生(比如说某项资源就绪)之后再继续运行。sleep,wait 等方法都可以导 +致线程阻塞。
+     + 第五是死亡状态。如果一个线程的 run 方法执行结束或者异常中断后,该 +线程就会死亡。对于已经死亡的线程,无法再使用 start 方法令其进入就绪。
+ +*版本 2.*
+     + 一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运 +行(running)、阻塞(blocked)、timed_waiting、waiting、消亡(dead)。
+![06_17_1](/data/images/Java应届生面试突击/多线程和并发/06_17_1.png)
+ + +### 18. 有三个线程 T1,T2,T3,怎么确保它们按顺序执行? +join()方法。 + +### 19. 在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成。多种方式,考虑效率。 +1. 在主函数中使用 join()方法。
+t1.start();
+t2.start();
+t3.start(); +t1.join();//不会导致 t1 和 t2 和 t3 的顺序执行
+t2.join();
+t3.join();
+System.out.println("Main finished");
+ +2. CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行 +的操作之前,它允许一个或多个线程一直等待。 +```java +public class WithLatch { + public static void main(String[] args) { + CountDownLatch latch = new CountDownLatch(3); + for (int i = 0; i < 3; i++) { + new ChildThead(i, latch).start(); + } + try { + latch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + System.out.println("Main finished"); + } + + static class ChildThead extends Thread { + private int id = -1; + private CountDownLatch latch = null; + public ChildThead(int id, CountDownLatch latch) { + this.id = id; + this.latch = latch; + } + public void run() { + try { + Thread.sleep(Math.abs(new Random().nextInt(5000))); + System.out.println(String.format("Child Thread %dfinished", id)); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + latch.countDown(); + } + } + } +} +``` + +3. 使用线程池。 +```java +public class WithExecutor { + public static void main(String[] args) throws InterruptedException { + ExecutorService pool = Executors.newFixedThreadPool(3); + List> list = new ArrayList>(); + for (int i = 0; i < 3; i++) { + list.add(new ChildThead(i)); + } + + try { + pool.invokeAll(list); + } finally { + pool.shutdown(); + } + System.out.println("Main finished"); + } + + static class ChildThead implements Callable { + private int id = -1; + + public ChildThead(int id) { + this.id = id; + } + + public Void call() throws Exception { + try { + Thread.sleep(Math.abs(new Random().nextInt(5000))); + System.out.println(String.format("Child Thread %dfinished", id)); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return null; + } + } +} +``` + +### 20. java 程序如何停止一个线程? +     + 建议使用”异常法”来终止线程的继续运行。在想要被中断执行的线程中, +调用 interrupted()方法,该方法用来检验当前线程是否已经被中断,即该线程 +是否被打上了中断的标记,并不会使得线程立即停止运行,如果返回 true,则 +抛出异常,停止线程的运行。在线程外,调用 interrupt()方法,使得该线程打 +上中断的标记。 + + --- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/07_\345\205\266\344\273\226\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/07_\345\205\266\344\273\226\351\227\256\351\242\230.md" index 3e22fbb..bcf30b4 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/07_\345\205\266\344\273\226\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/07_\345\205\266\344\273\226\351\227\256\351\242\230.md" @@ -9,8 +9,120 @@ ### 1. ThreadLocal 的原理 +     + ThreadLocal 相当于一个容器, 用于存放每个线程的局部变量。 +ThreadLocal 实例通常来说都是 private static 类型的。 ThreadLocal 可以 +给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证 +不同的线程都有一份拷贝。
+     + 一般情况下,通过 ThreadLocal.set() 到线程中的对象是该线程自己使用 +的对象,其他线程是访问不到的,各个线程中访问的是不同的对象。如果 +ThreadLocal.set()进去的东西本来就是多个线程共享的同一个对象,那么多个 +线程的 ThreadLocal.get()取得的还是这个共享对象本身,还是有并发访问问 +题。
+     + 向 ThreadLocal 中 set 的变量是由 Thread 线程对象自身保存的,当用户 +调 用 ThreadLocal 对象的 set(Object o) 时 , 该方法则通过 +Thread.currentThread() 获取当前线程, 将变量存入线程中的 +ThreadLocalMap 类的对象内,Map 中元素的键为当前的 threadlocal 对象, +而值对应线程的变量副本。
+ +```java +public T get() { + Thread t = Thread.currentThread(); //每个 Thread 对象内都保存一个 ThreadLocalMap 对象。 + ThreadLocalMap map = getMap(t); //map 中 元 素 的 键 为 共 用 的 + threadlocal 对象,而值为对应线程的变量副本。 + if (map != null) + return (T)map.get(this); + } + T value = initialValue(); + createMap(t, value); + return value; +} + +public void set(T value) { + Thread t = Thread.currentThread(); + ThreadLocalMap map = getMap(t); + if (map != null) + map.set(this, value); + else + createMap(t, value); +} + +ThreadLocalMap getMap(Thread t) { + return t.threadLocals; +} + +void createMap(Thread t, T firstValue) { + t.threadLocals = new ThreadLocalMap(this, firstValue); +} + +``` ### 2. Collections.synchronizedXX 方法的原理。 + +```java +public E get(int index) { + synchronized (mutex) {return list.get(index);} +} + +public E set(int index, E element) { + synchronized (mutex) {return list.set(index,element);} +} + +public void add(int index, E element) { + synchronized (mutex) {list.add(index, element);} +} + +public E remove(int index) { + synchronized (mutex) {return list.remove(index);} +} + +``` +在返回的列表上进行迭代时,用户必须手工在返回的列表上进行同步: + +```java + List list = Collections.synchronizedList(new ArrayList()); + ... + synchronized(list) { + Iterator i = list.iterator(); // Must be in synchronized block + while (i.hasNext()) + foo(i.next()); + } +``` ### 3. 如何在两个线程间共享数据? +#### 一、每个线程执行的代码相同 +     + 若每个线程执行的代码相同,共享数据就比较方便。可以使用同一个 +Runnable 对象,这个 Runnable 对象中就有那个共享数据。 +```java +public class MultiThreadShareData1 { + public static void main(String[] args) { + SaleTickets sale = new SaleTickets(); + new Thread(sale).start(); + new Thread(sale).start(); + } +} + +class SaleTickets implements Runnable { + public int allTicketCount = 20; + + public void run() { + while (allTicketCount > 0) { + sale(); + } + } + + public synchronized void sale() { + System.out.println("剩下" + allTicketCount); + allTicketCount--; + } +} +``` +#### 二、每个线程执行的代码不相同 +     + 如果每个线程执行的代码不同,这时候需要用不同的 Runnable 对象,将需要共享的 +数据封装成一个对象,将该对象传给执行不同代码的 Runnable 对象。 + --- diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/01_\346\223\215\344\275\234\347\263\273\347\273\237\344\270\223\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/01_\346\223\215\344\275\234\347\263\273\347\273\237\344\270\223\351\242\230.md" index 73e5d85..9aaae08 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/01_\346\223\215\344\275\234\347\263\273\347\273\237\344\270\223\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/01_\346\223\215\344\275\234\347\263\273\347\273\237\344\270\223\351\242\230.md" @@ -7,8 +7,7 @@ 2. 线程间通信的方式?
3. 线程同步的机制。
4. 操作系统由哪些部分组成?
-5. 用户态和系统态在什么时候进行切换?平时用的都是 64 位系统, - 那它和 32 位系统相比,有什么区别和优点?
+5. 用户态和系统态在什么时候进行切换?平时用的都是 64 位系统,那它和 32 位系统相比,有什么区别和优点?
6. 选择一个你熟悉的磁盘臂调度算法进行简单描述。
7. 进程和线程的区别?
8. 操作系统的换页方法。
@@ -99,30 +98,31 @@ volatile、synchronized、Lock、AtomicInteger等concurrent包下的原子类。 后顺序依次处理进程,可以类比队列的先进先出。优点是进程处理起来非常简单,但缺点显而易见,就是平均寻道长度会很长。 - Java实现: - - public class fcfs { - Scanner x=new Scanner(System.in); - public int[] position; - public int num; - public fcfs() - { - System.out.println("Enter the number of process:"); - num=x.nextInt(); - position=new int[num]; - } - public void input() - { - int i=0; - for(i=0;iMath.abs(position1[j][0]-initPos1)){ - nearest = position1[j][0]; - index = j; - } - } - } - sequenceOfProcess[i] = nearest; - sequenceOfNumber[i] = index+1; - position1[index][0] = -1;//-1表示此位置的进程已经放在了访问序列,不在进行查询 - initPos1 = nearest; - nearest = 10000; - } - - for(int i=0;iMath.abs(position1[j][0]-initPos1)){ + nearest = position1[j][0]; + index = j; + } } } + sequenceOfProcess[i] = nearest; + sequenceOfNumber[i] = index+1; + position1[index][0] = -1;//-1表示此位置的进程已经放在了访问序列,不在进行查询 + initPos1 = nearest; + nearest = 10000; } + + for(int i=0;i position1[j]){ + int temp = position1[j]; + position1[j] = position1[j-1]; + position1[j-1] = temp; } } - public void adjust(){ - //按照磁道编号将进程排序,就是一个冒泡排序 - for(int i=0;i position1[j]){ - int temp = position1[j]; - position1[j] = position1[j-1]; - position1[j-1] = temp; - } - } - } - } - public void algo(){ - //寻找磁头初始位置在哪两个进程之间 - input(); - adjust(); - int init; - for(init=0;init initPos) - break; - //此时得到的init值就是磁头初始位置 - } - int start = init; - //磁头先向里扫描 - for(int i=start;i>=0;i--){ - System.out.println("The First Time Scan:"+"Process"+position[i][1]+"At Position"+position[i][0]+"Completed"); - } - } - //磁头开始从初始位置向外扫描 - if(position1[init+1]!=0){ - System.out.println("This Is the Track 0"); - } - for(int i=start+1;i initPos) + break; + //此时得到的init值就是磁头初始位置 + } + int start = init; + //磁头先向里扫描 + for(int i=start;i>=0;i--){ + System.out.println("The First Time Scan:"+"Process"+position[i][1]+"At Position"+position[i][0]+"Completed"); + } + //磁头开始从初始位置向外扫描 + if(position1[init+1]!=0){ + System.out.println("This Is the Track 0"); + } + for(int i=start+1;iposition[j][0]){ + int temp1 = position[j][0]; + int temp2 = position[j][1]; + + position[j][0] = position[j-1][0]; + position[j][1] = position[j-1][1]; + + position[j-1][0] = temp1; + position[j-1][1] = temp2; } } - public void adjust(){//调整数组中进程的记录顺序 - for(int i=0;iposition[j][0]){ - int temp1 = position[j][0]; - int temp2 = position[j][1]; - - position[j][0] = position[j-1][0]; - position[j][1] = position[j-1][1]; - - position[j-1][0] = temp1; - position[j-1][1] = temp2; - } - } - } + } + } + + public void algo(){ + input(); + adjust(); + int init; + + for(init = 0;init=initPos){ + break; } - public void algo(){ - input(); - adjust(); - int init; - - for(init = 0;init=initPos){ - break; - } - } - int start = init; - System.out.println("第一次扫描:"); - for(int i=start;i>=0;i--){ - System.out.println("第一次扫描:"+"进程"+position[i][1]+"在磁道"+position[i][0]+"完成"); - } - - if(position[init+1][0]!=0){ - System.out.println("磁头已经扫描到磁盘最内层:0"); - } - if(position[num-1][0]!=size){ - System.out.println("磁头已经移到磁盘最外层:"+size); - } - - System.out.println("第二次扫描:"); - for(int i=num-1;i>start;i--){ - System.out.println("第二次扫描:"+"进程"+position[i][1]+"在磁道"+position[i][0]+"完成"); - } - } } + int start = init; + System.out.println("第一次扫描:"); + for(int i=start;i>=0;i--){ + System.out.println("第一次扫描:"+"进程"+position[i][1]+"在磁道"+position[i][0]+"完成"); + } + if(position[init+1][0]!=0){ + System.out.println("磁头已经扫描到磁盘最内层:0"); + } + if(position[num-1][0]!=size){ + System.out.println("磁头已经移到磁盘最外层:"+size); + } + System.out.println("第二次扫描:"); + for(int i=num-1;i>start;i--){ + System.out.println("第二次扫描:"+"进程"+position[i][1]+"在磁道"+position[i][0]+"完成"); + } + } +} +``` + ### 7. 进程和线程的区别?      (1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单 @@ -393,40 +407,45 @@ A.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷 不会出现死锁的情形。当某些资源不够时阻塞调用进程;由于等待队列的存在, 使得对资源的请求满足 FIFO 的要求,因此不会出现饥饿的情形。
伪码: +```java +semaphore chopstick[5]={1,1,1,1,1}; - semaphore chopstick[5]={1,1,1,1,1}; - void philosopher(int I) +void philosopher(int I) +{ + while(true) { - while(true) - { - think(); - Swait(chopstick[(I+1)]%5,chopstick[I]); - eat(); - Ssignal(chopstick[(I+1)]%5,chopstick[I]); - } + think(); + Swait(chopstick[(I+1)]%5,chopstick[I]); + eat(); + Ssignal(chopstick[(I+1)]%5,chopstick[I]); } +} + +``` 方法 2:利用信号量的保护机制实现。通过信号量 mutex 对 eat()之前的取左 侧和右侧筷子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的 出现。
伪码: +```java +semaphore mutex = 1 ; +semaphore chopstick[5]={1,1,1,1,1}; - semaphore mutex = 1 ; - semaphore chopstick[5]={1,1,1,1,1}; - void philosopher(int I) +void philosopher(int I) +{ + while(true) { - while(true) - { - think(); - wait(mutex); - wait(chopstick[(I+1)]%5); - wait(chopstick[I]); - signal(mutex); - eat(); - signal(chopstick[(I+1)]%5); - signal(chopstick[I]); - } + think(); + wait(mutex); + wait(chopstick[(I+1)]%5); + wait(chopstick[I]); + signal(mutex); + eat(); + signal(chopstick[(I+1)]%5); + signal(chopstick[I]); } +} +``` B.原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子; 而偶数号的哲学家则相反。按此规定,将是 1,4 号哲学家竞争 4 号筷子,2,3 号哲 @@ -435,31 +454,34 @@ B.原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿 塞等待队列,根据 FIFO 原则,则先申请的哲学家会较先可以吃饭,因此不会出 现饿死的哲学家。
伪码: +```java + +semaphore chopstick[5]={1,1,1,1,1}; - semaphore chopstick[5]={1,1,1,1,1}; - void philosopher(int i) +void philosopher(int i) +{ + while(true) { - while(true) + think(); + if(i%2 == 0) //偶数哲学家,先右后左。 { - think(); - if(i%2 == 0) //偶数哲学家,先右后左。 - { - wait (chopstick[ i + 1 ] mod 5) ; - wait (chopstick[ i]) ; - eat(); - signal (chopstick[ i + 1 ] mod 5) ; - signal (chopstick[ i]) ; - } - else //奇数哲学家,先左后右。 - { - wait (chopstick[ i]) ; - wait (chopstick[ i + 1 ] mod 5) ; - eat(); - signal (chopstick[ i]) ; - signal (chopstick[ i + 1 ] mod 5) ; - } + wait (chopstick[ i + 1 ] mod 5) ; + wait (chopstick[ i]) ; + eat(); + signal (chopstick[ i + 1 ] mod 5) ; + signal (chopstick[ i]) ; + } + else //奇数哲学家,先左后右。 + { + wait (chopstick[ i]) ; + wait (chopstick[ i + 1 ] mod 5) ; + eat(); + signal (chopstick[ i]) ; + signal (chopstick[ i + 1 ] mod 5) ; } } +} +``` ### 10. 操作系统的内存管理。 1 分区管理
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/02_linux\347\263\273\347\273\237\345\270\270\347\224\250\345\221\275\344\273\244.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/02_linux\347\263\273\347\273\237\345\270\270\347\224\250\345\221\275\344\273\244.md" index 9741766..b81e940 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/02_linux\347\263\273\347\273\237\345\270\270\347\224\250\345\221\275\344\273\244.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\223\215\344\275\234\347\263\273\347\273\237/02_linux\347\263\273\347\273\237\345\270\270\347\224\250\345\221\275\344\273\244.md" @@ -2,19 +2,19 @@ ### 目录 -- [Linux常用命令1](https://blog.csdn.net/qq_21508727/article/details/81038008) +- [1. Linux常用命令1](https://blog.csdn.net/qq_21508727/article/details/81038008) -- [Linux常用命令2(远程文件下载+查看文件内容)](https://blog.csdn.net/qq_21508727/article/details/81063678) +- [2. Linux常用命令2(远程文件下载+查看文件内容)](https://blog.csdn.net/qq_21508727/article/details/81063678) -- [Linux常用命令3(压缩和解压缩总结)](https://blog.csdn.net/qq_21508727/article/details/81074722) +- [3. Linux常用命令3(压缩和解压缩总结)](https://blog.csdn.net/qq_21508727/article/details/81074722) -- [Linux常用命令4(查找命令)](https://blog.csdn.net/qq_21508727/article/details/81161619) +- [4. Linux常用命令4(查找命令)](https://blog.csdn.net/qq_21508727/article/details/81161619) -- [linux常用命令5(查看系统信息)](https://blog.csdn.net/qq_21508727/article/details/81161636) +- [5. linux常用命令5(查看系统信息)](https://blog.csdn.net/qq_21508727/article/details/81161636) -- [linux下如何检查服务器异常](https://blog.csdn.net/qq_21508727/article/details/83544199) +- [6. linux下如何检查服务器异常](https://blog.csdn.net/qq_21508727/article/details/83544199) -- [linux系统任务的后台运行和关闭、查看后台任务等](https://blog.csdn.net/qq_21508727/article/details/85198912) +- [7.linux系统任务的后台运行和关闭、查看后台任务等](https://blog.csdn.net/qq_21508727/article/details/85198912) --- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_\346\225\260\346\215\256\345\272\223\344\270\223\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_\346\225\260\346\215\256\345\272\223\344\270\223\351\242\230.md" index 6129bee..71b6158 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_\346\225\260\346\215\256\345\272\223\344\270\223\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_\346\225\260\346\215\256\345\272\223\344\270\223\351\242\230.md" @@ -5,7 +5,7 @@ --- 1. 优化查询的方法?
2. 如果有一个特别大的访问量到数据库上,怎么做优化?
-3. 数据库分表, 分区, 分库
+3. 数据库分表, 分区, 分库
### 1. 优化查询的方法? @@ -17,66 +17,69 @@ by 涉及的列上建立索引。 #### 2.优化 SQL 语句      -2.1 通过 explain(查询优化神器)用来查看 SQL 语句的执行效果, + 2.1 通过 explain(查询优化神器)用来查看 SQL 语句的执行效果, 可以帮助选择更好的索引和优化查询语句, 写出更好的优化语句。 通 常我们可以对比较复杂的尤其是涉及到多表的 SELECT 语句, 把关 键字 EXPLAIN 加到前面, 查看执行计划。例如: explain select * from news;
     -2.2 任何地方都不要使用 select * from t , 用具体的字段列表代 + 2.2 任何地方都不要使用 select * from t , 用具体的字段列表代 替“*” , 不要返回用不到的任何字段。
     -2.3 不在索引列做运算或者使用函数。
+ 2.3 不在索引列做运算或者使用函数。
     -2.4 查询尽可能使用 limit 减少返回的行数, 减少数据传输时间和 + 2.4 查询尽可能使用 limit 减少返回的行数, 减少数据传输时间和 带宽浪费。 #### 3.优化数据库对象 3.1 优化表的数据类型
     -使用 procedure analyse()函数对表进行分析, 该函数可以对表 + 使用 procedure analyse()函数对表进行分析, 该函数可以对表 中列的数据类型提出优化建议。 能小就用小。 表数据类型第一个原 则是: 使用能正确的表示和存储数据的最短类型。 这样可以减少对 磁盘空间、 内存、 cpu 缓存的使用。 使用方法: select * from 表名 procedure analyse();
3.2 对表进行拆分
     -通过拆分表可以提高表的访问效率。 有 2 种拆分方法:
+ 通过拆分表可以提高表的访问效率。 有 2 种拆分方法:
     -1.垂直拆分: -把主键和一些列放在一个表中, 然后把主键和另外的列放在另 + 1.垂直拆分:
+     + 把主键和一些列放在一个表中, 然后把主键和另外的列放在另 一个表中。 如果一个表中某些列常用, 而另外一些不常用, 则可以 采用垂直拆分。
     -2.水平拆分: -根据一列或者多列数据的值把数据行放到二个独立的表中。
+ 2.水平拆分:
+     + 根据一列或者多列数据的值把数据行放到二个独立的表中。
3.3 使用中间表来提高查询速度
     -创建中间表, 表结构和源表结构完全相同, 转移要统计的数据 + 创建中间表, 表结构和源表结构完全相同, 转移要统计的数据 到中间表, 然后在中间表上进行统计, 得出想要的结果。 #### 4.硬件优化
4.1 CPU 的优化
     -选择多核和主频高的 CPU。
+ 选择多核和主频高的 CPU。
4.2 内存的优化
     -使用更大的内存。 将尽量多的内存分配给 MYSQL 做缓存。
+ 使用更大的内存。 将尽量多的内存分配给 MYSQL 做缓存。
4.3 磁盘 I/O 的优化
4.3.1 使用磁盘阵列
     -RAID 0 没有数据冗余, 没有数据校验的磁盘陈列。 实现 RAID 0 + RAID 0 没有数据冗余, 没有数据校验的磁盘陈列。 实现 RAID 0 至少需要两块以上的硬盘, 它将两块以上的硬盘合并成一块, 数据 连续地分割在每块盘上。
     -RAID1 是将一个两块硬盘所构成 RAID 磁盘阵列, 其容量仅等于 + RAID1 是将一个两块硬盘所构成 RAID 磁盘阵列, 其容量仅等于 一块硬盘的容量, 因为另一块只是当作数据“镜像”。 -使用 RAID-0+1 磁盘阵列。 RAID 0+1 是 RAID 0 和 RAID 1 的组 +     + 使用 RAID-0+1 磁盘阵列。 RAID 0+1 是 RAID 0 和 RAID 1 的组 合形式。 它在提供与 RAID 1 一样的数据安全保障的同时, 也提供了 与 RAID 0 近似的存储性能。
- 图 - +![01_1_1](/data/images/Java应届生面试突击/数据库/01_1_1.png)
+ 4.3.2 调整磁盘调度算法
     选择合适的磁盘调度算法, 可以减少磁盘的寻道时间。 @@ -104,19 +107,19 @@ RAID1 是将一个两块硬盘所构成 RAID 磁盘阵列, 其容量仅等于      目前,大部分的主流关系型数据库都提供了主从复制的功能,通过配置两台(或多台) 数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站可 -以利用数据库的这一功能,实现数据库的读写分离,从而改善数据库的负载压力。一个系 +以利用数据库的这一功能,*实现数据库的读写分离,从而改善数据库的负载压力*。一个系 统的读操作远远多于写操作,因此写操作发向 master,读操作发向 slaves 进行操作(简 单的轮循算法来决定使用哪个 slave)。
     利用数据库的读写分离,Web 服务器在写数据的时候,访问主数据库(Master),主 -数据库通过主从复制机制将数据更新同步到从数据库(Slave),这样当 Web 服务器读数 +数据库通过*主从复制机制*将数据更新同步到从数据库(Slave),这样当 Web 服务器读数 据的时候,就可以通过从数据库获得数据。这一方案使得在大量读操作的 Web 应用可以轻 松地读取数据,而主数据库也只会承受少量的写入操作,还可以实现数据热备份,可谓是 一举两得的方案。
+![01_1_2](/data/images/Java应届生面试突击/数据库/01_1_2.png)
- 图 -主从复制的原理:
+##### 主从复制的原理:
     影响 MySQL-A 数据库的操作,在数据库执行后,都会写入本地的日志系统 A 中。 假设,实时的将变化了的日志系统中的数据库事件操作,通过网络发给 MYSQL-B。 @@ -135,54 +138,55 @@ slave。
可以发现,通过上面的机制,可以保证 MYSQL-A 和 MYSQL-B 的数据库数据一致,但 是时间上肯定有延迟,即 MYSQL-B 的数据是滞后的。
-简化版:
+##### 简化版:
mysql 主(称 master)从(称 slave)复制的原理:
     -(1)master 将数据改变记录到二进制日志(binary log)中,也即是配置文件 log-bin 指定 + (1)master 将数据改变记录到二进制日志(binary log)中,也即是配置文件 log-bin 指定 的文件(这些记录叫做二进制日志事件, binary log events)
-PS:从图中可以看出,Slave 服务器中有一个 I/O线程(I/O Thread)在不停地监听 Master + *PS*:从图中可以看出,Slave 服务器中有一个 I/O线程(I/O Thread)在不停地监听 Master 的二进制日志(Binary Log)是否有更新: 如果没有它会睡眠等待 Master 产生新的日志事件; 如果有新的日志事件(Log Events), 则会将其拷贝至 Slave 服务器中的中继日志(Relay Log)。
     -(2).slave 将 master 的二进制日志事件(binary log events)拷贝到它的中继日志(relay + (2).slave 将 master 的二进制日志事件(binary log events)拷贝到它的中继日志(relay log)
     -(3).slave 重做中继日志中的事件,将 Master 上的改变反映到它自己的数据库中。所 + (3).slave 重做中继日志中的事件,将 Master 上的改变反映到它自己的数据库中。所 以两端的数据是完全一样的。
- -PS: 从图中可以看出, Slave 服务器中有一个 SQL 线程(SQL Thread)从中继日志读 +     + *PS*: 从图中可以看出, Slave 服务器中有一个 SQL 线程(SQL Thread)从中继日志读 取事件, 并重做其中的事件, 从而更新 Slave 的数据, 使其与 Master 中的数据一致。 只要 该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。 附简要原理图: -图 +![01_1_3](/data/images/Java应届生面试突击/数据库/01_1_3.png)
+ -主从复制的几种方式:
-1.同步复制
+##### 主从复制的几种方式:
+1. 同步复制
     - 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,必须等待验证所 -有的从服务器的更新数据是否已经复制到其中,之后才可以自由处理其它进入的事务处理 + 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,必须等待验证*所 +有的从服务器*的更新数据是否已经复制到其中,之后才可以自由处理其它进入的事务处理 请求。 -2.异步复制
+2. 异步复制
     主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,无需等待验证更 新数据是否已经复制到从服务器中,就可以自由处理其它进入的事务处理请求。 -3.半同步复制
+3. 半同步复制
     - 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,只需等待验证其 -中一台从服务器的更新数据是否已经复制到其中,就可以自由处理其它进入的事务处理请 + 主服务器在将更新的数据写入它的二进制日志(Binlog)文件中后,只需等待验证*其 +中一台从服务器*的更新数据是否已经复制到其中,就可以自由处理其它进入的事务处理请 求,其他的从服务器不用管。
### 3. 数据库分表, 分区, 分库      - 分表见上面描述。
+ *分表*见上面描述。
     - 分区就是把一张表的数据分成多个区块,这些区块可以在一个磁盘上,也可以在不同 + *分区*就是把一张表的数据分成多个区块,这些区块可以在一个磁盘上,也可以在不同 的磁盘上,分区后,表面上还是一张表,但数据散列在多个位置,这样一来,多块硬盘同 时处理不同的请求,从而提高磁盘 I/O 读写性能,实现比较简单。 包括水平分区和垂直分 区。
     - 分库是根据业务不同把相关的表切分到不同的数据库中,比如 web、bbs、blog 等库。
+ *分库*是根据业务不同把相关的表切分到不同的数据库中,比如 web、bbs、blog 等库。
--- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/02_sql\346\263\250\345\205\245\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/02_sql\346\263\250\345\205\245\347\232\204\351\227\256\351\242\230.md" index 0a88dab..7b05be7 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/02_sql\346\263\250\345\205\245\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/02_sql\346\263\250\345\205\245\347\232\204\351\227\256\351\242\230.md" @@ -8,82 +8,86 @@ ### 1. SQL 语句应该考虑哪些安全问题? -1.防止 sql 注入, 对特殊字符进行过滤、 转义或者使用预编译的 sql 语句绑定变量。
-2.当 sql 语句运行出错时, 不要把数据库返回的错误信息全部显示给用户, 以防止 -泄漏服务器和数据库相关信息。
+     + 1.防止 sql 注入, 对特殊字符进行过滤、 转义或者使用预编译的 sql 语句绑定变量。
+     + 2.当 sql 语句运行出错时, *不要把数据库返回的错误信息*全部显示给用户, 以*防止 +泄漏*服务器和数据库相关信息。
### 2. 什么叫SQL注入,如何防止?请举例说明。 举个例子:
     -你后台写的 java 代码拼的 sql 如下: - - // 该 ename 为前台传过来的一个查询条件 + 你后台写的 java 代码拼的 sql 如下: +```java + // 该 ename 为前台传过来的一个查询条件 public List getInfo(String ename){ - StringBuffer buf = new StringBuffer(); - buf.append("select empno,ename,deptno from emp where ename = - '").append(ename).append("'"); - ... - ... - ... + StringBuffer buf = new StringBuffer(); + buf.append("select empno,ename,deptno from emp where ename = '").append(ename).append("'"); + ... + ... + ... } - +``` + 而前台页面有个输入框如下:
职员姓名: __________
该文本域对应上面方法的 ename 参数。
如果用户在查询时向职员姓名文本域中输入的是如下信息:
- - ' or '1'='1 - +```sql +' or '1'='1 +``` 那么这时就会涉及到 sql 注入这个概念了。
-上面的字符串传到后台后, 与其它 select 等字符串拼成了如下的语句:
- - select empno,ename,deptno from emp where ename = '' or '1'='1' - -上面的 where 条件是永远成立的, 如果你的表中有权限限制, 比如只能查询本地市的信息, +*上面的字符串传到后台后, 与其它 select 等字符串拼成了如下的语句*:
+```sql +select empno,ename,deptno from emp where ename = '' or '1'='1' +``` +*上面的 where 条件是永远成立的*, 如果你的表中有权限限制, 比如只能查询本地市的信息, 过滤条件中有地市过滤, 不过因为输入 ' or '1'='1 字符串后, 条件永远成立, 导致你能看到 所有城市的职员信息, 那就会产生权限问题了, 用户能看到不该看到的信息。 同理, 如果 是 insert 或者 update 等语句的话, 通过 sql 注入会产生不可估量的问题。
     - 这种不安全的情况是在 SQL 语句在拼接的情况下发生。
+ 这种不安全的情况是在 SQL 语句*在拼接的情况下*发生。
     - 解决方法:
-1.参数绑定
+ +#### 解决方法: +1. 参数绑定
     为了防范这样” SQL 注入安全“可以用预编译解决(不要用拼 接 SQL 字符串,可以用 prepareStatement,参数用 set 方法进行填装 ) 。
+```java +String sql= "insert into userlogin values(?,?)"; +try { + PreparedStatement ps=conn.prepareStatement(sql); + for(int i=1;i<100;i++){ + ps.setInt(1, i); + ps.setInt(2, 8888); + ps.executeUpdate(); + } + ps.close(); + conn.close(); +} catch (SQLException e) { + e.printStackTrace(); +} +``` - String sql= "insert into userlogin values(?,?)"; - try { - PreparedStatement ps=conn.prepareStatement(sql); - for(int i=1;i<100;i++){ - ps.setInt(1, i); - ps.setInt(2, 8888); - ps.executeUpdate(); - } - ps.close(); - conn.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - -2.检查变量的数据类型和格式
+2. 检查变量的数据类型和格式
     - 如果你的 SQL 语句是类似 where id={$id}这种形式, 数据库里所有的 id 都是 -数字, 那么就应该在 SQL 被执行前, 检查确保变量 id 是 int 类型; 如果是接受 + 如果你的 SQL 语句是类似 where id={$id}这种形式, *数据库里所有的 id 都是 +数字, 那么就应该在 SQL 被执行前, 检查确保变量 id 是 int 类型*; 如果是接受 邮箱, 那就应该检查并严格确保变量一定是邮箱的格式, 其他的类型比如日期、 -时间等也是一个道理。 总结起来: 只要是有固定格式的变量, 在 SQL 语句执行 +时间等也是一个道理。 总结起来: *只要是有固定格式的变量, 在 SQL 语句执行 前, 应该严格按照固定格式去检查, 确保变量是我们预想的格式, 这样很大程 -度上可以避免 SQL 注入攻击。
+度上可以避免 SQL 注入攻击。*
     比如, 我们前面接受 username 参数例子中, 我们的产品设计应该是在用户 -注册的一开始, 就有一个用户名的命名规则, 比如 5-20 个字符, 只能由大小写 +注册的一开始, *就有一个用户名的命名规则*, 比如 5-20 个字符, 只能由大小写 字母、 数字以及一些安全的符号组成, 不包含特殊字符。 此时我们应该有一个 check_username 的函数来进行统一的检查。 不过, 仍然有很多例外情况并不能 应用到这一准则, 比如文章发布系统, 评论系统等必须要允许用户提交任意字 -符串的场景, 这就需要采用过滤等其他方案了。 (使用正则表达式进行格式验 -证! )
+符串的场景, 这就需要采用过滤等其他方案了。 (*使用正则表达式进行格式验 +证!*)
-3.所有的 SQL 语句都封装在存储过程中。
+3. 所有的 SQL 语句都封装在*存储过程*中。
     所有的 SQL 语句都封装在存储过程中, 这样不但可以避免 SQL 注入, 还能 提高一些性能。 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_\346\266\211\345\217\212\350\277\236\346\216\245\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_\346\266\211\345\217\212\350\277\236\346\216\245\347\232\204\351\227\256\351\242\230.md" index 98df757..e3ba971 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_\346\266\211\345\217\212\350\277\236\346\216\245\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_\346\266\211\345\217\212\350\277\236\346\216\245\347\232\204\351\227\256\351\242\230.md" @@ -13,55 +13,61 @@      为了说明问题, 定义如下 2 个表。 - [TEST1@orcl#16-12 月-11] SQL>select * from t1; - ID NAME - - --------- -------------------- - 1 aaa - 2 bbb +```sql +[TEST1@orcl#16-12 月-11] SQL>select * from t1; + ID NAME + - --------- -------------------- + 1 aaa + 2 bbb + + +[TEST1@orcl#16-12 月-11] SQL>select * from t1; + ID NAME + - --------- -------------------- + 1 aaa + 2 bbb +``` ---- - - [TEST1@orcl#16-12 月-11] SQL>select * from t1; - ID NAME - - --------- -------------------- - 1 aaa - 2 bbb -      内连接(inner join) : 只显示符合连接条件的记录。 - [TEST1@orcl#16-12 月-11] SQL>select * from t1 inner join t2 on t1.id=t2.id; - ID NAME ID AGE - - - ----------- -------------------- ---------- -------------------------------- - 1 aaa 1 20 +```sql +[TEST1@orcl#16-12 月-11] SQL>select * from t1 inner join t2 on t1.id=t2.id; +ID NAME ID AGE +- - ----------- -------------------- ---------- -------------------------------- +1 aaa 1 20 +```      - 外连接分左外连接、 右外连接、 全外连接三种。 + 外连接分*左外连接、 右外连接、 全外连接*三种。 -1) 左外连接(LEFT JOIN 或 LEFT OUTER JOIN )
+1) *左外连接*(LEFT JOIN 或 LEFT OUTER JOIN )
     - 即以左表为基准,到右表找匹配的数据,找不到匹配的用 NULL 补齐。
+ 即以左表为基准,到右表找匹配的数据,*找不到匹配的用 NULL 补齐*。
     显示左表的全部记录及右表符合连接条件的记录。
- [TEST1@orcl#16-12 月-11] SQL>select * from t1 left join t2 on t1.id=t2.id; - ID NAME ID AGE - ---------- -------------------- ---------- ---------- - 1 aaa 1 20 - 2 bbb NULL NULL - -2) 右外连接(RIGHT JOIN 或 RIGHT OUTER JOIN ) - - [TEST1@orcl#16-12 月-11] SQL>select * from t1 right join t2 on t1.id=t2.id; - ID NAME ID AGE - ---------- -------------------- ---------- ---------- - 1 aaa 1 20 - NULL NULL 3 30 - -3)全外连接(FULL JOIN 或 FULL OUTER JOIN)
+```sql +[TEST1@orcl#16-12 月-11] SQL>select * from t1 left join t2 on t1.id=t2.id; +ID NAME ID AGE +---------- -------------------- ---------- ---------- +1 aaa 1 20 +2 bbb NULL NULL +``` + +2) *右外连接*(RIGHT JOIN 或 RIGHT OUTER JOIN ) +```sql +[TEST1@orcl#16-12 月-11] SQL>select * from t1 right join t2 on t1.id=t2.id; +ID NAME ID AGE +---------- -------------------- ---------- ---------- +1 aaa 1 20 +NULL NULL 3 30 +``` + +3)*全外连接*(FULL JOIN 或 FULL OUTER JOIN)
     除了显示符合连接条件的记录外,在 2 个表中的其他记录也显示出来。 -即以右表为基准,到左表找匹配的数据,找不到匹配的用 NULL 补齐。
+即以右表为基准,到左表找匹配的数据,*找不到匹配的用 NULL 补齐*。
     显示右表的全部记录及左表符合连接条件的记录。
@@ -70,50 +76,49 @@ 从理论上来分析,确实是 inner join 的性能要好,因为是选出 2 个表都有 的记录,而 left join 会出来左边表的所有记录、满足 on 条件的右边表的记录。
     - 1.在解析阶段,左连接是内连接的下一阶段,内连接结束后,把存在于左输 + 1.*在解析阶段*,左连接是内连接的下一阶段,内连接结束后,把存在于左输 入而未存在于右输入的集,加回总的结果集,因此如果少了这一步效率应该要 高些。
     - 2.在编译的优化阶段,如果左连接的结果集和内连接一样时,左连接查询会 + 2.*在编译的优化阶段,如果左连接的结果集和内连接一样时*,左连接查询会 转换成内连接查询,即编译优化器认为内连接要比左连接高效。
### 1. 联合查询的索引使用。      -在 where 子句中要加筛选条件, 才可以都用上索引。 + 在 where 子句中要加筛选条件, 才可以都用上索引。 ### 2. 数据库中两个表求交集、并集、差集。 -图 +![03_2_1](/data/images/Java应届生面试突击/数据库/03_2_1.png)
-求交集(用 inner join) : +*求交集(用 inner join):* +![03_2_2](/data/images/Java应届生面试突击/数据库/03_2_2.png)
-图 -using(column_list): 其作用是为了方便书写联结的多对应关系, 大部分情况下 USING 语 -句可以用 ON 语句来代替, 如下面例子: -a LEFT JOIN b USING (c1,c2,c3), 其作用相当于下面语句 -a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3 -只是用 ON 来代替会书写比较麻烦而已。 +*using(column_list)*: 其作用是为了方便书写联结的多对应关系, 大部分情况下 USING 语 +句可以用 ON 语句来代替, 如下面例子:
+a LEFT JOIN b USING (c1,c2,c3), 其作用相当于下面语句
+a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3
+只是用 ON 来代替会书写比较麻烦而已。
-求差集(用 left join 或 right join) +*求差集(用 left join 或 right join):* +![03_2_3](/data/images/Java应届生面试突击/数据库/03_2_3.png)
-图 -求并集(用 union) +*求并集(用 union):* #### 精要      联合查询是可合并多个相似的选择查询的结果集。等同于将一个表追加到另一个表, 从而实现将两个表的查询组合到一起,使用谓词为UNION或UNION ALL。
-1联合查询分类 - - 内连接(inner Join 或 Join) - 外连接(outer Join) - 左外连接(left outer Join 或 left Join) - 右外连接(right outer Join 或 right Join) - 全外连接(full outer Join 或 full Join) - 交叉连接 (cross Join) - 结果集链接 (union 和 union all) +1. 联合查询分类 + 内连接(inner Join 或 Join)
+ 外连接(outer Join)
+ 左外连接(left outer Join 或 left Join)
+ 右外连接(right outer Join 或 right Join)
+ 全外连接(full outer Join 或 full Join)
+ 交叉连接 (cross Join)
+ 结果集链接 (union 和 union all)
--- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/04_\346\266\211\345\217\212\345\255\230\345\202\250\350\277\207\347\250\213\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/04_\346\266\211\345\217\212\345\255\230\345\202\250\350\277\207\347\250\213\347\232\204\351\227\256\351\242\230.md" index 5f4af88..1e7c424 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/04_\346\266\211\345\217\212\345\255\230\345\202\250\350\277\207\347\250\213\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/04_\346\266\211\345\217\212\345\255\230\345\202\250\350\277\207\347\250\213\347\232\204\351\227\256\351\242\230.md" @@ -8,7 +8,26 @@ ### 1. 存储过程的概念以及优缺点是什么?      - + 存储过程:就是一些*编译好了*的 sql 语句,这些 SQL 语句代码 +像一个方法一样实现一些功能(对单表或多表的增删改查),然后 +再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。 +#### 优点: +1. 存储过程因为 SQL 语句已经*预编译过了*,因此运行的速度比 +较快。 +2. 存储过程在服务器端运行,减少客户端的压力。 +3. *允许模块化程序设计*,就是说*只需要创建一次过程*,以后在程 +序中就可以*调用该过程任意次*,类似方法的复用。 +4. *减少网络流量*,客户端调用存储过程只需要传存储过程名和相 +关参数即可,与传输 SQL 语句相比自然数据量少了很多。 +5. *增强了使用的安全性*,充分利用系统管理员可以对执行的某 +一个存储过程进行权限限制,从而能够实现对某些数据访问的限制, +*避免非授权用户对数据的访问*,保证数据的安全。程序员直接调用 +存储过程,根本不知道表结构是什么,有什么字段,没有直接暴露 +表名以及字段名给程序员。 +#### 缺点: +     + *调试*麻烦(至少没有像开发程序那样容易),*可移植性*不灵活(因 +为存储过程是依赖于具体的数据库)。 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/05_\346\266\211\345\217\212\350\214\203\345\274\217\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/05_\346\266\211\345\217\212\350\214\203\345\274\217\347\232\204\351\227\256\351\242\230.md" index a781f3f..8217e32 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/05_\346\266\211\345\217\212\350\214\203\345\274\217\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/05_\346\266\211\345\217\212\350\214\203\345\274\217\347\232\204\351\227\256\351\242\230.md" @@ -1,4 +1,4 @@ -# 范式问题 +# 涉及范式问题 ### 目录 @@ -8,7 +8,29 @@ ### 1. 数据库的三级范式?      + 1NF:字段不可再分,原子性。
+     + 2NF:满足第二范式( 2NF )必须先满足第一范式( 1NF )。 +一个表只能说明一个事物。非主键属性必须完全依赖于主键属性。
+     + 3NF:满足第三范式( 3NF ) 必须先满足第二范式( 2NF ) 。每 +列都与主键有直接关系,不存在传递依赖。 任何非主属性不依赖于其它 +非主属性。
+不符合第一范式的例子(关系数据库中 create 不出这样的表):
+     + 表:字段 1, 字段 2(字段 2.1, 字段 2.2), 字段 3 ......
+不符合第二范式的例子:
+     +     + 表:学号, 姓名, 年龄, 课程名称, 成绩, 学分;
+ 这个表明显说明了两个事物:学生信息, 课程信息。
+不符合第三范式的例子:
+     + 学号, 姓名, 年龄, 所在学院, 学院地点,学院联系电话,主键为" +学号“;
+     + 存在依赖传递: (学号) → (所在学院) → (学院地点, 学院电话)
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/06_\346\266\211\345\217\212\344\272\213\345\212\241\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/06_\346\266\211\345\217\212\344\272\213\345\212\241\347\232\204\351\227\256\351\242\230.md" index e9ccd70..a20b9e8 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/06_\346\266\211\345\217\212\344\272\213\345\212\241\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/06_\346\266\211\345\217\212\344\272\213\345\212\241\347\232\204\351\227\256\351\242\230.md" @@ -1,34 +1,131 @@ -# 事务问题 +# 涉及事务问题 ### 目录 --- 1. 数据库事务正确执行的四个基本要素(事务的四个属性)。
-2. 并发事务带来的问题。
-3. 并发控制的方式(如何解决并发问题)。
-4. 数据库事物的隔离级别介绍、举例说明。
-5. MySQL事务控制语句。
-6. 数据库怎么保证数据的一致性。
+2. 并发事务带来的问题。
+3. 并发控制的方式(如何解决并发问题)。
+4. 数据库事物的隔离级别介绍、举例说明。
+5. MySQL事务控制语句。
+6. 数据库怎么保证数据的一致性。
### 1. 数据库事务正确执行的四个基本要素(事务的四个属性)。      - -### 2. 并发事务带来的问题。 + 事务是由一组 SQL 语句组成的逻辑处理单元。
     - -### 3. 并发控制的方式(如何解决并发问题)。 + *ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、 +持久性(Durability)*。
     - -### 4. 数据库事物的隔离级别介绍、举例说明。 + *原子性*:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成, +不会结束在中间某个环节。事务在执行过程中发生错误,会被 回滚 (Rollback)到事务开 +始前的状态,就像这个事务从来没有执行过一样。
     + *一致性*:在事务开始和完成时,数据库中的数据都保持一致的状态,数据的*完整性约 +束*没有被破坏。(事务的执行使得数据库*从一种正确状态*转换成*另一种正确状*)。具体 +来说就是,比如表与表之间存在外键约束关系,那么你对数据库进行的修改操作就必需要 +满足约束条件,即如果你修改了一张表中的数据,那你还需要修改与之存在外键约束关系 +的其他表中对应的数据,以达到一致性。
+     + *隔离性*:一个事务的执行不能被其他事务干扰。为了防止事务操作间的混淆,必须串 +行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。(*在事务正确提交之前*, +不允许把该事务*对数据的任何改变*提供给任何其他事务)。(事务处理过程中的中间状态 +对外部是不可见的)。隔离性通过*锁*就可以实现。
+     + *持久性*:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,并不会被 +回滚。
-### 5. MySQL事务控制语句。 +### 2. 并发事务带来的问题。 +1. 更新丢失。
+     + 两个事务 Tl 和 T2 读入同一数据并修改,T2 提交的结果覆盖了 Tl 提交 +的结果,导致 Tl 的修改被丢失。 +2. 脏读。
     + 事务 Tl 修改某一数据,并将其写回磁盘,事务 T2 读取同一数据后,Tl 由 +于某种原因被撤销,这时 Tl 已修改过的数据恢复原值,T2 读到的数据就与数 +据库中的数据不一致,则 T2 读到的数据就为“脏”数据,即不正确的数据。
+*例如:*
+     + 张三的工资为 5000,事务 A 中把他的工资改为 8000,但事务 A 尚未提交。 +与此同时,事务 B 正在读取张三的工资,读取到张三的工资为 8000。随后, +事务 A 发生异常,而回滚了事务。张三的工资又回滚为 5000。最后,事务 B 读 +取到的张三工资为 8000 的数据即为脏数据,事务 B 做了一次脏读。 +3. 不可重复读。
+     + 是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一 +个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第 +二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就 +发生了*在一个事务内两次相同的查询*读到的数据是不一样的,因此称为是不可 +重复读。
+*例如:*
+     + 在事务 A 中,读取到张三的工资为 5000,操作没有完成,事务还没提交。 +与此同时,事务 B 把张三的工资改为 8000,并提交了事务。随后,在事务 A 中, +再次读取张三的工资,此时工资变为 8000。在一个事务中前后两次读取的结果 +并不致,导致了不可重复读。 +4. 幻读。
+*例如:*
+     + 目前工资为 5000 的员工有 10 人,事务 A 读取所有工资为 5000 的人数为 +10 人。此时,事务 B 插入一条工资也为 5000 的记录。这是,事务 A 再次读取 +工资为 5000 的员工,记录为 11 人。此时产生了幻读。 + +*不可重复读的重点是修改:*
+同样的条件,你读取过的数据,再次读取出来发现值不一样了。
+*幻读的重点在于新增或者删除:*
+同样的条件,第 1 次和第 2 次读出来的*记录数不一样*。
+ +避免不一致性的方法和技术就是并发控制。最常用的技术是*封锁技术*。 -### 6. 数据库怎么保证数据的一致性。 +### 3. 并发控制的方式(如何解决并发问题)。      + 加锁,如乐观锁和悲观锁。 + +### 4. 数据库事物的隔离级别介绍、举例说明。 +     + 数据库事务的隔离性: 数据库系统必须具有隔离并发运行各个事务的能力, 使它们 +不会相互影响, *避免各种并发问题*。 +#### 数据库提供了 4 种隔离级别(由低到高): +这 4 个级别可逐个解决脏读,不可重复读和幻读这几个问题。 +1. 读未提交数据
+     + 允许事务读取*未被其他事务提交的变更*,可能有*脏读, 不可重复读和幻读*的问题。 +     + 比如:某时刻会话 a 修改了一个数据,但还未提交,此时会话 b 读取了该数据,这是, +会话 a 回滚了事务,这就导致数据出现了不一致状态,这就是*脏读*。 +2. 读已提交数据
+     + 允许事务读取*已经被其他事务提交的变更*,可以*避免脏读*,*可能有不可重复读和幻读* +的问题。
+     + 例如:某时刻会话 a 的一个事务里查询一个数据,得到的数据是 1,这时*会话 b 修改 +了该数据的值为 2,并提交了*, 此时会话 a 的事务又要读取该数据,这时的数据是 2,就样 +就出现了*同一个事务内,读的结果不一样,这就是不可重复读*。
+     + *不可重复读*,是指在数据库访问中,*一个事务范围内两个相同的查询却返回了不同数 +据*。 +3. 可重复读(Mysql 的默认隔离级别)
+     + 确保事务*可以多次从一个字段中读取相同的值*,在这个事务持续期间,禁止其他事务 +对这个字段进行更新,可以*避免脏读和不可重复读,可能会有幻读*。 +4. 可串行化
+     + 所有事务都一个接一个地*串行执行*。可以避免*脏读,不可重复读,幻读*。
+![06_4_1](/data/images/Java应届生面试突击/数据库/06_4_1.png)
+### 5. MySQL事务控制语句。 +     + *BEGIN 或 START TRANSACTION:*显示地开启一个事务; +     + COMMIT:提交事务,并使已对数据库进行的所有修改称为永久性的; +     + ROLLBACK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改; + +### 6. 数据库怎么保证数据的一致性。 +     + 事务,悲观锁,乐观锁。 --- ### 搬运工信息 Author:Jason Lou
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_\346\266\211\345\217\212\351\224\201\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_\346\266\211\345\217\212\351\224\201\347\232\204\351\227\256\351\242\230.md" index a9a6146..763fc16 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_\346\266\211\345\217\212\351\224\201\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_\346\266\211\345\217\212\351\224\201\347\232\204\351\227\256\351\242\230.md" @@ -1,9 +1,235 @@ +# 涉及锁的问题 +### 目录 +--- +1. 如何并发访问数据库。
+2. 如何并发访问数据库。
+3. mysql 锁的粒度(即锁的级别)。
+4. 乐观锁和悲观锁的概念,实现方式和适用场景。
+ + + +### 1. 数据库事务正确执行的四个基本要素(事务的四个属性)。 +     + 加锁。 + +### 2. 如何并发访问数据库 +     + 锁是一种并发控制技术,锁是用来在多个用户同时访问同一个数据的时候 +保护数据的
+1. 有 2 种基本的锁类型:
+     + 共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被 +读取完毕,S 锁立即被释放。在执行 select 语句的时候需要给操作对象(表或者一些记录) +加上共享锁,但加锁之前需要检查是否有排他锁,如果没有,则可以加共享锁(一个对象 +上可以加 n 个共享锁),否则不行。共享锁通常在执行完 select 语句之后被释放,当然也 +有可能是在事务结束(包括正常结束和异常结束)的时候被释放,主要取决与数据库所设 +置的事务隔离级别。
+     + 排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到 X 锁被释放才能对该 +页进行访问;X 锁一直到事务结束才能被释放。执行 insert、update、delete 语句的时候需 +要给操作的对象加排他锁,在加排他锁之前必须确认该对象上没有其他任何锁,一旦加上 +排他锁之后,就不能再给这个对象加其他任何锁。排他锁的释放通常是在事务结束的时候 +(当然也有例外,就是在数据库事务隔离级别被设置成 Read Uncommitted(读未提交数 +据)的时候,这种情况下排他锁会在执行完更新操作之后就释放,而不是在事务结束的时 +候)。
+2. 按锁的粒度 +3. 按锁的机制 + +*既然使用了锁,就有出现死锁的可能。*
+产生死锁的四个必要条件:
+(1) 互斥条件:一个资源每次只能被一个进程使用。
+(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
+(3) 不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
+(4) 环路等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
+     + 只要系统发生了死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死 +锁。
+ +1. 预防死锁
+     + 预防死锁的发生只需破坏死锁产生的四个必要条件之一即可。
+- 1) 破坏互斥条件
+     + 如果允许系统资源都能共享使用,则系统不会进入死锁状态。但有些资源根本不能同时 +访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可 +行,而且在有的场合应该保护这种互斥性。
+ 2) 破坏不剥夺条件
+     + 当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放 +已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被 +暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。
+     + 该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地 +申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复 +的资源,如 CPU 的寄存器及内存资源,一般不能用于打印机之类的资源。
+ 3) 破坏请求和保持条件
+     + 釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资 +源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出 +其他资源请求,这样就可以保证系统不会发生死锁。
+     + 这种方式实现简单,但缺点也显而易见,系统资源被严重浪费,其中有些资源可能仅 +在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由 +于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。
+ 4) 破坏环路等待条件
+     + 为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每 +个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提 +出申请分配资源 Ri,则该进程在以后的资源申请中,只能申请编号大于 Ri 的资源。
+     + 这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在 +为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使甩资 +源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源 +的方法,也必然会给用户的编程带来麻烦。
+2. 避免死锁
+     + 银行家算法。
+3. 检测死锁
+     + 死锁定理。
+4. 解除死锁
+     + 4.1 从死锁进程处剥夺资源
+     + 4.2 终止部分或全部进程 + +### 3. mysql 锁的粒度(即锁的级别)。 +     + MySQL 各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表 +级锁定。
+1. 表级锁,直接锁定整张表,在你锁定期间,其它进程无法对该表进行*写操作*。*如果 +你是写锁,则其它进程则读也不允许*。特点:开销小,*加锁快;不会出现死锁;锁定粒度 +最大,发生锁冲突的概率最高,并发度最低*。
+     + MyISAM 存储引擎采用的是*表级锁*。
+     + *有 2 种模式*:表共享读锁和表独占写锁。加读锁的命令:lock table 表名 read;去掉锁 +的命令:unlock tables。
+     + *支持并发插入*:支持查询和插入操作并发进行(*在表尾并发插入*)。
+     + *锁调度机制:写锁优先*。一个进程请求某个 MyISAM 表的读锁,同时另一个进程也请 +求同一表的写锁,MySQL 如何处理呢?答案是写进程先获得锁。
+2. 行级锁,仅对指定的记录进行加锁,这样其它进程还是可以对同一个表中的其它记 +录进行操作。特点:开销大,*加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最 +低,并发度也最高*。
+     + InnoDB 存储引擎既支持*行级锁*,也支持*表级锁*,但*默认情况下是采用行级锁*。 +3. 页级锁,一次锁定*相邻的一组记录*。开销和加锁时间界于表锁和行锁之间;*会出现 +死锁*;锁定粒度界于表锁和行锁之间,并发度一般。
+     + *最常用的处理多用户并发访问的方法是加锁*。当一个用户锁住数据库中的 +某个对象时,其他用户就不能再访问该对象。*加锁对并发访问的影响体现在锁 +的粒度上*。比如,(*表锁*)放在一个表上的锁限制对整个表的并发访问;(*页锁*) +放在数据页上的锁限制了对整个数据页的访问;(*行锁*)放在行上的锁只限制 +对该行的并发访问。
+ +### 4. 乐观锁和悲观锁的概念,实现方式和适用场景。 +     + 锁有两种机制:悲观锁和乐观锁。
+     + 悲观锁,锁如其名,他对世界是悲观的,他认为别人访问正在改变的数据 +的概率是很高的,所以从数据开始更改时就将数据锁住,直到更改完成才释放。 +一个典型的倚赖数据库的悲观锁调用: +```sql +select * from account where name=”Erica” for update +``` +     + 这条 sql 语句锁定了 account 表中所有符合检索条件( name=”Erica” )的 +记录。 本次事务提交之前(事务提交时会释放事务过程中的锁),外界无法修 +改这些记录。该语句用来锁定特定的行(如果有 where 子句,就是满足 where +条件的那些行)。当这些行被锁定后,其他会话可以选择这些行,但不能更改 +或删除这些行,直到该语句的事务被 commit 语句或 rollback 语句结束为止。需 +要注意的是,select ....for update 要放到 mysql 的事务中,即 begin 和 +commit 中,否则不起作用。
+     + 为了更好的理解 select...... for update 的锁表的过程,本人将要以 mysql +为例,进行相应的讲解。
+     + 1、要测试锁定的状况,可以利用 MySQL 的 Command Mode ,开二个 +视窗来做测试。
+     + 表的基本结构如下:
+![07_4_1](/data/images/Java应届生面试突击/数据库/07_4_1.png)
+ +     + 表中内容如下:
+![07_4_2](/data/images/Java应届生面试突击/数据库/07_4_2.png)
+     + 开启两个测试窗口,在其中一个窗口执行 select * from ta for update;
+     + 然后在另外一个窗口执行 update 操作如下图:
+![07_4_3](/data/images/Java应届生面试突击/数据库/07_4_3.png)
+     + 等到一个窗口 commit 后的图片如下:
+![07_4_4](/data/images/Java应届生面试突击/数据库/07_4_4.png)
+ +     + 悲观锁可能会造成加锁的时间很长,并发性不好,特别是长事务,影响系 +统的整体性能。
+     + 悲观锁的实现方式:
+     + 悲观锁,也是基于数据库的锁机制实现。传统的关系型数据库里边就用到 +了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先 +上锁。
+     + 乐观锁,他对世界比较乐观,认为别人访问正在改变的数据的概率是很低 +的,所以直到修改完成准备提交所做的修改到数据库的时候才会将数据锁住, +当你读取以及改变该对象时并不加锁,完成更改后释放。乐观锁不能解决脏读 +的问题。
+     + 乐观锁加锁的时间要比悲观锁短,大大提升了大并发量下的系统整体性能 +表现。
+#### 乐观锁的实现方式: +1. 大多是基于数据版本(Version)记录机制实现,需要为每一行数据增加 +一个版本标识(也就是每一行数据多一个字段 version),每次更新数据都要 +更新对应的版本号+1。
+     + 工作原理:读出数据时,将此版本号一同读出,之后更新时,对此版本号 +加一。此时,将提交数据的版本信息与数据库表对应记录的当前版本信息进行 +比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认 +为是过期数据,不得不重新读取该对象并作出更改。
+ +     + 假设数据库中帐户信息表中有一个
+version 字段,当前值为 1 ;而当前帐户余额字段( balance )为 $100 。
+1 操作员 A 此时将其读出( version=1 ),并从其帐户余额中扣除 $5 +( $100-$50 )。
+2 在操作员 A 操作的过程中,操作员 B 也读入此用户信息( version=1 ),并 +从其帐户余额中扣除 $20 ( $100-$20 )。
+3 操作员 A 完成了修改工作,将数据版本号加一( version=2 ),连同帐户扣 +除后余额( balance=$50 ),提交至数据库更新,此时由于提交数据版本大 +于数据库记录当前版本,数据被更新,数据库记录 version 更新为 2 。
+4 操作员 B 完成了操作,也将版本号加一( version=2 )试图向数据库提交数 +据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的 +数据版本号为 2 ,数据库记录当前版本也为 2 ,不满足 “ 提交版本必须大于记 +录当前版本才能执行更新 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。 +这样,就避免了操作员 B 用基于 version=1 的旧数据修改的结果覆盖操作 +员 A 的操作结果的可能。 +     + 从上面的例子可以看出,乐观锁机制避免了长事务中的数据库加锁开销 +(操作员 A 和操作员 B 操作过程中,都没有对数据库数据加锁),大大提升了 +大并发量下的系统整体性能表现。
+2. 使用时间戳来实现
+     + 同样是在需要乐观锁控制的 table 中增加一个字段,名称无所谓,字段类型 +使用时间戳 (timestamp), 和上面的 version 类似,也是在更新提交的时候 +检查当前数据库中数据的时间戳和自己更新前取到的时间戳进行对比,如果一 +致则 OK,否则就是版本冲突。 +#### 悲观锁和乐观锁的适用场景: +     + 如果并发量不大,可以使用悲观锁解决并发问题;但如果系统的并发量非 +常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方 +法.现在大部分应用都应该是乐观锁的。 + + --- ### 搬运工信息 Author:Jason Lou
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/08_\346\266\211\345\217\212\345\221\275\344\273\244\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/08_\346\266\211\345\217\212\345\221\275\344\273\244\347\232\204\351\227\256\351\242\230.md" index a9a6146..1c3a19a 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/08_\346\266\211\345\217\212\345\221\275\344\273\244\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/08_\346\266\211\345\217\212\345\221\275\344\273\244\347\232\204\351\227\256\351\242\230.md" @@ -1,6 +1,140 @@ +# 涉及命令问题 +### 目录 +--- +1. truncate 与 delete 的区别是什么?
+2. sql 的授权语句和收回权限语句?
+3. 怎么新加一行记录、怎么添加一个列字段,修改列 ?
+4. select Count (*) 和 Select Count( 数 字 ) 以 及 Select Count(column)区别。
+5. EXISTS 关键字的使用方法?
+6. 有一个学生表,有三个字段:name 、course 、score ,每一个学生都有三门课程,比如数学、语文、英语,写 sql 语句,查找出三门课程的成绩都大于 80 的学生。
+7. 判断表的字段值是否为空
+ + +### 1. truncate 与 delete 的区别是什么? +TRUNCATE TABLE:删除内容、不删除定义、释放空间。
+DELETE TABLE:删除内容、不删除定义,不释放空间。
+DROP TABLE:删除内容和定义,释放空间。
+ +1. truncate table 表名,只能删除表中全部数据。 +delete from 表名 where ....,可以删除表中全部数据,也可以删除 +部分数据。 +2. delete from 记录是一条条删的,所删除的每行记录都会进日志, +而 truncate 一次性删掉整个页,因此日志里面只记录页释放。 +3. Truncate 删除后,不能回滚。Delete 可以回滚。 +4. Truncate 的执行速度比 Delete 快。 +5. Delete 执行后,删除的数据占用的存储空间还在,还可以恢复数 +据。 + +Truncate 删除的数据占用的存储空间不在,不可以恢复数据。
+ +### 2. sql 的授权语句和收回权限语句? +*grant 权限 on 数据库对象 to 用户* +```sql +grant insert on scott.Employees to user1,user2; +grant delete on scott.Employees to user1,user2; +grant select on scott.Employees to user1,user2; +grant update on scott.Employees to user1,user2; +``` + +*revoke 权限 on 数据库对象 from 用户* + +### 3. 怎么新加一行记录、怎么添加一个列字段,修改列 ? +插入一行数据: +```sql +insert into stu(stuName,stuAge,stuSex) values('张三','20','男') +``` +增加列: +```sql +alter table tableName add (column)columnName varchar(30) (一定要有数据类型!!!) +``` +删除列: +```sql + alter table tableName drop (column) columnName +``` + +### 4. select Count (*) 和 Select Count( 数 字 ) 以 及 Select Count(column)区别。 +     + count(*) 跟 count(1) 的结果一样,返回记录的总行数,都包括 +对 NULL 的统计,而 count(column) 是不包括 NULL 的统计。
+![08_4_1](/data/images/Java应届生面试突击/数据库/08_4_1.png)
+ + +### 5. EXISTS 关键字的使用方法? +     + EXISTS 关键字表示存在。使用 EXISTS 关键字时,内层查询语句不返回查询的记录, +而是返回一个真假值。
+     + 如果内层查询语句查询到符合条件的记录,就返回一个真值(true),否则,将返回 +一个假值(false): +- 当返回的值为 true 时,外层查询语句将进行查询。 +- 当返回的值为 false 时,外层查询语句将不进行查询或者查询不出任何记录。 +#### 实例 1 +     + 如果 department 表中存在 d_id 取值为 1003 的记录, +则查询 employee 表的记录。SELECT +语句的代码如下: +```sql +SELECT * FROM employee + WHERE EXISTS + (SELECT d_name FROM department WHERE d_id=1003); +``` +     + 因为 department 表中存在 d_id 值为 1003 的记录,内层查询语句返回一个 true,外层 +查询语句接收 true 后,开始查询 employee 表中的记录。因为没有设置查询 employee 表的 +查询条件,所以查询出了 employee 表的所有记录。 +#### 实例 2 +     + EXISTS 关键字可以与其它的查询条件一起使用。条件表达式与 EXISTS 关键字之间用 +AND 或者 OR 进行连接。
+     + 如果 department 表中存在 d_id 取值为 1003 的记录,则查询 employee 表中 age 大于 +24 岁的记录。SELECT 语句的代码如下: +```sql +SELECT * FROM employee + WHERE age>24 AND EXISTS + (SELECT d_name FROM department WHERE d_id=1003); +``` +     + 因为,当内层查询语句从 department 表中查询到记录,返回一个 true,外层查询语句 +开始进行查询,根据查询条件,从 employee 表中查询出 age 大于 24 岁的两条记录。 +#### 实例 3 +     + NOT EXISTS 与 EXISTS 正好相反。使用 NOT EXISTS 关键字时,当返回的值是 true 时, +外层查询语句不进行查询或者查询不出任何记录;当返回值是 false 时,外层查询语句将 +进行查询。
+     + 如果 department 表中不存在 d_id 字段取值为 1003 的记录,则查询 employee 表的记 +录。SELECT 语句的代码如下: +```sql +SELECT * FROM employee + WHERE NOT EXISTS + (SELECT d_name FROM department WHERE d_id=1003); +``` +### 6. 有一个学生表,有三个字段:name 、course 、score ,每一个学生都有三门课程,比如数学、语文、英语,写 sql 语句,查找出三门课程的成绩都大于 80 的学生。 +     + 采用逆向思维。求三门成绩都大于 80 的人,也可以是使先查出有成绩小于 80 的人, +再除去这些人就是三门成绩都大于 80 的人了。
+方法 1: +```sql +SELECT DISTINCT A.name + FROM Student A + WHERE A.name not in( + SELECT Distinct S.name FROM Student S WHERE S.score <80) +``` +方法 2: +```sql +SELECT S.name + FROM Student S + GROUP BY S.name + Having MIN(S.score)>=80 +``` +### 7. 判断表的字段值是否为空 +1、查询字段值为空的语法:where <字段名> is null
+2、查询字段值不为空的语法:where <字段名> is not null 或者 where NoT(<字段名> IS +NULL)
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_\346\266\211\345\217\212\347\264\242\345\274\225\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_\346\266\211\345\217\212\347\264\242\345\274\225\347\232\204\351\227\256\351\242\230.md" index 821a376..b9b24f6 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_\346\266\211\345\217\212\347\264\242\345\274\225\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_\346\266\211\345\217\212\347\264\242\345\274\225\347\232\204\351\227\256\351\242\230.md" @@ -1,7 +1,323 @@ +# 涉及索引的问题 +### 目录 +--- +1. 索引的优缺点。
+2. 索引有哪些?
+3. 数据库索引的原理(实现)。
+4. Mysql 的 B+树索引的优点?为什么不用二叉树?B-树和 B+树为什么比红黑树更合适?
+5. 建索引的几大原则。
+ + +### 1. truncate 与 delete 的区别是什么? +![09_1_1](/data/images/Java应届生面试突击/数据库/09_1_1.png)
+ +### 性别字段为什么不适合加索引?从 B+树原理解释。 +     + 尽量选择区分度高的字段作为索引,区分度的公式是 count(distinct col)/count(*),表示 +字段不重复的比例,*比例越大我们扫描的记录数越少*,唯一键的区分度是 1,而一些状态、 +性别字段可能在大数据面前区分度就是 0。在性别字段上增加索引,并不能明显加快检索 +速度。 + +### 2. 索引有哪些? +     + 索引的作用是“排列好次序,使得查询时可以快速找到”。
+     + 唯一索引/非唯一索引、主键索引(主索引)、聚集索引/非聚集索引、组合 +索引。
+1. 唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字段 +的值组合起来在表中不可以重复。
+如下表中,为’学号‘建索引:
+```sql +学号 姓名 +----------------------- +001 张三 +002 李四 +``` +2. 非唯一索引是在表上一个或者多个字段组合建立的索引,这个或者这些字 +段的值组合起来在表中可以重复,不要求唯一。
+如下表中,为 Score 建索引,可不唯一: +```sql +Score | Name +-------------------- +98 张三 +98 李四 +96 王五 +``` +3. 主键索引(主索引)是唯一索引的特定类型。表中创建主键时自动创建的 +索引 。一个表只能建立一个主索引。 +4. 聚集索引(聚簇索引),表中记录的物理顺序与键值的索引顺序相同。一 +个表只能有一个聚集索引。 + +#### 扩展:聚集索引和非聚集索引的区别?分别在什么情况下使用? +     + 聚集索引和非聚集索引的根本区别是表中记录的物理顺序和索引的排列顺 +序是否一致。
+     + 聚集索引的表中记录的物理顺序与索引的排列顺序一致。
+     + 优点是查询速度快,因为一旦具有第一个索引值的记录被找到,具有连续索 +引值的记录也一定物理的紧跟其后。
+     + 缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引 +的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重 +排,降低了执行速度。 在插入新记录时数据文件为了维持 B+Tree 的特性而频繁的 +分裂调整,十分低效。
+     + 建议使用聚集索引的场合为:
+     + A.某列包含了小数目的不同值。
+     + B.排序和范围查找。
+     + 非聚集索引的记录的物理顺序和索引的顺序不一致。
+#### 其他方面的区别: +     + 1. 聚集索引和非聚集索引都采用了 B+树的结构,但非聚集索引的叶子层并 +不与实际的数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中 +的指针的方式。聚集索引的叶节点就是数据节点,而非聚集索引的叶节点仍然 +是索引节点。
+     + 2. 非聚集索引添加记录时,不会引起数据顺序的重组。
+     +     + 看上去聚簇索引的效率明显要低于非聚簇索引,因为每次使用辅助索引检索都要经过 +     + 两次 B+树查找,这不是多此一举吗?聚簇索引的优势在哪?
+     +     + 1.由于行数据和叶子节点存储在一起,这样主键和行数据是一起被载入内存的,找到
+     + 叶子节点就可以立刻将行数据返回了,如果按照主键 Id 来组织数据,获得数据更快。
+     +     + 2.辅助索引使用主键作为"指针", 而不是使用地址值作为指针的好处是,减少了当出
+     + 现行移动或者数据页分裂时,辅助索引的维护工作,InnoDB 在移动行时无须更新辅助索
+     + 引中的这个"指针"。也就是说行的位置会随着数据库里数据的修改而发生变化,使用聚簇
+     + 索引就可以保证不管这个主键 B+树的节点如何变化,辅助索引树都不受影响。
+     + 建议使用非聚集索引的场合为:
+     + a.此列包含了大数目的不同值;
+     + b.频繁更新的列
+5. 组合索引(联合索引)
+基于多个字段而创建的索引就称为组合索引。
+创建索引
+```sql +create index idx1 on table1(col1,col2,col3) +``` +查询 +```sql +select * from table1 where col1= A and col2= B and col3 = C + +``` +#### 组合索引查询的各种场景: +组合索引 Index (A, B, C) + +- 下面条件可以用上该组合索引查询: + - A>5 + - A=5 AND B>6 + - A=5 AND B=6 AND C=7 + - A=5 AND B=6 AND C IN (2, 3) + +- 下面条件将不能用上组合索引查询: + - B>5 ——查询条件不包含组合索引首列字段 + - B=6 AND C=7 ——理由同上 + +- 下面条件将能用上部分组合索引查询(重要!!!!): + - A>5 AND B=2 ——当范围查询使用第一列,查询条件仅仅能使用第一列 + - A=5 AND B>6 AND C=2 ——范围查询使用第二列,查询条件仅仅能使用前二列 + - A=5 AND B IN (2, 3) AND C=2 + +#### 组合索引排序的各种场景: +兹有组合索引 Index(A,B)。 + +- 下面条件可以用上组合索引排序: + - ORDER BY A——首列排序 + - A=5 ORDER BY B——第一列过滤后第二列排序 + - ORDER BY A DESC, B DESC——注意,此时两列以相同顺序排序 + - A>5 ORDER BY A——数据检索和排序都在第一列 + +- 下面条件不能用上组合索引排序: + - ORDER BY B ——排序在索引的第二列 + - A>5 ORDER BY B ——范围查询在第一列,排序在第二列 + - A IN(1,2) ORDER BY B ——理由同上 + - ORDER BY A ASC, B DESC ——注意,此时两列以不同顺序排序 + +```sql +alter table users add index lname_fname_age(lname,fname,age); + +``` +     + 创建了 lname_fname_age 多列索引,相当于创建了(lname)单列索引, +(lname,fname)联合索引以及(lname,fname,age)联合索引。 + +*举例说明:*
+     + 上面给出一个多列索引(username,password,last_login),当 +三 列 在 where 中 出 现 的 顺 序 如 (username,password,last_login) 、 +(username,password)、 (username) 才能 用 到 索引 ,如 下面几 个顺 序 +(password,last_login) 、 (passwrod) 、 (last_login)--- 这 三 者 不 从 +username 开始,(username,last_login)---断层,少了 password,都无 +法利用到索引。因为 B+tree 多列索引保存的顺序是按照索引创建的顺序, +检索索引时按照此顺序检索。 + +### 3. 数据库索引的原理(实现)。 +     + 目前大部分数据库系统及文件系统都采用 B-Tree( B 树)或其变种 B+Tree +(B+树)作为索引结构。B+Tree 是数据库系统实现索引的首选数据结构。 +    
+ 在 MySQL 中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式 +是不同的,本文主要讨论 MyISAM 和 InnoDB 两个存储引擎的索引实现方式。 +MyISAM 索引实现
+     + MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录 +的地址。下图是 MyISAM 索引的原理图:
+![09_3_1](/data/images/Java应届生面试突击/数据库/09_3_1.png)
+主键索引 + +     + 这里设表一共有三列,假设我们以 Col1 为主键,则图 8 是一个 MyISAM 表的主 +索引(Primary key)示意。可以看出 MyISAM 的索引文件仅仅保存数据记录的地址。 +在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只 +是主索引要求 key 是唯一的,而辅助索引的 key 可以重复。如果我们在 Col2 上建立 +一个辅助索引,则此索引的结构如下图所示:
+![09_3_2](/data/images/Java应届生面试突击/数据库/09_3_2.png)
+辅助索引 + +     + 同样也是一颗 B+Tree,data 域保存数据记录的地址。因此,MyISAM 中索引 +检索的算法为首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其 +data 域的值,然后以 data 域的值为地址,读取相应数据记录。
+     + MyISAM 的索引方式也叫做“非聚集索引”,之所以这么称呼是为了与 InnoDB +的聚集索引区分。
+InnoDB 索引实现
+     + 虽然 InnoDB 也使用 B+Tree 作为索引结构,但具体实现方式却与 MyISAM 截 +然不同。
+     + 1.第一个重大区别是 InnoDB 的数据文件本身就是索引文件。从上文知道, +MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在 +InnoDB 中,表数据文件本身就是按 B+Tree 组织的一个索引结构,这棵树的叶节点 +data 域保存了完整的数据记录。这个索引的 key 是数据表的主键,因此 InnoDB 表数 +据文件本身就是主索引。
+![09_3_3](/data/images/Java应届生面试突击/数据库/09_3_3.png)
+主索引 + +     + 上图是 InnoDB 主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整 +的数据记录。这种索引叫做聚集索引。因为 InnoDB 的数据文件本身要按主键聚集, +1. InnoDB 要求表必须有主键(MyISAM 可以没有),如果没有显式指定,则 MySQL +系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则 +MySQL 自动为 InnoDB 表生成一个隐含字段作为主键,类型为长整形。同时,请尽 +量 2.在 InnoDB 上采用自增字段做表的主键。因为 InnoDB 数据文件本身是一棵 +B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持 B+Tree 的特性而频 +繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。如果表使用 +自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当 +一页写满,就会自动开辟一个新的页。如下图所示:
+![09_3_4](/data/images/Java应届生面试突击/数据库/09_3_4.png)
+ +这样就会形成一个紧凑的索引结构,近似顺序填满。由于每次插入时也不需要移动已有 +数据,因此效率很高,也不会增加很多开销在维护索引上。 +2. 第二个与 MyISAM 索引的不同是 InnoDB 的辅助索引 data 域存储相应记录 +主键的值而不是地址。换句话说,InnoDB 的所有辅助索引都引用主键作为 data 域。 +例如,图 11 为定义在 Col3 上的一个辅助索引:
+![09_3_5](/data/images/Java应届生面试突击/数据库/09_3_5.png)
+辅助索引 + +聚集索引这种实现方式使得按主键的搜索十分高效, +但是辅助索引搜索需要检索两遍索
+引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
+引申:为什么不建议使用过长的字段作为主键?
+     + 因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。 +#### 扩展阅读 1: +InnoDB 使用的是聚簇索引,将主键组织到一棵 B+树中,而行数据就储存在叶子节 +点上,若使用"where id = 14"这样的条件查找主键,则按照 B+树的检索算法即可查找到 +对应的叶节点,之后获得行数据。若对 Name 列进行条件搜索,则需要两个步骤:第一步 +在辅助索引 B+树中检索 Name,到达其叶子节点获取对应的主键。第二步使用主键在主 +索引 B+树种再执行一次 B+树检索操作,最终到达叶子节点即可获取整行数据。 +MyISM 使用的是非聚簇索引,非聚簇索引的两棵 B+树看上去没什么不同,节点 +的结构完全一致只是存储的内容不同而已,主键索引 B+树的节点存储了主键,辅助键索引 +B+树存储了辅助键。表数据存储在独立的地方,这两颗 B+树的叶子节点都使用一个地址 +指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通 +过辅助键检索无需访问主键的索引树。
+为了更形象说明这两种索引的区别,我们假想一个表如下图存储了 4 行数据。其中 +Id 作为主索引,Name 作为辅助索引。图示清晰的显示了聚簇索引和非聚簇索引的差异。
+![09_3_6](/data/images/Java应届生面试突击/数据库/09_3_6.png)
+ +#### 扩展阅读 2: +![09_3_7](/data/images/Java应届生面试突击/数据库/09_3_7.png)
+ +b 树的查找过程:
+     + 如图所示,如果要查找数据项 29,那么首先会把磁盘块 1 由磁盘加载到内存, +此时发生一次 IO,在内存中用二分查找确定 29 在 17 和 35 之间,锁定磁盘块 1 的 P2 +指针,内存时间因为非常短(相比磁盘的 IO)可以忽略不计,通过磁盘块 1 的 P2 指 +针的磁盘地址把磁盘块 3 由磁盘加载到内存,发生第二次 IO,29 在 26 和 30 之间, +锁定磁盘块 3 的 P2 指针,通过指针加载磁盘块 8 到内存,发生第三次 IO,同时内存 +中做二分查找找到 29,结束查询,总计三次 IO。真实的情况是,3 层的 b+树可以表 +示上百万的数据,如果上百万的数据查找只需要三次 IO,性能提高将是巨大的,如果 +没有索引,每个数据项都要发生一次 IO,那么总共需要百万次的 IO,显然成本非常非 +常高。
+     + 注意:当 b+树的数据项是复合的数据结构(建立的是复合索引),比如 +(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张 +三,20,F)这样的数据来检索的时候,b+树会优先比较 name 来确定下一步的搜索方向, +如果 name 相同再依次比较 age 和 sex,最后得到检索的数据;但当(20,F)这样的没 +有 name 的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时 +候 name 就是第一个比较因子,必须要先根据 name 来搜索才能知道下一步去哪里查 +询。比如当(张三,F)这样的数据来检索时,b+树可以用 name 来指定搜索方向,但下 +一个字段 age 的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是 F +的数据了, 这个是非常重要的性质,即索引的最左匹配特性。注意:B+tree 多列索 +引保存的顺序是按照索引创建的顺序,检索索引时按照此顺序检索。
+     + 最左前缀原则中 where 字句有 or 出现还是会遍历全表。 +### 4. Mysql 的 B+树索引的优点?为什么不用二叉树?B-树和 B+树为什么比红黑树更合适? +     + 数据库文件很大,需要存储到磁盘上,索引的结构组织要尽量减少查找过程中磁盘 +I/O 的存取次数。
+1.高度原因
+     + B+树中的每个结点可以包含大量的关键字,这样树的深度降低了,所以任何关键 +字的查找必须走一条从根结点到叶子结点的路,所有关键字查询的路径长度相同,导致 +每一个数据的查询效率相当, 这就意味着查找一个元素只要很少结点从外存磁盘中读入 +内存,很快访问到要查找的数据,减少了磁盘 I/O 的存取次数。
+2.磁盘预读原理和局部性原理
+     + 将一个节点的大小设为等于一个页,这样每个节点只需要一次 I/O 就可以完全载 +入。 +### 5. 建索引的几大原则。 +1. 最左前缀匹配原则,mysql 会一直向右匹配直到遇到范围查询(>、<、between、 +like)就停止匹配,范围查询会导致组合索引半生效。
+     + 比如 a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,c 可 +以用到索引,d 是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d 的顺 +序可以任意调整。where 范围查询要放在最后 (这不绝对,但可以利用一部分索引)。 +特别注意:and 之间的部分可以乱序,比如 a = 1 and b = 2 and c = 3 建立(a,b,c) +索引可以任意顺序,mysql 的查询优化器会帮你优化成索引可以识别的形式。
+     + where 字句有 or 出现还是会遍历全表。
+2. 尽量选择区分度高的字段作为索引,某字段的区分度的公式是 count(distinct +col)/count(*),表示字段不重复的比例,比例越大,我们扫描的记录数越少, 查找匹配 +的时候可以过滤更多的行, 唯一索引的区分度是 1,而一些状态、性别字段可能在大数 +据面前区分度就是 0。 +4. 不在索引列做运算或者使用函数。 +5. 尽量扩展索引,不要新建索引。比如表中已经有 a 的索引,现在要加(a,b)的索引,那 +么只需要修改原来的索引即可。 +6. Where 子句中经常使用的字段应该创建索引, +分组字段或者排序字段应该创建索引, +两个表的连接字段应该创建索引。 +7. like 模糊查询中,右模糊查询(321%)会使用索引,而%321 和%321%会放弃索引 +而使用全局扫描。 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/10_\346\266\211\345\217\212\345\255\230\345\202\250\345\274\225\346\223\216\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/10_\346\266\211\345\217\212\345\255\230\345\202\250\345\274\225\346\223\216\347\232\204\351\227\256\351\242\230.md" index a9a6146..252e126 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/10_\346\266\211\345\217\212\345\255\230\345\202\250\345\274\225\346\223\216\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/10_\346\266\211\345\217\212\345\255\230\345\202\250\345\274\225\346\223\216\347\232\204\351\227\256\351\242\230.md" @@ -1,6 +1,58 @@ +# 涉及存储引擎的问题 +### 目录 +--- +1. mysql 中 MyIsam 与 InnoDB 的区别,至少 5 点。
+2. 一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ?
+ + +### 1. mysql 中 MyIsam 与 InnoDB 的区别,至少 5 点。 +     + Mysql 数据库中,最常用的两种引擎是 innordb 和 myisam。InnoDB 是 Mysql 的默 +认存储引擎。
+1. 事务处理上方面
+     + MyISAM 强调的是性能,查询的速度比 InnoDB 类型更快,但是不提供事务支持。
+     + InnoDB 提供事务支持事务。
+2.外键
+     + MyISAM 不支持外键,InnoDB 支持外键。
+3. 锁
+     + MyISAM 只支持表级锁,InnoDB 支持行级锁和表级锁,默认是行级锁,行锁大幅 +度提高了多用户并发操作的性能。innodb 比较适合于插入和更新操作比较多的情况, +而 myisam 则适合用于频繁查询的情况。另外,InnoDB 表的行锁也不是绝对的,如果 +在执行一个 SQL 语句时,MySQL 不能确定要扫描的范围,InnoDB 表同样会锁全表, +例如 update table set num=1 where name like “%aaa%”。
+4. 全文索引
+     + MyISAM 支持全文索引, InnoDB 不支持全文索引。innodb 从 mysql5.6 版本开始提 +供对全文索引的支持。
+5. 表主键
+     + MyISAM:允许没有主键的表存在。
+     + InnoDB:如果没有设定主键,就会自动生成一个 6 字节的主键(用户不可见)。
+6. 表的具体行数
+     + MyISAM:select count(*) from table,MyISAM 只要简单的读出保存好的行数。因为 +MyISAM 内置了一个计数器,count(*)时它直接从计数器中读。
+     + InnoDB:
+不保存表的具体行数,也就是说,执行 select count(*) from table 时, InnoDB +要扫描一遍整个表来计算有多少行。 +### 2. 一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert 一条记录,这条记录的 ID 是 18 还是 15 ? +     + 如果表的类型是 MyISAM,那么是 18。
+因为 MyISAM 表会把自增主键的最大 ID 记录到数据文件里,重启 +MySQL 自增主键的最大 ID 也不会丢失。
+     + 如果表的类型是 InnoDB,那么是 15。
+InnoDB 表只是把自增主键的最大 ID 记录到内存中,所以重启数据 +库会导致最大 ID 丢失。
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/11_\345\205\266\344\273\226\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/11_\345\205\266\344\273\226\351\227\256\351\242\230.md" index 821a376..1d9e344 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/11_\345\205\266\344\273\226\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/11_\345\205\266\344\273\226\351\227\256\351\242\230.md" @@ -1,7 +1,276 @@ +# 其他问题 +### 目录 +--- +1. 如果在数据库上进行了误操作该怎么处理。
+2. 数据库在进行水平分表之后,sql 分页查询该怎么进行?分表之后想让一个 id 多个表是自增的,效率实现 。数据库中的分页查询语句怎么写?
+3. 关系型数据库和非关系型数据库的区别。
+4. 数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?
+5. 列级约束与表级约束的区别?
+6. 关系五种基本运算
+ +### 1. mysql 中 MyIsam 与 InnoDB 的区别,至少 5 点。 +1.利用数据备份。 +2.利用 binlog 文件。 + +### 2. 数据库在进行水平分表之后,sql 分页查询该怎么进行?分表之后想让一个 id 多个表是自增的,效率实现 。数据库中的分页查询语句怎么写? +1. 用 union all 合并几个分表的结果集,之后进行分页查询。
+2. 如假定共 3 个分表,记录数分别为 90,120,80 ,总记录数为 290
+设分页是每页显示 40 条,则
+第 1 页 表一的 1 到 40
+第 2 页 表一的 41 到 80
+第 3 页 表一的 81 到 90 + 表二的 1 到 30
+第 4 页 表二的 31 到 70
+第 5 页 表二的 71 到 110
+第 6 页 表二的 111 到 120 + 表三的 1 到 30
+.....
+3. 用 sphinx(斯芬克司)先建索引,然后分页查询。 + +     + 当我们对 MySQL 进行分表操作后,将不能依赖 MySQL 的自动增量来产生唯一 ID 了, +因为数据已经分散到多个表中。
+     + 使用队列服务,如 redis、memcacheq 等,将一定量的 ID 预分配在一个队列里,每次 +插入操作,先从队列中获取一个 ID,若插入失败的话,将该 ID 再次添加到队列中,同时 +监控队列数量,当小于阀值时,自动向队列中添加元素。
+ +### 3. 关系型数据库和非关系型数据库的区别。 +#### 非关系型数据库的优势: +1. 性能
+NOSQL 是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经 +过 SQL 层的解析,所以性能非常高。
+2. 可扩展性
+同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。
+#### 关系型数据库的优势: +1. 复杂查询
+可以用 SQL 语句方便的在一个表以及多个表之间做非常复杂的数据查询。
+2. 事务支持
+使得对于安全性能很高的数据访问要求得以实现。
+ +### 4. 数据库连接池的原理?连接池使用什么数据结构实现?实现连接池? +#### 一.早期我们怎么进行数据库操作 +1. 原理:一般来说,java 应用程序访问数据库的过程是:
+ 1 加载数据库驱动程序;
+ 2 通过 jdbc 建立数据库连接;
+ 3 访问数据库,执行 sql 语句;
+ 4 断开数据库连接。
+2. 代码 +```java +// 查询所有用户 +public void FindAllUsers(){ + //1、装载 sqlserver 驱动对象 + DriverManager.registerDriver(new SQLServerDriver()); + //2、通过 JDBC 建立数据库连接 + Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123"); + //3、创建状态 + Statement state =con.createStatement(); + //4、查询数据库并返回结果 + ResultSet result =state.executeQuery("select * from users"); + + //5、输出查询结果 + while(result.next()){ + System.out.println(result.getString("email")); + } + //6、断开数据库连接 + result.close(); + state.close(); + con.close(); +} +``` +3. 分析
+     + 程序开发过程中,存在很多问题:
+     + 首先,每一次 web 请求都要建立一次数据库连接。建立连接是一个费时的活动, +每次都得花费 0.05s~1s 的时间,而且系统还要分配内存资源。这个时间对于一次或 +几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的 web 应用,尤其 +是大型电子商务网站,同时有几百人甚至几千人在线是很正常的事。在这种情况下,频 +繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的 +甚至会造成服务器的崩溃。 不是危言耸听,这就是制约某些电子商务网站发展的技术瓶 +颈问题。
+     + 其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而 +未能关闭,将会导致数据库系统中的内存泄漏,最终将不得不重启数据库。还有,这种 +开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多, +也可能导致内存泄漏,服务器崩溃。
+     + 通过上面的分析,我们可以看出来,“数据库连接”是一种稀缺的资源,为了保障 +网站的正常使用,应该对其进行妥善管理。其实我们查询完数据库后,如果不关闭连接, +而是暂时存放起来,当别人使用时,把这个连接给他们使用。就避免了一次建立数据库 +连接和断开的操作时间消耗。原理如下: + +#### 二. 技术演进出来的数据库连接池 +     + 由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们 +知道,对于共享资源,有一个著名的设计模式:资源池设计模式。该模式正是为了解决 +资源的频繁分配、释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。 +数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入 +一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕 +之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽地与数据库连接。 +更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为 +系统开发、测试及性能调整提供依据。
+     + 我们自己尝试开发一个连接池,来为上面的查询业务提供数据库连接服务:
+     + 1 编写 class 实现 DataSource 接口
+     + 2 在 class 的构造器一次性创建 10 个连接,将连接保存 LinkedList 中
+     + 3 实现 getConnection, 从 LinkedList 中返回一个连接
+     + 4 提供将连接放回连接池中的方法
+1. 连接池代码 +```java +public class MyDataSource implements DataSource { + //因为 LinkedList 是用链表实现的,对于增删实现起来比较容易 + LinkedList dataSources = new LinkedList(); + //初始化连接数量 + public MyDataSource() { + //问题:每次 new MyDataSource 都会建立 10 个链接,可使用单例设计模式解决此类问题 + + for(int i = 0; i < 10; i++) { + try { + //1、装载 sqlserver 驱动对象 + DriverManager.registerDriver(new SQLServerDriver()); + + //2、通过 JDBC 建立数据库连接 + Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer", "sa", "123"); + + //3、将连接加入连接池中 + dataSources.add(con); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Override + public Connection getConnection() throws SQLException { + //取出连接池中一个连接 + final Connection conn = dataSources.removeFirst(); // 删除第一个连接返回 + return conn; + } + + //将连接放回连接池 + public void releaseConnection(Connection conn) { + dataSources.add(conn); + } +} +``` +2. 使用连接池重构我们的用户查询函数 +```java +//查询所有用户 +public void FindAllUsers(){ + //1、使用连接池建立数据库连接 + MyDataSource dataSource = new MyDataSource(); + Connection conn =dataSource.getConnection(); + //2、创建状态 + Statement state =con.createStatement(); + //3、查询数据库并返回结果 + ResultSet result =state.executeQuery("select * from users"); + + //4、输出查询结果 + while(result.next()){ + System.out.println(result.getString("email")); + } + //5、断开数据库连接 + result.close(); + state.close(); + //6、归还数据库连接给连接池 + dataSource.releaseConnection(conn); +} +``` +#### 连接池的工作原理: +     + 连接池的核心思想是连接的复用,通过建立一个数据库连接池以及一套连接使用、分 +配和管理策略,使得该连接池中的连接可以得到高效,安全的复用,避免了数据库连接频 +繁建立和关闭的开销。
+     + 连接池的工作原理主要由三部分组成,分别为连接池的建立,连接池中连接的使用管 +理,连接池的关闭。
+     + 第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中 +建立几个连接对象,以便使用时能从连接池中获取。java 中提供了很多容器类,可以方便 +的构建连接池,例如 Vector(线程安全类),linkedlist 等。
+     + 第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和 +释放对系统的性能有很大的影响。其策略是:
+     + 当客户请求数据库连接时,首先查看连接池中是否有空闲连接,如果存在空闲连接, +则将连接分配给客户使用并作相应处理(即标记该连接为正在使用,引用计数加 1);如 +果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没有达到最大 +连接数,如果没达到就重新创建一个连接给请求的客户;如果达到,就按设定的最大等待 +时间进行等待,如果超出最大等待时间,则抛出异常给客户。
+     + 当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过了 +就从连接池中删除该连接,并判断当前连接池内总的连接数是否小于最小连接数,若小于 +就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。
+ 第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的链接,释放连接池相 +关资源,该过程正好与创建相反。
+#### 连接池的主要优点: +1)减少连接的创建时间。连接池中的连接是已准备好的,可以重复使用的,获取后可以直 +接访问数据库,因此减少了连接创建的次数和时间。
+2)更快的系统响应速度。数据库连接池在初始化过程中,往往已经创建了若干数据库连接 +置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有 +可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时 +间。
+3)统一的连接管理。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统 +的稳定性受系统的连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使 +性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的链接数量,增强了 +系统在大量用户应用时的稳定性。 + +*c3p0 数据库连接池。* +### 5. 列级约束与表级约束的区别? +(1)*列级约束*:只能应用于一列上。
+     + *表级约束8:可以应用于一列上,也可以应用在一个表中的多个列上。 +(即:如果你创建的约束涉及到该表的多个属性列,则必须创建的是表级约束(必须定义 +在表级上);否则既可以定义在列级上也可以定义在表级上,此时只是 SQL 语句格式不同 +而已)
+(2)*列级约束*:包含在列定义中,直接跟在该列的其它定义之后 ,用空格分隔;不必指 +定列名 。
+     + *表级约束*:与列定义相互独立,不包含在列定义中;与定义用‘,’分隔;必须指出要 +约束的列的名称。
+(*注*:因为在创建列级约束时,只需将创建列约束的语句添加到该字段(列)的定义子句 +后面;而在创建表级约束时,需要将创建表级约束的语句添加到各个字段(列)定义语句 +的后面,因为并不是每个定义的字段都要创建约束,所以必须指明需要创建的约束的列名。) +举例说明: +```sql +Create Table project +( + 项目编号 int + Constraint pk_pno primary key, + 项目名称 char(20), + 项目负责人 char(20), + Constraint un_pname_pm unique(项目名称,项目负责人) +) +``` +     + 分析: “项目编号”字段设置为主键,主键约束名为 pk_pno,此主键约束为列主键约束“项 +目名称”和“项目负责人”的组合字段设置唯一性约束,此约束为表级约束) +### 6. 关系五种基本运算 +1 并:
+     + R,S 具有相同的关系模式(元素相同,结构相同),记为 R U S,返回由 R 或者 S 元组 +构成的集合组成
+2 差:
+     + R,S 具有相同的关系模式(元素相同,结构相同),记为 R-S,右属于 R 但不属于 S 的 +元组组成
+3 广义笛卡尔积:
+     + R×S 由 n 目和 m 目的关系 R,S 组成一个(n+m)列的元组集合,若 R 有 K1 个元组,S +有 K2 个元组,则 R×S 有 K1*K2 个元 组。
+4 投影(π) :
+     + 从关系的垂直方向开始运算,选择关系中的若干列组成新的列。
+5 选择(σ):
+     + 从关系的水平方向进行运算,选择满足给定条件的元组组成新的关系。
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/12_\346\225\260\346\215\256\345\272\223\344\270\223\351\242\230(\350\241\245 1).md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/12_\346\225\260\346\215\256\345\272\223\344\270\223\351\242\230(\350\241\245 1).md" new file mode 100644 index 0000000..95a682a --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/12_\346\225\260\346\215\256\345\272\223\344\270\223\351\242\230(\350\241\245 1).md" @@ -0,0 +1,69 @@ +# 数据库专题(补 1) + +### 目录 + +--- +1. 数据库索引失效的几种情况。
+2. 一个表只有一列 name,有重复的 name, 求出前十个 name 数最大的 name。
+3. 服务器与服务器之间传输文件夹下的文件,一个文件夹下有 10 个文件,另一个文件夹下有 100 个文件,两个文件夹大小相等,问,哪个传输更快?
+4. 数据库表里有 100 万条数据,想要删除 80 万条数据,但是因为锁的原因,删除很慢,现在想要快速删除怎么办 ?
+ + +### 1. mysql 中 MyIsam 与 InnoDB 的区别,至少 5 点。 +1. 对于组合索引,不是使用的第一部分,则不会使用索引 。 +2. or 语句前后没有同时使用索引。要想使用 or,又想让索引生效,只能将 or 条件中的每个 +列都加上索引。 +3. 如果列类型是字符串,那一定要在条件中使用引号引起来,否则不会使用索引 。 +4. 如果 mysql 估计使用全表描述比使用索引快,则不使用索引。 +5. 在索引列上做运算或者使用函数。 +6. 以“%”开头的 LIKE 查询,模糊匹配。 + +### 2. 一个表只有一列 name,有重复的 name, 求出前十个 name 数最大的 name。 +```sql +select distinct name,count(name) a + from user + group by name + order by a desc + limit 10 +``` + +#### 扩展:limit 的用法。 +一.如果给定两个参数,第一个参数指定第一个返回记录行的偏移量,第二个参数指定返 +回记录行的最大数目。初始记录行的偏移量是 0(而不是 1)。 +```sql +SELECT * FROM + table LIMIT 5,10; //检索记录行 6-15 + //为了检索从某一个偏移量到记录集的结束所有的记录行,可以指定第二个参数为 -1: + SELECT * FROM + table LIMIT 95,-1; // 检索记录行 96-last. +``` +二.如果只给定一个参数,它表示返回最大的记录行数目。 +```sql +SELECT * FROM table LIMIT 5;//检索前 5 个记录行; LIMIT n 等价于 LIMIT 0,n。 +``` + +### 3. 服务器与服务器之间传输文件夹下的文件,一个文件夹下有 10 个文件,另一个文件夹下有 100 个文件,两个文件夹大小相等,问,哪个传输更快? +10 个文件更快。
+1)建立连接数更少,建立连接的开销比传输文件的开销大。
+2)文件写入磁盘,要计算文件的起始位置,文件数目少的话,这个开销就小了。
+ +### 4. 数据库表里有 100 万条数据,想要删除 80 万条数据,但是因为锁的原因,删除很慢,现在想要快速删除怎么办 ? +     + 如果需要保留的数据不多,需要删除的数据很多,那么可以考虑把需要保留的数据复 +制到临时表,然后删除所有数据,最后复制回去。
+     + 具体做法是:
+     + 先把要保留的数据用 insert into ... select * from ... where ...移到另外的表 +中, truncate table 旧表,
+     + 然后再 insert into ... select * from ... ,这个不存在锁,比 delete效率高。 + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
\ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_TCP_IP\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_TCP_IP\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" index 68a5b73..c969eb9 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_TCP_IP\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_TCP_IP\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" @@ -3,7 +3,7 @@ ### 目录 --- -1. 一.OSI 与 TCP/IP 各层的结构与功能,都有哪些协议,协议所占端口号。
+1. OSI 与 TCP/IP 各层的结构与功能,都有哪些协议,协议所占端口号。
2. IP 地址的分类。
3. 画出三次握手和四次挥手的图(状态转移图)。TCP 为什么三次握手,四次挥手?
4. 为什么收到 Server 端的确认之后,Client 还需要进行第三次“握手”呢?
@@ -33,7 +33,7 @@ ### 1. 优化查询的方法? #### 一.OSI 与 TCP/IP 各层的结构与功能,都有哪些协议,协议所占端口号。 -![01_1_1](/data/images/Java应届生面试突击/计算机网络/01_1_1.png) +![01_1_1](/data/images/Java应届生面试突击/计算机网络/01_1_1.png)
![01_1_2](/data/images/Java应届生面试突击/计算机网络/01_1_2.png) 1. 物理层----定义了为建立、维护和拆除物理链路所需的机械的、电气的、 @@ -70,7 +70,7 @@ 过网络交互访问的虚拟终端(VT)协议等都属于应用层的范畴。 ##### 每层的协议: -![01_1_3](/data/images/Java应届生面试突击/计算机网络/01_1_3.png) +![01_1_3](/data/images/Java应届生面试突击/计算机网络/01_1_3.png)
- 物理层:RJ45、CLOCK、IEEE802.3 - 数据链路:PPP、FR、HDLC、VLAN、MAC - 网络层:IP、ICMP、ARP、RARP、OSPF、IPX、RIP、IGMP @@ -86,15 +86,14 @@ - SMTP 25。 ### 2. IP 地址的分类。 -私有地址有: -A 类:10.0.0.0 到 10.255.255.255 -B 类:172.16.0.0 到 172.31.255.255 -C 类:192.168.0.0 到 192.168.255.255 -![01_2_1](/data/images/Java应届生面试突击/计算机网络/01_2_1.png) +私有地址有:
+A 类:10.0.0.0 到 10.255.255.255
+B 类:172.16.0.0 到 172.31.255.255
+C 类:192.168.0.0 到 192.168.255.255
+![01_2_1](/data/images/Java应届生面试突击/计算机网络/01_2_1.png)
### 3. 画出三次握手和四次挥手的图(状态转移图)。TCP 为什么三次握手,四次挥手? - #### 3 次握手过程状态: - LISTEN: 表示服务器端的某个 SOCKET 处于监听状态,可以接受连接了。 - SYN_SENT: 当客户端 SOCKET 执行 CONNECT 连接时,它首先发送 SYN 报文,因 @@ -171,37 +170,40 @@ TCP 连接就建立了。
关闭,所以发送 ACK 后进入 TIME_WAIT 状态,如果 Server 端没有收到 ACK 则可以重传。 “,Server 端收到 ACK 后,"就知道可以断开连接了"。Client 端等待了 2MSL 后依然没有收 到回复,则证明 Server 端已正常关闭,那好,我 Client 端也可以关闭连接了。Ok,TCP -连接就这样关闭了! +连接就这样关闭了!
+ +netstat 可以看到 tcp 的哪些状态?
+     + netstat 查看 TCP 状态值。
+https://www.cnblogs.com/ftl1012/p/netstat.html
-netstat 可以看到 tcp 的哪些状态? -netstat 查看 TCP 状态值。 -https://www.cnblogs.com/ftl1012/p/netstat.html #### 整个过程 Client 端所经历的状态如下: ![01_3_1](/data/images/Java应届生面试突击/计算机网络/01_3_1.png) #### Server 端所经历的过程如下: -![01_3_2](/data/images/Java应届生面试突击/计算机网络/01_3_2.png) +![01_3_2](/data/images/Java应届生面试突击/计算机网络/01_3_2.png)
![01_3_3](/data/images/Java应届生面试突击/计算机网络/01_3_3.png) *【注意】* 在 TIME_WAIT 状态中,如果 TCP client 端最后一次发送的 ACK 丢失了,它将 重新发送。TIME_WAIT 状态中所需要的时间是依赖于实现方法的。典型的值为 30 秒、1 -分钟和 2 分钟。等待之后连接正式关闭,并且*所有的资源(包括端口号)都被释放*。 -![01_3_4](/data/images/Java应届生面试突击/计算机网络/01_4_1.png) - -研究过 backlog 含义的朋友都很容易理解上图。这两个队列是内核实现的,当服务器 -绑定、监听了某个端口后,这个端口的 SYN 队列(未完成握手队列)和 ACCEPT 队列(已 -完成握手队列)就建立好了。客户端使用 connect 向服务器发起 TCP 连接,当图中 1.1 步 -骤客户端的 SYN 包到达了服务器后,内核会把这一信息放到 SYN 队列中,同时回一个 +分钟和 2 分钟。等待之后连接正式关闭,并且*所有的资源(包括端口号)都被释放*。
+![01_3_4](/data/images/Java应届生面试突击/计算机网络/01_4_1.png)
+     + 研究过 backlog 含义的朋友都很容易理解上图。这两个队列是内核实现的,当服务器 +绑定、监听了某个端口后,这个端口的 *SYN 队列(未完成握手队列)*和 *ACCEPT 队列(已 +完成握手队列)* 就建立好了。客户端使用 connect 向服务器发起 TCP 连接,当图中 1.1 步 +骤客户端的 SYN 包到达了服务器后,*内核会把这一信息放到 SYN 队列中*,同时回一个 SYN+ACK 包给客户端。一段时间后,在图中 2.1 步骤中客户端再次发来了针对服务器 SYN -包的 ACK 网络分组时,内核会把连接从 SYN 队列中取出,再把这个连接放到 ACCEPT -队列中。而服务器在第 3 步调用 accept 时,其实就是直接从 ACCEPT 队列中取出已经建 -立成功的连接套接字而已。 +包的 ACK 网络分组时,*内核会把连接从 SYN 队列中取出,再把这个连接放到 ACCEPT +队列中*。而服务器在第 3 步调用 accept 时,其实就是*直接从 ACCEPT 队列中取出已经建 +立成功的连接套接字*而已。 ### 4. 为什么收到 Server 端的确认之后,Client 还需要进行第三次“握手”呢? - -采用三次握手是为了*防止失效的连接请求报文段突然又传送到主机 B *,因而产生错 +     + 采用三次握手是为了*防止失效的连接请求报文段突然又传送到主机 B*,因而产生错 误。 -“已失效的连接请求报文段”的产生在这样一种情况下: client 发出的第一个连接请求报 +     + “已失效的连接请求报文段”的产生在这样一种情况下: client 发出的第一个连接请求报 文段并没有丢失,而是在某个网络结点长时间的滞留了(因为网络并发量很大在某结点被 阻塞了),以致延误到连接释放以后的某个时间才到达 server。*本来这是一个早已失效的 报文段。但 server 收到此失效的连接请求报文段后,就误认为是 client 再次发出的一个新 @@ -211,8 +213,8 @@ SYN+ACK 包给客户端。一段时间后,在图中 2.1 步骤中客户端再次 连接已经建立,并一直等待 client 发来数据。这样,server 的很多资源就白白浪费掉了*。 采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client 不会向 server 的 确认发出确认。server 由于收不到确认,就知道 client 并没有要求建立连接。”。*主要目的 -防止 server 端一直等待,浪费资源。* -![01_4_1](/data/images/Java应届生面试突击/计算机网络/01_4_1.png) +防止 server 端一直等待,浪费资源。*
+![01_4_1](/data/images/Java应届生面试突击/计算机网络/01_4_1.png)
     如果两次握手的话,客户端有可能因为网络阻塞等原因会发送多个请求报文, @@ -306,25 +308,407 @@ TIME_WAIT 状态保持时间足够长 (2MSL) ,连接相应方向上的 TCP 报 永远收不到这个重传的 FIN 报文段,服务器收不到 ACK,服务器无法关闭连接。
### 10. TCP如何保证可靠传输? -http://www.cnblogs.com/deliver/p/5471231.html +http://www.cnblogs.com/deliver/p/5471231.html
+0、在传递数据之前,会有三次握手来建立连接。
+1、应用数据被分割成 TCP 认为最适合发送的数据块(按字节编号,合理分片)。这和 UDP +完全不同,应用程序产生的数据报长度将保持不变。 (将数据截断为合理的长度)
+2、当 TCP 发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不 +能及时收到一个确认,将重发这个报文段。(超时重发)
### 11. TCP 建立连接之后怎么保持连接(检测连接断没断)? +     + 有两种技术可以运用。一种是由 TCP 协议层实现的 Keepalive 机制,另一种是由应用 +层自己实现的 HeartBeat 心跳包。
+     + 1.在 TCP 中有一个 Keep-alive 的机制可以检测死连接,原理很简单,当连接闲置一定 +的时间(参数值可以设置,默认是 2 小时)之后,TCP 协议会向对方发一个 keepalive 探 +针包(包内没有数据),对方在收到包以后,如果连接一切正常,应该回复一个 ACK;如 +果连接出现错误了(例如对方重启了,连接状态丢失),则应当回复一个 RST;如果对方 +没有回复,那么,服务器每隔一定的时间(参数值可以设置)再发送 keepalive 探针包, +如果连续多个包(参数值可以设置)都被无视了,说明连接被断开了。
+     + 2.心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服 +务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么 +特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。由应用程序自己发送 +心跳包来检测连接的健康性。客户端可以在一个 Timer 中或低级别的线程中定时向服务器 +发送一个短小精悍的包,并等待服务器的回应。客户端程序在一定时间内没有收到服务器 +回应即认为连接不可用,同样,服务器在一定时间内没有收到客户端的心跳包则认为客户 +端已经掉线。
+ ### 12. TCP 三次握手有哪些漏洞? +#### 1.SYN Flood 攻击 +     + SYN Flood 是 DDoS 攻击的方式之一,这是一种利用 TCP 协议缺陷,发送大量伪造 +的 TCP 连接请求,从而使得被攻击方资源耗尽(CPU 满负荷或内存不足)的攻击方式。 +要明白这种攻击的基本原理,还是要从 TCP 连接建立的过程开始说起: +首先,请求端(客户端)发送一个包含 SYN 标志的 TCP 报文,SYN 即同步 +(Synchronize),同步报文会指明客户端使用的端口以及 TCP 连接的初始序号; +第二步,服务器在收到客户端的 SYN 报文后,将返回一个 SYN+ACK 的报文,表示客 +户端的请求被接受,同时 TCP 序号被加一,ACK 即确认(Acknowledgment)。 +第三步,客户端也返回一个确认报文 ACK 给服务器端,同样 TCP 序列号被加一,到 +此一个 TCP 连接完成。
+     + 以上的连接过程在 TCP 协议中被称为三次握手。 +问题就出在 TCP 连接的三次握手中,假设一个用户向服务器发送了 SYN 报文后突然 +死机或掉线,那么服务器在发出 SYN+ACK 应答报文后是无法收到客户端的 ACK 报文的 +(第三次握手无法完成),这种情况下服务器端一般会不停地重试(再次发送 SYN+ACK 给客 +户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为 SYN Timeout +(大约为 30 秒-2 分钟);一个用户出现异常导致服务器的一个线程等待 1 分钟并不是什 +么很大的问题,但如果有一个恶意的攻击者发送大量伪造原 IP 地址的攻击报文,发送到服 +务端,服务器端将为了维护一个非常大的半连接队列而消耗非常多的 CPU 时间和内存。服 +务器端也将忙于处理攻击者伪造的 TCP 连接请求而无暇理睬客户的正常请求(毕竟客户端 +的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我 +们称作:服务器端受到了 SYN Flood 攻击(SYN 洪水攻击)。
+     + 原理:攻击者首先伪造地址对 服务器发起 SYN 请求,服务器回应(SYN+ACK)包,而 +真实的 IP 会认为,我没有发送请求,不作回应。服务 器没有收到回应,这样的话,服务 +器不知 道(SYN+ACK)是否发送成功,默认情况下会重试 5 次(tcp_syn_retries)。这样的 +话,对于服务器的内存,带宽都有很大的消耗。攻击者 如果处于公网,可以伪造 IP 的话, +对于服务器就很难根据 IP 来判断攻击者,给防护带来很大的困难。
+     + 2.解决方法:
+     + 第一种是缩短 SYN Timeout 时间;
+     + 由于 SYN Flood 攻击的效果取决于服务器上保持的 SYN 半连接数,这个值=SYN 攻击 +的频度 x SYN Timeout,所以通过缩短从接收到 SYN 报文到确定这个报文无效并丢弃该连 +接的时间,例如设置为 20 秒以下(过低的 SYN Timeout 设置可能会影响客户的正常访问), +可以成倍的降低服务器的负荷。
+     + 第二种方法是设置 SYN Cookie;
+     + 就是给每一个请求连接的 IP 地址分配一个 Cookie,如果短时间内连续受到某个 IP 的 +重复 SYN 报文,就认定是受到了攻击,以后从这个 IP 地址来的包会被丢弃。 +可是上述的两种方法只能对付比较原始的 SYN Flood 攻击,缩短 SYN Timeout 时间仅 +在对方攻击频度不高的情况下生效,SYN Cookie 更依赖于对方使用真实的 IP 地址,如果 +攻击者以数万/秒的速度发送 SYN 报文,同时利用随机改写 IP 报文中的源地址,以上的方 +法将毫无用武之地。例如 SOCK_RAW 返回的套接字通过适当的设置可以自己完全控制 IP +头的内容从而实现 IP 欺骗。
+     + 第三种方法是 Syn Cache 技术。
+     + 这种技术在收到 SYN 时不急着去分配系统资源,而是先回应一个 ACK 报文,并在一 +个专用的 HASH 表中(Cache)中保存这种半开连接,直到收到正确的 ACK 报文再去分配 +系统。
+     + 第四种方法是使用硬件防火墙。
+SYN FLOOD 攻击很容易就能被防火墙拦截。
+扩展:ddos 攻击的原理,如何防止 ddos 攻击?
+DDOS 是英文 Distributed Denial of Service 的缩写,意即“分布式拒绝服务”。
+![01_13_1](/data/images/Java应届生面试突击/计算机网络/01_13_1.png)
+ +#### 当前主要有 2 种流行的 DDOS 攻击: +     + 1、SYN Flood 攻击:这种攻击方法是经典最有效的 DDOS 方法。
+     + 2、TCP 全连接攻击
+     + 这种攻击是为了绕过常规防火墙的检查而设计的,一般情况下,常规防火墙大多具备 +过滤 Land 等 DOS 攻击的能力,但对于正常的 TCP 连接是放过的,很多网络服务程序(如: +IIS、Apache 等 Web 服务器)能接受的 TCP 连接数是有限的,一旦有大量的 TCP 连接, +则会导致网站访问非常缓慢甚至无法访问。
+     + TCP 全连接攻击就是通过许多僵尸主机不断地与受害服务器建立大量的 TCP 连接, +直到服务器的内存等资源被耗尽而被拖跨,从而造成拒绝服务。
+     + 这种攻击的特点是可绕过一般防火墙的防护而达到攻击目的。
+     + 缺点是需要找很多僵尸主机,并且由于僵尸主机的 IP 是暴露的,因此容易被追踪。
+     + 1.限制 SYN 流量
+     + 用户在路由器上配置 SYN 的最大流量来限制 SYN 封包所能占有的最高频宽,这样, +当出现大量的超过所限定的 SYN 流量时,说明不是正常的网络访问,而是有黑客入侵。
+     + 2.定期扫描
+     + 定期扫描现有的网络主节点,清查可能存在的安全漏洞,对新出现的漏洞及时进行清 +理。
+     + 3.在骨干节点配置防火墙
+     + 防火墙本身能抵御 Ddos 攻击和其他一些攻击。在发现受到攻击的时候,可以将攻击 +导向一些牺牲主机,这样可以保护真正的主机不被攻击。当然导向的这些牺牲主机可以选 +择不重要的,或者是 linux 以及 unix 等漏洞少和天生防范攻击优秀的系统。
+     + 4.用足够的机器承受黑客攻击
+     + 这是一种较为理想的应对策略。如果用户拥有足够的容量和足够的资源给黑客攻击, +在它不断访问用户、夺取用户资源之时,自己的能量也在逐渐耗失,或许未等用户被攻死, +黑客已无力支招儿了。不过此方法需要投入的资金比较多,平时大多数设备处于空闲状态, +和目前中小企业网络实际运行情况不相符。
+     + 5.过滤不必要的服务和端口
+     + 可以使用 Inexpress、Express、Forwarding 等工具来过滤不必要的服务和端口,即在 +路由器上过滤假 IP。
+ +##### 2.Land 攻击 +     + LAND 攻击利用了 TCP 连接建立的三次握手过程,通过向一个目标主机发送一个用于 +建立请求连接的 TCP *SYN 报文*而实现对目标主机的攻击。与正常的 TCP SYN 报文不同的 +是:*LAND 攻击报文的源 IP 地址和目的 IP 地址是相同的,都是目标主机的 IP 地址*。这样 +目标主机接在收到这个 SYN 报文后,就会向该报文的源地址发送一个 ACK 报文,并建立 +一个 TCP 连接控制结构,而该报文的源地址就是自己。由于目的 IP 地址和源 IP 地址是相 +同的,都是目标主机的 IP 地址,因此这个 *ACK 报文就发给了目标主机本身*。这样如果攻 +击者发送了足够多的 SYN 报文,则目标计算机的 TCB 可能会耗尽,最终不能正常服务。
+ ### 13. TCP 存在的缺陷有哪些? +1. TCP 三次握手可能会出现 SYN Flood 攻击。 +2. TCP 三次握手可能会出现 Land 攻击。 +2. Connection Flood 攻击。
+     + 原理是利用真实的 IP 地址向服务器发起大量的连接,并且建立连接之后很长时间不 +释放并定时发送垃圾数据包给服务器使连接得以长时间保持,占用服务器的资源,造成服 +务器上残余连接(WAI-time 状态)过多,效率降低,甚至资源耗尽,无法响应其他客户所发 +起的连接。
+ +#### 防范该攻击主要有如下方法: +1. 限制每个源 IP 的连接数。 +2. 对恶意连接的 IP 进行封禁。 +3. 主动清除残余连接。 + ### 14. 三次握手与 accept()函数的关系? +1. 客户端发送 SYN 给服务器。 +2. 服务器发送 SYN+ACK 给客户端。 +3. 客户端发送 ACK 给服务器。 +4. 连接建立,调用 accept()函数获取连接。 + ### 15. 在三次握手和四次挥手协议中,客户端和服务器端各用到什么函数。 -https://www.cnblogs.com/xuan52rock/p/9454696.html +https://www.cnblogs.com/xuan52rock/p/9454696.html
+*(这里涉及到底层的 socket 知识)*
+socket 的基本操作(加粗的是阻塞函数)
+socket()函数
+bind()函数
+listen()、connect()函数
+accept()函数
+read()/write()函数--------send()/recv()函数
+close()函数
+![01_15_1](/data/images/Java应届生面试突击/计算机网络/01_15_1.png)
+##### Socket server 和 client 通信流程图: +![01_15_2](/data/images/Java应届生面试突击/计算机网络/01_15_2.png)
+ +##### Socket 三次握手连接图: +![01_15_3](/data/images/Java应届生面试突击/计算机网络/01_15_3.png)
+     + 从图中可以看出,当客户端调用 connect()函数时,触发了连接请求,向服务器发送了 +SYN J 包,这时 connect 进入阻塞状态(先调用 connect()函数,然后发送 SYN 包); +服务器监听到连接请求,即收到 SYN J 包,调用 accept()函数接收请求(先收到 SYN 包, +然后调用 accept()函数),向客户端发送 SYN K ,ACK J+1,这时 accept 进入阻塞状态; +客户端收到服务器的 SYN K ,ACK J+1 之后,这时 connect 返回,并对 SYN K 进行确认; +服务器收到 ACK K+1 时,accept 返回,至此三次握手完毕,连接建立。 +总结:客户端的 connect()函数在三次握手的第二次之后返回,而服务器端的 accept +()在三次握手的第三次之后返回。 +##### Socket 四次握手断开连接图: +![01_15_4](/data/images/Java应届生面试突击/计算机网络/01_15_4.png)
+注意,read()返回 0 就表明收到了 FIN 段。 + +*函数:* +- socket()-- 创建套接字,它会创建一个结构体及收发缓冲区。此时并不指定该套接字在 +哪个 IP 和 PORT 口上。 + +- bind()-- 用于将套接字绑定在特定的 IP 和 PORT 上。 + +- listen(SOCKET s, int backlog)-- 用于为侦听端口创建两个队列(见上图)用于接收客户 +端的 SYN 请求,侦听客户端的 Socket 连接请求。backlog 指的就是已经完成握手了的队 +列的大小。 + +- accept() --- 将侦听端口中的 ESTABLISHED 队列中取出那些连接。 accept 函数返回的是 +已建立连接的套接字描述符,包括客户端的 ip 和 port 信息,服务器的 ip 和 port 信息。 + +- connect()-- 客户端连接请求。 + +- read() ---- 负责从 fd 中读取内容。当读成功时,read 返回实际所读的字节数,如果返回的 +值是 0 表示已经读到文件的结束了,小于 0 表示出现了错误。 + +- write() -----将 buf 中的 nbytes 字节内容写入文件描述符 fd。成功时返回写的字节数。 + +*客户端过程*:socket() -> bind()(可选的)->connect() +*服务器过程*:socket() -> bind() -> listen() -> accept() + ### 16. listen 的真正目的? +     + listen 的函数为侦听端口创建两个队列:未完成队列(SYN_RCV 状态)和已完成队列。 +如果不调用 listen,则客户端过来的 SYN 请求无法入队接受进一步的处理。因此,listen +是服务器的必须过程。 + ### 17. 如果客户端发起握手请求,服务端无法立刻建立连接应该回应什么? +     + RST 报文,表示重置,重新建立连接。 + ### 18. TCP 与 UDP 的区别(或各自的优缺点),以及各自的用途和使用领域。 +1. 基于连接 vs 无连接
+     + TCP 是面向连接的协议,而 UDP 是无连接的协议。这意味着当一个客户端和一个服 +务器通过 TCP 发送数据之前,必须先建立连接,建立连接的过程也被称为 TCP 三次握手。 + +2. 可靠性
+     + TCP 提供交付保证,这意味着一个使用 TCP 协议发送的消息是保证交付给客户端的, +如果消息在传输过程中丢失,那么它将重发。UDP 是不可靠的,它不提供任何交付的保证, +一个数据报包在运输途中可能会丢失。 + +3. 有序性
+     + 消息到达网络的另一端时可能是无序的,TCP 协议将会为你排好序。UDP 不提供任何 +有序性的保证。 + +4.速度
+     + TCP 速度比较慢,而 UDP 速度比较快,因为 TCP 必须创建连接,以保证消息的可靠 +交付和有序性,他需要做比 UDP 多的事。这就是为什么 UDP 更适用于对速度比较敏感的 +应用。TCP 适合传输大量数据, UDP 适合传输少量数据。 + +5.重量级 vs 轻量级
+     + TCP 是重量级的协议,UDP 协议则是轻量级的协议。一个 TCP 数据报的报头大小最 +少是 20 字节,UDP 数据报的报头固定是 8 个字节。TCP 报头中包含序列号,ACK 号,数 +据偏移量,保留,控制位,窗口,紧急指针,可选项,填充项,校验位,源端口和目的端 +口。而 UDP 报头只包含长度,源端口号,目的端口,和校验和。 + +6.流量控制或拥塞控制
+      + TCP 有流量控制和拥塞控制。UDP 没有流量控制和拥塞控制。 + +7. TCP 面向字节流,UDP 是面向报文的。
+     + TCP 是字节流的协议,无记录边界。 +UDP 发送的每个数据报是记录型的数据报,所谓的记录型数据报就是接收进程可以识 +别接收到的数据报的记录边界。 + +8. TCP 只能单播,不能发送广播和组播;UDP 可以广播和组播。
+ +##### TCP 应用场景: +     + 效率要求相对低,但对准确性要求相对高的场景。因为传输中需要 +对数据确认、重发、排序等操作,相比之下效率没有 UDP 高。举几个例子:文件传输、邮 +件传输、远程登录。 + +##### UDP 应用场景: +     + 效率要求相对高,对准确性要求相对低的场景。举几个例子:QQ +聊天、QQ 视频、网络语音电话(即时通讯,速度要求高,但是出现偶尔断续不是太大问 +题,并且此处完全不可以使用重发机制)、广播通信(广播、多播)。 + ### 19. 为什么 TCP 比 UDP 安全,但是还有很多用 UDP? +1. 无需建立连接(减少延迟) +2. 无需维护连接状态 +3. 头部开销小,一个 TCP 数据报的报头大小最少是 20 字节,UDP 数据报的报头固定 +是 8 个字节。 +4. 应用层能更好地控制要发送的数据和发送时间。UDP 没有拥塞控制,因此网络中的 +拥塞不会影响主机的发送频率。某些实时应用要求以稳定的速度发送数据,可以容忍一些 +数据的丢失,但不允许有较大的延迟,而 UDP 正好满足这些应用的需求。 + ### 20. UDP 为何快? +1. 不需要建立连接 +2. 对于收到的数据,不用给出确认 +3. 没有超时重发机制 +4. 没有流量控制和拥塞控制 + ### 21. TCP 如何实现流量控制和拥塞控制。tcp 是怎么做错误处理的? +     + *流量控制*就是*让发送方的发送速率不要太快*,要让接收方来得及接收。利用*滑动窗口 +机制*可以很方便地在 TCP 连接上实现对发送方的*流量控制*。原理这就是运用 TCP 报文段中 +的*窗口大小字段*来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。
+     + *滑动窗口机制见《王道单科-数据链路层的部分》。*
+     + 所谓滑动窗口协议,自己理解有两点:1. “窗口”对应的是一段可以被发送者发送 +的字节序列,其连续的范围称之为“窗口”;2. “滑动”则是指这段“允许发送的范围” +是可以随着发送的过程而变化的,方式就是按顺序“滑动”。在引入一个例子来说这个协 +议之前,我觉得很有必要先了解以下前提: +- 1. TCP 协议的两端分别为发送者 A 和接收者 B,由于是全双工协议,因此 A 和 B 应该 +分别维护着一个独立的发送缓冲区和接收缓冲区,由于对等性(A 发 B 收和 B 发 A 收),我 +们以 A 发送 B 接收的情况作为例子; + 2. 发送窗口是发送缓存中的一部分,是可以被 TCP 协议发送的那部分,其实应用层 +需要发送的所有数据都被放进了发送者的发送缓冲区; + 3. 发送窗口中相关的有四个概念:已发送并收到确认的数据(不再发送窗口和发送 +缓冲区之内)、已发送但未收到确认的数据(位于发送窗口之中)、允许发送但尚未发送 +的数据以及发送窗口外发送缓冲区内暂时不允许发送的数据; + 4. 每次成功发送数据之后,发送窗口就会在发送缓冲区中按顺序移动,将新的数据 +包含到窗口中准备发送; + +#### 几种拥塞控制方法: +慢开始和拥塞避免、快重传和快恢复。 +![01_21_1](/data/images/Java应届生面试突击/计算机网络/01_21_1.png)
+![01_21_2](/data/images/Java应届生面试突击/计算机网络/01_21_2.png)
+ ### 22. TCP 滑动窗口协议,窗口过大或过小有什么影响? +     + 滑动窗口的大小对网络性能有很大的影响。
+     + *如果滑动窗口过小*,极端的情况就是停止等待协议,发一个报文等一个 ACK,会造成 +通信效率下降。
+     + *如果滑动窗口过大*,网络容易拥塞,容易造成接收端的缓存不够而溢出,容易产生丢 +包现象,则需要多次发送重复的数据,耗费了网络带宽。
+ ### 23. 在流量控制的过程中,必须考虑传输效率。 +1. Nagle 算法
+     + Nagle 算法是为了避免网络中存在太多的小包(协议头比例非常大)造成拥塞。 +Nagle 算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。
+     + Nagle 算法要求一个 TCP 连接上最多只能有一个未被确认的未完成的小分组,在该 +分组的确认到达之前不能发送其他的小分组。因此它事实上就是一个扩展的停-等协议,只 +不过它是基于包停-等的,而不是基于字节停-等的。
+![01_23_1](/data/images/Java应届生面试突击/计算机网络/01_23_1.png)
+ + 他的主要职责是数据的累积,实际上有三个门槛: +- 1) 缓冲区中的字节数达到了一定量(超过阀值 MSS); + 2) 等待了一定的时间(一般的 Nagle 算法都是等待 200ms); + 3) 紧急数据发送。 + +2. 糊涂窗口综合症
+![01_23_2](/data/images/Java应届生面试突击/计算机网络/01_23_2.png)
+ ### 24. 说下 TCP 的黏包 ? +     + TCP 报文粘连就是,本来发送的是多个 TCP 报文,但是在接收端收到的却是一个报文, +把多个报文合成了一个报文。
+     + TCP 报文粘连的原因: "粘包"可发生在发送端,也可发生在接收端。在流传输中出现, UDP +不会出现粘包,因为它有消息边界(两段数据间是有界限的)。
+     + 1. 由 Nagle 算法造成的发送端的粘包
+Nagle 算法产生的背景是,为了解决发送多个非常小的数据包时(比如 1 字节),由 +于包头的存在而造成巨大的网络开销。简单的讲,Nagle 算法就是当有数据要发送时,先 +不立即发送,而是稍微等一小会,看看在这一小段时间内,还有没有其他需要发送的消息。 +当等过这一小会以后,再把要发送的数据一次性都发出去。这样就可以有效的减少包头的 +发送次数。
+     + 2. 接收端接收不及时造成的接收端粘包
+     + TCP 会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据.当应用层由于某 +些原因不能及时的把 TCP 的数据取出来,就会造成 TCP 缓冲区中存放了几段数据,产生报 +文粘连的现象。 + +#### TCP 报文粘连的解决方法: +1. 关闭 Nagle 算法。在 scoket 选项中,TCP_NODELAY 表示是否使用 Nagle 算法。 +2. 接收端尽可能快速的从缓冲区读数据。 +3. 可以在发送的数据中,添加一个表示数据的开头和结尾的字符,在收到消息后,通过这 +些字符来处理报文粘连。 + +#### 如何用 udp 实现 tcp(udp 的可靠性怎么提高)? +     + 如果要通过 UDP 传输数据,但却要保证可靠性的话,要通过第七层(应用层)来实现 +的。 + ### 25. TCP 头部有哪些字段? +*(这里又是关键点,在讲这个问题的时候, +不能光讲头部哪些字段,还要结合字段讲讲作用,然后就顺带把整个 +TCP 的可靠传输原理,以及相关的拥塞控制等全讲了.这就是主动出 +击的技巧)*
+![01_25_1](/data/images/Java应届生面试突击/计算机网络/01_25_1.png)
+![01_25_2](/data/images/Java应届生面试突击/计算机网络/01_25_2.png)
+![01_25_3](/data/images/Java应届生面试突击/计算机网络/01_25_3.png)
+ ### 26. UDP 的首部多长,具体包含哪些字段? +     + UDP 的首部是固定 8B。包含的字段如下。
+![01_26_1](/data/images/Java应届生面试突击/计算机网络/01_26_1.png)
+ + --- ### 搬运工信息 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_HTTP \345\215\217\350\256\256\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_HTTP \345\215\217\350\256\256\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" deleted file mode 100644 index d8b15ad..0000000 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_HTTP \345\215\217\350\256\256\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" +++ /dev/null @@ -1,33 +0,0 @@ -# HTTP 协议相关的问题 - -### 目录 - ---- -1. Http 的请求报文结构和响应报文结构。
-2. 常见 HTTP 首部字段。
-3. Http 状态码含义。
-Http1.1 和 Http1.0 的区别。(HTTP1.1 版本的 4 个新特性)
-常用的 HTTP 方法有哪些?
-为什么 HTTP 是无状态的?如何保持状态(会话跟踪技术、状态管理)?
-Http 的短连接和长连接的原理。
-HTTP 的特点。
-http 的安全问题。
-Https 的作用。
-浏览器和服务器在基于 https 进行请求链接到数据传输过程中,用到了哪些技术?
-讲下 Http 协议。
-http 和 socket 的区别,两个协议哪个更高效一点。
-HTTP 与 HTTPS 的区别。
- -### 1. 优化查询的方法? - -#### 1.使用索引 -     - - ---- -### 搬运工信息 -Author:Jason Lou
-Email:vip.iotworld@gmail.com
-Blog:https://blog.csdn.net/qq_21508727
-Github:https://github.com/JGPY/JavaGuideBooster
---- diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_HTTP\345\215\217\350\256\256\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_HTTP\345\215\217\350\256\256\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" new file mode 100644 index 0000000..25c7cd7 --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_HTTP\345\215\217\350\256\256\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" @@ -0,0 +1,585 @@ +# HTTP 协议相关的问题 + +### 目录 + +--- +1. Http 的请求报文结构和响应报文结构。
+2. 常见 HTTP 首部字段。
+3. Http 状态码含义。
+4. http 中有关缓存的首部字段有哪些?http 的浏览器缓存机制。
+5. Http1.1 和 Http1.0 的区别。(HTTP1.1 版本的 4 个新特性)
+6. 常用的 HTTP 方法有哪些?
+7. http 的请求方式 get 和 post 的区别。
+8. 为什么 HTTP 是无状态的?如何保持状态(会话跟踪技术、状态管理)?
+9. Http 的短连接和长连接的原理。
+10. HTTP 的特点。
+11. http 的安全问题。
+12. Https 的作用。
+13. 浏览器和服务器在基于 https 进行请求链接到数据传输过程中,用到了哪些技术?
+14. 讲下 Http 协议。
+15. http 和 socket 的区别,两个协议哪个更高效一点。
+16. HTTP 与 HTTPS 的区别。
+ +### 1. 优化查询的方法? + +#### *HTTP 请求报文* 主要由请求行、请求头、空行、请求正文(*Get 请求没有请求正文*)4 部分组成。
+[02_1_1](/data/images/Java应届生面试突击/计算机网络/02_1_1.png)
+1. 请求行
+     + 由 3 部分组成,分别为:请求方法、URL 以及协议版本,之间由空格分隔; +请求方法包括 GET、HEAD、PUT、POST、TRACE、OPTIONS、DELETE 以及扩展 +方法,当然并不是所有的服务器都实现了所有的方法,部分方法即便支持,出 +于安全性的考虑也是不可用的;
+     + 协议 版本的格 式为:HTTP/主版本号.次版本号 ,常用的有 HTTP/1.0 和 +HTTP/1.1;
+2. 请求头
+     + 请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对, +名和值之间使用冒号分隔。
+     + 常见请求头如下:
+[02_1_2](/data/images/Java应届生面试突击/计算机网络/02_1_2.png)
+3. 空行
+     + 请求头的最后会有一个空行,表示请求头部结束,接下来为请求正文,这 +一行非常重要,必不可少。
+4. 请求正文
+     + 可选部分,比如 GET 请求就没有请求正文。
+[02_1_3](/data/images/Java应届生面试突击/计算机网络/02_1_3.png)
+ +#### *HTTP 响应报文* 主要由状态行、响应头、空行、响应正文 4 部分组成。 +[02_1_4](/data/images/Java应届生面试突击/计算机网络/02_1_4.png)
+ +1. 状态行
+     + 由 3 部分组成,分别为:协议版本,状态码,状态码描述,之间由空格分隔;
+2. 响应头
+     + 与请求头类似,为响应报文添加了一些附加信息。
+     + 常见响应头如下:
+[02_1_5](/data/images/Java应届生面试突击/计算机网络/02_1_5.png)
+3. 空行
+4. 响应正文
+[02_1_6](/data/images/Java应届生面试突击/计算机网络/02_1_6.png)
+ + +### 2. 常见 HTTP 首部字段。 +1. *通用首部字段*(请求报文与响应报文都会使用的首部字段)
+Date:创建报文时间
+Connection:连接的管理
+Cache-Control:缓存的控制
+Transfer-Encoding:报文主体的传输编码方式,如 *Transfer-Encoding:chunked*。
+ +2. *请求首部字段*(请求报文会使用的首部字段)
+Host:请求资源所在服务器
+Accept:可处理的媒体类型
+Accept-Charset:可接收的字符集
+Accept-Encoding:可接受的内容编码
+Accept-Language:可接受的自然语言
+*Referer*:HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求的时候, +一般会带上 Referer,*告诉服务器我是从哪个页面链接过来的*,服务器籍此可以获得一些信 +息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从 HTTP Referer +中统计出每天有多少用户点击我主页上的链接访问他的网站。如果是 CSRF 攻击传来的请 +求,Referer 字段会是*包含恶意网址的地址*,这时候服务器就能识别出恶意的访问。
+ +3. *响应首部字段*(响应报文会使用的首部字段)
+Accept-Ranges:可接受的字节范围
+Location:令客户端重新定向到的 URI
+Server:HTTP 服务器的安装信息
+ +4. *实体首部字段*(请求报文与响应报文的的*实体部分使用的首部字段*)
+Allow:资源可支持的 HTTP 方法
+Content-Type:实体主类的类型
+Content-Encoding:实体主体适用的编码方式
+Content-Language:实体主体的自然语言
+Content-Length:实体主体的字节数
+Content-Range:实体主体的位置范围,一般用于发出部分请求时使用。
+ +### 4. http 中有关缓存的首部字段有哪些?http 的浏览器缓存机制。 +[02_4_1](/data/images/Java应届生面试突击/计算机网络/02_4_1.png)
+ +#### 1.Last-Modified 和 If-Modified-Since +     + 简单的说,Last-Modified 与 If-Modified-Since 都是用于记录页面最后修改时间的 +HTTP 头 信 息 , 只 是 Last-Modified 是 由 服 务 器 往 客 户 端 发 送 的 HTTP 头 , 而 +If-Modified-Since 则是由客户端往服务器发送的头,可以看到,再次请求本地存在的缓存 +页面时,客户端会通过 If-Modified-Since 头把浏览器端缓存页面的最后一次被服务器修改 +的时间一起发到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行 +比较,通过这个时间戳判断客户端的页面是否是最新的,如果不是最新的,就返回 HTTP +状态码 200 和新的文件内容,客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显 +示到浏览器中;如果是最新的,则返回 304 告诉客户端其本地缓存的页面是最新的,就直 +接把本地缓存文件显示到浏览器中,这样在网络上传输的数据量就会大大减少,同时也减 +轻了服务器的负担。 +1) 什么是”Last-Modified”? +     + 在浏览器第一次请求某一个 URL 时,服务器端的返回状态会是 200,内容是你请求的 +资源,同时有一个 Last-Modified 的属性标记此文件在服务期端最后被修改的时间,格式类 +似这样: +     + Last-Modified: Fri, 12 May 2006 18:53:33 GMT +     + 客户端第二次请求此 URL 时,浏览器会向服务器传送 If-Modified-Since 报头,询问 +该时间之后文件是否有被修改过: +     + If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT +     + 如果服务器端的资源没有变化,则自动返回 HTTP 304 状态码,内容为空,这样就 +节省了传输数据量。当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回 +和第一次请求时类似,从而保证不向客户端重复发出资源,也保证当服务器有变化时,客 +户端能够得到最新的资源。 + +#### 2. ETag 和 If-None-Match +     + ETag 和 If-None-Match 是一种常用的判断资源是否改变的方法。类似于 Last-Modified +和 If-Modified-Since。但是有所不同的是 Last-Modified 和 If-Modified-Since 只判断资源的 +最后修改时间,而 ETag 和 If-None-Match 可以是资源任何的任何属性,比如资源的 MD5 +等。 +     + ETag 和 If-None-Match 的工作原理是在 HTTP Response 中添加 ETags 信息。当客户 +端再次请求该资源时,将在 HTTP Request 中加入 If-None-Match 信息(也就是 ETags 的 +值)。如果服务器验证资源的 ETags 没有改变(该资源的内容没有改变),将返回一个 304 +状态;否则,服务器将返回 200 状态,并返回该资源和新的 ETags。 +2) 什么是”Etag”? +     + 服务器会为每个资源分配对应的 ETag 值,根据资源的内容得到其值。当资源内容发 +生改变时,其值也会改变。以下是服务器端返回的格式: +     + ETag: "50b1c1d4f775c61:df3" +     + 客户端的查询更新格式是这样的: +     + If-None-Match: W/"50b1c1d4f775c61:df3" +     + 如果 ETag 没改变,则返回状态 304,这也和 Last-Modified 一样。 + +##### 扩展 1:Last-Modified 和 Etags 如何帮助提高性能? +     + 聪明的开发者会把 Last-Modified 和 ETags 请求的 http 报头一起使用,这样可利用 +客户端(例如浏览器)的缓存。因为服务器首先产生 Last-Modified/Etag 标记,服务器可 +在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求 +服务器验证其(客户端)缓存。 + +##### 扩展 2:既然有了 Last-Modified,为什么还要用 ETag 字段呢? +1. 某些文件修改非常频繁,比如在秒以下的时间内进行修改(比方说 1s 内修改了 N +次),If-Modified-Since 能检查到的粒度是秒级的,这种修改无法体现。 +2. 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这 +个时候我们并不希望客户端认为这个文件被修改了,而重新 GET; +3. 某些服务器不能精确的得到文件的最后修改时间。 +     + 因此, HTTP/1.1 利用 Entity Tag 头提供了更加严格的验证。 Last-Modified 与 ETag +一起使用时,服务器会 优先验证 ETag 的值 。 + +#### 3.Expires / Cache-Control(优先使用) +     + 用来控制缓存的失效日期,控制浏览器是直接从浏览器缓存取数据还是重新发请求到 +服务器取数据。
+     + Expires 是 Web 服务器响应消息头字段,在响应 http 请求时告诉浏览器在过期时间前 +浏览器可以直接从浏览器缓存取数据,而无需再次请求。Expires 的一个缺点就是,返回 +的到期时间是服务器端的时间,这样存在一个问题,如果客户端的时间与服务器的时间相 +差很大(比如时钟不同步,或者跨时区),那么误差就很大,所以在 HTTP 1.1 版开始,使 +用 Cache-Control: max-age=(秒)替代。
+ +当服务器发出响应的时候,可以通过两种方式来告诉客户端缓存请求:
+第一种是 Expires,比如:
+     + Expires: Sun, 16 Oct 2016 05:43:02 GMT
+     + 在此日期之前,客户端都会认为缓存是有效的。
+     + 不过 Expires 有缺点,比如说,服务端和客户端的时间设置可能不同,这就会使缓存 +的失效可能并不能精确的按服务器的预期进行。
+第二种是 Cache-Control,比如:
+     + Cache-Control: max-age=315360000
+     + 这里声明的是一个相对的秒数,表示从现在起,315360000 秒内缓存都是有效的,这 +样就避免了服务端和客户端时间不一致的问题。
+     + 但是 Cache-Control 是 HTTP1.1 才有的,不适用于 HTTP1.0,而 Expires 既适用于 +HTTP1.0,也适用于 HTTP1.1,所以说在大多数情况下同时发送这两个头会是一个更好的 +选择,当客户端两种头都能解析的时候,会优先使用 Cache-Control。
+ +过程如下:
+- 1. 客户端请求一个页面(A)。 + 2. 服务器返回页面 A,并在给 A 加上一个 Last-Modified 和 ETag。 + 3. 客户端展现该页面,并将页面连同 Last-Modified 和 ETag 的值一起缓存。 + 4. 客户再次请求页面 A,并将上次请求时服务器返回的 Last-Modified 和 ETag 的值 +一起传递给服务器。 + 5. 服务器检查该 Last-Modified 或 ETag,并判断出该页面自上次客户端请求之后还 +未被修改,直接返回响应 304 和一个空的响应体。 + +1. 首先在服务器创建一个简单的 HTML 文件,用浏览器访问一下,成功表示 HTML 页 +面。Fiddler 就会产生下面的捕获信息。
+需要留意的是
+- 1. 因为是第一次访问该页面,客户端发请求时,请求头中没有 If-Modified-Since 标 +签。 +- 2. 服务器返回的 HTTP 状态码是 200,并发送页面的全部内容。 +- 3.服务器返回的 HTTP 头标签中有 Last-Modified,告诉客户端页面的最后修改时间。 +[02_4_2](/data/images/Java应届生面试突击/计算机网络/02_4_2.png)
+ + +2.在浏览器中刷新一下页面,Fiddler 就会产生下面的捕获信息。
+需要注意的是
+- 1. 客户端发 HTTP 请求时,使用 If-Modified-Since 标签,把上次服务器告诉它的文 +件最后修改时间返回到服务器端了。 + 2. 因为文件没有改动过,所以服务器返回的 HTTP 状态码是 304,没有发送页面的内 +容。 +[02_4_3](/data/images/Java应届生面试突击/计算机网络/02_4_3.png)
+3. 用文本编辑器稍微改动一下页面文件,保存。再用浏览器访问一下,Fiddler 就会产 +生下面的捕获信息。
+需要留意的是
+- 1. 客户端发 HTTP 请求时,使用 If-Modified-Since 标签,把上次服务器告诉它的文 +件最后修改时间返回到服务器端了。 + 2. 因为文件被改动过,两边时间不一致,所以服务器返回的 HTTP 状态码是 200,并 +发送新页面的全部内容。 + 3. 服务器返回的 HTTP 头标签中有 Last-Modified,告诉客户端页面的新的最后修改 +时间。 +[02_4_4](/data/images/Java应届生面试突击/计算机网络/02_4_4.png)
+ +### 6. 常用的 HTTP 方法有哪些? +[02_6_1](/data/images/Java应届生面试突击/计算机网络/02_6_1.png)
+*注意:只有 POST 和 PUT 方法才有请求内容。* +GET: 用于请求访问已经被 URI(统一资源标识符)识别的资源,可以通过 URL 传参 +给服务器。 +POST:用于传输信息给服务器,主要功能与 GET 方法类似,但一般推荐使用 POST +方式。 +PUT: 传输文件,报文主体中包含文件内容,保存到对应 URI 位置。 +HEAD: 获得报文首部,与 GET 方法类似,只是不返回报文主体。 +DELETE:删除文件,与 PUT 方法相反,删除对应 URI 位置的文件。 +OPTIONS:查询相应 URL 支持的 HTTP 方法。 + +*注意:并非所有的服务器都都实现了这几个方法。有的服务器还实现了自己特有的 +HTTP 方法,称为扩展方法。* +- *GET*:GET 可以说是最常见的了,它本质就是发送一个请求来取得服务器上的某一资 +源。资源通过一组 HTTP 头和呈现数据(如 HTML 文本,或者图片或者视频等)返回 +给客户端。GET 请求中,永远不会包含呈现数据。 +- *HEAD*:HEAD 和 GET 本质是一样的,区别在于 HEAD 不含有呈现数据,而仅仅是 +HTTP 头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情 +景:欲判断某个资源是否存在,我们通常使用 GET,但这里用 HEAD 则意义更加明确。 +- *PUT*:这个方法比较少见。HTML 表单也不支持这个。本质上来讲, PUT 和 POST 极 +为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT 通常指定了资源 +的存放位置,而 POST 则没有,POST 的数据存放位置由服务器自己决定。举个例子: +如一个用于提交博文的 URL,/addBlog。如果用 PUT,则提交的 URL 会是像这样 +的”/addBlog/abc123”,其中 abc123 就是这个博文的地址。而如果用 POST,则这 +个地址会在提交后由服务器告知客户端。目前大部分博客都是这样的。显然,PUT 和 +POST 用途是不一样的。具体用哪个还取决于当前的业务场景。 +DELETE:删除某一个资源。基本上这个也很少见,不过还是有一些地方比如 amazon +的 S3 云服务里面就用的这个方法来删除资源。 +- *POST*:向服务器提交数据。这个方法用途广泛,几乎目前所有的提交操作都是靠这个 +完成。 +- *OPTIONS*:这个方法很有趣,但极少使用。它用于获取当前 URL 所支持的方法。若 +请求成功,则它会在 HTTP 头中包含一个名为“Allow”的头,值是所支持的方法, 如“GET, POST”。 +- *TRACE*:请求服务器回送收到的请求信息,主要用于测试和诊断,所以是安全的。 + +HEAD、GET、OPTIONS 和 TRACE 视为安全的方法,因为它们只是从服务器获得资 +源而不对服务器做任何修改;但是 HEAD、 GET、 OPTIONS 在用户端不安全,而 POST +则影响服务器上的资源。 + +GET 虽然不修改服务器数据,但是 GET 方法通过 URL 请求来传递用户的输入; HEAD +只获得消息的头部,但是数据传入也是通过 URL。这样对客户端而言并不安全。 + +*TRACE 方法对于服务端和用户端一定是安全的。* + + +### 8. 为什么 HTTP 是无状态的?如何保持状态(会话跟踪技术、状态管理)? +     + HTTP 无状态:无状态是指协议对于*事务处理*没有记忆能力,不能保存每次客户端提 +交的信息,即当服务器返回应答之后,这次*事务*的所有信息就都丢掉了。如果用户发来一 +个新的请求,服务器也无法知道它是否与上次的请求有联系。
+     + 这里我们用一个比较熟悉的例子来理解 HTTP 的无状态性,如一个包含多图片的网页 +的浏览。步骤为:1建立连接,客户端发送一个网页请求,服务器端返回一个 html 页面(这 +里的页面只是一个纯文本的页面,也就是我们写的 html 代码),关闭连接;2浏览器解析 +html 文件,遇到图片标记得到 url,这时,客户端和服务器再建立连接,客户端发送一个图 +片请求,服务器返回图片应答,关闭连接。(这里又涉及到无状态定义:对于服务器来说, +这次的请求虽然是同一个客户端的请求但是服务器还是不知道这个是之前的那个客户端, +即对于事务处理没有记忆能力)。
+     + 优点:服务器不用为每个客户端连接*分配内存来记忆大量状态*,也不用在客户端失去连 +接时去清理内存,节省服务器端资源,以更高效地去处理业务。
+     + 缺点:缺少状态意味着*如果后续处理需要前面的信息,则客户端必须重传*,这样可能导 +致每次连接*传送的数据量增大*。
+     + 针对这些缺点,可以采用*会话跟踪技术*来解决这个问题。把状态保存在服务器中,只发 +送回一个标识符,浏览器在下次提交中把这个标识符发送过来;这样,就可以定位存储在 +服务器上的状态信息了。
+*有四种会话跟踪技术:*
+1.COOKIE
+2.Session
+3.URL 重写
+4.作为隐藏域嵌入 HTML 表单中(隐藏表单域)
+     + 在浏览器和服务器之间来回传递一个标识符,这就是所谓的会话(session)跟踪。来 +自浏览器的所有包含同一个标识符(这里是 SESSIONID)的请求同属于一个会话。
+     + 会话的有效期直到它被显式地终止为止,或者当用户在一段时间内没有动作,由服务 +器自动设置为过期。目前没有办法通知服务器用户已经关闭浏览器,因为在浏览器和服务 +器之间没有一个持久的连接,并且浏览器关闭时也不向服务器发送信息。同时,关闭浏览 +器通常意味着会话 ID 丢失,COOKIE 将过期,或者注入了信息的 URL 将不能再使用。所以 +当用户再次打开浏览器的时候,服务器无法将新得到的请求与以前的会话联系起来,则只 +能创建一个新的会话。然而,所有与前一个会话有关的数据依然存放在服务器上,直到会 +话过期被清除为止。
+ +### 10. HTTP 的特点。 +     + (1)支持客户端/服务器端通信模式。
+     + (2)简单方便快速:当客户端向服务器端发送请求时,只是简单的填写请求路径和请求 +方法即可,然后就可以通过浏览器或其他方式将该请求发送就行了。比较常用的请求方法 +有三种,分别是:GET、HEAD、POST。不同的请求方法使得客户端和服务器端联系的方式 +各不相同。因为 HTTP 协议比较简单,所以 HTTP 服务器的程序规模相对比较小,从而使得 +通信的速度非常快。
+     + (3)灵活:Http 协议允许客户端和服务器端传输任意类型任意格式的数据对象。这些不 +同的类型由 Content-Type 标记。
+     + (4)无连接:无连接的含义是每次建立的连接只处理一个客户端请求。当服务器处理完 +客户端的请求之后,并且收到客户的反馈应答后,服务器端立即断开连接。采用这种通信 +方式可以大大的节省传输时间。
+     + (5)无状态:Http 是无状态的协议。所谓的无状态是指协议对于请求的处理没有记忆功 +能。无状态意味着如果要再次处理先前的信息,则这些先前的信息必须要重传,这就导致 +了数据量传输的增加。但是从另一方面来说,当先前的信息服务器不在使用的时候,则服 +务器的响应将会非常的快。 + +### 12. Https 的作用。 +- 内容加密 建立一个信息安全通道,来保证数据传输的安全; +- 身份认证 确认网站的真实性 +- 数据完整性 防止内容被第三方冒充或者篡改
+[02_12_1](/data/images/Java应届生面试突击/计算机网络/02_12_1.png)
+ +### 14. 讲下 Http 协议。 +     + 主要包括 http 建立连接的过程,持久和非持久连接,带流水与不带流水,dns 解析过程, +get 和 post 区别,http 与 https 的区别等。状态码,Header 各个字段的意义。 +http 和 socket 的区别,两个协议哪个更高效一点。
+ +### 16. HTTP 与 HTTPS 的区别。 +●https 更安全
+HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议, +要比 http 协议安全,所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器 +方的证书进行了非对称加密。http 是超文本传输协议,信息是明文传输,没有加密,通过 +抓包工具可以分析其信息内容。
+●https 需要申请证书
+https 协议需要到 CA 申请证书,一般免费证书很少,需要交费。而常见的 http 协议则没 +有这一项。
+●端口不同
+http 使用的是 80 端口,而 https 使用的是 443 端口。
+●所在层次不同
+HTTP 协议运行在 TCP 之上,HTTPS 是运行在 SSL/TLS 之上的 HTTP 协议,SSL/TLS 运行在 +TCP 之上。
+ + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/03_\345\256\211\345\205\250\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/03_\345\256\211\345\205\250\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" index 87db4ea..4a920b9 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/03_\345\256\211\345\205\250\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/03_\345\256\211\345\205\250\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" @@ -35,41 +35,44 @@ XSS 是实现 CSRF 的诸多途径中的一条,但绝对不是唯一的一条。 又叫“跨站请求伪造”。可以这么理解 CSRF 攻击:攻击者盗用了你的身份,以你的 名义发送恶意请求。CSRF 能够做的事情包括:以你名义发送邮件,发消息,盗取你的账 号,甚至于购买商品,虚拟货币转账......造成的问题包括:个人隐私泄露以及财产安全。 -下图简单阐述了 CSRF 攻击的思想: +下图简单阐述了 CSRF 攻击的思想:
![03_1_2](/data/images/Java应届生面试突击/计算机网络/03_1_2.png) -1. 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A; +1. 用户 C 打开浏览器,访问受信任网站 A,输入用户名和密码请求登录网站 A;
2.在用户信息通过验证后,网站 A 产生 Cookie 信息并返回给浏览器,此时用户登录网 -站 A 成功,可以正常发送请求到网站 A; -3. 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B; +站 A 成功,可以正常发送请求到网站 A;
+3. 用户未退出网站 A 之前,在同一浏览器中,打开一个 TAB 页访问网站 B;
4. 网站 B 接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方 -站点 A; +站点 A;
5. 浏览器在接收到这些攻击性代码后,根据网站 B 的请求,在用户不知情的情况下携 带 Cookie 信息,向网站 A 发出请求。网站 A 并不知道该请求其实是由 B 发起的,所以会根 -据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行。 +据用户 C 的 Cookie 信息以 C 的权限处理该请求,导致来自网站 B 的恶意代码被执行。
-从上图可以看出,要完成一次 CSRF 攻击,受害者必须依次完成两个步骤: -1. 登录受信任网站 A,并在本地生成 Cookie。 -2. 在不退出 A 的情况下,访问危险网站 B。 +从上图可以看出,要完成一次 CSRF 攻击,受害者必须依次完成两个步骤:
+1. 登录受信任网站 A,并在本地生成 Cookie。
+2. 在不退出 A 的情况下,访问危险网站 B。
##### 示例: -银行网站 A,它以 GET 请求来完成银行转账的操作,如: -http://www.mybank.com/Transfer.php?toBankId=11&money=1000 +银行网站 A,它以 GET 请求来完成银行转账的操作,如:
+http://www.mybank.com/Transfer.php?toBankId=11&money=1000
危险网站 B,它里面有一段 HTML 的代码如下: ```html ``` +     首先,你登录了银行网站 A,然后访问危险网站 B,噢,这时你会发现你的银行账户 -少了 1000 块。 +少了 1000 块。
+     为什么会这样呢?原因是银行网站 A 违反了 HTTP 规范,使用 GET 请求更新资源。 在访问危险网站 B 的之前,你已经登录了银行网站 A,而 B 中的以 GET 的方式请求 第三方资源(这里的第三方就是指银行网站了,原本这是一个合法的请求,但这里被不法 分子利用了),所以你的浏览器会带上你的银行网站 A 的 Cookie 发出 Get 请求,去获取资 源“http://www.mybank.com/Transfer.php?toBankId=11&money=1000”,结果银行网站 服务器收到请求后,认为这是一个更新资源操作(转账操作),所以就立刻进行转账操作。 + ##### 防御方法: 3.1. CSRF 攻击是有条件的,当用户访问恶意链接时,认证的 cookie 仍然有效,所以 -当用户关闭页面时要及时清除认证 cookie。 +当用户关闭页面时要及时清除认证 cookie。
3.2. 在客户端页面增加伪随机数。在所有 POST 方法提交的数据中提供一个不可预测 的参数,比如一个随机数或者一个根据时间计算的 HASH 值,并且在 Cookie 中也同样保 存这个参数值(保证 2 者数值的一致)。把这个参数嵌入标签保存在 FORM 表单中,当浏 @@ -79,47 +82,50 @@ http://www.mybank.com/Transfer.php?toBankId=11&money=1000 的 POST 请求。 ```php + 在表单里增加 Hash 值,以认证这确实是用户发送的请求。 + +
- - -”> - + + + ”> +
+ 然后在服务器端进行 Hash 值验证 + + ``` 3.3.图片验证码 ##### 4.SQL 注入攻击 见《数据库部分》。
-      https 怎么做到安全的。https 的实现过程(工作原理)。HTTPS 如何加密, HTTPS 加 密算法 SSL。 网络安全协议 SSL 协议及完整交互过程。解释 https (先公私钥加密,再 对称加密) 为什么不直接公私钥。MD5 加盐。怎么对传输的数据加密。对称加密和非对称 加密( 公钥加密 )。RSA 算法的机制(-> 加密通信连接建立的过程) 。 - - ### 2. 怎么确保数据传输过程中的安全性? #### 1.数据加密: diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_Socket \347\274\226\347\250\213.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_Socket\347\274\226\347\250\213.md" similarity index 96% rename from "Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_Socket \347\274\226\347\250\213.md" rename to "Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_Socket\347\274\226\347\250\213.md" index 5b4258b..db2719f 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_Socket \347\274\226\347\250\213.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_Socket\347\274\226\347\250\213.md" @@ -7,11 +7,12 @@ 3. Socket I/O模型。
### 1. socket 编程的基本步骤(TCP/UDP)。 +![04_1_1](/data/images/Java应届生面试突击/计算机网络/04_1_1.png)
     创建 Socket 连接时,可以指定使用的传输层协议,Socket 可以支持不同的传输层协 -议(TCP 或 UDP),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接。 -Server 端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的 -处理步骤如下:(服务器端建立连接过程)
+议(*TCP* 或 *UDP*),当使用 TCP 协议进行连接时,该 Socket 连接就是一个 TCP 连接。 +*Server 端所要做的事情主要是建立一个通信的端点,然后等待客户端发送的请求。典型的 +处理步骤如下:(服务器端建立连接过程)*
1. 构建一个 ServerSocket 实例,指定本地的端口。这个 socket 就是用来监听指定端口的 连接请求的。
2.重复如下几个步骤:
@@ -19,7 +20,7 @@ Server 端所要做的事情主要是建立一个通信的端点,然后等待客 - b.通过这个返回的 socket 实例获取 InputStream 和 OutputStream,可以通过这两个 stream来分别读和写数据。 - c.结束的时候调用 socket 实例的 close()方法关闭 socket 连接。 -客户端的请求过程稍微有点不一样:
+*客户端的请求过程稍微有点不一样:*
1.构建 Socket 实例,通过指定的远程服务器地址和端口来建立连接。
2.通过 Socket 实例包含的 InputStream 和 OutputStream 来进行数据的读写。
3.操作结束后调用 socket 实例的 close 方法,关闭。
@@ -160,6 +161,7 @@ Select 事件模型,epoll 事件模型。 对于某些输入io只有一路的程序,数据接收线程 + circle buffer + 数据处理线程是一个比较简单的模型。 上面的方案仍然造成数据量的线程处理不过来,数据量小的线程又很空闲,应该采用如下方案
+     主线程内用epoll接收数据和accept新连接,并解析出消息,放入队列中让所有的线程去抢,至于如何多个线程同时对一个连接发送消息, 可以采用与dedupe中多线程处理FP cache(一个hash table)的方案类似,分配与线程数目相同的锁,当处理完消息需要发送时,将连 接的文件描述符数除以线程数目,余是多少,就加锁哪个锁,这样,多个线程能尽量分配到不同的锁上增加并发性,而对同一个连接加同一 diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_\345\205\266\344\273\226\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_\345\205\266\344\273\226\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" index 3b1d1aa..a7afb48 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_\345\205\266\344\273\226\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_\345\205\266\344\273\226\347\233\270\345\205\263\347\232\204\351\227\256\351\242\230.md" @@ -14,10 +14,10 @@ ### 1. Session 的原理。 -#### Session 存储方式: +#### Session 原理:      session 可以放在文件、内存中或数据库都可以,是以键值对的形式存储。Session -也是一种 key-value 的属性对。 +也是一种 key-value 的属性对。
     当程序需要为某个客户端的请求创建一个 session 的时候,服务器首先检查这个客户 端的请求里是否已包含了一个 session 标识 - 称为 session id,如果已包含一个 session id @@ -25,19 +25,25 @@ 出来使用(如果检索不到,可能会新建一个,根据 getSession()方法的参数),如果客户 端请求不包含 session id,则为此客户端创建一个 session 并且生成一个与此 session 相关 联的 session id,这个 session id 将被在本次响应中返回给客户端保存。 -Session 的客户端实现形式(即 Session ID 的保存方法) -一般浏览器提供了 3 种方式来保存: -[1] 使用 Cookie 来保存,这是最常见的方法,“记住我的登录状态”功能的实现正是基 +     + Session 的客户端实现形式(即 Session ID 的保存方法)
+     + 一般浏览器提供了 3 种方式来保存:
+     + [1] 使用 Cookie 来保存,这是最常见的方法,“记住我的登录状态”功能的实现正是基 于这种方式的。服务器通过设置 Cookie 的方式将 Session ID 发送到浏览器。如果我们不 设置过期时间,那么这个 Cookie 将不存放在硬盘上,当浏览器关闭的时候,Cookie 就消 失了,这个 Session ID 就丢失了。如果我们设置这个时间,那么这个 Cookie 会保存在客 户端硬盘中,即使浏览器关闭,这个值仍然存在,下次访问相应网站时,同 样会发送到服 -务器上。 -[2] URL 重写,就是把 session id 直接附加在 URL 路径的后面,也就是像我们经常看到 -JSP 网站会有 aaa.jsp?JSESSIONID=*一样的。 -[3] 在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过 -GET 方式发送数据,后者使用 POST 方式发送数据。但是明显后者比较麻烦。 -就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把 session id +务器上。
+     + [2] URL 重写,就是把 session id 直接附加在 URL 路径的后面,也就是像我们经常看到 +JSP 网站会有 aaa.jsp?JSESSIONID=*一样的。
+     + [3] 在页面表单里面增加隐藏域,这种方式实际上和第二种方式一样,只不过前者通过 +GET 方式发送数据,后者使用 POST 方式发送数据。但是明显后者比较麻烦。
+     + 就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把 session id 传递回服务器。比如: ```html
@@ -48,37 +54,44 @@ GET 方式发送数据,后者使用 POST 方式发送数据。但是明显后者 ``` #### session 什么时候被创建? -一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server +     + 一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet)调用 HttpServletRequest.getSession(true)这样的语句时才会被创建。 #### session 何时被删除? -session 在下列情况下被删除: -A.程序调用 HttpSession.invalidate() +session 在下列情况下被删除:
+A.程序调用 HttpSession.invalidate()
B.距离上一次收到客户端发送的 session id 时间间隔超过了 session 的最大有效时间 -C.服务器进程被停止 +C.服务器进程被停止
再次注意关闭浏览器只会使存储在客户端浏览器内存中的 session cookie 失效,不会 -使服务器端的 session 对象失效。 -getSession()/getSession(true)、getSession(false)的区别 -getSession()/getSession(true):当 session 存在时返回该 session,否则新建一个 -session 并返回该对象。 -getSession(false):当 session 存在时返回该 session,否则不会新建 session,返回 +使服务器端的 session 对象失效。
+ +#### getSession()/getSession(true)、getSession(false)的区别 +     + getSession()/getSession(true):当 session 存在时返回该 session,否则新建一个 +session 并返回该对象。
+     + getSession(false):当 session 存在时返回该 session,否则不会新建 session,返回 null。 ### 2. Cookie 的机制。 -#### Cookie 存储方式: -1.以文件方式存在硬盘空间上的永久性的 cookie。持久 cookie 是指存放于客户端硬盘 +#### Cookie 种类 +     + 1.以文件方式存在硬盘空间上的永久性的 cookie。持久 cookie 是指存放于客户端硬盘 中的 cookie 信息(设置了一定的有效期限),当用户访问某网站时,浏览器就会在本地 硬盘上查找与该网站相关联的 cookie。如果该 cookie 存在,浏览器就将它与页面请求一 起通过 HTTP 报头信息发送到您的站点,然后在系统会比对 cookie 中各属性和值是否与 -存放在服务器端的信息一致,并根据比对结果确定用户为“初访者”或者“老客户”。 -2.停留在浏览器所占内存中的临时性的 cookie,关闭 Internet Explorer 时即从计算机 +存放在服务器端的信息一致,并根据比对结果确定用户为“初访者”或者“老客户”。
+     + 2.停留在浏览器所占内存中的临时性的 cookie,关闭 Internet Explorer 时即从计算机 上删除。 #### Cookie 的有效期: -Cookie 的 maxAge 决定着 Cookie 的有效期,单位为秒。 -如果 maxAge 属性为正数,则表示该 Cookie 会在 maxAge 秒之后自动失效。浏览器会将 +Cookie 的 maxAge 决定着 Cookie 的有效期,单位为秒。
+     + 如果 maxAge 属性为正数,则表示该 Cookie 会在 maxAge 秒之后自动失效。浏览器会将 maxAge 为正数的 Cookie 持久化,即写到对应的 Cookie 文件中。无论客户关闭了浏览器 还是电脑,只要还在 maxAge 秒之前,登录网站时该 Cookie 仍然有效。下面代码中的 Cookie 信息将永远有效。 @@ -88,13 +101,15 @@ cookie.setMaxAge(Integer.MAX_VALUE); // 设置生命周期为 MAX_VAL response.addCookie(cookie); // 输出到客户端 ``` -如果 maxAge 为负数,则表示该 Cookie 仅在本浏览器窗口以及本窗口打开的子窗口内有 +     + 如果 maxAge 为负数,则表示该 Cookie 仅在本浏览器窗口以及本窗口打开的子窗口内有 效,关闭窗口后该 Cookie 即失效。 maxAge 为负数的 Cookie,为临时性 Cookie, Cookie 信息保存在浏览器内存中,因此关闭浏览器该 Cookie 就消失了。Cookie 默认的 maxAge -值为–1。 -如果 maxAge 为 0,则表示删除该 Cookie。Cookie 机制没有提供删除 Cookie 的方法, +值为–1。
+     + 如果 maxAge 为 0,则表示删除该 Cookie。Cookie 机制没有提供删除 Cookie 的方法, 因此通过设置该 Cookie 即时失效实现删除 Cookie 的效果。失效的 Cookie 会被浏览器从 -Cookie 文件或者内存中删除, +Cookie 文件或者内存中删除,
例如: ```java Cookie cookie = new Cookie("username","helloweenvsfei");// 新建 Cookie @@ -104,29 +119,39 @@ response.addCookie(cookie); // 必须执行这一句 #### Cookie 的组成部分。 -Cookie 在 HTTP 的头部信息中。 -标 准 格 式 : Set - Cookie: NAME=VALUE ; Expires=DATE ; Path=PATH ; -Domain=DOMAIN_NAME;SECURE; -举例说明:Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2 -008 05:02:50 GMT; Path=/web; -Cookie 的内容主要包括:名字,值,过期时间,域和路径。 -Cookie 的 Expires 属性标识了 Cookie 的有效时间,当 Cookie 的有效时间过了之后, +Cookie 在 HTTP 的头部信息中。
+     + 标 准 格 式 : Set - Cookie: NAME=VALUE ; Expires=DATE ; Path=PATH ; +Domain=DOMAIN_NAME;SECURE;
+     + 举例说明:Set-Cookie: JSESSIONID=mysession; Expires=Thu, 05-Jun-2 +008 05:02:50 GMT; Path=/web;
+     + Cookie 的内容主要包括:名字,值,过期时间,域和路径。
+     + Cookie 的 Expires 属性标识了 Cookie 的有效时间,当 Cookie 的有效时间过了之后, 这些数据就被自动删除了。若不设置过期时间,则表示这个 cookie 的生命期为浏览器会话 期间,关闭浏览器窗口,cookie 就消失。这种生命期为浏览器会话期的 cookie 被称为会 话 cookie(临时性 cookie),会话 cookie 保存在内存里。若设置了过期时间,浏览器 就会把 cookie 保存到硬盘上,关闭后再次打开浏览器,这些 cookie 仍然有效直到超过设 定的过期时间。存储在硬盘上的 cookie 可以在不同的浏览器进程间共享,比如两个 IE -窗口。 -Cookie 的域和路径属性一起构成 cookie 的作用范围。 -domain 属性可以使多个 web 服务器共享 cookie。 -path 指定与 cookie 关联在一起的网页。 +窗口。
+     + Cookie 的域和路径属性一起构成 cookie 的作用范围。
+     + domain 属性可以使多个 web 服务器共享 cookie。
+     + path 指定与 cookie 关联在一起的网页。
### 3. Cookie 被浏览器禁用怎么办? -cookie 可以被人为的禁止,则必须有其他机制以便在 cookie 被禁止时仍然能够把 -session id 传递回服务器。 -[1] URL 重写,就是把 session id 直接附加在 URL 路径的后面,也就是像我们经常看到 +     + cookie 可以被人为的禁止,则必须有其他机制以便在 cookie 被禁止时仍然能够把 +session id 传递回服务器。
+     + [1] URL 重写,就是把 session id 直接附加在 URL 路径的后面,也就是像我们经常看到 JSP 网站会有 aaa.jsp?JSESSIONID=*一样的。 -[2] 在页面表单里面增加隐藏域,这种方式实际上和第 1 种方式一样,只不过前者通过 +     + [2] 在页面表单里面增加隐藏域,这种方式实际上和第 1 种方式一样,只不过前者通过 GET 方式发送数据,后者使用 POST 方式发送数据。但是明显后者比较麻烦。 就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把 session id 传递回服务器。比如: @@ -140,35 +165,45 @@ GET 方式发送数据,后者使用 POST 方式发送数据。但是明显后者 ### 4. Cookie 和 Session 原理解析。 -客户第一次发送请求给服务器,此时服务器产生一个唯一的 sessionID,并返回给客户 +     + 客户第一次发送请求给服务器,此时服务器产生一个唯一的 sessionID,并返回给客户 端(通过 cookie),此时的 cookie 并没有 setMaxAge();只是保存于客户端的内存中,并与一 个浏览器窗口对应着,由于 HTTP 协议的特性,这一次连接就断开了。以后此客户端再发送 请求给服务器的时候,就会在请求 request 中携带 cookie,由于 cookie 中有 sessionID,所以 -服务器就知道这是刚才那个客户,从而区分不同的人,购物车就是这样实现的。 - -第一次请求时:(注意,访问 jsp 时会自动创建 sessionID,而访问 Servlet,需要你自己写代 -码才会创建 sessionID) - - +服务器就知道这是刚才那个客户,从而区分不同的人,购物车就是这样实现的。
+![05_4_1](/data/images/Java应届生面试突击/计算机网络/05_4_1.png)
+ +第一次请求时:
+(注意,访问 jsp 时会自动创建 sessionID,而访问 Servlet,需要你自己写代 +码才会创建 sessionID)
+![05_4_2](/data/images/Java应届生面试突击/计算机网络/05_4_2.png)
+可以看到服务器给我们分配了一个 sessionID,随着响应返回给客户端.
+ +第二次请求时:
+![05_4_3](/data/images/Java应届生面试突击/计算机网络/05_4_3.png)
+之后请求时,客户端都会携带这个 sessionID,以便服务器能辨认。
### 5. Cookie 与 Session 的区别。 -1、cookie 数据存放在客户端,用来记录用户信息的,session 数据放在服务器上。 +1、cookie 数据存放在客户端,用来记录用户信息的,session 数据放在服务器上。
2、正是由于 Cookie 存储在客户端中,对客户端是可见的,客户端的一些程序可能会窥探、 复制甚至修改 Cookie 中的内容。而 Session 存储在服务器上,对客户端是透明的,不存在 -敏感信息泄露的危险。 -如果选用 Cookie,比较好的办法是,敏感的信息如账号密码等尽量不要写到 Cookie +敏感信息泄露的危险。
+     + 如果选用 Cookie,比较好的办法是,敏感的信息如账号密码等尽量不要写到 Cookie 中。最好是像 Google、Baidu 那样将 Cookie 信息加密,提交到服务器后再进行解密,保 证 Cookie 中的信息只有自己能读得懂。而如果选择 Session 就省事多了,反正是放在服务 -器上,Session 里任何隐私都可以。 +器上,Session 里任何隐私都可以。
3、Session 是保存在服务器端的,每个用户都会产生一个 Session。如果并发访问的用户 非常多,会产生非常多的 Session,消耗大量的服务器内存。因此像 Google、Baidu、Sina -这样并发访问量极高的网站,是不太可能使用 Session 来追踪客户会话的。 -而 Cookie 保存在客户端,不占用服务器资源。如果并发浏览的用户非常多,Cookie -是很好的选择。对于 Google、Baidu、Sina 来说,Cookie 也许是唯一的选择。 +这样并发访问量极高的网站,是不太可能使用 Session 来追踪客户会话的。
+     + 而 Cookie 保存在客户端,不占用服务器资源。如果并发浏览的用户非常多,Cookie +是很好的选择。对于 Google、Baidu、Sina 来说,Cookie 也许是唯一的选择。
4、cookie 的容量和个数都有限制。单个 cookie 的容量不能超过 4KB,很多浏览器都限制 -一个站点最多保存 20 个 cookie,而 session 没有此问题。 -5、所以个人建议: -将登录信息等重要信息存放到 SESSION 中,其他信息如果需要保留,可以放在 -COOKIE 中。 +一个站点最多保存 20 个 cookie,而 session 没有此问题。
+5、所以个人建议:
+     + 将登录信息等重要信息存放到 SESSION 中,其他信息如果需要保留,可以放在 +COOKIE 中。
### 6. session 和 cache 的区别。      @@ -181,118 +216,151 @@ COOKIE 中。 ### 7. 如果有几千个 session,怎么提高效率 。当 session 访问量比较大的时候,怎么解决? 把 session 放到 redis 或 memcache 等此类内存缓存中或着把 session 存储在 SSD硬盘上。 - ### 8. 在浏览器中输入 URL 后,执行的全部过程。会用到哪些协议?(一次完整的 http 请求过程)。 +整个流程如下:
+- 域名解析 +- 为了将消息从你的 PC 上传到服务器上,需要用到 IP 协议、ARP 协议和 OSPF 协议。 +- 发起 TCP 的 3 次握手 +- 建立 TCP 连接后发起 http 请求 +- 服务器响应 http 请求 +- 浏览器解析 html 代码,并请求 html 代码中的资源(如 js、css、图片等) +- 断开 TCP 连接 +- 浏览器对页面进行渲染呈现给用户 #### 一.域名解析 - -比如要查询 www.baidu.com 的 IP 地址: -1.浏览器搜索自己的 DNS 缓存(维护一张域名与 IP 地址的对应表); -2.若没有,则搜索操作系统中的 DNS 缓存(维护一张域名与 IP 地址的对应表); -3.若没有,则搜索操作系统的 hosts 文件( Windows 环境下,维护一张域名与 IP 地址的 +![05_8_1](/data/images/Java应届生面试突击/计算机网络/05_8_1.png)
+     + 比如要查询 www.baidu.com 的 IP 地址: +1. 浏览器搜索自己的 DNS 缓存(维护一张域名与 IP 地址的对应表); +2. 若没有,则搜索操作系统中的 DNS 缓存(维护一张域名与 IP 地址的对应表); +3. 若没有,则搜索操作系统的 hosts 文件( Windows 环境下,维护一张域名与 IP 地址的 对应表); -4.若没有,则操作系统将域名发送至 本地域名服务器--(递归查询方式),本地域名服务 -器 查询自己的 DNS 缓存,查找成功则返回结果,否则,(以下是迭代查询方式) -4.1.本地域名服务器 向根域名服务器(其虽然没有每个域名的的具体信息,但存储了负 +4. 若没有,则操作系统将域名发送至 本地域名服务器--(递归查询方式),本地域名服务 +器 查询自己的 DNS 缓存,查找成功则返回结果,否则,(以下是迭代查询方式)
+     + 4.1. 本地域名服务器 向根域名服务器(其虽然没有每个域名的的具体信息,但存储了负 责每个域,如 com、net、org 等的解析的顶级域名服务器的地址)发起请求,此处,根域 -名服务器返回 com 域的顶级域名服务器的地址; -4.2.本地域名服务器 向 com 域的顶级域名服务器发起请求,返回 baidu.com 权限域名 -服务器(权限域名服务器,用来保存该区中的所有主机域名到 IP 地址的映射)地址; -4.3.本地域名服务器 向 baidu.com 权限域名服务器发起请求,得到 www.baidu.com 的 +名服务器返回 com 域的顶级域名服务器的地址;
+     + 4.2. 本地域名服务器 向 com 域的顶级域名服务器发起请求,返回 baidu.com 权限域名 +服务器(权限域名服务器,用来保存该区中的所有主机域名到 IP 地址的映射)地址;
+     + 4.3.本地域名服务器 向 baidu.com 权限域名服务器发起请求,得到 www.baidu.com 的 IP 地址; -5.本地域名服务器 将得到的 IP 地址返回给操作系统,同时自己也将 IP 地址缓存起来; -6.操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来; -7.至此,浏览器已经得到了域名对应的 IP 地址。 +5. 本地域名服务器 将得到的 IP 地址返回给操作系统,同时自己也将 IP 地址缓存起来; +6. 操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来; +7. 至此,浏览器已经得到了域名对应的 IP 地址。 #### 二.三次握手 详细过程见前面的内容。 #### 三. ARP(地址解析协议) -ARP 解决的是同一个局域网内,主机或路由器的 IP 地址和 MAC 地址的映射问题。如果 +     + ARP 解决的是同一个局域网内,主机或路由器的 IP 地址和 MAC 地址的映射问题。如果 源主机和目的主机在同一个局域网内(目标 IP 和本机 IP 分别与子网掩码相与的结果相同, 那么它们在一个子网),就可以用 ARP 找到目的主机的 MAC 地址;如果不在一个局域网内, 用 ARP 协议找到本网络内的一个路由器的 MAC 地址,剩下的工作由这个路由器来完成。 +      ARP 协议的具体内容是: -01 每个主机都会有 ARP 高速缓存,存储本局域网内 IP 地址和 MAC 地址之间的对应关系。 -02 当源主机要发送数据时,首先检查 ARP 高速缓存中是否有对应 IP 地址的目的主机的 +01. 每个主机都会有 ARP 高速缓存,存储本局域网内 IP 地址和 MAC 地址之间的对应关系。 +02. 当源主机要发送数据时,首先检查 ARP 高速缓存中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 请求分 组,该数据包包括的内容有:(源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址)。 -03 当本网络的所有主机收到该 ARP 请求分组时,首先检查数据包中的 IP 地址是否是自 +03. 当本网络的所有主机收到该 ARP 请求分组时,首先检查数据包中的 IP 地址是否是自 己的 IP 地址,如果不是,则忽略该数据包;如果是,则首先从数据包中取出源主机的 IP 地 址和 MAC 地址写入到 ARP 高速缓存中,如果已经存在,则覆盖,然后将自己的 MAC 地址 写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。 -04 源主机收到 ARP 响应分组后,将目的主机的 IP 和 MAC 地址写入 ARP 高速缓存中, -并利用此信息发送数据。如果源主机一直没有收到 ARP 响应分组,表示 ARP 查询失败。 +04. 源主机收到 ARP 响应分组后,将目的主机的 IP 和 MAC 地址写入 ARP 高速缓存中, +并利用此信息发送数据。如果源主机一直没有收到 ARP 响应分组,表示 ARP 查询失败。     + +![05_8_2](/data/images/Java应届生面试突击/计算机网络/05_8_2.png)
#### 四.路由选择协议 -网络层主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器, +     + 网络层主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器, 这些都是由路由器来完成的工作,通过查找路由表决定通过那个路径到达服务器,其中用到 -路由选择协议。 +路由选择协议。
有两大类路由选择协议:(有时间补上算法的具体内容!!!) -1.内部网关协议 -内 部网 关协 议 IGP(Interior Gateway Protocol)即在 一 个 自治 系 统 内 部 使 用的 路由 选择 协 +##### 1.内部网关协议 +     + 内部网关协议 IGP(Interior Gateway Protocol)即在 一 个 自治 系 统 内 部 使 用的 路由 选择 协 议,RIP 和 OSPF 协议和 IS-IS 协议,IGRP(内部网关路由协议)、EIGRP(增强型内部网关路 -由协议)。 -1)RIP(应用层协议,基于 UDP) -RIP 是一种基于距离向量的路由选择协议。 RIP 协议要求网络中的每一个路由器都要维 +由协议)。
+     + 1)RIP(应用层协议,基于 UDP)
+     + RIP 是一种基于距离向量的路由选择协议。 RIP 协议要求网络中的每一个路由器都要维 护从它自己到其他每一个目的网络的距离记录。这里的“距离”实际上指的是“最短距离”。 RIP 认为一个好的路由就是它通过的路由器的数目少,即“距离短”。RIP 允许一条路径最 多只能包含 15 个路由器。“距离”的最大值为 16 时即相当于不可达。RIP 选择一个具有最 -少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。 -2)OSPF(网络层协议) -“最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法。使用 洪泛法向本自治系 +少路由器的路由(即最短路由),哪怕还存在另一条高速(低时延)但路由器较多的路由。
+     + 2)OSPF(网络层协议)
+     + “最短路径优先”是因为使用了 Dijkstra 提出的最短路径算法。使用 洪泛法向本自治系 统中所有路由器发送信息。发送的信息就是与本路由器相邻的所有路由器的链路状态(“链 路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”),但这只是路由器 所知道的部分信息。只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此 -信息。 -2.外部网关协议 -1)BGP 协议(应用层协议,基于 TCP 的) -BGP 是不同自治系统的路由器之间交换路由信息的协议。边界网关协议 BGP 只能是力 +信息。
+##### 2.外部网关协议 +     + 1)BGP 协议(应用层协议,基于 TCP 的)
+     + BGP 是不同自治系统的路由器之间交换路由信息的协议。边界网关协议 BGP 只能是力 求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路 -由。 -BGP 发言人:每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP +由。
+     + BGP 发言人:每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP 发言人”。一般说来,两个 BGP 发言人都是通过一个共享网络连接在一起的,而 BGP 发言 人往往就是 BGP 边界路由器,但也可以不是 BGP 边界路由器。 -BGP 交换路由信息: -一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连 +     + BGP 交换路由信息:
+     + 一个 BGP 发言人与其他自治系统中的 BGP 发言人要交换路由信息,就要先建立 TCP 连 接,然后在此连接上交换 BGP 报文以建立 BGP 会话(session),利用 BGP 会话交换路由信息。 使用 TCP 连接能提供可靠的服务也简化了路由选择协议。使用 TCP 连接交换路由信息的两 个 BGP 发言人,彼此成为对方的邻站或对等站。BGP 所交换的路由信息就是到达某个网络 所要经过的一系列 AS。 - -1)首先从 IP 数据报首部提取出目的主机的 IP 地址 D,得出其所在的网络 N。 -(2)若 N 就是与此路由器直接相连的某个网络,则进行直接交付,直接把数据报交付给目 -的主机。否则就执行(3)。 -(3)若路由表中有目的地址为 D 的特定主机路由,则把数据报传给路由表中所指明的下一 -跳路由器。否则执行(4)。 -(4)若路由表中有到达网络 N 的路由,则把数据报传给路由表中所指明的下一跳路由器。 -否则执行(5)。 -(5)若路由表中有一个默认路由,则把数据报传给默认路由所指明的默认路由器。否则执 -行(6)。 -(6)报告转发分组出错。 +![05_8_3](/data/images/Java应届生面试突击/计算机网络/05_8_3.png)
+ +##### 路由器分组转发算法 +(1) 首先从 IP 数据报首部提取出目的主机的 IP 地址 D,得出其所在的网络 N。
+(2) 若 N 就是与此路由器直接相连的某个网络,则进行直接交付,直接把数据报交付给目 +的主机。否则就执行(3)。
+(3) 若路由表中有目的地址为 D 的特定主机路由,则把数据报传给路由表中所指明的下一 +跳路由器。否则执行(4)。
+(4) 若路由表中有到达网络 N 的路由,则把数据报传给路由表中所指明的下一跳路由器。 +否则执行(5)。
+(5) 若路由表中有一个默认路由,则把数据报传给默认路由所指明的默认路由器。否则执 +行(6)。
+(6) 报告转发分组出错。 #### 五.建立 TCP 连接后发起 http 请求 -说下 HTTP 的浏览器缓存机制。POST 还是 GET。 +     + 说下 HTTP 的浏览器缓存机制。POST 还是 GET。 #### 六.服务器收到请求并响应 http 请求 -1.负载均衡 -网站可能会有负载均衡设备来平均分配所有用户的请求。即对工作任务进行平衡,分 +##### 1.负载均衡 +     + 网站可能会有负载均衡设备来平均分配所有用户的请求。即对工作任务进行平衡,分 摊到多个操作单元上执行,如图片服务器,应用服务器等。 -2.请求处理阅读请求及它的参数和 cookies。 +##### 2.请求处理阅读请求及它的参数和 cookies。 -#### 七.浏览器解析 html 代码,并请求 html 代码中的资源(如 js、css、 - 图片等) -看是否是长连接。来决定是不是断开 TCP 连接。 +#### 七.浏览器解析 html 代码,并请求 html 代码中的资源(如 js、css、图片等) +     + 看是否是长连接。来决定是不是断开 TCP 连接。 #### 八.断开 TCP 连接 - +     + 四次挥手。 #### 九. 浏览器对页面进行渲染呈现给用户 ### 9. 路由器与交换机的区别是什么? -1.交换机工作在数据链路层;路由器工作在网络层。 -2.交换机转发数据帧;路由器转发 IP 分组。 +1.交换机工作在数据链路层;路由器工作在网络层。
+2.交换机转发数据帧;路由器转发 IP 分组。
3.交换机隔离冲突域,不隔离广播域;路由器隔离冲突域,隔离广播域 + --- ### 搬运工信息 Author:Jason Lou
diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\344\270\223\351\242\230(\350\241\2451).md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\344\270\223\351\242\230(\350\241\2451).md" new file mode 100644 index 0000000..7c0ccd6 --- /dev/null +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\344\270\223\351\242\230(\350\241\2451).md" @@ -0,0 +1,117 @@ +# 计算机网络专题(补1) +### 目录 + +--- +1. NAT 地址转换。
+2. HTTP 断点续传的原理。
+3. 有几种会话跟踪技术(补充)?
+4. TCP 接收方如何保证按序接收。
+5. 数据传输:服务器与服务器之间传输文件夹下的文件,一个文件夹下有 10 个文件,另一个文件夹下有 100 个文件,两个文件夹大小相等,问,哪个传输更快?
+ + +### 1. NAT 地址转换。 + +### 2. HTTP 断点续传的原理。 +     + 要实现断点续传下载文件,首先要了解断点续传的原理。断点续传其实就是在上一次 +下载断开的位置开始继续下载。HTTP 协议中,可以在请求报文头中加入 Range 段,来表 +示客户机希望从何处继续下载。在以前版本的 HTTP 协议是不支持断点的,HTTP/1.1 开 +始就支持了。一般断点下载时才用到 Range 和 Content-Range 实体头。
+ +#### 例子 1: +这是一个普通的下载请求: +```html +GET /test.txt HTTP/1.1 +Accept:*/* +Referer:http://192.168.1.96 +Accept-Language:zh-cn +Accept-Encoding:gzip,deflate +User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727) +Host:192.168.1.96 +Connection:Keep-Alive +这表示从 1024 字节开始断点续传(加入了 Range:bytes=1024-): +GET /test.txt HTTP/1.1 +Accept:*/* +Referer:http://192.168.1.96 +Accept-Language:zh-cn +Accept-Encoding:gzip,deflate +User-Agent:Mozilla/4.0(compatible;MSIE 6.0;Windows NT 5.2;.NET CLR 2.0.50727) +Host:192.168.1.96 +Range:bytes=1024- //Range:bytes=0-10000 (从 0 编号) 告诉服务器/test.txt这个文件从 1024 字节开始传,前面的字节不用传了。 +Connection:Keep-Alive +``` +#### 例子 2: +```html +Connection: close +Host: 127.0.0.3 +Accept: */* +Pragma: no-cache +Cache-Control: no-cache +Referer: http://127.0.0.3/ +User-Agent: Mozilla/4.04 [en] (Win95; I ;Nav) +Range: bytes=5275648- + + + +HTTP/1.1 206 Partial Content +Server: Zero Http Server/1.0 +Date: Thu, 12 Jul 2001 11:19:40 GMT +Cache-Control: no-cache +Last-Modified: Tue, 30 Jan 2001 13:11:30 GMT +Content-Type: application/octet-stream +Content-Range: bytes 5275648-15143085/15143086 +Content-Length: 9867438 +Connection: close + +``` + +#### 扩展:服务器断点续传文件增强验证(If-Range,If-Match) +##### 1.用 If-Range 进行增强校验 +     + If-Range 中的内容可以为最初收到的 ETag 头或者是 Last-Modfied 中的最后修改时间。 +服务端在收到续传请求时,通过 If-Range 中的内容进行校验,看文件的内容是否发生了变 +化,校验一致时(文件内容没有发生变化时),返回 206 的续传回应;不一致时(文件的 +内容发生了变化),服务端则返回 200 回应,回应的内容为新的文件的全部数据。
+![06_1_1](/data/images/Java应届生面试突击/计算机网络/06_1_1.png)
+ +##### 2.用 if-Match 进行增强校验与 Http 412 问题 +     + If-Match: "40e04a44a997d11:0"//第一次获取到的 Etag 的值 +如果服务器端的资源被修改了,那么,http 请求时会发生 http 412 Precondition failed 先 +决条件失败 ,因此,我们建议使用 iF-Range。这样,即使文件被修改,也会以 http200 返 +回全部资源。
+![06_1_2](/data/images/Java应届生面试突击/计算机网络/06_1_2.png)
+ +### 3. 有几种会话跟踪技术(补充)? +     + 第五种是:Web Storage 技术。
+     + HTML5 中可以使用 Web Storage 技术通过 JavaScript 来保存数据。
+     + Web Storage 由两部分组成:sessionStorage 和 localStorage,他们都可以用来保存 +用户会话的信息,也能够实现会话跟踪。 sessionStorage 用于本地存储一个会话 (session) +中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销 +毁。因此 sessionStorage 不是一种持久化的本地存储,仅仅是会话级别的存储; localStorage +用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。
+ +### 4. TCP 接收方如何保证按序接收。 +TCP 具有乱序重组的功能。
+(1)TCP 具有缓冲区;
+(2)TCP 报文具有序列号,TCP 给所发送数据的每一个字节关联一个序列号进行排序。 +如果分节非顺序到达,接收方的 TCP 将根据它们的序列号重新排序。 + +### 5. 数据传输:服务器与服务器之间传输文件夹下的文件,一个文件夹下有 10 个文件,另一个文件夹下有 100 个文件,两个文件夹大小相等,问,哪个传输更快? +     + 我答的 10 个文件更快,因为建立连接数更少,建立连接的开销比传输文件的开销大。 +事后讨论下,还有另一个,文件写入磁盘,要计算文件的起始位置,文件数目少的话,这 +个开销就小了。 + + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" index ded022c..00e8be2 100644 --- "a/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" +++ "b/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273_\347\233\256\345\275\225.md" @@ -99,7 +99,7 @@      • [19. IO 里面常见的类。](./Java应届生面试突击/Java基础/05_Java基础专题.md/#19)
     • [20. xml 解析方式。](./Java应届生面试突击/Java基础/05_Java基础专题.md/#20)
-#### [多线程和并发](./Java应届生面试突击/多线程和并发) +#### 多线程和并发    ♦ [多线程和并发专题](./Java应届生面试突击/多线程和并发/01_多线程和并发专题.md)
     • [1. 什么是缓存一致性问题?如何解决呢?](./Java应届生面试突击/多线程和并发/01_多线程和并发专题.md/#1)
     • [2. 简述 volatile 关键字(或 volatile 的内存语义或 volatile 的2个特性)](./Java应届生面试突击/多线程和并发/01_多线程和并发专题.md/#2)
@@ -122,210 +122,204 @@    ♦ [并发包的问题](./Java应届生面试突击/多线程和并发/04_并发包的问题.md)
     • [1. 并发包(Concurrent 包)中含有的类。](./Java应届生面试突击/多线程和并发/04_并发包的问题.md/#1)
-     • [2. CountDownLatch 和 CyclicBarrier 的区别?](./Java应届生面试突击/多线程和并发/04_并发包的问题.md/#2)
   ♦ [阻塞队列相关的问题](./Java应届生面试突击/多线程和并发/05_阻塞队列相关的问题.md)
     • [1. 阻塞队列](./Java应届生面试突击/多线程和并发/05_阻塞队列相关的问题.md/#1)
     • [2. 生产者/消费者问题的多种实现方式](./Java应届生面试突击/多线程和并发/05_阻塞队列相关的问题.md/#2)
-     • [3. 编程实现一个最大元素为 100 的阻塞队列。]()
-     • [4. 设计一个双缓冲阻塞队列,写代码。]()
-     • [5. Java 中的队列都有哪些,有什么区别。]()
+     • [3. 编程实现一个最大元素为 100 的阻塞队列。](./Java应届生面试突击/多线程和并发/05_阻塞队列相关的问题.md/#3)
+     • [4. 设计一个双缓冲阻塞队列,写代码。](./Java应届生面试突击/多线程和并发/05_阻塞队列相关的问题.md/#4)
+     • [5. Java 中的队列都有哪些,有什么区别。](./Java应届生面试突击/多线程和并发/05_阻塞队列相关的问题.md/#5)
   ♦ [多线程相关的问题](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md)
-     • [1. 如果不用锁机制如何实现共享数据访问。]()
-     • [2. 说一下 java 中的多线程。]()
-     • [3. Java 中 Runnable 和 Callable 有什么不同?]()
-     • [4. 一个类是否可以同时继承 Thread 和实现 Runnable接口?]()
-     • [5. 实现多线程的同步。]()
-     • [6. volatile 和 synchronized 区别。]()
-     • [7. 什么场景下可以使用 volatile 替换 synchronized?]()
-     • [8. wait()/notify()/notifyAll()的用法(Java 中怎样唤醒一个阻塞的线程?)。]()
-     • [9. 为什么 wait(),notify(),notifyAll()等方法都定义在 Object 类中?]()
-     • [10. notify()和 notifyAll()有什么区别?]()
-     • [11. CAS]()
-     • [12. 同步锁的分类?]()
-     • [13. 锁的分类?]()
-     • [14. java 中的悲观锁和乐观锁?]()
-     • [15. 实现线程之间的通信?]()
-     • [16. 如何确保线程安全?]()
-     • [17. 多线程的优点和缺点?]()
-     • [18. 写出 3 条你遵循的多线程最佳实践。]()
-     • [19. 多线程的性能一定就优于单线程吗?]()
-     • [20. 多线程中锁的种类。]()
-     • [21. 锁优化]()
-     • [22. wait()和 sleep()的区别。]()
-     • [23. Java 中 interrupted() 和 isInterrupted()方法的区别?]()
-     • [24. Java 创建线程之后,直接调用 start()方法和 run()的区别 ?]()
-     • [25. 什么是线程的上下文切换?]()
-     • [26. 怎么检测一个线程是否拥有锁?]()
-     • [27. 用户线程和守护线程有什么区别?]()
-     • [28. 什么是线程调度器?]()
-     • [29. 线程的状态。]()
-     • [30. 有三个线程 T1,T2,T3,怎么确保它们按顺序执行?]()
-     • [31. 在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成。多种方式,考虑效率。]()
-     • [32. java 程序如何停止一个线程?]()
+     • [1. 如果不用锁机制如何实现共享数据访问。](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#1)
+     • [2. 说一下 java 中的多线程。](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#2)
+     • [3. 实现线程之间的通信?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#3)
+     • [4. 如何确保线程安全?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#4)
+     • [5. 多线程的优点和缺点?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#5)
+     • [6. 写出 3 条你遵循的多线程最佳实践。](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#6)
+     • [7. 多线程的性能一定就优于单线程吗?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#7)
+     • [8. 多线程中锁的种类。](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#8)
+     • [9. 锁优化](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#9)
+     • [10. wait()和 sleep()的区别。](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#12)
+     • [11. Java 中 interrupted() 和 isInterrupted()方法的区别?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#11)
+     • [12. Java 创建线程之后,直接调用 start()方法和 run()的区别 ?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#12)
+     • [13. 什么是线程的上下文切换?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#13)
+     • [14. 怎么检测一个线程是否拥有锁?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#14)
+     • [15. 用户线程和守护线程有什么区别?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#15)
+     • [16. 什么是线程调度器?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#16)
+     • [17. 线程的状态。](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#17)
+     • [18. 有三个线程 T1,T2,T3,怎么确保它们按顺序执行?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#18)
+     • [19. 在一个主线程中,要求有大量子线程执行完之后,主线程才执行完成。多种方式,考虑效率。](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#19)
+     • [20. java 程序如何停止一个线程?](./Java应届生面试突击/多线程和并发/06_多线程相关的问题.md/#20)
   ♦ [其他问题](./Java应届生面试突击/多线程和并发/07_其他问题.md)
-     • [1. ThreadLocal 的原理]()
-     • [2. Collections.synchronizedXX 方法的原理。]()
-     • [3. 如何在两个线程间共享数据?]()
+     • [1. ThreadLocal 的原理](./Java应届生面试突击/多线程和并发/07_其他问题.md/#1)
+     • [2. Collections.synchronizedXX 方法的原理。](./Java应届生面试突击/多线程和并发/07_其他问题.md/#2)
+     • [3. 如何在两个线程间共享数据?](./Java应届生面试突击/多线程和并发/07_其他问题.md/#3)
-#### [数据库](./Java应届生面试突击/数据库) +#### 数据库    ♦ [数据库专题](./Java应届生面试突击/数据库/01_数据库专题.md)
-     • [优化查询的方法?]()
-     • [如果有一个特别大的访问量到数据库上,怎么做优化?]()
-     • [数据库分表, 分区, 分库]()
+     • [1. 优化查询的方法?](./Java应届生面试突击/数据库/01_数据库专题.md/#1)
+     • [2. 如果有一个特别大的访问量到数据库上,怎么做优化?](./Java应届生面试突击/数据库/01_数据库专题.md/#2)
+     • [3. 数据库分表, 分区, 分库](./Java应届生面试突击/数据库/01_数据库专题.md/#3)
   ♦ [sql注入的问题](./Java应届生面试突击/数据库/02_sql注入的问题.md)
-     • [SQL语句应该考虑哪些安全问题?]()
-     • [什么叫SQL注入,如何防止?请举例说明。]()
+     • [1. SQL语句应该考虑哪些安全问题?](./Java应届生面试突击/数据库/02_sql注入的问题.md/#1)
+     • [2. 什么叫SQL注入,如何防止?请举例说明。](./Java应届生面试突击/数据库/02_sql注入的问题.md/#2)
   ♦ [连接问题](./Java应届生面试突击/数据库/03_涉及连接的问题.md)
-     • [内连接与外链接的区别?]()
-     • [inner join 和 left join 的性能比较。]()
-     • [联合查询的索引使用]()
-     • [数据库中两个表求交集、并集、差集。]()
+     • [1. 内连接与外链接的区别?](./Java应届生面试突击/数据库/03_涉及连接的问题.md/#1)
+     • [2. inner join 和 left join 的性能比较。](./Java应届生面试突击/数据库/03_涉及连接的问题.md/#2)
+     • [3. 联合查询的索引使用](./Java应届生面试突击/数据库/03_涉及连接的问题.md/#3)
+     • [4. 数据库中两个表求交集、并集、差集。](./Java应届生面试突击/数据库/03_涉及连接的问题.md/#4)
   ♦ [存储过程相关问题](./Java应届生面试突击/数据库/04_涉及存储过程的问题.md)
-     • [存储过程的概念以及优缺点是什么。]()
+     • [1. 存储过程的概念以及优缺点是什么。](./Java应届生面试突击/数据库/04_涉及存储过程的问题.md/#1)
   ♦ [范式问题](./Java应届生面试突击/数据库/05_涉及范式的问题.md)
-     • [数据库的三级范式?]()
+     • [1. 数据库的三级范式?](./Java应届生面试突击/数据库/05_涉及范式的问题.md/#1)
   ♦ [事务问题](./Java应届生面试突击/数据库/06_涉及事务的问题.md)
-     • [数据库事务正确执行的四个基本要素(事务的四个属性)。]()
-     • [并发事务带来的问题。]()
-     • [并发控制的方式(如何解决并发问题)]()
-     • [数据库事物的隔离级别介绍、举例说明。]()
-     • [MySQL事务控制语句]()
-     • [数据库怎么保证数据的一致性。]()
+     • [1. 数据库事务正确执行的四个基本要素(事务的四个属性)。](./Java应届生面试突击/数据库/06_涉及事务的问题.md/#1)
+     • [2. 并发事务带来的问题。](./Java应届生面试突击/数据库/06_涉及事务的问题.md/#2)
+     • [3. 并发控制的方式(如何解决并发问题)](./Java应届生面试突击/数据库/06_涉及事务的问题.md/#3)
+     • [4. 数据库事物的隔离级别介绍、举例说明。](./Java应届生面试突击/数据库/06_涉及事务的问题.md/#4)
+     • [5. MySQL事务控制语句](./Java应届生面试突击/数据库/06_涉及事务的问题.md/#5)
+     • [6. 数据库怎么保证数据的一致性。](./Java应届生面试突击/数据库/06_涉及事务的问题.md/#6)
   ♦ [锁的问题](./Java应届生面试突击/数据库/07_涉及锁的问题.md)
-     • [如何并发访问数据库]()
-     • [说下数据库的锁机制,数据库中都有哪些锁。]()
-     • [MySQL锁的粒度(即锁的级别)]()
-     • [乐观锁和悲观锁的概念,实现方式和使用场景。]()
+     • [1. 如何并发访问数据库](./Java应届生面试突击/数据库/07_涉及锁的问题.md/#1)
+     • [2. 说下数据库的锁机制,数据库中都有哪些锁。](./Java应届生面试突击/数据库/07_涉及锁的问题.md/#2)
+     • [3. MySQL锁的粒度(即锁的级别)](./Java应届生面试突击/数据库/07_涉及锁的问题.md/#3)
+     • [4. 乐观锁和悲观锁的概念,实现方式和使用场景。](./Java应届生面试突击/数据库/07_涉及锁的问题.md/#4)
   ♦ [命令问题](./Java应届生面试突击/数据库/08_涉及命令的问题.md)
-     • [truncate 与 delete 的区别是什么?]()
-     • [SQL的授权语句和收回权限语句?]()
-     • [怎么新加一行记录,怎么添加一个列字段,修改列?]()
-     • [Select Count(*)和Select Count(数字)以及Select Count(column)区别。]()
-     • [EXISTS关键字的使用方法?]()
-     • [例题]()
-     • [判断表的字段值是否为空]()
+     • [1. truncate 与 delete 的区别是什么?](./Java应届生面试突击/数据库/08_涉及命令的问题.md/#1)
+     • [2. SQL的授权语句和收回权限语句?](./Java应届生面试突击/数据库/08_涉及命令的问题.md/#2)
+     • [3. 怎么新加一行记录,怎么添加一个列字段,修改列?](./Java应届生面试突击/数据库/08_涉及命令的问题.md/#3)
+     • [4. Select Count(*)和Select Count(数字)以及Select Count(column)区别。](./Java应届生面试突击/数据库/08_涉及命令的问题.md/#4)
+     • [5. EXISTS关键字的使用方法?](./Java应届生面试突击/数据库/08_涉及命令的问题.md/#5)
+     • [6. 例题](./Java应届生面试突击/数据库/08_涉及命令的问题.md/#6)
+     • [7. 判断表的字段值是否为空](./Java应届生面试突击/数据库/08_涉及命令的问题.md/#7)
   ♦ [索引问题](./Java应届生面试突击/数据库/09_涉及索引的问题.md)
-     • [索引的优缺点]()
-     • [索引有哪些?]()
-     • [数据库索引的原理(实现)]()
-     • [MySQL的B+树索引的优点?为什么不用二叉树?B-树和B+树为什么比红黑树更合适?]()
-     • [建索引的几大原则]()
+     • [1. 索引的优缺点](./Java应届生面试突击/数据库/09_涉及索引的问题.md/#1)
+     • [2. 索引有哪些?](./Java应届生面试突击/数据库/09_涉及索引的问题.md/#2)
+     • [3. 数据库索引的原理(实现)](./Java应届生面试突击/数据库/09_涉及索引的问题.md/#3)
+     • [4. MySQL的B+树索引的优点?为什么不用二叉树?B-树和B+树为什么比红黑树更合适?](./Java应届生面试突击/数据库/09_涉及索引的问题.md/#4)
+     • [5. 建索引的几大原则](./Java应届生面试突击/数据库/09_涉及索引的问题.md/#5)
   ♦ [存储引擎问题](./Java应届生面试突击/数据库/10_涉及存储引擎的问题.md)
-     • [MySQL中Mylsam与InnoDB的区别,至少5点。]()
-     • [例题]()
+     • [1. MySQL中Mylsam与InnoDB的区别,至少5点。](./Java应届生面试突击/数据库/10_涉及存储引擎的问题.md/#1)
+     • [2. 例题](./Java应届生面试突击/数据库/10_涉及存储引擎的问题.md/#2)
   ♦ [其他问题](./Java应届生面试突击/数据库/11_其他问题.md)
-     • [如果在数据库上进行误操作该怎么处理。]()
-     • [数据库在进行水平分表之后,SQL分页查询该怎么进行?分表之后想让一个id多个表示自增的,效率实现。数据库中的分页查询怎么写?]()
-     • [关系型数据库和非关系型数据库的区别]()
-     • [数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?]()
+     • [1. 如果在数据库上进行误操作该怎么处理。](./Java应届生面试突击/数据库/11_其他问题.md/#1)
+     • [2. 数据库在进行水平分表之后,SQL分页查询该怎么进行?分表之后想让一个id多个表示自增的,效率实现。数据库中的分页查询怎么写?](./Java应届生面试突击/数据库/11_其他问题.md/#2)
+     • [3. 关系型数据库和非关系型数据库的区别](./Java应届生面试突击/数据库/11_其他问题.md/#3)
+     • [4. 数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?](./Java应届生面试突击/数据库/11_其他问题.md/#4)
+     • [5. 列级约束与表级约束的区别?](./Java应届生面试突击/数据库/11_其他问题.md/#5)
+     • [6. 关系五种基本运算](./Java应届生面试突击/数据库/11_其他问题.md/#6)
-#### [操作系统](./Java应届生面试突击/操作系统) + +#### 操作系统    ♦ [操作系统专题](./Java应届生面试突击/操作系统/01_操作系统专题.md)
-     • [进程间的通信方式(IPC)?进程调度方法](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
-     • [线程间的通信方式?](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
-     • [线程同步的机制](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
-     • [操作系统由哪几部分组成?]()
-     • [用户态和系统态是什么时候进行切换的?64位操作系统和32位操作系统有什么区别和优点](./Java应届生面试突击/操作系统/01_操作系统专题.md)
-     • [选择一个你熟悉的磁盘臂调度算法进行简单描述](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
-     • [进程和线程的区别?](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
-     • [操作系统的换页方法](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
-     • [哲学家进餐问题的无死锁算法](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
-     • [操作系统的内存管理](./Java应届生面试突击/操作系统/01_操作系统专题.md/#)
+     • [1. 进程间的通信方式(IPC)?进程调度方法](./Java应届生面试突击/操作系统/01_操作系统专题.md/#1)
+     • [2. 线程间的通信方式?](./Java应届生面试突击/操作系统/01_操作系统专题.md/#2)
+     • [3. 线程同步的机制](./Java应届生面试突击/操作系统/01_操作系统专题.md/#3)
+     • [4. 操作系统由哪几部分组成?](./Java应届生面试突击/操作系统/01_操作系统专题.md/#4)
+     • [5. 用户态和系统态是什么时候进行切换的?64位操作系统和32位操作系统有什么区别和优点](./Java应届生面试突击/操作系统/01_操作系统专题.md/#5)
+     • [6. 选择一个你熟悉的磁盘臂调度算法进行简单描述](./Java应届生面试突击/操作系统/01_操作系统专题.md/#6)
+     • [7. 进程和线程的区别?](./Java应届生面试突击/操作系统/01_操作系统专题.md/#7)
+     • [8. 操作系统的换页方法](./Java应届生面试突击/操作系统/01_操作系统专题.md/#8)
+     • [9. 哲学家进餐问题的无死锁算法](./Java应届生面试突击/操作系统/01_操作系统专题.md/#9)
+     • [10. 操作系统的内存管理](./Java应届生面试突击/操作系统/01_操作系统专题.md/#10)
   ♦ [linux系统常用命令](./Java应届生面试突击/操作系统/02_linux系统常用命令.md)
-     • [Linux常用命令1](https://blog.csdn.net/qq_21508727/article/details/81038008) -     • [Linux常用命令2(远程文件下载+查看文件内容)](https://blog.csdn.net/qq_21508727/article/details/81063678) -     • [Linux常用命令3(压缩和解压缩总结)](https://blog.csdn.net/qq_21508727/article/details/81074722) -     • [Linux常用命令4(查找命令)](https://blog.csdn.net/qq_21508727/article/details/81161619) -     • [linux常用命令5(查看系统信息)](https://blog.csdn.net/qq_21508727/article/details/81161636) -     • [linux下如何检查服务器异常](https://blog.csdn.net/qq_21508727/article/details/83544199) -     • [linux系统任务的后台运行和关闭、查看后台任务等](https://blog.csdn.net/qq_21508727/article/details/85198912) - -#### [计算机网络](./Java应届生面试突击/操作系统/计算机网络.md) -   ♦ [TCP/IP相关的问题](./Java应届生面试突击/操作系统/TCP_IP相关的问题.md)
-     • [OSI 与 TCP/IP 各层的结构与功能,都有哪些协议,协议所占端口号。]()
-     • [IP 地址的分类。]()
-     • [画出三次握手和四次挥手的图(状态转移图)。TCP 为什么三次握手,四次挥手?]()
-     • [为什么要 4 次挥手?]()
-     • [建立连接的第二个 syn 作用是啥?]()
-     • [time_wait 状态产生的原因?]()
-     • [如果网络连接中出现大量 TIME_WAIT 状态所带来的危害?]()
-     • [如何消除大量 TCP 短连接引发的 TIME_WAIT?]()
-     • [TIME_WAIT 的时间?]()
-     • [当关闭连接时最后一个 ACK 丢失怎么办?]()
-     • [TCP如何保证可靠传输?]()
-     • [TCP 建立连接之后怎么保持连接(检测连接断没断)?]()
-     • [TCP 三次握手有哪些漏洞?]()
-     • [扩展:ddos 攻击的原理,如何防止 ddos 攻击?]()
-     • [TCP 存在的缺陷有哪些?]()
-     • [三次握手与 accept()函数的关系?]()
-     • [在三次握手和四次挥手协议中,客户端和服务器端各用到什么函数(这里涉及到底层的 socket 知识)。]()
-     • [listen 的真正目的?]()
-     • [如果客户端发起握手请求,服务端无法立刻建立连接应该回应什么?]()
-     • [TCP 与 UDP 的区别(或各自的优缺点),以及各自的用途和使用领域。]()
-     • [TCP 面向字节流,UDP 是面向报文的。]()
-     • [TCP 只能单播,不能发送广播和组播;UDP 可以广播和组播。]()
-     • [为什么 TCP 比 UDP 安全,但是还有很多用 UDP?]()
-     • [UDP 为何快?]()
-     • [TCP 如何实现流量控制和拥塞控制。tcp 是怎么做错误处理的?]()
-     • [TCP 滑动窗口协议,窗口过大或过小有什么影响?]()
-     • [说下 TCP 的黏包?]()
-     • [TCP 头部有哪些字段?]()
- -   ♦ [HTTP协议相关的问题](./Java应届生面试突击/操作系统/HTTP协议相关的问题.md)
-     • [Http 的请求报文结构和响应报文结构。]()
-     • [常见 HTTP 首部字段。]()
-     • [Http 状态码含义。]()
-     • [http 中有关缓存的首部字段有哪些?http 的浏览器缓存机制。]()
-     • [Http1.1 和 Http1.0 的区别。(HTTP1.1 版本的 4 个新特性)]()
-     • [常用的 HTTP 方法有哪些?]()
-     • [http 的请求方式 get 和 post 的区别。]()
-     • [为什么 HTTP 是无状态的?如何保持状态(会话跟踪技术、状态管理)?]()
-     • [Http 的短连接和长连接的原理。]()
-     • [HTTP 的特点。]()
-     • [http 的安全问题。]()
-     • [Https 的作用。]()
-     • [浏览器和服务器在基于 https 进行请求链接到数据传输过程中,用到了哪些技术?]()
-     • [讲下 Http 协议。]()
-     • [http 和 socket 的区别,两个协议哪个更高效一点。]()
-     • [HTTP 与 HTTPS 的区别。]()
- -   ♦ [安全相关的问题](./Java应届生面试突击/操作系统/安全相关的问题.md)
-     • [攻击网站的方法和原理。]()
-     • [怎么确保数据传输过程中的安全性?]()
- -   ♦ [Socket编程](./Java应届生面试突击/操作系统/Socket编程.md)
-     • [socket 编程的基本步骤(TCP/UDP)。]()
- -   ♦ [其他相关的问题](./Java应届生面试突击/操作系统/其他相关的问题.md)
-     • [Cookie 与 Session 的原理。]()
-     • [Cookie 与 Session 的区别]()
-     • [session 和 cache 的区别。]()
-     • [如果有几千个 session,怎么提高效率。当 session 访问量比较大的时候,怎么解决?]()
-     • [在浏览器中输入 URL 后,执行的全部过程。会用到哪些协议?(一次完整的 http 请求过程)。]()
-     • [域名解析]()
-     • [三次握手]()
-     • [ARP(地址解析协议)]()
-     • [路由选择协议]()
-     • [建立 TCP 连接后发起 http 请求]()
-     • [服务器收到请求并响应 http 请求]()
-     • [浏览器解析 html 代码,并请求 html 代码中的资源(如 js、css、图片等)]()
-     • [断开 TCP 连接]()
-     • [浏览器对页面进行渲染呈现给用户]()
-     • [路由器与交换机的区别是什么?]()
+     • [1. Linux常用命令1](https://blog.csdn.net/qq_21508727/article/details/81038008)
+     • [2. Linux常用命令2(远程文件下载+查看文件内容)](https://blog.csdn.net/qq_21508727/article/details/81063678)
+     • [3. Linux常用命令3(压缩和解压缩总结)](https://blog.csdn.net/qq_21508727/article/details/81074722)
+     • [4. Linux常用命令4(查找命令)](https://blog.csdn.net/qq_21508727/article/details/81161619)
+     • [5. linux常用命令5(查看系统信息)](https://blog.csdn.net/qq_21508727/article/details/81161636)
+     • [6. linux下如何检查服务器异常](https://blog.csdn.net/qq_21508727/article/details/83544199)
+     • [7. linux系统任务的后台运行和关闭、查看后台任务等](https://blog.csdn.net/qq_21508727/article/details/85198912)
+ +#### 计算机网络 +   ♦ [TCP/IP相关的问题](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md)
+     • [1. OSI 与 TCP/IP 各层的结构与功能,都有哪些协议,协议所占端口号。](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#1)
+     • [2. IP 地址的分类。](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#2)
+     • [3. 画出三次握手和四次挥手的图(状态转移图)。TCP 为什么三次握手,四次挥手?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#3)
+     • [4. 为什么收到 Server 端的确认之后,Client 还需要进行第三次“握手”呢?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#4)
+     • [5. 为什么要 4 次挥手?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#5)
+     • [6. 建立连接的第二个 syn 作用是啥? time_wait 状态产生的原因?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#6)
+     • [7. 如果网络连接中出现大量 TIME_WAIT 状态所带来的危害?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#7)
+     • [8. 如何消除大量 TCP 短连接引发的 TIME_WAIT?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#8)
+     • [9. TIME_WAIT 的时间? 当关闭连接时最后一个 ACK 丢失怎么办?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#9)
+     • [10. TCP如何保证可靠传输?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#10)
+     • [11. TCP 建立连接之后怎么保持连接(检测连接断没断)?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#11)
+     • [12. TCP 三次握手有哪些漏洞?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#12)
+     • [13. TCP 存在的缺陷有哪些?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#13)
+     • [14. 三次握手与 accept()函数的关系?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#14)
+     • [15. 在三次握手和四次挥手协议中,客户端和服务器端各用到什么函数(这里涉及到底层的 socket 知识)。](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#15)
+     • [16. listen 的真正目的?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#16)
+     • [17. 如果客户端发起握手请求,服务端无法立刻建立连接应该回应什么?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#17)
+     • [18. TCP 与 UDP 的区别(或各自的优缺点),以及各自的用途和使用领域。](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#18)
+     • [19. 为什么 TCP 比 UDP 安全,但是还有很多用 UDP?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#19)
+     • [20. UDP 为何快?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#20)
+     • [21. TCP 如何实现流量控制和拥塞控制。tcp 是怎么做错误处理的?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#21)
+     • [22. TCP 滑动窗口协议,窗口过大或过小有什么影响?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#22)
+     • [23. 在流量控制的过程中,必须考虑传输效率。](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#23)
+     • [24. 说下 TCP 的黏包 ?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#24)
+     • [25. TCP 头部有哪些字段?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#25)
+     • [26. UDP 的首部多长,具体包含哪些字段?](./Java应届生面试突击/计算机网络/01_TCP_IP相关的问题.md/#26)
+ + +   ♦ [HTTP协议相关的问题](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md)
+     • [1. Http 的请求报文结构和响应报文结构。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#1)
+     • [2. 常见 HTTP 首部字段。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#2)
+     • [3. Http 状态码含义。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#3)
+     • [4. http 中有关缓存的首部字段有哪些?http 的浏览器缓存机制。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#4)
+     • [5. Http1.1 和 Http1.0 的区别。(HTTP1.1 版本的 4 个新特性)](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#5)
+     • [6. 常用的 HTTP 方法有哪些?](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#6)
+     • [7. http 的请求方式 get 和 post 的区别。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#7)
+     • [8. 为什么 HTTP 是无状态的?如何保持状态(会话跟踪技术、状态管理)?](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#8)
+     • [9. Http 的短连接和长连接的原理。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#9)
+     • [10. HTTP 的特点。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#10)
+     • [11. http 的安全问题。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#11)
+     • [12. Https 的作用。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#12)
+     • [13. 浏览器和服务器在基于 https 进行请求链接到数据传输过程中,用到了哪些技术?](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#13)
+     • [14. 讲下 Http 协议。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#14)
+     • [15. http 和 socket 的区别,两个协议哪个更高效一点。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#15)
+     • [16. HTTP 与 HTTPS 的区别。](./Java应届生面试突击/计算机网络/02_HTTP协议相关的问题.md/#16)
+ +   ♦ [安全相关的问题](./Java应届生面试突击/计算机网络/03_安全相关的问题.md)
+     • [1. 攻击网站的方法和原理。](./Java应届生面试突击/计算机网络/03_安全相关的问题.md/#1)
+     • [2. 怎么确保数据传输过程中的安全性?](./Java应届生面试突击/计算机网络/03_安全相关的问题.md/#2)
+ +   ♦ [Socket编程](./Java应届生面试突击/计算机网络/04_Socket编程.md)
+     • [1. socket 编程的基本步骤(TCP/UDP)。](./Java应届生面试突击/计算机网络/04_Socket编程.md/#1)
+     • [2. Socket 通信模型。](./Java应届生面试突击/计算机网络/04_Socket编程.md/#2)
+     • [3. Socket I/O模型。](./Java应届生面试突击/计算机网络/04_Socket编程.md/#3)
+ +   ♦ [其他相关的问题](./Java应届生面试突击/计算机网络/05_其他相关的问题.md)
+     • [1. Session 原理。](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#1)
+     • [2. Cookie 的机制。](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#2)
+     • [3. Cookie 被浏览器禁用怎么办?](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#3)
+     • [4. Cookie 和 Session 原理解析。](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#4)
+     • [5. Cookie 与 Session 的区别。](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#5)
+     • [6. session 和 cache 的区别。](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#6)
+     • [7. 如果有几千个 session,怎么提高效率 。当 session 访问量比较大的时候,怎么解决?](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#7)
+     • [8. 在浏览器中输入 URL 后,执行的全部过程。会用到哪些协议?(一次完整的 http 请求过程)。](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#8)
+     • [9. 路由器与交换机的区别是什么?](./Java应届生面试突击/计算机网络/05_其他相关的问题.md/#9)
+ +   ♦ [计算机网络专题(补1)](./Java应届生面试突击/计算机网络/06_计算机网络专题(补1).md)
+     • [1. NAT 地址转换。](./Java应届生面试突击/计算机网络/06_计算机网络专题(补1).md/#1)
+     • [2. HTTP 断点续传的原理。](./Java应届生面试突击/计算机网络/06_计算机网络专题(补1).md/#2)
+     • [3. 有几种会话跟踪技术(补充)?](./Java应届生面试突击/计算机网络/06_计算机网络专题(补1).md/#3)
+     • [4. TCP 接收方如何保证按序接收。](./Java应届生面试突击/计算机网络/06_计算机网络专题(补1).md/#4)
+     • [5. 数据传输:服务器与服务器之间传输文件夹下的文件,一个文件夹下有 10 个文件,另一个文件夹下有 100 个文件,两个文件夹大小相等,问,哪个传输更快?](./Java应届生面试突击/计算机网络/06_计算机网络专题(补1).md/#5)
+ + --- ### 搬运工信息 diff --git "a/Java\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231_\347\233\256\345\275\225.md" "b/Java\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231_\347\233\256\345\275\225.md" new file mode 100644 index 0000000..2b953e0 --- /dev/null +++ "b/Java\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231_\347\233\256\345\275\225.md" @@ -0,0 +1,18 @@ +### Java面试强化资料_目录 + +#### 强化资料 +   ♦ [1. Java面试强化测试题](./data/books/面试强化资料/Java面试强化测试题.md)
+   ♦ [2. Java高级技术路线](./data/books/面试强化资料/Java高级技术路线.pdf)
+   ♦ [3. !!!Java后端技术面试汇总](./data/books/面试强化资料/Java后端技术面试汇总-20190301.pdf)
+   ♦ [4. !!Java常见疑惑和陷阱](./data/books/面试强化资料/Java常见疑惑和陷阱.pdf)
+   ♦ [5. 2019阿里巴巴技术技术专家面试题汇总](./data/books/面试强化资料/2019阿里巴巴技术技术专家面试题汇总1559554113.pdf)
+   ♦ [6. Java开发手册规范1.5.0](./data/books/面试强化资料/Java开发手册规范1.5.0.pdf)
+   ♦ [7. Java核心知识点整理](data/books/面试强化资料/Java核心知识点整理.pdf)
+ +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/data/00_\346\226\207\346\234\254\346\240\274\345\274\217\346\250\241\346\235\277.md" "b/data/00_\346\226\207\346\234\254\346\240\274\345\274\217\346\250\241\346\235\277.md" new file mode 100644 index 0000000..7acdd63 --- /dev/null +++ "b/data/00_\346\226\207\346\234\254\346\240\274\345\274\217\346\250\241\346\235\277.md" @@ -0,0 +1,48 @@ +# 文本格式模板 + +### 目录 + +--- +1. xxx
+2. xxx
+3. xxx
+ + +### 1. xxx +#### xxx +     + xxx
+##### xxx +     + xxx
+![图片](link) + +1. xxx
+ xxx +2. xxx
+ xxx + +- 1. xxx + 2. xxx + +- xxx +- xxx +- xxx + +### 2. xxxx +     + xxx
+ +### 3. xxx +     + xxx
+ + + +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/data/books/Java/Netty\345\256\236\346\210\230 \347\224\265\345\255\220\347\211\210.pdf" "b/data/books/Java/Netty\345\256\236\346\210\230 \347\224\265\345\255\220\347\211\210.pdf" new file mode 100644 index 0000000..1c36dbb Binary files /dev/null and "b/data/books/Java/Netty\345\256\236\346\210\230 \347\224\265\345\255\220\347\211\210.pdf" differ diff --git "a/data/books/Java/Netty\346\235\203\345\250\201\346\214\207\345\215\227\345\270\246\347\233\256\345\275\225\345\256\214\346\225\264\347\211\210.pdf" "b/data/books/Java/Netty\346\235\203\345\250\201\346\214\207\345\215\227\345\270\246\347\233\256\345\275\225\345\256\214\346\225\264\347\211\210.pdf" new file mode 100644 index 0000000..c331adf Binary files /dev/null and "b/data/books/Java/Netty\346\235\203\345\250\201\346\214\207\345\215\227\345\270\246\347\233\256\345\275\225\345\256\214\346\225\264\347\211\210.pdf" differ diff --git "a/data/books/\344\274\201\344\270\232\345\272\224\347\224\250\346\236\266\346\236\204\346\250\241\345\274\217.pdf" "b/data/books/\344\274\201\344\270\232\345\272\224\347\224\250\346\236\266\346\236\204\346\250\241\345\274\217.pdf" new file mode 100644 index 0000000..8b59af7 Binary files /dev/null and "b/data/books/\344\274\201\344\270\232\345\272\224\347\224\250\346\236\266\346\236\204\346\250\241\345\274\217.pdf" differ diff --git "a/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/2019\351\230\277\351\207\214\345\267\264\345\267\264\346\212\200\346\234\257\346\212\200\346\234\257\344\270\223\345\256\266\351\235\242\350\257\225\351\242\230\346\261\207\346\200\2731559554113.pdf" "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/2019\351\230\277\351\207\214\345\267\264\345\267\264\346\212\200\346\234\257\346\212\200\346\234\257\344\270\223\345\256\266\351\235\242\350\257\225\351\242\230\346\261\207\346\200\2731559554113.pdf" new file mode 100755 index 0000000..f001d16 Binary files /dev/null and "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/2019\351\230\277\351\207\214\345\267\264\345\267\264\346\212\200\346\234\257\346\212\200\346\234\257\344\270\223\345\256\266\351\235\242\350\257\225\351\242\230\346\261\207\346\200\2731559554113.pdf" differ diff --git "a/data/books/\350\265\204\346\226\231/Java\345\220\216\347\253\257\346\212\200\346\234\257\351\235\242\350\257\225\346\261\207\346\200\273-20190301.pdf" "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\345\220\216\347\253\257\346\212\200\346\234\257\351\235\242\350\257\225\346\261\207\346\200\273-20190301.pdf" similarity index 100% rename from "data/books/\350\265\204\346\226\231/Java\345\220\216\347\253\257\346\212\200\346\234\257\351\235\242\350\257\225\346\261\207\346\200\273-20190301.pdf" rename to "data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\345\220\216\347\253\257\346\212\200\346\234\257\351\235\242\350\257\225\346\261\207\346\200\273-20190301.pdf" diff --git "a/data/books/\350\265\204\346\226\231/Java\345\270\270\350\247\201\347\226\221\346\203\221\345\222\214\351\231\267\351\230\261.pdf" "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\345\270\270\350\247\201\347\226\221\346\203\221\345\222\214\351\231\267\351\230\261.pdf" similarity index 100% rename from "data/books/\350\265\204\346\226\231/Java\345\270\270\350\247\201\347\226\221\346\203\221\345\222\214\351\231\267\351\230\261.pdf" rename to "data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\345\270\270\350\247\201\347\226\221\346\203\221\345\222\214\351\231\267\351\230\261.pdf" diff --git "a/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\345\274\200\345\217\221\346\211\213\345\206\214\350\247\204\350\214\2031.5.0.pdf" "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\345\274\200\345\217\221\346\211\213\345\206\214\350\247\204\350\214\2031.5.0.pdf" new file mode 100644 index 0000000..7cf51a9 Binary files /dev/null and "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\345\274\200\345\217\221\346\211\213\345\206\214\350\247\204\350\214\2031.5.0.pdf" differ diff --git "a/data/books/\350\265\204\346\226\231/JAVA\346\240\270\345\277\203\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.pdf" "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\346\240\270\345\277\203\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.pdf" similarity index 100% rename from "data/books/\350\265\204\346\226\231/JAVA\346\240\270\345\277\203\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.pdf" rename to "data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\346\240\270\345\277\203\347\237\245\350\257\206\347\202\271\346\225\264\347\220\206.pdf" diff --git "a/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\351\235\242\350\257\225\345\274\272\345\214\226\346\265\213\350\257\225\351\242\230.md" "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\351\235\242\350\257\225\345\274\272\345\214\226\346\265\213\350\257\225\351\242\230.md" new file mode 100644 index 0000000..d9e9560 --- /dev/null +++ "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\351\235\242\350\257\225\345\274\272\345\214\226\346\265\213\350\257\225\351\242\230.md" @@ -0,0 +1,134 @@ +## Java面试强化测试题 + +### Java基础 +1、List 和 Set 的区别?
+2、HashSet 是如何保证不重复的?
+3、HashMap 是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全)?
+4、HashMap 的扩容过程?
+5、HashMap 1.7 与 1.8 的 区别,说明 1.8 做了哪些优化,如何优化的?
+6、final finally finalize 区别?
+7、强引用 、软引用、 弱引用、虚引用?
+8、Java反射?
+9、Arrays.sort 实现原理和 Collection 实现原理?
+10、LinkedHashMap的应用?
+11、cloneable接口实现原理?
+12、异常分类以及处理机制?
+13、wait和sleep的区别?
+14、数组在内存中如何分配 + +### Java 并发 +1、synchronized 的实现原理以及锁优化?
+2、volatile 的实现原理?
+3、Java 的信号灯?
+4、synchronized 在静态方法和普通方法的区别?
+5、怎么实现所有线程在等待某个事件的发生才会去执行?
+6、CAS?CAS 有什么缺陷,如何解决?
+7、synchronized 和 lock 有什么区别?
+8、Hashtable 是怎么加锁的 ?
+9、HashMap 的并发问题?
+10、ConcurrenHashMap 介绍?1.8 中为什么要用红黑树?
+11、AQS 12、如何检测死锁?怎么预防死锁?
+13、Java 内存模型?
+14、如何保证多线程下 i++ 结果正确?
+15、线程池的种类,区别和使用场景?
+16、分析线程池的实现原理和线程的调度过程?
+17、线程池如何调优,最大数目如何确认?
+18、ThreadLocal原理,用的时候需要注意什么?
+19、CountDownLatch 和 CyclicBarrier 的用法,以及相互之间的差别?
+20、LockSupport工具
+21、Condition接口及其实现原理
+22、Fork/Join框架的理解
+23、分段锁的原理,锁力度减小的思考
+24、八种阻塞队列以及各个阻塞队列的特性 + +### Spring +1、BeanFactory 和 FactoryBean?
+2、Spring IOC 的理解,其初始化过程?
+3、BeanFactory 和 ApplicationContext?
+4、Spring Bean 的生命周期,如何被管理的?
+5、Spring Bean 的加载过程是怎样的?
+6、如果要你实现Spring AOP,请问怎么实现?
+7、如果要你实现Spring IOC,你会注意哪些问题?
+8、Spring 是如何管理事务的,事务管理机制?
+9、Spring 的不同事务传播行为有哪些,干什么用的?
+10、Spring 中用到了那些设计模式?
+11、Spring MVC 的工作原理?
+12、Spring 循环注入的原理?
+13、Spring AOP的理解,各个术语,他们是怎么相互工作的?
+14、Spring 如何保证 Controller 并发的安全? + +### Netty +1、BIO、NIO和AIO?
+2、Netty 的各大组件?
+3、Netty的线程模型?
+4、TCP 粘包/拆包的原因及解决方法?
+5、了解哪几种序列化协议?包括使用场景和如何去选择?
+6、Netty的零拷贝实现?
+7、Netty的高性能表现在哪些方面? + +### 分布式相关 +1、Dubbo的底层实现原理和机制?
+2、描述一个服务从发布到被消费的详细过程?
+3、分布式系统怎么做服务治理?
+4、接口的幂等性的概念?
+5、消息中间件如何解决消息丢失问题?
+6、Dubbo的服务请求失败怎么处理?
+7、重连机制会不会造成错误?
+8、对分布式事务的理解?
+9、如何实现负载均衡,有哪些算法可以实现?
+10、Zookeeper的用途,选举的原理是什么?
+11、数据的垂直拆分水平拆分?
+12、zookeeper原理和适用场景?
+13、zookeeper watch机制?
+14、redis/zk节点宕机如何处理?
+15、分布式集群下如何做到唯一序列号?
+16、如何做一个分布式锁?
+17、用过哪些MQ,怎么用的,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗?
+18、MQ系统的数据如何保证不丢失?
+19、列举出你能想到的数据库分库分表策略;分库分表后,如何解决全表查询的问题?
+20、zookeeper的选举策略?
+21、全局ID?
+ +### 数据库 +1、mysql分页有什么优化?
+2、悲观锁、乐观锁?
+3、组合索引,最左原则?
+4、mysql 的表锁、行锁?
+5、mysql 性能优化?
+6、mysql的索引分类:B+,hash;什么情况用什么索引?
+7、事务的特性和隔离级别 ?
+ +### 缓存 +1、Redis用过哪些数据数据,以及Redis底层怎么实现?
+2、Redis缓存穿透,缓存雪崩?
+3、如何使用Redis来实现分布式锁?
+4、Redis的并发竞争问题如何解决?
+5、Redis持久化的几种方式,优缺点是什么,怎么实现的?
+6、Redis的缓存失效策略?
+7、Redis集群,高可用,原理?
+8、Redis缓存分片?
+9、Redis的数据淘汰策略?
+ +### JVM +1、详细jvm内存模型?
+2、讲讲什么情况下回出现内存溢出,内存泄漏?
+3、说说Java线程栈
+4、JVM 年轻代到年老代的晋升过程的判断条件是什么呢?
+5、JVM 出现 fullGC 很频繁,怎么去线上排查问题?
+6、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?
+7、类的实例化顺序?
+8、JVM垃圾回收机制,何时触发MinorGC等操作?
+9、JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的?
+10、各种回收器,各自优缺点?
+*注意点:*
+重点CMS、G1
+11、各种回收算法?
+12、说下OOM错误,stackoverflow错误,permgen space错误?
+ +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- \ No newline at end of file diff --git "a/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\351\253\230\347\272\247\346\212\200\346\234\257\350\267\257\347\272\277.pdf" "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\351\253\230\347\272\247\346\212\200\346\234\257\350\267\257\347\272\277.pdf" new file mode 100755 index 0000000..dea10e2 Binary files /dev/null and "b/data/books/\351\235\242\350\257\225\345\274\272\345\214\226\350\265\204\346\226\231/Java\351\253\230\347\272\247\346\212\200\346\234\257\350\267\257\347\272\277.pdf" differ diff --git "a/data/books/\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241\357\274\232\350\275\257\344\273\266\346\240\270\345\277\203\345\244\215\346\235\202\346\200\247\345\272\224\345\257\271\344\271\213\351\201\223.pdf" "b/data/books/\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241\357\274\232\350\275\257\344\273\266\346\240\270\345\277\203\345\244\215\346\235\202\346\200\247\345\272\224\345\257\271\344\271\213\351\201\223.pdf" new file mode 100644 index 0000000..4d5722c Binary files /dev/null and "b/data/books/\351\242\206\345\237\237\351\251\261\345\212\250\350\256\276\350\256\241\357\274\232\350\275\257\344\273\266\346\240\270\345\277\203\345\244\215\346\235\202\346\200\247\345\272\224\345\257\271\344\271\213\351\201\223.pdf" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5_1.jpg" "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5_1.jpg" new file mode 100644 index 0000000..88c5250 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5_1.jpg" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5_2.jpg" "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5_2.jpg" new file mode 100644 index 0000000..3a352c5 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/5_2.jpg" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7_1.jpg" "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7_1.jpg" new file mode 100644 index 0000000..3d490fa Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7_1.jpg" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7_2.jpg" "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7_2.jpg" new file mode 100644 index 0000000..a388976 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\347\256\227\346\263\225\347\252\201\345\207\273/\343\200\212\345\211\221\346\214\207offer\343\200\213_66/7_2.jpg" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_1.png" new file mode 100644 index 0000000..76508f2 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_2.png" new file mode 100644 index 0000000..e471d98 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_3.png" new file mode 100644 index 0000000..8477110 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_4.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_4.png" new file mode 100644 index 0000000..64d39b0 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/02_1_4.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_1.png" new file mode 100644 index 0000000..e579571 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_2.png" new file mode 100644 index 0000000..d078dfe Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_3.png" new file mode 100644 index 0000000..a076d29 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_4.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_4.png" new file mode 100644 index 0000000..3cd185d Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_4.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_5.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_5.png" new file mode 100644 index 0000000..5a69550 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_5.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_6.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_6.png" new file mode 100644 index 0000000..093b820 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/04_1_6.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_17_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_17_1.png" new file mode 100644 index 0000000..40545e0 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_17_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_1_1.png" new file mode 100644 index 0000000..a3a0649 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_1_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_1_2.png" new file mode 100644 index 0000000..3844711 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\345\244\232\347\272\277\347\250\213\345\222\214\345\271\266\345\217\221/06_1_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_1.png" new file mode 100644 index 0000000..12e3819 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_2.png" new file mode 100644 index 0000000..79598c8 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_3.png" new file mode 100644 index 0000000..5b3b856 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/01_1_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_1.png" new file mode 100644 index 0000000..b857855 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_2.png" new file mode 100644 index 0000000..d4aaa5a Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_3.png" new file mode 100644 index 0000000..20f0d7a Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/03_2_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/06_4_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/06_4_1.png" new file mode 100644 index 0000000..fd795fb Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/06_4_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_1.png" new file mode 100644 index 0000000..027b69a Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_2.png" new file mode 100644 index 0000000..b11a9fd Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_3.png" new file mode 100644 index 0000000..5c8f2fa Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_4.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_4.png" new file mode 100644 index 0000000..1f14011 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/07_4_4.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/08_4_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/08_4_1.png" new file mode 100644 index 0000000..ebf7437 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/08_4_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_1_1.png" new file mode 100644 index 0000000..ef6a7b0 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_1.png" new file mode 100644 index 0000000..18e22d7 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_2.png" new file mode 100644 index 0000000..0cae510 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_3.png" new file mode 100644 index 0000000..b12678d Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_4.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_4.png" new file mode 100644 index 0000000..10393fc Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_4.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_5.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_5.png" new file mode 100644 index 0000000..3e39cc0 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_5.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_6.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_6.png" new file mode 100644 index 0000000..c2fa0d2 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_6.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_7.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_7.png" new file mode 100644 index 0000000..e4e6913 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\346\225\260\346\215\256\345\272\223/09_3_7.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_13_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_13_1.png" new file mode 100644 index 0000000..c27db93 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_13_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_1.png" new file mode 100644 index 0000000..0551305 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_2.png" new file mode 100644 index 0000000..4950dea Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_3.png" new file mode 100644 index 0000000..d01d7aa Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_4.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_4.png" new file mode 100644 index 0000000..82989c8 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_15_4.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_21_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_21_1.png" new file mode 100644 index 0000000..87bdda8 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_21_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_21_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_21_2.png" new file mode 100644 index 0000000..f244687 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_21_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_23_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_23_1.png" new file mode 100644 index 0000000..d826e5b Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_23_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_23_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_23_2.png" new file mode 100644 index 0000000..f6d0a16 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_23_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_1.png" new file mode 100644 index 0000000..1a4839e Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_2.png" new file mode 100644 index 0000000..5977bb2 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_3.png" new file mode 100644 index 0000000..6a87e33 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_25_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_26_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_26_1.png" new file mode 100644 index 0000000..2287b44 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/01_26_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_12_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_12_1.png" new file mode 100644 index 0000000..53e1252 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_12_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_1.png" new file mode 100644 index 0000000..493af1a Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_2.png" new file mode 100644 index 0000000..a4cd5fc Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_3.png" new file mode 100644 index 0000000..2496ab6 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_4.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_4.png" new file mode 100644 index 0000000..dba9eb9 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_4.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_5.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_5.png" new file mode 100644 index 0000000..c38ba2a Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_5.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_6.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_6.png" new file mode 100644 index 0000000..aac722b Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_1_6.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_1.png" new file mode 100644 index 0000000..8cea4fa Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_2.png" new file mode 100644 index 0000000..32a8097 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_3.png" new file mode 100644 index 0000000..ccfc35d Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_4.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_4.png" new file mode 100644 index 0000000..5676d9f Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_4_4.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_6_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_6_1.png" new file mode 100644 index 0000000..fa148bb Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_6_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_7_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_7_1.png" new file mode 100644 index 0000000..bc96a6c Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_7_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_7_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_7_2.png" new file mode 100644 index 0000000..7158726 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/02_7_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_1_1.png" new file mode 100644 index 0000000..9536758 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/04_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_1.png" new file mode 100644 index 0000000..f85a566 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_2.png" new file mode 100644 index 0000000..180ac23 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_3.png" new file mode 100644 index 0000000..05bb40d Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_4_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_1.png" new file mode 100644 index 0000000..61c3344 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_2.png" new file mode 100644 index 0000000..568b04f Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_2.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_3.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_3.png" new file mode 100644 index 0000000..fd8d983 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/05_8_3.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_1_1.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_1_1.png" new file mode 100644 index 0000000..00046b5 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_1_1.png" differ diff --git "a/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_1_2.png" "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_1_2.png" new file mode 100644 index 0000000..9bd3892 Binary files /dev/null and "b/data/images/Java\345\272\224\345\261\212\347\224\237\351\235\242\350\257\225\347\252\201\345\207\273/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234/06_1_2.png" differ diff --git "a/notes/\345\244\215\344\271\240\350\247\204\345\210\222.md" "b/notes/\345\244\215\344\271\240\350\247\204\345\210\222.md" index 3bf4a97..d3f89bf 100644 --- "a/notes/\345\244\215\344\271\240\350\247\204\345\210\222.md" +++ "b/notes/\345\244\215\344\271\240\350\247\204\345\210\222.md" @@ -18,3 +18,25 @@ #### 实习生面试大公司失败,进了小公司,不要灰心,秋招还是有翻盘的机会!      当你投了很多实习简历后,经过一系列笔面试后,你应该知道笔/面试的方向在哪了!不要急,好好为秋招做准备吧! + +#### 复习方向 +[跳槽季快速全面复习方向](./跳槽季快速全面复习方向.md) + +--- + +### 如果你已经拿到实习offer/正式offer,那么在此恭喜你!
接下来你可能需要做一些入职前的基础技术准备! +[入职前的基础技术准备](https://github.com/JGPY/JavaWebTech) + + + +--- + + +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Website:www.iotworld.vip
+ +--- + diff --git "a/notes/\345\276\205\346\225\264\347\220\206.md" "b/notes/\345\276\205\346\225\264\347\220\206.md" index 777057e..a71a4ab 100644 --- "a/notes/\345\276\205\346\225\264\347\220\206.md" +++ "b/notes/\345\276\205\346\225\264\347\220\206.md" @@ -1,7 +1,11 @@ -## 还在整理中,请耐心等待,如果急需相关资料,请邮箱联系我。 +## 还在整理中,请耐心等待。 +## 欢迎各位一起来完善,让更多的有心之人能够受益!!! ---- - -### Email:iotworld.vip@gmail.com ---- \ No newline at end of file +--- +### 搬运工信息 +Author:Jason Lou
+Email:vip.iotworld@gmail.com
+Blog:https://blog.csdn.net/qq_21508727
+Github:https://github.com/JGPY/JavaGuideBooster
+--- diff --git a/readme.md b/readme.md index 0737dcf..9c4227c 100644 --- a/readme.md +++ b/readme.md @@ -1,27 +1,43 @@ -## Java笔/面试加速器(我复习到哪块基本就整理到哪块,有时候忙,可能没有及时更新,还请耐心等待,如果急需相关资料,[请邮箱联系我。](./notes/待整理.md)) +### 内推内推内推你来阿里,工作地杭州or北京皆可,简历发至邮箱:vip.iotworld@gmail.com / Liu_0102@outlook.com + + +## ♦ Java笔/面试加速器 + * 整理这些资料的起因:自己还有一年的时间就即将毕业了,因为没有继续深造的意愿,所以开始注意工作方面的动向。 初步看了些往年互联公司的网申题目和校招笔试题目感觉很难入手,与往届毕业的师兄师姐交流些面试情况,自我感觉很不良好啊。 -* 在网上找了些有关笔试和面试相关的内容,总体感觉不是**杂**就**面太广太多**,很难仔细消化掉。 +* 在网上找了些有关笔试和面试相关的内容,总体感觉不是*杂*就是*面太广太多*,很难仔细消化掉。 内容是根据往届师兄师姐留下来的笔/面试资料和一些网上的资料整理了出来。 * 无论你是即将进入社会的应届Java工程师还是即将打算跳槽的Java工程师,只要你点击进来浏览了,我希望以下内容能给你带来帮助! -* 整理这些内容的目标是**以快速提升笔面试技能为目标!** -* 虽然只做**搬运工**,但一字一句整理不易,还**请点亮小星星!** +* 整理这些内容的目标是*以快速提升笔面试技能为目标!* +* 虽然只做*搬运工*,但一字一句整理不易,还*请点亮小星星!* +### ♦ 内容分为四个部分 +<>
-### 内容分为三个部分 -<>
+<>
-<>
+<>
-<>
+<>
个人建议:[复习规划](./notes/复习规划.md) -### 如果时间充裕可系统学习这些勤劳的IT猿整理出来的资料 +### ♦ 如果时间充裕可系统学习这些勤劳的IT猿整理出来的资料 + +#### Github: + [I 【技术面试必备基础知识】](https://github.com/CyC2018/CS-Notes)
[II 【Java学习+面试指南】](https://github.com/Snailclimb/JavaGuide)
[III【All Algorithms implemented in Java】](https://github.com/TheAlgorithms/Java)
+#### 网站: + +[I 【专注Java技术分享】](http://www.importnew.com/)
+[II 【企业级软件架构解决之道】](https://www.jdon.com/)
+[III【IBM Developer】](https://developer.ibm.com/)
+[IV 【Stack Overflow】](https://stackoverflow.com/)
+ + --- ### Java应届生面试突击_章节目录
@@ -64,7 +80,7 @@      ♦ 安全相关的问题
     ♦ Socket 编程
     ♦ 其他相关的问题
- +     ♦ 计算机网络专题(补1)
--- @@ -95,7 +111,7 @@      ♦ 其他(15道)
   IV LeetCode_Top100
-     ♦ 整理中...
+     ♦ 001~100
--- @@ -113,6 +129,13 @@ --- +### Java面试强化资料_章节目录
+ +   I 强化资料
+ +--- + + ### 搬运工信息 Author:Jason Lou
Email:vip.iotworld@gmail.com