diff --git "a/00-\347\233\256\345\275\225.md" "b/00-\347\233\256\345\275\225.md"
deleted file mode 100644
index d950068..0000000
--- "a/00-\347\233\256\345\275\225.md"
+++ /dev/null
@@ -1,4 +0,0 @@
-# 目录
-
-###01.[使用socket发送HTTP GET请求](01.使用socket发送HTTP GET请求.md)
-###02.[编写自定义Annotation](02.编写自定义Annotation.md)
diff --git "a/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md" "b/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md"
deleted file mode 100644
index f36ba9b..0000000
--- "a/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md"
+++ /dev/null
@@ -1,35 +0,0 @@
-#00.待解决问题
-
-* 如何禁止用户登出之后浏览器的回退功能?
-* log4j的详细配置:参考这里
-* log4j使用数据库
-* 测试的内存数据库
-* jbmp 5
-* Spring web flow
-* Lucens
-* Hadoop
-* aop
-* webservice
-* mybatis
-* spring security
-* nosql
-* ide自动生成equals、hashcode、toString
-* 原型设计工具Axure
-* Java异常
-* 自定义日志级别
-* 如果你的项目或类,很难进行测试,这说明,你的类或项目的结构很有问题!
-* 跨域访问和同源策略
-* 安全测试
-* 性能测试
-* 各种IO模型
-* MongoDB是否可以解决大数据量的检索问题?
-* mysql多账号(安全账号)、索引、试图、优化查询、调优、备份
-* service层能否互相调用【考虑权限、事务、session】?
-* Spring的事务传播机制
-* 测试的类型,以及如何完成测试
-* HTTP 406 错误的原因
-* https协议,在tomcat和apache搭建
-* JNDI
-* JAAS
-* javascript 在线着色工具
-* 在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的,毕竟站在程序的角度来看这两个根本就是同一个,如果内部类该变了,而外部方法的形参却没有改变这是难以理解和不可接受的,所以为了保持参数的一致性,就规定使用final来避免形参的不改变。
diff --git "a/Java-Base/00-\345\277\265\345\277\265\347\242\216.md" "b/Java-Base/00-\345\277\265\345\277\265\347\242\216.md"
new file mode 100644
index 0000000..b96e4ce
--- /dev/null
+++ "b/Java-Base/00-\345\277\265\345\277\265\347\242\216.md"
@@ -0,0 +1,3 @@
+# 念念碎
+
+* 浮点数除以0不会抛出**ArithmeticException**;
diff --git "a/Java-Base/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md" "b/Java-Base/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md"
new file mode 100644
index 0000000..93703e9
--- /dev/null
+++ "b/Java-Base/00.\345\276\205\350\247\243\345\206\263\351\227\256\351\242\230.md"
@@ -0,0 +1,2 @@
+#00.待解决问题
+
diff --git "a/01.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP GET\350\257\267\346\261\202.md" "b/Java-Base/01.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP GET\350\257\267\346\261\202.md"
similarity index 98%
rename from "01.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP GET\350\257\267\346\261\202.md"
rename to "Java-Base/01.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP GET\350\257\267\346\261\202.md"
index d454690..e0adf47 100644
--- "a/01.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP GET\350\257\267\346\261\202.md"
+++ "b/Java-Base/01.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP GET\350\257\267\346\261\202.md"
@@ -1,59 +1,59 @@
-#01.使用socket发送HTTP GET请求
-
-##1.HTTP协议介绍
- HTTP是建立在TCP/IP之上,用于互联网上超媒体系统应用之间的通信协议。中文奶名:超文本传输协议。
-
- 简单地说,HTTP就是建立在TCP/IP之上,使用一些特殊的文本标志来进行客户端与服务器端的通信。
-
- 这些特殊的标志文本,包括三个部分:Start line,Header,Body。
-
- 客户端发送给服务器(Request请求)以及服务器返回给客户端(Response响应)的特殊标志文本不尽相同,例如Request与Response的
- Start Line是不同的,Request与Response的Header有公用的部分,也有自己私有的Header。下面这张图是一个HTTP GET Request以及服务
- 器的Response。
-
-
-
- 需要注意都是,GET请求没有Body。
-
-##2.HTTP GET请求
- 如上面所说,HTTP是建立在TCP/IP之上使用一些标识文本来进行通信的协议,只要我们按照一定的格式发送这些标识文本,就可以跟
- HTTP服务器进行通讯了。例如下面是一个HTTP GET请求的标识文本:
-
- GET /index.html HTTP/1.1
- Host: www.allwinnertech.com
-
-
- 上面这个,基本是HTTP GET请求所需的最少的标识文本,只包括Start line和一个Header属性(GET请求没有Body)。
-
- 第一行为Start line,这里表示是一个基于HTTP 1.1版本的GET请求,需要获取的资源为Host所标识的服务器下的index.html文本。
-
- 第二行到回车换行符行(这里是第三行)前都是Header,Header的Host属性表明访问的域名为www.allwinnertech.com。
-
- 这里的第三行为一个回车换行符,用于标识Header与Body的界线,由于GET请求没有Body,所以这里的最后一行为回车换行符。
-
- 我们只要在TCP连接之上,按照这个格式发送文本,就可以取得www.allwinnertech.co/index.html这个文本了。
-
-##3.使用Socket发送HTTP GET请求
- 这里尽量使用最少的代码量来实现HTTP GET请求,不会考虑长连接(一次TCP连接,多次HTTP请求),以及WebSocket(一次Request,
- 多次Reponse)等请求。这里只是发送一次HTTP请求,然后读取取得的文本(更像HTTP 1.0)。
-
-```java
-Socket socket = new Socket("www.allwinnertech.com", 80); // 建立socket连接
-
-BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 取得文本输出流
-
-bw.write("GET / HTTP/1.1\r\n"); // \r\n为回车换行符
-bw.write("Host: www.allwinnertech.com\r\n");
-bw.write("\r\n"); // 不要忘记Header之后还有一个回车换行符
-bw.flush(); // 发送请求
-
-BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 取得文本输出流
-
-String line = null;
-while((line = br.readLine())!=null) { //迭代输出的文本
- System.out.println(line);
-}
-```
- 将这段代码运行之后,就可以在控制台看到取得文本了。
-
- 就那么简单!
+#01.使用socket发送HTTP GET请求
+
+##1.HTTP协议介绍
+ HTTP是建立在TCP/IP之上,用于互联网上超媒体系统应用之间的通信协议。中文奶名:超文本传输协议。
+
+ 简单地说,HTTP就是建立在TCP/IP之上,使用一些特殊的文本标志来进行客户端与服务器端的通信。
+
+ 这些特殊的标志文本,包括三个部分:Start line,Header,Body。
+
+ 客户端发送给服务器(Request请求)以及服务器返回给客户端(Response响应)的特殊标志文本不尽相同,例如Request与Response的
+ Start Line是不同的,Request与Response的Header有公用的部分,也有自己私有的Header。下面这张图是一个HTTP GET Request以及服务
+ 器的Response。
+
+
+
+ 需要注意都是,GET请求没有Body。
+
+##2.HTTP GET请求
+ 如上面所说,HTTP是建立在TCP/IP之上使用一些标识文本来进行通信的协议,只要我们按照一定的格式发送这些标识文本,就可以跟
+ HTTP服务器进行通讯了。例如下面是一个HTTP GET请求的标识文本:
+
+ GET /index.html HTTP/1.1
+ Host: www.allwinnertech.com
+
+
+ 上面这个,基本是HTTP GET请求所需的最少的标识文本,只包括Start line和一个Header属性(GET请求没有Body)。
+
+ 第一行为Start line,这里表示是一个基于HTTP 1.1版本的GET请求,需要获取的资源为Host所标识的服务器下的index.html文本。
+
+ 第二行到回车换行符行(这里是第三行)前都是Header,Header的Host属性表明访问的域名为www.allwinnertech.com。
+
+ 这里的第三行为一个回车换行符,用于标识Header与Body的界线,由于GET请求没有Body,所以这里的最后一行为回车换行符。
+
+ 我们只要在TCP连接之上,按照这个格式发送文本,就可以取得www.allwinnertech.co/index.html这个文本了。
+
+##3.使用Socket发送HTTP GET请求
+ 这里尽量使用最少的代码量来实现HTTP GET请求,不会考虑长连接(一次TCP连接,多次HTTP请求),以及WebSocket(一次Request,
+ 多次Reponse)等请求。这里只是发送一次HTTP请求,然后读取取得的文本(更像HTTP 1.0)。
+
+```java
+Socket socket = new Socket("www.allwinnertech.com", 80); // 建立socket连接
+
+BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 取得文本输出流
+
+bw.write("GET / HTTP/1.1\r\n"); // \r\n为回车换行符
+bw.write("Host: www.allwinnertech.com\r\n");
+bw.write("\r\n"); // 不要忘记Header之后还有一个回车换行符
+bw.flush(); // 发送请求
+
+BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); // 取得文本输出流
+
+String line = null;
+while((line = br.readLine())!=null) { //迭代输出的文本
+ System.out.println(line);
+}
+```
+ 将这段代码运行之后,就可以在控制台看到取得文本了。
+
+ 就那么简单!
diff --git "a/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md" "b/Java-Base/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md"
similarity index 99%
rename from "02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md"
rename to "Java-Base/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md"
index fbe3f55..06afcd1 100644
--- "a/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md"
+++ "b/Java-Base/02.\347\274\226\345\206\231\350\207\252\345\256\232\344\271\211Annotation.md"
@@ -18,7 +18,7 @@ public @interface TestCase { // 使用@Interface修饰这个是一个Annotation
以上就完成了一个Annotation接口的编写。接着我们写一个Test类来使用@TestCase这个注释。
```java
public class Test {
- @TestCase
+
public void m_1(){
System.out.println("This is Method with @TestCase!");
}
diff --git "a/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md" "b/Java-Base/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md"
similarity index 95%
rename from "03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md"
rename to "Java-Base/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md"
index 94c614f..6e24207 100644
--- "a/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md"
+++ "b/Java-Base/03.\350\233\213\347\226\274\347\232\204AOP\346\246\202\345\277\265.md"
@@ -1,6 +1,6 @@
#AOP介绍
-AOP全称Aspect Oriented Programming,面向切面编程。在事务管理,代码跟踪方面应用很广泛。教科书上的对于AOP概念的解释比较让人晕眩,下面是偶本人对AOP一些概念的理解:
+AOP全称Aspect Oriented Programming,面向切面编程。在事务管理,代码跟踪方面应用很广泛。教科书上的对于AOP概念的解释比较让人晕眩。
>**连接点(Joinpoint)**:程序流中可以用于代码植入的点,通常是某些边界,例如:类初始化前、类初始化后、方法执行前、方法执行后、方法抛异常后。
diff --git "a/04.AOP\347\232\204\345\272\224\347\224\250\350\214\203\345\233\264\345\217\212\345\256\236\347\216\260\346\241\206\346\236\266.md" "b/Java-Base/04.AOP\347\232\204\345\272\224\347\224\250\350\214\203\345\233\264\345\217\212\345\256\236\347\216\260\346\241\206\346\236\266.md"
similarity index 100%
rename from "04.AOP\347\232\204\345\272\224\347\224\250\350\214\203\345\233\264\345\217\212\345\256\236\347\216\260\346\241\206\346\236\266.md"
rename to "Java-Base/04.AOP\347\232\204\345\272\224\347\224\250\350\214\203\345\233\264\345\217\212\345\256\236\347\216\260\346\241\206\346\236\266.md"
diff --git "a/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md" "b/Java-Base/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md"
similarity index 97%
rename from "05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md"
rename to "Java-Base/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md"
index 4876258..78fc517 100644
--- "a/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md"
+++ "b/Java-Base/05.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\217.md"
@@ -2,9 +2,6 @@
## 遇到的问题
- 学习的最好方法就是实践,想当年大学学《设计模式》这门课的时候,重修两次,补考还挂了两次,最后还是甩小聪明才拿到的毕业证。
-往事不多提,甚是可悲。
-
最近遇到一个问题,这里有一个controller的方法,方法里面需要获取request header的 __x-forwarded-for__ 属性的值:
```java
diff --git "a/06.\345\215\225\344\276\213\346\250\241\345\274\217.md" "b/Java-Base/06.\345\215\225\344\276\213\346\250\241\345\274\217.md"
similarity index 86%
rename from "06.\345\215\225\344\276\213\346\250\241\345\274\217.md"
rename to "Java-Base/06.\345\215\225\344\276\213\346\250\241\345\274\217.md"
index b4dea4a..b1a2a1e 100644
--- "a/06.\345\215\225\344\276\213\346\250\241\345\274\217.md"
+++ "b/Java-Base/06.\345\215\225\344\276\213\346\250\241\345\274\217.md"
@@ -4,7 +4,7 @@
在我们需要在系统中只能拥有一个实例时,这时候我们就需要单例模式,例如:数据库连接池、缓存池等。
-##6.1 最简单的单例模式
+## 6.1最简单的单例模式
在读书的时候,或许我们都写过这么一个单例的实现:
@@ -24,7 +24,7 @@ public class DataSource {
类提供了一个getInstance方法,该方法返回一个在类加载期就初始化的DataSource实例化对象,从而保证了DataSource实例的唯一性。
-##6.2 延迟创建
+## 6.2延迟创建
我们知道static标识的属性会在类初始时就进行初始化。处于性能的考虑,我们可能会希望该单例的实例化对象,在第一次使用的时候再进行初始化:
@@ -48,7 +48,7 @@ public class DataSource {
我们将DataSource的初始化迁移到getInstance方法里,系统会第一次调用getInstance方法的时候初始化DataSource对象。
-##6.3 线程安全
+## 6.3线程安全
上面的例子中,细心的人或许会发现:在多线程的情况下,如果第一次有N个线程同时进入getInstance方法,则会产生线程安全问题,
会多次创建DataSource对象,甚至其他问题。
@@ -71,7 +71,7 @@ public class DataSource {
}
```
-##6.3 线程安全优化
+## 6.3线程安全优化
也许有人有提出问题了,在高并发的情况下,使用synchronized对整个方法进行同步会影响性能(大多数情况下没必要计较)。
@@ -79,7 +79,8 @@ public class DataSource {
```java
public class DataSource {
- private static DataSource dataSource = null;
+ // volatile关键字必不可少
+ private volatile static DataSource dataSource = null;
private DataSource() {}
@@ -99,9 +100,22 @@ public class DataSource {
在这个实现里使用了 **double check** (两次判断dataSource == null)。当多个线程同时进入第一个if判断时,double check是很有必要滴!
-##6.4 静态内部类
+## 6.4静态内部类
+
+```
+public class Singleton{
+ public static class SingletonHolder {
+ private static final Singleton INSTANCE = new Singleton();
+ }
+ private Singleton(){}
+ public static Singleton getInstance(){
+ return SingletonHolder.INSTANCE;
+ }
+}
+```
+
-##6.5 序列化
+## 6.5 序列化
## 参考资料
diff --git "a/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md" "b/Java-Base/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md"
similarity index 79%
rename from "07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md"
rename to "Java-Base/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md"
index f5757b2..900f70a 100644
--- "a/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md"
+++ "b/Java-Base/07.\344\275\277\347\224\250socket\345\217\221\351\200\201HTTP POST\350\257\267\346\261\202.md"
@@ -54,16 +54,3 @@ socket.close();
```
一个HTTP POST的登陆请求就完成了。Java代码不难实现,唯一需要注意的HTTP报文的格式了。
-
-##Connection: close
-
- 细心的人,可能会发现上面的请求,控制台虽然正确地打印了服务器响应的登陆报文,但是控制台的线程是还没有断开的。
-即使客户端使用了socket.close()。
-
- 这里涉及TCP协议以及HTTP 1.1的长连接,先不详细解释。这里我们简单地使用一个Header就可以断开请求了。
-
-```java
-bw.write("Connection: close\r\n");
-```
-
- 把上面这一段代码复制到前面一段代码的Header部分即可。perfect!
diff --git "a/08.\350\264\253\350\241\200\346\250\241\345\236\213\344\270\216\345\205\205\350\241\200\346\250\241\345\236\213.md" "b/Java-Base/08.\350\264\253\350\241\200\346\250\241\345\236\213\344\270\216\345\205\205\350\241\200\346\250\241\345\236\213.md"
similarity index 100%
rename from "08.\350\264\253\350\241\200\346\250\241\345\236\213\344\270\216\345\205\205\350\241\200\346\250\241\345\236\213.md"
rename to "Java-Base/08.\350\264\253\350\241\200\346\250\241\345\236\213\344\270\216\345\205\205\350\241\200\346\250\241\345\236\213.md"
diff --git "a/09.\350\256\250\345\216\214\347\232\204setter\345\222\214getter.md" "b/Java-Base/09.\350\256\250\345\216\214\347\232\204setter\345\222\214getter.md"
similarity index 100%
rename from "09.\350\256\250\345\216\214\347\232\204setter\345\222\214getter.md"
rename to "Java-Base/09.\350\256\250\345\216\214\347\232\204setter\345\222\214getter.md"
diff --git "a/10.Java8\344\271\213Lambda\350\241\250\350\276\276\345\274\217.md" "b/Java-Base/10.Java8\344\271\213Lambda\350\241\250\350\276\276\345\274\217.md"
similarity index 100%
rename from "10.Java8\344\271\213Lambda\350\241\250\350\276\276\345\274\217.md"
rename to "Java-Base/10.Java8\344\271\213Lambda\350\241\250\350\276\276\345\274\217.md"
diff --git "a/11.\344\272\213\345\212\241\347\232\204\344\274\240\346\222\255\346\234\272\345\210\266\344\270\216\351\232\224\347\246\273\347\272\247\345\210\253.md" "b/Java-Base/11.\344\272\213\345\212\241\347\232\204\344\274\240\346\222\255\346\234\272\345\210\266\344\270\216\351\232\224\347\246\273\347\272\247\345\210\253.md"
similarity index 97%
rename from "11.\344\272\213\345\212\241\347\232\204\344\274\240\346\222\255\346\234\272\345\210\266\344\270\216\351\232\224\347\246\273\347\272\247\345\210\253.md"
rename to "Java-Base/11.\344\272\213\345\212\241\347\232\204\344\274\240\346\222\255\346\234\272\345\210\266\344\270\216\351\232\224\347\246\273\347\272\247\345\210\253.md"
index 06cbb72..241777d 100644
--- "a/11.\344\272\213\345\212\241\347\232\204\344\274\240\346\222\255\346\234\272\345\210\266\344\270\216\351\232\224\347\246\273\347\272\247\345\210\253.md"
+++ "b/Java-Base/11.\344\272\213\345\212\241\347\232\204\344\274\240\346\222\255\346\234\272\345\210\266\344\270\216\351\232\224\347\246\273\347\272\247\345\210\253.md"
@@ -36,6 +36,14 @@ __可序列化(Serializable)__ |最高的隔离级别,保证所有的事
EJB和Spring的这些事务隔离设置依赖于底层数据库。也就是说,虽然编程框架支持上述种种隔离级别设定,但需要底层数据库也要支持这些级别设定,设定才会生效。如果数据库不支持某一个设定级别,而应用框架这样设置了,数据库将会采用缺省的隔离级别。
+##11.3 脏读、幻读、不可重复读等定义
+
+### 脏读
+
+### 幻读
+
+### 不可重复读
+
## 参考资料
* http://docs.oracle.com/cd/E19226-01/820-7627/6nisfjnao/index.html
diff --git a/12.Spring MVC WebApplicationContext.md b/Java-Base/12.Spring MVC WebApplicationContext.md
similarity index 100%
rename from 12.Spring MVC WebApplicationContext.md
rename to Java-Base/12.Spring MVC WebApplicationContext.md
diff --git "a/13.\344\270\215\350\246\201\345\234\250HttpSession\345\214\205\344\277\235\345\255\230\351\235\236\345\272\217\345\210\227\345\214\226\345\257\271\350\261\241.md" "b/Java-Base/13.\344\270\215\350\246\201\345\234\250HttpSession\345\214\205\344\277\235\345\255\230\351\235\236\345\272\217\345\210\227\345\214\226\345\257\271\350\261\241.md"
similarity index 100%
rename from "13.\344\270\215\350\246\201\345\234\250HttpSession\345\214\205\344\277\235\345\255\230\351\235\236\345\272\217\345\210\227\345\214\226\345\257\271\350\261\241.md"
rename to "Java-Base/13.\344\270\215\350\246\201\345\234\250HttpSession\345\214\205\344\277\235\345\255\230\351\235\236\345\272\217\345\210\227\345\214\226\345\257\271\350\261\241.md"
diff --git "a/14.SimpleDateFormat\351\235\236\347\272\277\347\250\213\345\256\211\345\205\250.md" "b/Java-Base/14.SimpleDateFormat\351\235\236\347\272\277\347\250\213\345\256\211\345\205\250.md"
similarity index 100%
rename from "14.SimpleDateFormat\351\235\236\347\272\277\347\250\213\345\256\211\345\205\250.md"
rename to "Java-Base/14.SimpleDateFormat\351\235\236\347\272\277\347\250\213\345\256\211\345\205\250.md"
diff --git "a/15.HTTP\344\271\213\346\214\201\344\271\205\350\277\236\346\216\245.md" "b/Java-Base/15.HTTP\344\271\213\346\214\201\344\271\205\350\277\236\346\216\245.md"
similarity index 100%
rename from "15.HTTP\344\271\213\346\214\201\344\271\205\350\277\236\346\216\245.md"
rename to "Java-Base/15.HTTP\344\271\213\346\214\201\344\271\205\350\277\236\346\216\245.md"
diff --git "a/16.\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205\346\250\241\345\274\217.md" "b/Java-Base/16.\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205\346\250\241\345\274\217.md"
similarity index 100%
rename from "16.\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205\346\250\241\345\274\217.md"
rename to "Java-Base/16.\347\224\237\344\272\247\350\200\205\346\266\210\350\264\271\350\200\205\346\250\241\345\274\217.md"
diff --git "a/17.\350\277\252\347\261\263\347\211\271\346\263\225\345\210\231\357\274\210\345\276\227\345\242\250\345\277\222\350\200\263\345\256\232\345\276\213\357\274\211.md" "b/Java-Base/17.\350\277\252\347\261\263\347\211\271\346\263\225\345\210\231\357\274\210\345\276\227\345\242\250\345\277\222\350\200\263\345\256\232\345\276\213\357\274\211.md"
similarity index 100%
rename from "17.\350\277\252\347\261\263\347\211\271\346\263\225\345\210\231\357\274\210\345\276\227\345\242\250\345\277\222\350\200\263\345\256\232\345\276\213\357\274\211.md"
rename to "Java-Base/17.\350\277\252\347\261\263\347\211\271\346\263\225\345\210\231\357\274\210\345\276\227\345\242\250\345\277\222\350\200\263\345\256\232\345\276\213\357\274\211.md"
diff --git "a/18.REST\346\236\266\346\236\204\351\243\216\346\240\274.md" "b/Java-Base/18.REST\346\236\266\346\236\204\351\243\216\346\240\274.md"
similarity index 92%
rename from "18.REST\346\236\266\346\236\204\351\243\216\346\240\274.md"
rename to "Java-Base/18.REST\346\236\266\346\236\204\351\243\216\346\240\274.md"
index 2b52ce0..23440db 100644
--- "a/18.REST\346\236\266\346\236\204\351\243\216\346\240\274.md"
+++ "b/Java-Base/18.REST\346\236\266\346\236\204\351\243\216\346\240\274.md"
@@ -1,8 +1,8 @@
-#18.REST架构风格
+# 18.REST架构风格
从毕业设计误打误撞选了《RESTful架构webservice应用研究》这个课题,到现在也三年有多了。但直至目前,个人对REST的理解都还欠缺火候。随着知识的积累与深入,对同一个事务的认知都在变化。且让我把当前的想法记录下来,秋后才有账可算。:)
-##18.1 什么是REST
+## 18.1 什么是REST
__REST__,英文名叫__Representational State Transfer__,翻译为中文为__表述性状态转移__。okay,我们不要纠结与名词的含义,简而言之:REST就是利用__用户友好的URL风格__、利用现存的__HTTP动词__以及__HTTP相关的特性__来规范WebService接口。实际上它是一种交互数据的协议规范。
@@ -10,7 +10,7 @@ __REST__,英文名叫__Representational State Transfer__,翻译为中文为_
当然,我并不认为REST是一种架构,我更认同它是一种__设计风格或理念__。当大家都遵循这样的设计理念后,那么拓展、跨平台、维护也就水到渠成了(API文档都不用写了,呵呵)。
-##18.2 REST特性
+## 18.2 REST特性
REST是建立在HTTP之上的,所以REST的很多特征都与HTTP息息相关。
@@ -21,7 +21,7 @@ REST是建立在HTTP之上的,所以REST的很多特征都与HTTP息息相关
* 统一接口(Uniform Interface)
* 超文本驱动(Hypertext Driven)
-###18.2.1 面向资源(Resource Oriented)
+### 18.2.1 面向资源(Resource Oriented)
面向资源是REST最明显的特征,__每个URI都唯一指向一个资源,同时一个资源可以由多个URI表示__。
@@ -46,7 +46,7 @@ http://www.example.com/queryPage?bookId=2&pageNo=10086
* 容易理解
* 易于拓展
-###18.2.2 可寻址(Addressability)
+### 18.2.2 可寻址(Addressability)
每一个资源都有一个唯一的URI标识。我们可以根据URI找到相应的资源。甚至,我们可以根据这些URI类比其他资源的地址。
@@ -54,15 +54,15 @@ http://www.example.com/queryPage?bookId=2&pageNo=10086
而实际上也正如我所想。(这是一个软件类的电子书网站,很强大,请笑纳: ))
-###18.2.3 连通性(Connectedness)
+### 18.2.3 连通性(Connectedness)
REST指出,资源不应该是孤立的,应该使用超链接将资源关联起来。这个概念很有意思,而实际上会被很多开发人员忽略。后面我们再来详细展开讨论。
-###18.2.4 无状态(Statelessness)
+### 18.2.4 无状态(Statelessness)
无状态性意味着每个HTTP请求都是彼此孤立,互不干扰的。REST的无状态性,让横向实现分布性系统提供了方便。URI在前面我们已经提过,这里来说一下HTTP方法。
-###18.2.5 统一接口(Uniform Interface)
+### 18.2.5 统一接口(Uniform Interface)
虽然浏览器只支持HTTP的GET和POST方法,我们也知道GET方法用来获取资源,而POST方法通常用来添加、修改和删除资源的。但是实际上HTTP为了我们提供了更有语义的方法。
@@ -78,18 +78,18 @@ HTTP还提供了其他的HTTP方法,这里不再累赘,只叙述CRUD。
可以看到REST是使用现成的HTTP方法来更新资源的状态(这就是__状态转移__之意),增删改查分别对应POST、DELETE、PUT和GET方法。相比我们以前使用的动词,如_delBook_、_deleteBook_、_removeBook_、_book?operation=delete_等等。REST实在太高上大了。
-####18.2.5.1 使用HTTP动词的优势
+#### 18.2.5.1 使用HTTP动词的优势
GET、POST、PUT、DELETE,幂等安全等特性。
客户端与服务器之间通过特定的URI和HTTP方法进行交互。
-###18.2.6 超文本驱动(Hypertext Driven)
+### 18.2.6 超文本驱动(Hypertext Driven)
-##18.3 URL设计(事实上的妥协)
+## 18.3 URL设计(事实上的妥协)
-##18.4 REST优势
+## 18.4 REST优势
-##18.5 参考资料
+## 18.5 参考资料
* http://www.infoq.com/cn/articles/understanding-restful-style
* http://www.ruanyifeng.com/blog/2011/09/restful.html
diff --git "a/19.Java\345\257\271\350\261\241\345\272\217\345\210\227\345\214\226\344\270\216RMI.md" "b/Java-Base/19.Java\345\257\271\350\261\241\345\272\217\345\210\227\345\214\226\344\270\216RMI.md"
similarity index 100%
rename from "19.Java\345\257\271\350\261\241\345\272\217\345\210\227\345\214\226\344\270\216RMI.md"
rename to "Java-Base/19.Java\345\257\271\350\261\241\345\272\217\345\210\227\345\214\226\344\270\216RMI.md"
diff --git "a/20.Java7\344\271\213try-with-resources.md" "b/Java-Base/20.Java7\344\271\213try-with-resources.md"
similarity index 100%
rename from "20.Java7\344\271\213try-with-resources.md"
rename to "Java-Base/20.Java7\344\271\213try-with-resources.md"
diff --git "a/21.\345\274\202\345\270\270\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/Java-Base/21.\345\274\202\345\270\270\346\234\200\344\275\263\345\256\236\350\267\265.md"
similarity index 100%
rename from "21.\345\274\202\345\270\270\346\234\200\344\275\263\345\256\236\350\267\265.md"
rename to "Java-Base/21.\345\274\202\345\270\270\346\234\200\344\275\263\345\256\236\350\267\265.md"
diff --git "a/22.\347\274\226\347\240\201\350\247\243\347\240\201.md" "b/Java-Base/22.\347\274\226\347\240\201\350\247\243\347\240\201.md"
similarity index 97%
rename from "22.\347\274\226\347\240\201\350\247\243\347\240\201.md"
rename to "Java-Base/22.\347\274\226\347\240\201\350\247\243\347\240\201.md"
index 689d289..5281478 100644
--- "a/22.\347\274\226\347\240\201\350\247\243\347\240\201.md"
+++ "b/Java-Base/22.\347\274\226\347\240\201\350\247\243\347\240\201.md"
@@ -9,7 +9,7 @@
```Java
System.out.println("中国");
```
-1. 无论文件以任何编码格式载入到JVM中,"中国"二字都会以unicode码的形式存在JVM中(\u4e2d\u56fd);
+1. 无论文本以任何编码格式载入到JVM中,"中国"二字都会以unicode码的形式存在JVM中(\u4e2d\u56fd);
2. 假如IDE控制台的编码为UTF-8,当对"中国"二字进行控制台输出时,系统会将unicode码转为具体的UTF-8编码格式。(\u4e2d\u56fd -> e4b8ade59bbd)
```
@@ -77,4 +77,4 @@ public void gbk_unicode_utf8() throws DecoderException,
实际上,这里的unicode编码对应的是unicode的`UTF-16`编码。以16位定长的二进制表示一个unicode码。
-## 参考资料
\ No newline at end of file
+## 参考资料
diff --git "a/23.\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213\344\270\216\350\277\233\345\210\266\350\275\254\346\215\242.md" "b/Java-Base/23.\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213\344\270\216\350\277\233\345\210\266\350\275\254\346\215\242.md"
similarity index 100%
rename from "23.\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213\344\270\216\350\277\233\345\210\266\350\275\254\346\215\242.md"
rename to "Java-Base/23.\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213\344\270\216\350\277\233\345\210\266\350\275\254\346\215\242.md"
diff --git "a/24.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213Base64.md" "b/Java-Base/24.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213Base64.md"
similarity index 100%
rename from "24.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213Base64.md"
rename to "Java-Base/24.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213Base64.md"
diff --git "a/25.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213JCA.md" "b/Java-Base/25.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213JCA.md"
similarity index 100%
rename from "25.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213JCA.md"
rename to "Java-Base/25.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213JCA.md"
diff --git "a/26.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\237\272\346\234\254\346\265\201\347\250\213.md" "b/Java-Base/26.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\237\272\346\234\254\346\265\201\347\250\213.md"
similarity index 100%
rename from "26.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\237\272\346\234\254\346\265\201\347\250\213.md"
rename to "Java-Base/26.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\237\272\346\234\254\346\265\201\347\250\213.md"
diff --git "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" "b/Java-Base/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
similarity index 93%
rename from "27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
rename to "Java-Base/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
index 567e86e..caaaded 100644
--- "a/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
+++ "b/Java-Base/27.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
@@ -6,7 +6,7 @@
**对称加密算法的安全基于密钥的保密,所以密钥的安全与否决定了加密信息的安全!**
-虽然说**对称加密算法**不适用于安全要求较高的场合,对是对于一般应用来说,这已经足够了。与此同时,对称加密的速度远由于非对称加密,所以还是很多场景适用对称加密。
+虽然说**对称加密算法**不适用于安全要求较高的场合,对是对于一般应用来说,这已经足够了。与此同时,对称加密的速度远低于非对称加密,所以还是很多场景适用对称加密。
对称加密的速度比公钥加密快很多,在很多场合都需要对称加密。
@@ -36,7 +36,7 @@ IDEA(International Data Encryption Algorithm,国际数据加密标准)是
在加密之前,我们先要生成加密算法对应的密钥。我们之前所说的密钥长度都是基于位元为单位的。例如128位的密钥,则该密钥占用128个位元,以一个字节八位元,128密钥占用128 / 8 = 16个字节。使用byte[]数组存放,则byte[]的长度为16。
-为了方便存储和传输,我们通常使用Base64对密钥的字节组数进行编码。而ASCII编码有很多字符是不可打印的,所以不建议使用ASCII。当然你可以使用ASCII,当时很容易在存储或传输过程中丢失字节(在计算器中存储和传输没有问题,但是使用纸质就歇菜了)。当然你可以使用其他方式和编码,一般情况下都是使用Base64,约定俗成。
+为了方便存储和传输,我们通常使用Base64对密钥的字节组数进行编码。而ASCII编码有很多字符是不可打印的,所以不建议使用ASCII。当然你可以使用ASCII,但是很容易在存储或传输过程中丢失字节(在计算器中存储和传输没有问题,但是使用纸质就歇菜了)。当然你可以使用其他方式和编码,一般情况下都是使用Base64,约定俗成。
Java中使用`KeyGenerator`类来生成密钥。如下:
@@ -58,7 +58,7 @@ public void generateKey() throws NoSuchAlgorithmException {
Cipher是JCA中用于加密解密的类,它同时负责数据的加密与解密。在初始化时,需要为Cipher指定是加密或是解密模式。
-加密与加密的过程直接操作的是数据的字节数组,由于字符在JVM中是以unicode形式存在的,字符串的不同编码的字节数组序列是一样的,例如UTF-8和GBK的字节序列就不一样。所以在加密之前或加密之后需要将字符编码进行编码与解码。当然,这不是必须的,你可以使用系统默认的ASCII字符编码,只要统一即可。
+加密与加密的过程直接操作的是数据的字节数组,由于字符在JVM中是以unicode形式存在的,字符串的不同编码的字节数组序列是不一样的,例如UTF-8和GBK的字节序列就不一样。所以在加密之前或加密之后需要将字符编码进行编码与解码。当然,这不是必须的,你可以使用系统默认的ASCII字符编码,只要统一即可。
数据加密后是以字节数组存在的,跟密钥类似,为了方面存储和传输,我们将加密后的结果转为Base64表示形式。
@@ -111,4 +111,4 @@ public void decrypt() throws InvalidKeyException, NoSuchAlgorithmException, NoSu
* 密码学:http://zh.wikipedia.org/wiki/%E5%AF%86%E7%A2%BC%E5%AD%B8
* 经典密码:http://zh.wikipedia.org/wiki/%E7%B6%93%E5%85%B8%E5%AF%86%E7%A2%BC
* DES:http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%99%E6%BA%96
-* 3DES:http://zh.wikipedia.org/wiki/3DES
\ No newline at end of file
+* 3DES:http://zh.wikipedia.org/wiki/3DES
diff --git "a/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md" "b/Java-Base/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
similarity index 92%
rename from "28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
rename to "Java-Base/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
index 025fe05..d55dda2 100644
--- "a/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
+++ "b/Java-Base/28.Java\345\212\240\345\257\206\350\247\243\345\257\206\344\271\213\351\235\236\345\257\271\347\247\260\345\212\240\345\257\206\347\256\227\346\263\225.md"
@@ -1,4 +1,4 @@
-##28.1 非对称加密算法
+## 28.1 非对称加密算法
**非对称加密算法**与**对称加密算法**的区别在于:对称加密算法加密与解密使用的密钥是相同的,而非对称加密算法的加密与解密使用的密钥是不相同的,在这两个密钥中,一个公开,成为**公钥**,一个保密,成为**私钥**。
@@ -6,18 +6,18 @@

-##28.2 常用非对称加密算法
+## 28.2 常用非对称加密算法
-###28.2.1 典型非对称加密算法:RSA
+### 28.2.1 典型非对称加密算法:RSA
-RSA算法密钥的长度为512位至65535位之间,且必须是64的倍数。Java6默认的RSA算法的密钥长度是1014位。
+RSA算法密钥的长度为512位至65535位之间,且必须是64的倍数。Java6默认的RSA算法的密钥长度是1024位。
-###28.2.2 常用非对称加密算法:EIGamal
+### 28.2.2 常用非对称加密算法:EIGamal
EIGamal算法密钥的长度为160位至16384位之间,且必须为8的倍数。Java没有默认对EIGamal算法的实现。如果需要使用GIGmal算法,可以使用Bouncy Castle的实现。
-##28.3 代码示例
-###28.3.1 密钥生成
+## 28.3 代码示例
+### 28.3.1 密钥生成
```Java
@Test
@@ -33,7 +33,7 @@ public void t4_keyPair() throws NoSuchAlgorithmException {
}
```
-###28.3.2 加密
+### 28.3.2 加密
```Java
@Test
@@ -53,7 +53,7 @@ public void t5_encrypt() throws NoSuchAlgorithmException, NoSuchPaddingException
}
```
-###28.3.3 解密
+### 28.3.3 解密
```Java
@Test
@@ -74,4 +74,4 @@ public void t6_decrypt() throws NoSuchAlgorithmException, InvalidKeySpecExceptio
}
```
-##28.4 参考资料
\ No newline at end of file
+## 28.4 参考资料
diff --git "a/29.Java8\344\271\213Stream.md" "b/Java-Base/29.Java8\344\271\213Stream.md"
similarity index 100%
rename from "29.Java8\344\271\213Stream.md"
rename to "Java-Base/29.Java8\344\271\213Stream.md"
diff --git a/Java-Base/30.Java Runtime Data Areas.md b/Java-Base/30.Java Runtime Data Areas.md
new file mode 100644
index 0000000..ce8f7ab
--- /dev/null
+++ b/Java-Base/30.Java Runtime Data Areas.md
@@ -0,0 +1,76 @@
+# 30.Java Runtime Data Areas.md
+
+
+
+## 30.1 运行时数据区(Runtime Data Areas)
+
+Java虚拟机为程序的运行提供了各种不同的数据区,部分数据区与JVM的生命周期一致(随JVM启动而分配,JVM退出而释放),而另一部分则跟线程绑定,随着线程的启动和退出进行分配和释放。
+
+### 30.1.1 程序计数器(Program Counter Rigister)
+
+Java虚拟机支持多个线程在同一时刻运行。每一个Java虚拟机线程拥有自己的程序计数器。在任意时刻,任意线程都处于一个方法中(称为当前方法(current method)),如果是该方法是**非本地方法(not native method)**,则该程序计数器记录着**Java虚拟机执行的当前指令的地址**。而如果该方法为**本地方法(native method)**,则该程序计数器为undefined。
+
+### 30.1.2 Java虚拟机栈(Java Virtual Machine Stacks)
+
+每个Java虚拟机线程都拥有各自的**Java虚拟机栈**,并与线程同时被创建。Java虚拟机栈用于存储**帧(frames)**。Java虚拟机栈跟传统语言的栈相似:存储局部变量、结果,同时参与方法的调用和返回。
+Because the Java Virtual Machine stack is never manipulated directly except to push and pop frames, frames may be heap allocated. The memory for a Java Virtual Machine stack does not need to be contiguous.
+
+在第一版的Java虚拟机规范中,**Java虚拟机栈**做为**Java栈** 为人们所熟知。这个规范允许Java虚拟机栈是固定的大小或根据需要通过计算来动态地扩展和收缩。如果Java虚拟机堆的大小是固定的,(If the Java Virtual Machine stacks are of a fixed size, the size of each Java Virtual Machine stack may be chosen independently when that stack is created.)
+
+Java虚拟的实现可以提供让程序员或用户来控制Java虚拟栈初始大小,并且,可以让Java虚拟机栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。
+
+以下异常情况与Java虚拟栈相关:
+* 如果线程需要的Java虚拟机栈大小超过限额,则抛出**StackOverflowError**。
+* 如果Java虚拟机栈被设置为可动态拓展,当拓展时由于受限于物理内存的限制而无法实现拓展时,则抛出**OutOfMemoryError**。
+
+### 30.1.2 堆(Heap)
+
+Java虚拟机具有一个由所有Java虚拟机线程共享的一个堆。堆是**分配和储存所有的实例对象和数组的运行时数据区域**。
+
+堆是在Java虚拟机启动时被创建的。堆的对象储存空间通过**自动存储管理系统(garbage collector简称gc)**进行回收,并不能像c/c++语言那样显示地进行释放。Java虚拟机没有指定限制使用的gc,这个可以由程序员和用户根据自己的情况来进行选择。堆可以是固定大小的,也可以通过计算来动态地拓展和收缩。同时,堆的内容空间地址不需要是连续的。
+
+Java虚拟机的实现可以提供让程序员和用户控制初始的堆大小,并且,可以让栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。
+
+以下异常情况与堆相关:
+
+* 当堆需要拓展的内存大小大于自动存储管理系统所能提供的内存大小时,抛出**OutOfMemoryError**。
+
+### 方法区(Method Area)
+
+Java虚拟机拥有一个由所有Java虚拟机线程共享的方法区。方法区类似于传统语言的用于存储编译代码的内存区域。(The method area is analogous to the storage area for compiled code of a conventional language or analogous to the "text" segment in an operating system process. )它用于存储每个类的类结构,例如**运行时常量池(Runtime Constant Pool)**,字段和方法数据,以及方法和构造方法的代码,包括类、实例和接口在初始化时使用的特殊方法。
+
+方法区也是在Java虚拟机启动时创建的。虽然方法区作为堆的一部分,但简单的Java虚拟机的实现可能不会对这部分区域进行gc操作和内存紧凑操作。Java虚拟机规范并不强制规范方法区的存储位置和管理已编译代码的策略。方法区可以是固定大小,也可以根据实际需要对方法区的大小进行拓展和紧凑操作。同时,方法区的内存不需要是连续的。
+
+Java虚拟机的实现应该提供让程序员和用户控制初始的方法区内存大小,并且,可以让方法区在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。
+
+以下异常情况与方法区相关:
+* 如果方法区不能提供满足需要分配的内存时,Java虚拟机抛出**OutOfMemoryError**。
+
+###运行时常量池(Runtime Constant Pool)
+**运行时常量池**是一个类或接口的class文件的中**constant_pool**表的运行时表示。它包含多种常量:编译期的数值型字面量,运行时的方法和字段的引用。运行时常量池提供类似于一个传统的编程语言中的符号表的功能,但它比典型的符号表包含了更广泛的范围中的数据。
+
+每个运行时常量池都是在Java虚拟机的方法区中进行分配的(也就是说运行时常量池是方法区中的一部分)。类/接口的运行时常量池在类/接口创建时被Java虚拟机构造。
+
+以下异常情况与类/接口的运行时常量池的创建相关:
+
+当创建一个类或接口时,如果运行时常量池的创建需要更多的内存,而方法区没有足够的内存可以提供时,Java虚拟机抛出**OutOfMemoryError**。
+
+### 本地方法栈(Native Method Stacks)
+Java虚拟机应该使用传统的栈(通俗地将:C栈)来对**本地方法**(非Java实现的方法)进行支持。Native method stacks may also be used by the implementation of an interpreter for the Java Virtual Machine's instruction set in a language such as C. Java Virtual Machine implementations that cannot load native methods and that do not themselves rely on conventional stacks need not supply native method stacks. If supplied, native method stacks are typically allocated per thread when each thread is created.
+
+This specification permits native method stacks either to be of a fixed size or to dynamically expand and contract as required by the computation. If the native method stacks are of a fixed size, the size of each native method stack may be chosen independently when that stack is created.
+
+
+Java虚拟机的实现应当提供这样的功能:程序员和用户可以控制本地方法栈的初始化大小,并且,可以让本地方法栈在最小值和最大值的限制范围内根据实际需要动态地拓展或收缩。
+
+以下异常情况与本地方法栈相关:
+* 如果本地方法栈需要更多的内存,但无法进行分配时,Java虚拟机抛出**StackOverflowError**。
+
+
+If native method stacks can be dynamically expanded and native method stack expansion is attempted but insufficient memory can be made available, or if insufficient memory can be made available to create the initial native method stack for a new thread, the Java Virtual Machine throws an OutOfMemoryError.
+
+### 拓展阅读
+
+* 翻译自:http://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5
+* understanding-jvm-internals: http://www.cubrid.org/blog/dev-platform/understanding-jvm-internals/
+* understanding-java-garbage-collection: http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/
diff --git a/Java-Base/31.Understanding Java Garbage Collection.md b/Java-Base/31.Understanding Java Garbage Collection.md
new file mode 100644
index 0000000..51beb95
--- /dev/null
+++ b/Java-Base/31.Understanding Java Garbage Collection.md
@@ -0,0 +1,120 @@
+#31.Understanding Java Garbage Collection
+
+理解GC(Garbage Collection)的工作原理对Java编程有什么益处呢?满足软件工程师的求知欲或许是一个不错的原因,但与此同时,也可以帮助你编写更加优秀的Java应用程序。
+
+这是我的个人的主观意见,但是我相信那些深谙GC的人往往更容易成为一个优秀的Java工程师。如果你对GC感兴趣,那么意味着你有不错的开发经验。如果你有过仔细选择合适的GC算法经验,这意味着你完全了解你开发应用程序的功能特点。当然,这也许只是优秀开发者的普遍衡量标准,然而我要说的是,要想成为一名优秀的开发者,理解GC是一门必修的课程。
+
+这篇文章的主要目的是以尽量简洁的方式向你讲解GC。我希望这篇文章能切切实实地对你有所帮助。回到正题,在GC中有个词汇**stop-the-word**,stop-the-word这个过程总会发生,无论你选择何种GC算法。stop-the-world意味着在**执行GC的过程中,JVM会中断所有的应用程序线程**( 除了GC需要的线程外)。被中断的线程会在GC完成后恢复。我们所关注的**GC调优就在于如何减少stop-the-world的运行时间**。
+
+## 垃圾收集器(Generational Garbage Collection)
+
+Java代码并不能显式地对内存进行分配和移除。有些人会将对象设置为null或者调用System.gc()方法来**显式**地移除内存空间。将对象设置为null没有大不了的,当调用System.gc()方法却会大大地响应系统的性能(我们并不需要这样做)。
+
+在Java中,开发者并不需要显式地在代码中释放内存,垃圾收集器会帮助我们找到不需要的对象并讲它们移除。垃圾收集器只所以被引入使用是基于以下两个假定前提:
+
+1. 大多数对象很快成为不可达状态;
+2. **老对象引用新对象**这种情况总是控制在很小的数量内。
+
+这两个假定前提被成为**弱世代假说(Weak generational hypothesis)**,基于这个假设,在HotSpot虚拟机中,内存(切确地说是Java Heap)被分为两种:**新生代(Young Generation)**与**老年代(Old Generation)**。
+
+新生代:绝大部分的新创建的对象都被分配到这里。由于大部分的对象很快会成为不可达状态,很多新创建的对象都分配到新生代,然后很快从这个区域被释放。对象从新生代被释放,我们称这个过程为**Minor GC**。
+
+老年代:当在新生代的对象没有成为不可达状态,并且从新生代存活下来后,我们会将这些对象复制到老年代。老年代的储存空间会比新生代的要大,所以在老年代发生GC的频率要远远低于在新生代的GC频率。对象从老年代被释放,我们称这个过程为**major GC**或**full GC**。
+
+我们看下以下两个图表:
+
+
+
+以上图中**永久代(Permanent Generation)**被称为**方法区**,它用于存储class文件和运行时常量池。所以,这里的存储空间并不用于“收留”从老年代存活下来的对象。当GC可能会在这个区域发生,我们也把在这个区域发生的GC算作full GC。
+
+有些人会有疑问:当老年代的对象需要引用新生代的对象,这时候会发生什么情况?
+
+为了处理这些情况,在老年代中会有个叫做**卡表(card table)**的东西,它是一个512字节的数据块。在老年代的对象需要引用新生代的对象时,会被记录到这里。然后,当新生代的GC执行时,这个**card table**会被检查以确定对象是否应该被GC处理,这样做可以防止对老年代的所有对象进行遍历。这个卡表使用一个被称为**写屏障**的装置进行管理,它可以让minor GC的性能更加高效,虽然它本身也需要一定的开销,但是整体的开销却是减少的。
+
+
+
+## 新生代(Composition of the Young Generation)
+
+为了深入理解GC,我们来看一下新生代。新生代被划分为3个区域空间:
+
+* 一个伊甸园(One Eden Space)
+* 两个幸存区 (Two Survivor Spaces)
+
+这三个区域空间中,有两个是幸存区(Survivor Spaces)。每个区域空间的执行过程如下:
+
+1. 绝大多数新创建的对象都首先被分配到伊甸园(Eden Space)。
+2. 当伊甸园的GC执行以后,存活下来的对象会被移动到其中一个幸存区(这个幸存区存放着之前存活下来的对象)。
+3. 一旦幸存区满了以后,该幸存区存活下来的对象会移动到另外一个幸存区,然后该幸存区会重置为空状态。
+4. 在多次幸存区的GC执行后而存活下来的对象会被移动到老年代。
+
+在这个过程中,其中一个幸存区必须要保持为空状态。如果两个幸存区都是空状态或者都同时存在数据,你的系统一定出现了什么错误。
+
+数据通过minor GC并堆砌进入老年代的过程如下图所示:
+
+
+
+在HotSpot虚拟机中,有两项被用于快速分配内存的技术。一种被成为**bump-the-pointer**,而另一种是所谓的线程局部缓冲器TLABs (Thread-Local Allocation Buffers)。
+
+Bump-the-pointer technique tracks the last object allocated to the Eden space. That object will be located on top of the Eden space. And if there is an object created afterwards, it checks only if the size of the object is suitable for the Eden space. If the said object seems right, it will be placed in the Eden space, and the new object goes on top. So, when new objects are created, only the lastly added object needs to be checked, which allows much faster memory allocations. However, it is a different story if we consider a multithreaded environment. To save objects used by multiple threads in the Eden space for Thread-Safe, an inevitable lock will occur and the performance will drop due to the lock-contention. TLABs is the solution to this problem in HotSpot VM. This allows each thread to have a small portion of its Eden space that corresponds to its own share. As each thread can only access to their own TLAB, even the bump-the-pointer technique will allow memory allocations without a lock.
+
+你并不需要技术以上提到的两种技术。你需要记住的是:当对象创建之后会首先分配到伊甸园空间,然后通过在幸存区的长时间存活被晋升到老年代空间。
+
+##老年代的GC(GC for the Old Generation)
+
+老年代基本在空间被沾满时才执行GC操作。GC的执行过程根据GC的类型不同而有所差异,如果你对不同的GC类型有所了解,则会明白其中的差异所在。
+
+根据JDK7,共有5中GC类型:
+
+* Serial GC
+* Parallel GC
+* Parallel Old GC (Parrallel Compacting GC)
+* Concurrent Mark & Sweep GC (or CMS)
+* Garbage First GC (G1)
+
+其中,串行GC不能使用的操作的服务器上。这种类型的GC创建时有在台式计算机上只有一个CPU核心。使用该系列GC将显著删除应用程序的性能。 使用这种将很明显地降低应用程序的性能。
+
+现在让我们来了解每种GC的类型:
+
+###串行GC( Serial GC (-XX:+UseSerialGC))
+
+(The GC in the young generation uses the type we explained in the previous paragraph. ?)
+在新生代中我们使用一种称为**标记-清除-紧凑(mark-sweep-compact)**的算法。
+
+这种算法的第一步就是对新生代的幸存对象进行标记。然后,它从堆的从前往后逐个清理不需要的对象。最后对幸存的对象进行紧凑,使它们在位于连续的内存空间。这个过程会将堆分为两部分:一部分有数据,一部分没数据。Serial GC适用于小的内存空间和少量的CPU核心的机器。
+
+###并行GC (Parallel GC (-XX:+UseParallelGC))
+
+
+
+ 看上图,你可以清楚看到Serial GC与Parallel之间的差异。Serial GC仅使用一个线程去执行GC过程,而Parallel GC会使用多个线程去执行GC过程,因此,可得到更加优秀的性能。当机器拥有很大的内存和较多的CPU核心时,Paraller GC会表现得非常不错。Parallel GC也被称为**throughput GC**。
+
+###Parallel Old GC
+
+Parallel Old GC从JDK 5 update版本开始得到支持。相比Parallel GC,唯一的区别在于:Parallel Old GC只工作于老年代。它通过三个步骤进行工作:标记-总结-紧凑。The summary step identifies the surviving objects separately for the areas that the GC have previously performed, and thus different from the sweep step of the mark-sweep-compact algorithm. It goes through a little more complicated steps.
+
+###Concurrent Mark & Sweep GC (or CMS)
+
+
+
+ 如你上图所看的,Concurrent Mark-Sweep GC比之前介绍的几种GC都要复杂得多。早期的**初始标记阶**段很简单,它的主要功能是最接近根类加载器的对象进行标记,这个阶段的停顿时间十分短暂。在**并发标记**阶段,对刚刚幸存下来的对象的引用进行跟踪和检查,这个过程中,其他的JVM线程不会被中止(也就是没有stop-the-world)。在**重新标记**阶段,会对**并发标记**阶段新添加或停止的引用进行确认。最后,在**并发清除**阶段,对不可达对象进行清理工作(也就GC动作),这个过程,其他的JVM线程也不会被中止。由于这种GC工作方式,GC的停顿时间非常短暂。CMS GC也被称为**低延迟GC**,这对那些对响应时间有严格要求的应用程序是至关重要的。
+
+虽然这种GC垃圾收集的停顿时间非常短暂,但是他对内存大小和CPU内核数量与性能有着更高的要求。
+虽然这种GC类型具有极其短暂的停顿时间,但它也有以下缺点:
+
+* 对内存和CPU的要求更加高。
+* 不提供默认的内存紧凑步骤
+
+在使用这种GC之前,你需要仔细地review。此外,在内存紧凑阶段,如果存在大量的内存碎片,那么这种GC需要停顿时间可能会比其他的GC类型的要长。你需要仔细检查内存紧凑发生的频率和时间。
+
+###Garbage First GC (G1)
+
+最后,让我们来看下Garbage First GC(G1)
+
+
+
+如果你想要了解G1 GC,首先你要忘记关于新生代和老年代的一切知识点。Java堆(新生代&老年代)被划分为一个个大小固定的区域,对象被分派到这些区域中,如果一个区域被占满,则继续分配另外的区域,同时在后台维护一个优先列表,每次在允许的GC时间内,优先回收占用内存多的对象,这是就G1的来源。
+
+待续...
+
+## 参考文档
+* 翻译自:http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/
diff --git "a/Java-Base/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md" "b/Java-Base/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md"
new file mode 100644
index 0000000..2238327
--- /dev/null
+++ "b/Java-Base/32.\350\277\255\344\273\243\345\231\250\346\250\241\345\274\217.md"
@@ -0,0 +1,69 @@
+# 32.迭代器模式
+
+## 32.1 从Iterable接口说起
+
+ 在Java中的集合类接口有Set、List、Map、Queue,而这些接口的子类不计其数。以List接口为例,常用的实现类有:ArrayList、LinkedList、Stack、Vector。每个List子类实现的方式各不一样,ArrayList使用数组,LinkedList使用链表,Stack和Vector可以数组,甚至有些其他的集合类使用混合的数据结构。
+
+ 为了对外隐藏集合类的实现方式,保持良好的封装性,必须要统一这些集合类的迭代接口。同时调用者也无效关心集合类的底层实现方式,使用统一的接口即可对集合进行迭代。
+
+ 这不禁让人想到Java的`Iterable`接口,这也是迭代器模式在JDK中的经典实例。
+
+## 32.2 ArrayList实现Iterable接口
+
+Iterable.java 实现:
+```Java
+public interface Iterable {
+ Iterator iterator();
+}
+```
+Iterator.java 实现
+```Java
+public interface Iterator {
+ boolean hasNext();
+ E next();
+}
+```
+ArrayList.java 实现 Iterable接口
+```Java
+ @Override
+ public Iterator iterator() {
+ return new ArrayListIterator();
+ }
+```
+
+ArrayListIterator.java 实现
+```Java
+public class ArrayListIterator {
+ int cursor;
+ int lastRet = -1;
+
+ public boolean hasNext() {
+ return cursor != size;
+ }
+
+ public E next() {
+ int i = cursor;
+ if (i >= size)
+ throw new NoSuchElementException();
+ Object[] elementData = ArrayList.this.elementData;
+ cursor = i + 1;
+ return (E) elementData[lastRet = i];
+ }
+}
+```
+
+为了减少类文件和易于维护,我们通常把ArrayListIterator.java作为ArrayList的内部类,或者在ArrayList的iterator方法中世界采用匿名内部类,这里我们使用的外部类。
+
+## 32.3 迭代器模式
+
+**意图**:使用统一的方式遍历集合的各个元素,而无需暴露集合的内部结构。
+
+**使用场景**:
+
+* 为聚合类统一遍历接口;
+* 需要为聚合类提供多种遍历方式,例如二叉树的前序遍历,中序遍历,后续遍历,层次遍历;
+* 访问聚合对象的内容而无需暴露其内部结构;
+
+**类图**:
+
+
diff --git "a/Java-Base/33.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md" "b/Java-Base/33.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md"
new file mode 100644
index 0000000..fd930a4
--- /dev/null
+++ "b/Java-Base/33.\350\243\205\351\245\260\345\231\250\346\250\241\345\274\2172.md"
@@ -0,0 +1 @@
+# 33.装饰器模式2
diff --git "a/Java-Base/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md" "b/Java-Base/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md"
new file mode 100644
index 0000000..cf15502
--- /dev/null
+++ "b/Java-Base/34.Java\344\270\255\347\232\204\345\274\272\350\275\257\345\274\261\350\231\232\345\274\225\347\224\250\345\217\212\345\205\266\345\272\224\347\224\250.md"
@@ -0,0 +1,50 @@
+# 34.Java中的强软弱虚引用及其应用
+
+## 34.1 强引用(Strong References)
+
+强引用是使用最频繁的引用。例如:
+```Java
+Object obj = new Object();
+```
+如果一个对象有强引用,则垃圾回收器不会回收它。即使JVM内存不足,也是抛出`OutOfMemeoryError`来停止程序,也不会通过回收强引用来释放内存。
+
+##34.2 软引用(Soft Reference)
+
+如果一个对象只有软引用,则在JVM足够时该对象不会被回收,而当JVM不足时就会回收该对象释放内存。
+
+```Java
+SoftReference