list = List.of(1, 2, 3, 4, 5, 6, 7, 8);
+ int count = 0;
+ for (Integer _ : list) {
+ count++;
+ }
+ System.out.println(count);
+ }
+}
diff --git a/core-java-modules/core-java-21/src/main/java/Jep444VirtualThread.java b/core-java-modules/core-java-21/src/main/java/Jep444VirtualThread.java
new file mode 100644
index 0000000..52c565c
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/Jep444VirtualThread.java
@@ -0,0 +1,48 @@
+import java.time.Duration;
+import java.util.concurrent.Executors;
+import java.util.stream.IntStream;
+
+/**
+ * 虚拟线程
+ *
+ * @author https://www.wdbyte.com
+ * @date 2023/10/10
+ */
+public class Jep444VirtualThread {
+ public static void main(String[] args) throws InterruptedException {
+ // 创建并提交执行虚拟线程
+ long start = System.currentTimeMillis();
+ try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
+ IntStream.range(0, 10_000).forEach(i -> {
+ executor.submit(() -> {
+ Thread.sleep(Duration.ofSeconds(1));
+ return i;
+ });
+ });
+ }
+ System.out.println("time:" + (System.currentTimeMillis() - start) + "ms");
+
+
+ // 创建一个虚拟线程指定虚拟线程名称
+ Thread thread1 = Thread.ofVirtual().name("v-thread").unstarted(() -> {
+ String threadName = Thread.currentThread().getName();
+ System.out.println(String.format("[%s] Hello Virtual Thread", threadName));
+ });
+ thread1.start();
+ System.out.println(thread1.isVirtual());
+
+ //创建一个线程,启动为虚拟线程
+ Thread thread2 = new Thread(() -> {
+ String threadName = Thread.currentThread().getName();
+ System.out.println(String.format("[%s] Hello Virtual Thread 2", threadName));
+ });
+
+ Thread.startVirtualThread(thread2);
+
+ // 判断一个线程是否是虚拟线程
+ System.out.println(thread1.isVirtual());
+ System.out.println(thread2.isVirtual());
+
+ Thread.sleep(1000);
+ }
+}
diff --git a/core-java-modules/core-java-21/src/main/java/Jep445HelloJava.java b/core-java-modules/core-java-21/src/main/java/Jep445HelloJava.java
new file mode 100644
index 0000000..9f5ba6b
--- /dev/null
+++ b/core-java-modules/core-java-21/src/main/java/Jep445HelloJava.java
@@ -0,0 +1,5 @@
+
+void main(){
+ System.out.println("Hello, Java 21!");
+}
+
diff --git a/core-java-modules/core-java-22/pom.xml b/core-java-modules/core-java-22/pom.xml
new file mode 100644
index 0000000..4fc6401
--- /dev/null
+++ b/core-java-modules/core-java-22/pom.xml
@@ -0,0 +1,14 @@
+
+
+ 4.0.0
+ com.wdbyte.core-java-modules
+ core-java-22
+ 1.0.0-SNAPSHOT
+
+ 22
+ 22
+ UTF-8
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-22/src/main/java/com/wdbyte/Main.java b/core-java-modules/core-java-22/src/main/java/com/wdbyte/Main.java
new file mode 100644
index 0000000..cbe7f6f
--- /dev/null
+++ b/core-java-modules/core-java-22/src/main/java/com/wdbyte/Main.java
@@ -0,0 +1,21 @@
+package com.wdbyte;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2025/04/28
+ */
+//TIP To Run code, press or
+// click the icon in the gutter.
+public class Main {
+ public static void main(String[] args) {
+ //TIP Press with your caret at the highlighted text
+ // to see how IntelliJ IDEA suggests fixing it.
+ System.out.printf("Hello and welcome!");
+
+ for (int i = 1; i <= 5; i++) {
+ //TIP Press to start debugging your code. We have set one breakpoint
+ // for you, but you can always add more by pressing .
+ System.out.println("i = " + i);
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/.gitignore b/core-java-modules/core-java-8/.gitignore
new file mode 100644
index 0000000..6aa4da5
--- /dev/null
+++ b/core-java-modules/core-java-8/.gitignore
@@ -0,0 +1,26 @@
+/target/
+*/systemlog/
+!.mvn/wrapper/maven-wrapper.jar
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/build/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/%
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md
index b27f4f4..edcb82b 100644
--- a/core-java-modules/core-java-8/README.md
+++ b/core-java-modules/core-java-8/README.md
@@ -2,6 +2,7 @@
当前模块包含 Java 8 新特性相关代码
### 相关文章
+- [Java 8 Lambda 和 Comparator 排序](/java8/comparator/)
- [Java 8 函数接口 UnaryOperator ](https://www.wdbyte.com/java8/java8-unaryoperaotr)
- [Java 8 函数接口 BiPredicate ](https://www.wdbyte.com/java8/java8-bipredicate)
- [Java 8 函数接口 BiFunction ](https://www.wdbyte.com/java8/java8-bifunction/)
diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml
index a8cb9fc..132cc2e 100644
--- a/core-java-modules/core-java-8/pom.xml
+++ b/core-java-modules/core-java-8/pom.xml
@@ -18,4 +18,23 @@
1.8
+
+
+
+ org.junit
+ junit-bom
+ 5.8.2
+ pom
+ import
+
+
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java
index ca253a4..a3d4f8f 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Dog.java
@@ -6,7 +6,7 @@
import java.util.Base64;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/21
*/
public class Dog {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java
index 788f9f5..ff762d2 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunction.java
@@ -3,7 +3,7 @@
import java.util.function.BiFunction;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/26
*/
public class Java8BiFunction {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java
index c01bb4d..d240d3f 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen.java
@@ -4,7 +4,7 @@
import java.util.function.Function;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/26
*/
public class Java8BiFunctionAndThen {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java
index 68c39f2..187ddbb 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionAndThen2.java
@@ -4,7 +4,7 @@
import java.util.function.Function;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/26
*/
public class Java8BiFunctionAndThen2 {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java
index 83e429f..3daa2a8 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8BiFunctionFilter.java
@@ -6,7 +6,7 @@
import java.util.function.BiFunction;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/26
*/
public class Java8BiFunctionFilter {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java
index 0402758..c03fed5 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Consumer.java
@@ -3,7 +3,7 @@
import java.util.function.Consumer;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/20
*/
public class Java8Consumer {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java
index 2055e05..c78da3a 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerAndThen.java
@@ -3,7 +3,7 @@
import java.util.function.Consumer;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/20
*/
public class Java8ConsumerAndThen {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java
index 3dd6c7a..9d294ae 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ConsumerForEach.java
@@ -5,7 +5,7 @@
import java.util.function.Consumer;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/20
*/
public class Java8ConsumerForEach {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java
index 70f95f1..6647081 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachArray.java
@@ -4,7 +4,7 @@
import java.util.List;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachArray {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java
index 635654c..e8063fe 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiy.java
@@ -5,7 +5,7 @@
import java.util.function.Consumer;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/25
*/
public class Java8ForEachDiy {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java
index 4d7927e..2265b05 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachDiyConsumer.java
@@ -6,7 +6,7 @@
import java.util.stream.Stream;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachDiyConsumer {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java
index 6fff108..4a0f6ef 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachException.java
@@ -4,7 +4,7 @@
import java.util.List;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachException {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java
index 37c2fd3..90aaf8a 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachListNormal.java
@@ -4,7 +4,7 @@
import java.util.List;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachListNormal {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java
index ffc95e1..dd44b34 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMap.java
@@ -4,7 +4,7 @@
import java.util.Map.Entry;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachMap {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java
index fbc1cf1..e29210c 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapFilter.java
@@ -3,7 +3,7 @@
import java.util.HashMap;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachMapFilter {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java
index 306e0bb..2af0c47 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachMapNormal.java
@@ -6,7 +6,7 @@
import java.util.Map.Entry;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachMapNormal {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java
index b809a5c..152a248 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ForEachOrder.java
@@ -5,7 +5,7 @@
import java.util.stream.Stream;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/18
*/
public class Java8ForEachOrder {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java
index 7fd4dff..c44a097 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Function.java
@@ -3,7 +3,7 @@
import java.util.function.Function;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @website https://www.wdbyte.com
* @date 2021/07/17
*/
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java
index 2ae4845..1d7eb31 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionAndThen.java
@@ -3,7 +3,7 @@
import java.util.function.Function;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/17
*/
public class Java8FunctionAndThen {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java
index c258741..8907e02 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicate.java
@@ -3,7 +3,7 @@
import java.util.function.BiPredicate;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/08/01
*/
public class Java8FunctionBiPredicate {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java
index 3bd5f9f..55dbb95 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateOr.java
@@ -3,7 +3,7 @@
import java.util.function.BiPredicate;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/08/01
*/
public class Java8FunctionBiPredicateOr {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java
index 8f94722..43c756d 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionBiPredicateParams.java
@@ -6,7 +6,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/08/01
*/
public class Java8FunctionBiPredicateParams {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java
index 8b7ec4d..4116921 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionLength.java
@@ -3,7 +3,7 @@
import java.util.function.Function;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/17
*/
public class Java8FunctionLength {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java
index 660de89..c77d742 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionListToMap.java
@@ -7,7 +7,7 @@
import java.util.function.Function;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/17
*/
public class Java8FunctionListToMap {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java
index 02a83a2..4a9ca5c 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8FunctionString.java
@@ -6,7 +6,7 @@
import java.util.function.Function;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/17
*/
public class Java8FunctionString {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java
index 28499fb..fdb8e0d 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8ObjIntConsumer.java
@@ -6,7 +6,7 @@
import java.util.function.ObjIntConsumer;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/20
*/
public class Java8ObjIntConsumer {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java
index 440afa6..9824bfb 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateAnd.java
@@ -6,7 +6,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/19
*/
public class Java8PredicateAnd {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java
index ba7fda5..d32ca96 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateChain.java
@@ -6,7 +6,7 @@
import java.util.function.Predicate;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/19
*/
public class Java8PredicateChain {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java
index d386c8e..a1529b8 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateFilter.java
@@ -5,7 +5,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/19
*/
public class Java8PredicateFilter {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java
index 3363538..8a7e4bc 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateNeagete.java
@@ -6,7 +6,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/19
*/
public class Java8PredicateNeagete {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java
index d7e10cd..26303df 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateObject.java
@@ -5,7 +5,7 @@
import java.util.function.Predicate;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/19
*/
public class Java8PredicateObject {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java
index e1e2e4a..1cb71c8 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateOr.java
@@ -6,7 +6,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/19
*/
public class Java8PredicateOr {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java
index 5f3472f..0df70fa 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8PredicateTest.java
@@ -3,7 +3,7 @@
import java.util.function.Predicate;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/19
*/
public class Java8PredicateTest {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java
index 33c6607..7e9edb5 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8Supplier.java
@@ -6,7 +6,7 @@
import java.util.function.Supplier;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/21
*/
public class Java8Supplier {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java
index fa1d00d..1a2fb80 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierFactory.java
@@ -3,7 +3,7 @@
import java.util.function.Supplier;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/21
*/
public class Java8SupplierFactory {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java
index f0a14e7..cc3d14f 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8SupplierInt.java
@@ -4,7 +4,7 @@
import java.util.function.IntSupplier;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/23
*/
public class Java8SupplierInt {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java
index 8711559..ddf91b6 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperator.java
@@ -5,7 +5,7 @@
import java.util.function.UnaryOperator;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/08/02
*/
public class Java8UnaryOperator {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java
index ba719eb..5085de4 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorIdentify.java
@@ -8,7 +8,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/08/02
*/
public class Java8UnaryOperatorIdentify {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java
index f7c048b..d2bfb7a 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParam.java
@@ -9,7 +9,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/08/02
*/
public class Java8UnaryOperatorParam {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java
index dd1d3f0..4e81857 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Java8UnaryOperatorParams.java
@@ -6,7 +6,7 @@
import java.util.function.UnaryOperator;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/08/02
*/
public class Java8UnaryOperatorParams {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java
index 871dd16..241c5a4 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/JavaBiFunctionFactory.java
@@ -3,7 +3,7 @@
import java.util.function.BiFunction;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/26
*/
public class JavaBiFunctionFactory {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java
index f3034f9..c50f47c 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Base64.java
@@ -7,7 +7,7 @@
*
* JDK8 对 base64 编码的支持
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/6/12 9:47
*/
public class Jdk8Base64 {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java
index 2919164..9d14a98 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Function.java
@@ -4,7 +4,6 @@
import java.util.List;
import java.util.function.Predicate;
-import org.junit.Test;
/**
*
@@ -15,12 +14,11 @@
* - Consumer: 数据消费器, 接收一个 T类型的对象,无返回值,通常用于设置T对象的值; 单参数无返回值的行为接口;提供了 accept, andThen 方法
* - Predicate: 条件测试器,接收一个 T 类型的对象,返回布尔值,通常用于传递条件函数; 单参数布尔值的条件性接口。提供了 test (条件测试) , and-or- negate(与或非) 方法。
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/2/18 22:08
*/
public class Jdk8Function {
- @Test
public void testFunction() {
// 构造器引用
final Car bmwCar = Car.create(Car::new);
@@ -39,7 +37,6 @@ public void testFunction() {
/**
* 函数接口
*/
- @Test
public void functionInterfaceTest() {
List skills = Arrays.asList("java", "golang", "c++", "c", "python");
Predicate length4 = (str) -> str.length() > 4;
@@ -75,7 +72,6 @@ public void filterByFilter(List list, Predicate condition) {
/**
* predicate 的复杂使用
*/
- @Test
public void predicateTest() {
Predicate startsWith = (str) -> str.startsWith("g");
Predicate length = (str) -> str.length() > 4;
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java
index 4037c71..790262a 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Interface.java
@@ -5,7 +5,7 @@
* 接口的静态方法和默认方法
*
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/2/18 22:52
*/
public class Jdk8Interface {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java
index 46804b4..cbd5029 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Lambda.java
@@ -1,10 +1,6 @@
package com.wdbyte;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.Setter;
-import lombok.ToString;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
import java.util.*;
import java.util.stream.Collectors;
@@ -23,7 +19,7 @@
* 4. 花括号可选,一个语句可以不用花括号,多个参数则花括号必须。
* 5. 返回值可选,如果只有一个表达式,可以自动返回不需要 return 语句,花括号中需要 return 语法。
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/2/17 14:48
*/
public class Jdk8Lambda {
@@ -70,13 +66,33 @@ public void functionLambdaTest() {
}
- @Getter
- @Setter
- @ToString
- @AllArgsConstructor
static class User {
private String name;
private Integer age;
+
+ public User() {
+ }
+
+ public User(String name, Integer age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
}
public static List userList = new ArrayList();
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java
index b850e40..9af6004 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8LocalDateTime.java
@@ -6,7 +6,7 @@
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
/**
*
@@ -19,7 +19,7 @@
* - 实现了大部分常用操作方法
*
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/2/19 17:48
*/
public class Jdk8LocalDateTime {
@@ -161,15 +161,29 @@ public void calcTest() {
public void timeFunctionTest() {
LocalDateTime now = LocalDateTime.now();
System.out.println("当前时间:" + now);
- // 第一天
+
+ // LocalDateTime 本月第一天
+ // 方法1
LocalDateTime firstDay = now.withDayOfMonth(1);
System.out.println("本月第一天:" + firstDay);
- // 当天最后一秒
- LocalDateTime lastSecondOfDay = now.withHour(23).withMinute(59).withSecond(59);
- System.out.println("当天最后一秒:" + lastSecondOfDay);
- // 最后一天
+ // 方法2
+ firstDay = now.with(TemporalAdjusters.firstDayOfMonth());
+ System.out.println("本月第一天:" + firstDay);
+
+ // LocalDateTime 本月最后一天
LocalDateTime lastDay = now.with(TemporalAdjusters.lastDayOfMonth());
System.out.println("本月最后一天:" + lastDay);
+
+
+ // LocalDateTime 当天最后一秒
+ // 方法1
+ LocalDateTime lastSecondOfDay1 = now.withHour(23).withMinute(59).withSecond(59);
+ System.out.println("当天最后一秒:" + lastSecondOfDay1);
+ // 方法2
+ LocalDateTime lastSecondOfDay2 = LocalDateTime.now().with(LocalTime.MAX);
+ System.out.println("当天最后一秒:" + lastSecondOfDay2);
+
+
// 是否闰年
System.out.println("今年是否闰年:" + Year.isLeap(now.getYear()));
}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java
index 5389aa9..ac34fd1 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8NashornJs.java
@@ -1,12 +1,10 @@
package com.wdbyte;
-import org.junit.Test;
-
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
-import java.util.HashSet;
-import java.util.Set;
+
+import org.junit.jupiter.api.Test;
/**
*
@@ -17,7 +15,7 @@
*
* 这类Script引擎遵循相同的规则,允许Java和JavaScript交互使用,例子代码如下:
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/6/12 9:41
*/
public class Jdk8NashornJs {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java
index ba276c2..fc080a8 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Optional.java
@@ -2,15 +2,13 @@
import java.util.Optional;
-import org.junit.Test;
-
-import lombok.Data;
+import org.junit.jupiter.api.Test;
/**
*
* JDK8 为解决空指针增加的 Optional 方法
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/2/19 11:40
*/
public class Jdk8Optional {
@@ -182,23 +180,44 @@ public void optionalTest() {
/**
* 计算机
*/
-@Data
class Computer {
private Optional soundCard;
+
+ public Optional getSoundCard() {
+ return soundCard;
+ }
+
+ public void setSoundCard(Optional soundCard) {
+ this.soundCard = soundCard;
+ }
}
/**
* 声卡
*/
-@Data
class SoundCard {
private Optional usb;
+
+ public Optional getUsb() {
+ return usb;
+ }
+
+ public void setUsb(Optional usb) {
+ this.usb = usb;
+ }
}
/**
* USB
*/
-@Data
class Usb {
private String version;
+
+ public String getVersion() {
+ return version;
+ }
+
+ public void setVersion(String version) {
+ this.version = version;
+ }
}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java
index 9a9ca9c..d78cdb2 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8Stream.java
@@ -1,7 +1,6 @@
package com.wdbyte;
-import org.junit.Test;
-
+import org.junit.jupiter.api.Test;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
@@ -14,7 +13,7 @@
*
* JDK 8 steam 流操作
*
- * @Author niujinpeng
+* @Author https://www.wdbyte.com
* @Date 2019/8/12 18:03
*/
public class Jdk8Stream {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8StreamPro.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8StreamPro.java
index d4a2e87..18c400e 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8StreamPro.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/Jdk8StreamPro.java
@@ -6,8 +6,7 @@
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Stream;
-
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
/**
* @author darcy
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator.java
new file mode 100644
index 0000000..b4c5773
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator.java
@@ -0,0 +1,66 @@
+package com.wdbyte.comparator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/04/02
+ */
+public class Java8Comparator {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new Person("Linda", 10));
+ list.add(new Person("Jack", 30));
+ list.add(new Person("Chris", 20));
+ sortListJava7(list);
+ }
+
+ private static void sortListJava7(List list) {
+ Collections.sort(list, new Comparator() {
+ @Override
+ public int compare(Person o1, Person o2) {
+ return o1.getAge() - o2.getAge();
+ }
+ });
+ for (Person person : list) {
+ System.out.println(person);
+ }
+ }
+}
+
+class Person {
+ private String name;
+ private Integer age;
+
+ public Person(String name, Integer age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return "Person{" +
+ "name='" + name + '\'' +
+ ", age=" + age +
+ '}';
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+}
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator2.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator2.java
new file mode 100644
index 0000000..b53e60e
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator2.java
@@ -0,0 +1,29 @@
+package com.wdbyte.comparator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/04/02
+ */
+public class Java8Comparator2 {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new Person("Chris", 20));
+ list.add(new Person("Linda", 10));
+ list.add(new Person("Jack", 30));
+ sort(list);
+ list.forEach(System.out::println);
+ }
+
+ private static List sort(List list) {
+ //Comparator byAge = (Person o1, Person o2) -> o1.getAge().compareTo(o2.getAge());
+ Comparator byAge = Comparator.comparing(Person::getAge);
+ list.sort(byAge);
+ return list;
+ }
+}
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator3.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator3.java
new file mode 100644
index 0000000..4031315
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator3.java
@@ -0,0 +1,28 @@
+package com.wdbyte.comparator;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/04/02
+ */
+public class Java8Comparator3 {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new Person("Chris", 20));
+ list.add(new Person("Linda", 10));
+ list.add(new Person("Jack", 30));
+ sort(list);
+ for (Person person : list) {
+ System.out.println(person);
+ }
+ }
+
+ private static List sort(List list) {
+ list.sort(Comparator.comparing(Person::getAge));
+ return list;
+ }
+}
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator4.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator4.java
new file mode 100644
index 0000000..c02c30d
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator4.java
@@ -0,0 +1,28 @@
+package com.wdbyte.comparator;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/04/02
+ */
+public class Java8Comparator4 {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new Person("Chris", 20));
+ list.add(new Person("Linda", 10));
+ list.add(new Person("Jack", 30));
+ sort(list);
+ for (Person person : list) {
+ System.out.println(person);
+ }
+ }
+
+ private static List sort(List list) {
+ list.sort(Comparator.comparing(Person::getName));
+ return list;
+ }
+}
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator5.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator5.java
new file mode 100644
index 0000000..ca3ae94
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator5.java
@@ -0,0 +1,30 @@
+package com.wdbyte.comparator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/04/02
+ */
+public class Java8Comparator5 {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new Person("Chris", 20));
+ list.add(new Person("Linda", 10));
+ list.add(new Person("Jack", 30));
+ Collections.sort(list, new Comparator() {
+ @Override
+ public int compare(Person o1, Person o2) {
+ return o1.getAge() - o2.getAge();
+ }
+ });
+ for (Person person : list) {
+ System.out.println(person);
+ }
+ }
+
+}
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator6.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator6.java
new file mode 100644
index 0000000..20ab437
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator6.java
@@ -0,0 +1,36 @@
+package com.wdbyte.comparator;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/04/02
+ */
+public class Java8Comparator6 {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new Person("Chris", 20));
+ list.add(new Person("Linda", 10));
+ list.add(new Person("Jack", 30));
+
+ Comparator comparing = Comparator.comparing(Person::getAge);
+ list.sort(comparing);
+ list.forEach(System.out::println);
+
+ System.out.println("--------");
+
+ list.sort(comparing.reversed());
+ list.forEach(System.out::println);
+
+ list.sort((p1, p2) -> p1.getAge() - p2.getAge());
+ list.forEach(System.out::println);
+ System.out.println("--------");
+ list.sort((p1, p2) -> p2.getAge() - p1.getAge());
+ list.forEach(System.out::println);
+ }
+
+}
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator7.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator7.java
new file mode 100644
index 0000000..2918e31
--- /dev/null
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/comparator/Java8Comparator7.java
@@ -0,0 +1,28 @@
+package com.wdbyte.comparator;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/04/02
+ */
+public class Java8Comparator7 {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ list.add(new com.wdbyte.comparator.Person("Chris", 20));
+ list.add(new com.wdbyte.comparator.Person("Linda", 10));
+ list.add(new com.wdbyte.comparator.Person("Jack", 30));
+
+ list.stream()
+ .sorted(Comparator.comparing(Person::getAge))
+ .forEach(System.out::println);
+ System.out.println("----------");
+ list.stream()
+ .sorted(Comparator.comparing(Person::getAge).reversed())
+ .forEach(System.out::println);
+ }
+
+}
+
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMap.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMap.java
index 5c8ddf4..8e29127 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMap.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMap.java
@@ -6,7 +6,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/23
*/
public class ListToMap {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapConcurrentHashMap.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapConcurrentHashMap.java
index acb0ad9..a5bf22e 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapConcurrentHashMap.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapConcurrentHashMap.java
@@ -7,7 +7,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/23
*/
public class ListToMapConcurrentHashMap {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDog.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDog.java
index 0647f64..e50fa40 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDog.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDog.java
@@ -6,7 +6,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/23
*/
public class ListToMapDog {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDuplicateKey.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDuplicateKey.java
index 678b8c4..898dd62 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDuplicateKey.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapDuplicateKey.java
@@ -6,7 +6,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/23
*/
public class ListToMapDuplicateKey {
diff --git a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapSort.java b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapSort.java
index 5367255..c8b95af 100644
--- a/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapSort.java
+++ b/core-java-modules/core-java-8/src/main/java/com/wdbyte/list_to_map/ListToMapSort.java
@@ -7,7 +7,7 @@
import java.util.stream.Collectors;
/**
- * @author niulang
+ * @author https://www.wdbyte.com
* @date 2021/07/23
*/
public class ListToMapSort {
diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md
new file mode 100644
index 0000000..16a83cc
--- /dev/null
+++ b/core-java-modules/core-java-9/README.md
@@ -0,0 +1,6 @@
+## core-java-9
+当前模块包含 Java 9 新特性相关代码
+
+### 相关文章
+
+- [Java 9 新特性介绍](https://www.wdbyte.com/2020/02/jdk/jdk9-feature/)
\ No newline at end of file
diff --git a/core-java-modules/core-java-9/pom.xml b/core-java-modules/core-java-9/pom.xml
new file mode 100644
index 0000000..6b2d877
--- /dev/null
+++ b/core-java-modules/core-java-9/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ core-java-9
+ 1.0.0-SNAPSHOT
+ core-java-9
+ jar
+
+
+ 9
+ 9
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9CollectionFactory.java b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9CollectionFactory.java
new file mode 100644
index 0000000..2399cc8
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9CollectionFactory.java
@@ -0,0 +1,51 @@
+package com.wdbyte.java9;
+
+import java.util.*;
+
+/**
+ * java 9 - 集合工厂方法
+ * 集合工厂方法创建的集合都是不可变只读集合,在改变时会抛出异常。
+ * 对于 Set 和 Map 工厂方法常见的,创建时如果有 key 值重复,也会直接抛出异常。
+ * 对于 Set 和 Map 工厂方法常见的,每个 JVM 运行周期里遍历的顺序是不定的。
+ *
+ * @author 达西 - 公众号:未读代码
+ */
+public class Jdk9CollectionFactory {
+
+ public static void main(String[] args) {
+ // 工厂方法创建集合
+ List stringList = List.of("a", "b", "c", "d");
+ Set stringSet = Set.of("a", "b", "c", "d");
+ Map stringIntegerMap = Map.of("key1", 1, "key2", 2, "key3", 3);
+ Map stringIntegerMap2 = Map.ofEntries(Map.entry("key1", 1), Map.entry("key2", 2));
+
+ // 集合输出
+ System.out.println(stringList);
+ System.out.println(stringSet);
+ System.out.println(stringIntegerMap);
+ System.out.println(stringIntegerMap2);
+
+ }
+
+ public void hashCodeOf(){
+ // 工厂可以自由创建新的实例或者复用现有实例,所以 使用 of 创建的集合,避免 == 或者 hashCode 判断操作
+ List stringList = List.of("a", "b", "c", "d");
+ List stringList2 = List.of("a", "b", "c", "d");
+ System.out.println(stringList.hashCode());
+ System.out.println(stringList2.hashCode());
+ }
+
+ /**
+ * jdk 9 之前创建只读集合方式
+ */
+ public void jdk9Before() {
+ List arrayList = new ArrayList<>();
+ arrayList.add("达西");
+ arrayList.add("未读代码");
+ // 设置为只读集合
+ arrayList = Collections.unmodifiableList(arrayList);
+ // java.lang.UnsupportedOperationException
+ // arrayList.add("test");
+ // Set,Map 同理
+ }
+}
diff --git a/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Http.java b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Http.java
new file mode 100644
index 0000000..63f6cbd
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Http.java
@@ -0,0 +1,31 @@
+package com.wdbyte.java9;
+
+import java.io.IOException;
+import java.net.URI;
+
+//import jdk.incubator.http.HttpClient;
+//import jdk.incubator.http.HttpRequest;
+//import jdk.incubator.http.HttpResponse;
+
+/**
+ * @author 达西 - 公众号:未读代码
+ */
+public class Jdk9Http {
+
+ /**
+ * 只有在使用 JDK9 时才可以放开注释语句,不然找不到类
+ *
+ * @param args
+ * @throws IOException
+ * @throws InterruptedException
+ */
+ public static void main(String[] args) throws IOException, InterruptedException {
+ //HttpClient client = HttpClient.newHttpClient();
+ //URI uri = URI.create("http://www.tianqiapi.com/api/xxx");
+ //HttpRequest req = HttpRequest.newBuilder(uri).header("User-Agent", "Java").GET().build();
+ //HttpResponse resp = client.send(req, HttpResponse.BodyHandler.asString());
+ //String body = resp.body();
+ //System.out.println(body);
+ }
+
+}
diff --git a/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Interface.java b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Interface.java
new file mode 100644
index 0000000..fcbfe65
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Interface.java
@@ -0,0 +1,37 @@
+package com.wdbyte.java9;
+
+/**
+ * @author 达西 - 公众号:未读代码
+ */
+public class Jdk9Interface {
+ public static void main(String[] args) {
+ ChinaPeople chinaPeople = new ChinaPeople();
+ chinaPeople.sleep();
+ chinaPeople.eat();
+ chinaPeople.doXxx();
+ }
+
+}
+
+class ChinaPeople implements People {
+ @Override
+ public void sleep() {
+ System.out.println("躺着睡");
+ }
+}
+
+interface People {
+ void sleep();
+
+ default void eat() {
+ drink();
+ }
+
+ default void doXxx() {
+ drink();
+ }
+
+ private void drink() {
+ System.out.println("喝水");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Stream.java b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Stream.java
new file mode 100644
index 0000000..b8fe9ab
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/com/wdbyte/java9/Jdk9Stream.java
@@ -0,0 +1,71 @@
+package com.wdbyte.java9;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+/**
+ * * @author 达西 - 公众号:未读代码
+ */
+public class Jdk9Stream {
+
+ /**
+ * takeWhile ,从头开始筛选,遇到不满足的就结束了
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ // takeWhile ,从头开始筛选,遇到不满足的就结束了
+ List list1 = List.of(1, 2, 3, 4, 5);
+ List listResult = list1.stream().takeWhile(x -> x < 3).collect(Collectors.toList());
+ System.out.println(listResult);
+ // takeWhile ,从头开始筛选,遇到不满足的就结束
+ List list2 = List.of(1, 2, 3, 4, 3, 0);
+ List listResult2 = list2.stream().takeWhile(x -> x < 3).collect(Collectors.toList());
+ System.out.println(listResult2);
+ }
+
+ /**
+ * dropWhile ,从头开始删除,遇到不满足的就结束了
+ */
+ public void dropWhile() {
+ // dropWhile ,从头开始删除,遇到不满足的就结束了
+ List list1 = List.of(1, 2, 3, 4, 5);
+ List listResult = list1.stream().dropWhile(x -> x < 3).collect(Collectors.toList());
+ System.out.println(listResult);
+ // dropWhile ,从头开始删除,遇到不满足的就结束
+ List list2 = List.of(1, 2, 3, 4, 3, 0);
+ List listResult2 = list2.stream().dropWhile(x -> x < 3).collect(Collectors.toList());
+ System.out.println(listResult2);
+ }
+
+ /**
+ * 使用 ofNullable 创建支持 null 的 stream
+ */
+ public void ofNullable() {
+ Stream stream = Stream.of(1, 2, null);
+ stream.forEach(System.out::print);
+ System.out.println();
+ // 空指针异常
+ // stream = Stream.of(null);
+ stream = Stream.ofNullable(null);
+ stream.forEach(System.out::print);
+ }
+
+ /**
+ * 重载迭代器
+ */
+ public void iterate() {
+ IntStream.iterate(0, x -> x < 10, x -> x + 1).forEach(System.out::print);
+ }
+
+ /**
+ * Optional 转 Stream
+ */
+ public void optionalToStream() {
+ Stream s = Optional.of(1).stream();
+ s.forEach(System.out::print);
+ }
+}
diff --git a/core-java-modules/core-java-9/src/main/java/module-info.java b/core-java-modules/core-java-9/src/main/java/module-info.java
new file mode 100644
index 0000000..4ceb417
--- /dev/null
+++ b/core-java-modules/core-java-9/src/main/java/module-info.java
@@ -0,0 +1,5 @@
+module net.codingme.feature.jdk9 {
+ exports com.wdbyte.java9;
+ //requires jdk.incubator.httpclient;
+ // 只有在使用 JDK9 时才可以放开上面的注释语句,不然找不到模块
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/.gitignore b/core-java-modules/core-java-base/.gitignore
new file mode 100644
index 0000000..5ff6309
--- /dev/null
+++ b/core-java-modules/core-java-base/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/README.md b/core-java-modules/core-java-base/README.md
new file mode 100644
index 0000000..5b2d151
--- /dev/null
+++ b/core-java-modules/core-java-base/README.md
@@ -0,0 +1,26 @@
+## core-java-base
+当前模块包含 Java 核心代码
+
+### 相关文章
+
+- [JDK、JRE、JVM 的区别](/java/jdk-jre-jvm/)
+- [Java 数据类型](/java/data-type/)
+- [Java 流程控制](/java/flow-control/)
+- [Java String 字符串](/java/java-string/)
+- [Java Array 数组](/java/java-array/)
+- [Java 多维数组](/java/java-array-mul/)
+- [Java StringBuilder](/java/java-stringbuilder/)
+- [Java Scanner](/java/scanner/)
+- [Java 继承](/java/extends/)
+- [Java 接口](/java/interface/)
+- [Java 抽象类](/java/abstract/)
+- [抽象类和接口的区别](https://www.wdbyte.com/java/abs-interface/)
+- [Java 多态](/java/polymorphism/)
+- [Java Scanner](/java/scanner/)
+- [Java 日期时间Date](/java/date/)
+- [Java 异常处理](/java/exception/)
+- [Java 枚举](https://www.wdbyte.com/java/enum/)
+- [Java 注释](*https://www.wdbyte.com/java/comment/*)
+- [Java 集合框架](https://www.wdbyte.com/java/collection/)
+- [Java 中使用 List ](https://www.wdbyte.com/java/list/)
+- [Java 断言 Assert 使用教程与最佳实践](https://www.wdbyte.com/java/assert/)
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/pom.xml b/core-java-modules/core-java-base/pom.xml
new file mode 100644
index 0000000..b5a436e
--- /dev/null
+++ b/core-java-modules/core-java-base/pom.xml
@@ -0,0 +1,19 @@
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ core-java-base
+ Archetype - core-java-base
+ http://maven.apache.org
+
+
+ 17
+ 17
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/JavaDataType.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/JavaDataType.java
new file mode 100644
index 0000000..192314b
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/JavaDataType.java
@@ -0,0 +1,36 @@
+package com.wdbyte;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/03/23
+ */
+public class JavaDataType {
+
+ public static void main(String[] args) {
+ boolean result = true;
+ char capitalC = 'C';
+ byte b = 100;
+ short s = 10000;
+ int i = 100000;
+
+ // 10 进制的 26
+ int decVal = 26;
+ // 16 进制的 26
+ int hexVal = 0x1a;
+ // 2 进制的 26
+ int binVal = 0b11010;
+ System.out.println(decVal);
+ System.out.println(hexVal);
+ System.out.println(binVal);
+
+ long creditCardNumber = 1234_5678_9012_3456L;
+ long socialSecurityNumber = 999_99_9999L;
+ float pi = 3.14_15F;
+ long hexBytes = 0xFF_EC_DE_5E;
+ long hexWords = 0xCAFE_BABE;
+ long maxLong = 0x7fff_ffff_ffff_ffffL;
+ byte nybbles = 0b0010_0101;
+ long bytes = 0b11010010_01101001_10010100_10010010;
+
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray.java
new file mode 100644
index 0000000..521b1c2
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray.java
@@ -0,0 +1,77 @@
+package com.wdbyte.array;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/03/23
+ */
+public class JavaArray {
+
+ public static void main(String[] args) {
+
+ // 数组定义
+ String[] aaa = new String[11];
+ System.out.println(aaa.length);
+ // 数组访问
+ int[] arr = {1, 2, 3};
+ System.out.println(arr.toString()); // 数组地址
+ arr[0] = 10;
+ System.out.println(arr[0]);
+
+ for (int a : arr) {
+ System.out.println(a);
+ }
+ for (int i = 0; i < arr.length; i++) {
+ System.out.println(arr[i]);
+ }
+
+ // copy
+ String[] strArr = {"hello", "world", "!"};
+ String[] strArrByClone = strArr.clone();
+ System.out.println(String.join(" ", strArrByClone));
+ // 输出:hello world !
+ String[] strAyyByCopy = new String[5];
+ System.arraycopy(strArr,1,strAyyByCopy,3,2);
+ for (String s : strAyyByCopy) {
+ System.out.println(s);
+ }
+ String[] newArr = Arrays.copyOfRange(strArr, 0, 2);
+ System.out.println(Arrays.toString(newArr));
+ // 输出:null
+ //null
+ //null
+ //world
+ //!
+
+ Person[][] personArr = new Person[2][2];
+ personArr[0][0] = new Person("www");
+ personArr[1][1] = new Person("wdbyte.com");
+ Person[][] personArrByClone = personArr.clone();
+ personArrByClone[0][0] = new Person("https://www");
+ System.out.println(personArr[0][0].name);
+ System.out.println(personArrByClone[0][0].name);
+
+ int[] numArr = {1, 3, 5, 7, 9, 2, 4, 6, 8, 10};
+ // 对数组进行排序
+ Arrays.sort(numArr);
+ // 将数组转换成字符串输出
+ System.out.println(Arrays.toString(numArr));
+ // 将数组转换成 List
+ String[] strArray = new String[3];
+ // 将数组的所有元素都赋为指定的值
+ Arrays.fill(strArray,"byte");
+ System.out.println(Arrays.toString(strArray));
+ List stringList = Arrays.asList("a","b","c");
+ System.out.println(stringList);
+ }
+ static class Person{
+ public String name;
+ public Person(String name) {
+ this.name = name;
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray2.java
new file mode 100644
index 0000000..ba92287
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray2.java
@@ -0,0 +1,32 @@
+package com.wdbyte.array;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/03/25
+ */
+public class JavaArray2 {
+
+ public static void main(String[] args) {
+ int[][] myArray = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
+ for (int i = 0; i < myArray.length; i++) {
+ for (int j = 0; j < myArray[i].length; j++) {
+ System.out.print(myArray[i][j] + " ");
+ }
+ System.out.println();
+ }
+ System.out.println(myArray[0][0]); // 输出1
+ System.out.println(myArray[0][1]); // 输出2
+ System.out.println(myArray[1][0]); // 输出4
+
+ System.out.println("------------");
+
+ int intArray[][] = { { 1, 2, 3 }, { 4, 5 } };
+ int cloneArray[][] = intArray.clone();
+ // 输出:false
+ System.out.println(intArray == cloneArray);
+
+ // 因为是浅拷贝,所以元素引用相同,输出 true
+ System.out.println(intArray[0] == cloneArray[0]);
+ System.out.println(intArray[1] == cloneArray[1]);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray3.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray3.java
new file mode 100644
index 0000000..3816c54
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray3.java
@@ -0,0 +1,25 @@
+package com.wdbyte.array;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/03/25
+ */
+public class JavaArray3 {
+
+ public static void main(String[] args) {
+ int[][] myArray1 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
+ int[][] myArray2 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
+ int[][] myArray3 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
+ int[][][] array3d = {myArray1, myArray2, myArray3};
+ for (int i = 0; i < array3d.length; i++) {
+ for (int j = 0; j < array3d[i].length; j++) {
+ for (int k = 0; k < array3d[i][j].length; k++) {
+ System.out.print(array3d[i][j][k] + " ");
+ }
+ System.out.println();
+ }
+ System.out.println("-----");
+ }
+ System.out.println(array3d[1][1][1]);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray4.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray4.java
new file mode 100644
index 0000000..4665cc6
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/array/JavaArray4.java
@@ -0,0 +1,42 @@
+package com.wdbyte.array;
+
+/**
+ * 锯齿数组
+ * @author https://www.wdbyte.com
+ * @date 2023/03/25
+ */
+public class JavaArray4 {
+
+ public static void main(String[] args) {
+ int[][] arrName1 = new int[][] {
+ new int[] {10, 20, 30, 40},
+ new int[] {50, 60, 70, 80, 90, 100},
+ new int[] {110, 120}
+ };
+
+ int[][] arrName2 = {
+ new int[] {10, 20, 30, 40},
+ new int[] {50, 60, 70, 80, 90, 100},
+ new int[] {110, 120}
+ };
+
+ int[][] arrName3 = {
+ {10, 20, 30, 40},
+ {50, 60, 70, 80, 90, 100},
+ {110, 120}
+ };
+
+ int[][] jaggedArray = new int[3][];
+ jaggedArray[0] = new int[] {1, 2, 3};
+ jaggedArray[1] = new int[] {4, 5};
+ jaggedArray[2] = new int[] {6, 7, 8, 9};
+
+ for (int i = 0; i < jaggedArray.length; i++) {
+ for (int j = 0; j < jaggedArray[i].length; j++) {
+ System.out.print(jaggedArray[i][j] + " ");
+ }
+ System.out.println();
+ }
+
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo1.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo1.java
new file mode 100644
index 0000000..50490a5
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo1.java
@@ -0,0 +1,29 @@
+package com.wdbyte.assert1;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2024/04/22
+ */
+public class AssertDemo1 {
+ public static void main(String[] args) {
+
+ List list = Arrays.asList("1", "2");
+ boolean result = list.remove("x");
+ //assert result;
+ assert result : "移除失败";
+ System.out.println(calc(100, 10));
+
+ // 手动开启断言
+ //ClassLoader.getSystemClassLoader().setDefaultAssertionStatus(true);
+ //System.out.println(calc(100, 0));
+ }
+
+ public static int calc(int a, int b) {
+ assert b != 0 : "除数不能为0";
+ return a / b;
+
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo2.java
new file mode 100644
index 0000000..735c2bb
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo2.java
@@ -0,0 +1,24 @@
+package com.wdbyte.assert1;
+
+import java.util.Arrays;
+import java.util.List;
+
+import static com.google.common.base.Verify.*;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2024/04/22
+ */
+public class AssertDemo2 {
+ public static void main(String[] args) {
+ int x = 100;
+ verifyNotNull(x != 0);
+ System.out.println(calc(100, 10));
+ System.out.println(calc(100, 0));
+ }
+
+ public static int calc(int a, int b) {
+ verify(b != 0, "除数不能为0");
+ return a / b;
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo3.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo3.java
new file mode 100644
index 0000000..09e2272
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo3.java
@@ -0,0 +1,20 @@
+package com.wdbyte.assert1;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2024/04/22
+ */
+public class AssertDemo3 {
+ static final boolean asserts = false; // 设置为 false 来消除断言
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("1", "2");
+ boolean result = list.remove("x");
+ if (asserts) {
+ assert result : "移除失败";
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo4.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo4.java
new file mode 100644
index 0000000..565de43
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo4.java
@@ -0,0 +1,25 @@
+package com.wdbyte.assert1;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2024/04/22
+ */
+public class AssertDemo4 {
+
+ static {
+ boolean assertsEnabled = false;
+ assert assertsEnabled = true; // 故意产生副作用!!!
+ if (!assertsEnabled) {
+ throw new RuntimeException("必须启用断言!!!");
+ }
+ }
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("1", "2");
+ boolean result = list.remove("x");
+ assert result : "移除失败";
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo5.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo5.java
new file mode 100644
index 0000000..4c37dde
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/AssertDemo5.java
@@ -0,0 +1,25 @@
+package com.wdbyte.assert1;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.base.Preconditions;
+import com.google.common.base.Verify;
+import org.apache.commons.lang3.Validate;
+import org.junit.jupiter.api.Assertions;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2024/04/22
+ */
+public class AssertDemo5 {
+
+ public static void main(String[] args) {
+ List list = Arrays.asList("1", "2");
+ boolean result = list.remove("x");
+ Assertions.assertTrue(result);
+ Preconditions.checkNotNull("","msg");
+ Validate.isTrue(list.isEmpty(),"msg");
+ Verify.verify(list.isEmpty(),"msg");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/InitializationDemo.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/InitializationDemo.java
new file mode 100644
index 0000000..cfebe99
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/assert1/InitializationDemo.java
@@ -0,0 +1,28 @@
+package com.wdbyte.assert1;
+
+public class InitializationDemo {
+
+ static {
+ init();
+ }
+
+ static void init() {
+ System.out.println("Static initialization block called");
+ // 假设这里有一个重要的初始化逻辑
+ // 这个方法错误地在静态初始化之前被调用了
+ assert isProperlyInitialized() : "System not properly initialized";
+ }
+
+ static boolean isProperlyInitialized() {
+ // 这里返回 false 模拟系统未被正确初始化
+ return false;
+ }
+
+ public InitializationDemo() {
+ System.out.println("Constructor called");
+ }
+
+ public static void main(String[] args) {
+ new InitializationDemo();
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest.java
new file mode 100644
index 0000000..582a6f3
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest.java
@@ -0,0 +1,63 @@
+package com.wdbyte.collection;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/10/19
+ */
+public class ArrayListTest {
+
+ public static void main(String[] args) {
+ //String[] arr = new String[]{"w","d","b","y","t","e"};
+ ////arr[7] = "f";
+ //
+ //List list = new ArrayList();
+ //list.add("a");
+ //list.add("b");
+ //list.add("c");
+ //list.add("d");
+ //
+ //System.out.println(list.get(2));
+ //list.remove(2);
+ //System.out.println(list.get(2));
+
+ //List list2 = List.of("www", "wdbyte", "com");
+ //list2.add("a");
+ //System.out.println(list2);
+
+ List list = new ArrayList();
+ list.add("b");
+ list.add("c");
+ list.add("a");
+ list.add("d");
+
+ System.out.println(list);
+
+ list = list.stream().sorted().collect(Collectors.toList());
+ System.out.println(list);
+
+ // 排序时指定降序还是升序:Comparator.reverseOrder() 降序
+ list = list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());
+ System.out.println(list);
+
+ System.out.println("----------");
+
+ Collections.sort(list);
+ System.out.println(list);
+ // 降序
+ Collections.sort(list,Comparator.reverseOrder());
+ System.out.println(list);
+
+ list.sort(Comparator.comparing(Function.identity()));
+ System.out.println(list);
+
+
+
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest2.java
new file mode 100644
index 0000000..f18c9b1
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest2.java
@@ -0,0 +1,49 @@
+package com.wdbyte.collection;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/10/19
+ */
+public class ArrayListTest2 {
+
+ public static void main(String[] args) {
+ List list = new ArrayList();
+ list.add("a");
+ list.add("b");
+ System.out.println("当前集合:" + list);
+ System.out.println("获取第一个元素:" + list.get(0));
+ list.set(0, "x");
+ System.out.println("修改第一个元素为 x:" + list);
+ list.remove(1);
+ System.out.println("移除第2个元素后剩余:" + list);
+ System.out.println("判断元素 x 是否存在:" + list.contains("x"));
+ System.out.println("判断元素 a 是否存在:" + list.contains("a"));
+ System.out.println("当前 list 大小:" + list.size());
+
+ list.add("y");
+ list.add("z");
+ System.out.println("添加两个元素:" + list);
+
+ System.out.println("遍历元素:");
+ for (String string : list) {
+ System.out.print(string);
+ }
+ for (int i = 0; i < list.size(); i++) {
+ System.out.print(list.get(i));
+ }
+ list.forEach(s -> {
+ System.out.println(s);
+ });
+
+ Iterator iterator = list.iterator();
+ while (iterator.hasNext()){
+ System.out.println(iterator.next());
+ }
+
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest3.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest3.java
new file mode 100644
index 0000000..a88fd7a
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest3.java
@@ -0,0 +1,54 @@
+package com.wdbyte.collection;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.Lists;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/10/19
+ */
+public class ArrayListTest3 {
+
+ public static void main(String[] args) {
+ List list = new ArrayList();
+ list.add("a");
+ list.add("b");
+
+ String[] array = list.toArray(new String[0]);
+ System.out.println(Arrays.toString(array));
+
+ String[] array2 = list.stream().toArray(String[]::new);
+ System.out.println(Arrays.toString(array2));
+
+ // 数组 -> List
+ // 方式1
+ List list0 = Lists.newArrayList(array);
+ list0.add("e");
+ System.out.println(list0);
+
+ // 方式2
+ List list1 = Arrays.stream(array).toList();
+ // list1.add("e"); 报错,不能修改
+ System.out.println(list1);
+
+ // 方式3
+ List list2 = Arrays.asList(array);
+ //list2.add("e"); 报错,不能修改
+ System.out.println(list2);
+
+ // 方式4
+ List list3 = new ArrayList<>(Arrays.asList(array));
+ list3.add("e");
+ System.out.println(list3);
+
+ // 方式5
+ List list4 = Arrays.stream(array).collect(Collectors.toList());
+ list4.add("e");
+ System.out.println(list4);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest4.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest4.java
new file mode 100644
index 0000000..93d09e4
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/ArrayListTest4.java
@@ -0,0 +1,83 @@
+package com.wdbyte.collection;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.Lists;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/10/19
+ */
+public class ArrayListTest4 {
+
+ public static void main(String[] args) {
+ List list = new ArrayList();
+ list.add(new Dog("大黄", 1));
+ list.add(new Dog("小黑", 2));
+
+ Map dogMap = list.stream()
+ .collect(Collectors.toMap(Dog::getName, Function.identity(), (o, n) -> o));
+ System.out.println(dogMap.get("大黄"));
+
+ Map dogMap2 = new HashMap<>();
+ for (Dog dog : list) {
+ dogMap2.put(dog.getName(), dog);
+ }
+ System.out.println(dogMap.get("大黄"));
+
+ List arrayList = new ArrayList();
+ arrayList.add("a");
+ arrayList.add("b");
+
+ Iterator iterator = arrayList.iterator();
+ while (iterator.hasNext()) {
+ String next = iterator.next();
+ if ("a".equals(next)) {
+ iterator.remove();
+ }
+ }
+ System.out.println(arrayList);
+ }
+
+}
+
+class Dog {
+ String name;
+ Integer age;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getAge() {
+ return age;
+ }
+
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+
+ public Dog(String name, Integer age) {
+ this.name = name;
+ this.age = age;
+ }
+
+ @Override
+ public String toString() {
+ return "Dog{" +
+ "name='" + name + '\'' +
+ ", age=" + age +
+ '}';
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest.java
new file mode 100644
index 0000000..fc953ed
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest.java
@@ -0,0 +1,20 @@
+package com.wdbyte.collection;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class CollectionTest {
+ public static void main(String[] args) {
+ List arrayList = new ArrayList<>();
+ // 向 List 中添加元素
+ arrayList.add("www");
+ arrayList.add("wdbyte");
+ arrayList.add("com");
+ arrayList.add("com");
+ // 输出
+ System.out.println(arrayList);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest2.java
new file mode 100644
index 0000000..3c67874
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest2.java
@@ -0,0 +1,35 @@
+package com.wdbyte.collection;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.Stack;
+import java.util.TreeSet;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class CollectionTest2 {
+ public static void main(String[] args) {
+ List arrayList = new ArrayList<>();
+ List linkedList = new LinkedList<>();
+ Set hashSet = new HashSet<>();
+ Set treeSet = new TreeSet<>();
+ Stack stack = new Stack<>();
+ // 添加元素
+ arrayList.add("wdbyte.com");
+ linkedList.add("wdbyte.com");
+ hashSet.add("wdbyte.com");
+ treeSet.add("wdbyte.com");
+ stack.add("wdbyte.com");
+ // 输出
+ System.out.println(arrayList);
+ System.out.println(linkedList);
+ System.out.println(hashSet);
+ System.out.println(treeSet);
+ System.out.println(stack);
+ }
+
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest3.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest3.java
new file mode 100644
index 0000000..2989ef5
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest3.java
@@ -0,0 +1,35 @@
+package com.wdbyte.collection;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class CollectionTest3 {
+ public static void main(String[] args) {
+ List arrayList = new ArrayList<>();
+ // 向 List 中添加元素
+ arrayList.add("www");
+ arrayList.add("wdbyte");
+ arrayList.add("com");
+ // 普通遍历
+ for (int i = 0; i < arrayList.size(); i++) {
+ System.out.println(arrayList.get(0));
+ }
+ System.out.println("--------");
+ // iterator 迭代器遍历
+ Iterator iterator = arrayList.iterator();
+ while (iterator.hasNext()) {
+ System.out.println(iterator.next());
+ }
+ }
+
+ public void printCollection(Collection collection) {
+ for (Object o : collection) {
+ System.out.println(o);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest4.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest4.java
new file mode 100644
index 0000000..349619b
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest4.java
@@ -0,0 +1,37 @@
+package com.wdbyte.collection;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class CollectionTest4 {
+ public static void main(String[] args) {
+ List arrayList = new ArrayList<>();
+ // 向 List 中添加元素
+ arrayList.add("www");
+ arrayList.add("wdbyte");
+ arrayList.add("com");
+
+ HashSet hashSet = new HashSet<>();
+ hashSet.addAll(arrayList);
+
+ printCollection(arrayList.iterator());
+ System.out.println("--------------");
+ printCollection(hashSet.iterator());
+ }
+
+ public static void printCollection(Iterator iterator) {
+ // 当前日期
+ LocalDate now = LocalDate.now();
+ while (iterator.hasNext()) {
+ String obj = iterator.next();
+ System.out.println(now + ":" + obj.toString());
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest5.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest5.java
new file mode 100644
index 0000000..6d480e8
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/CollectionTest5.java
@@ -0,0 +1,34 @@
+package com.wdbyte.collection;
+
+import java.time.LocalDate;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class CollectionTest5 {
+ public static void main(String[] args) {
+ List arrayList = new ArrayList<>();
+ // 向 List 中添加元素
+ arrayList.add("www");
+ arrayList.add("wdbyte");
+ arrayList.add("com");
+ HashSet hashSet = new HashSet<>();
+ hashSet.addAll(arrayList);
+
+ printCollection(arrayList);
+ printCollection(hashSet);
+ }
+ public static void printCollection(Iterable iterable) {
+ // 当前日期
+ LocalDate now = LocalDate.now();
+ Iterator iterator = iterable.iterator();
+ while (iterator.hasNext()) {
+ String obj = iterator.next();
+ System.out.println(now + ":" + obj.toString());
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/MapTest.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/MapTest.java
new file mode 100644
index 0000000..cd346f9
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/MapTest.java
@@ -0,0 +1,21 @@
+package com.wdbyte.collection;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class MapTest {
+ public static void main(String[] args) {
+ Map hashMap = new HashMap<>();
+ // 添加元素
+ hashMap.put("site","www.wdbyte.com");
+ hashMap.put("author","程序猿阿朗");
+ hashMap.put("github","github.com/niumoo");
+ // 获取元素
+ System.out.println(hashMap.get("github"));
+ // 输出全部元素
+ System.out.println(hashMap);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/MapTest2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/MapTest2.java
new file mode 100644
index 0000000..235c79a
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/collection/MapTest2.java
@@ -0,0 +1,26 @@
+package com.wdbyte.collection;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class MapTest2 {
+ public static void main(String[] args) {
+ Map hashMap = new HashMap<>();
+ Map linkedHashMap = new LinkedHashMap<>();
+ // 添加元素
+ hashMap.put("site", "www.wdbyte.com");
+ hashMap.put("author", "程序猿阿朗");
+ hashMap.put("github", "github.com/niumoo");
+ linkedHashMap.put("site", "www.wdbyte.com");
+ linkedHashMap.put("author", "程序猿阿朗");
+ linkedHashMap.put("github", "github.com/niumoo");
+
+ // 输出全部元素
+ System.out.println(hashMap);
+ System.out.println(linkedHashMap);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/JavaDocDemo.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/JavaDocDemo.java
new file mode 100644
index 0000000..0625952
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/JavaDocDemo.java
@@ -0,0 +1,41 @@
+package com.wdbyte.comment;
+
+/**
+ * 输出一个名称和地域的问候信息。
+ * 如:Hello 朋友,welcome to 杭州
+ * 主要实现方法是 {@link JavaDocDemo#getMessage(String, String)}
+ *
+ * @author wdbyte
+ * @version 1.0
+ * @see com.wdbyte.comment.JavaDocDemo#getMessage(String, String)
+ * @since 1.0
+ */
+public class JavaDocDemo {
+
+ /**
+ * 启动应用程序
+ *
+ * @param args - 应用启动参数
+ */
+ public static void main(String[] args) {
+ System.out.println(getMessage("朋友", "杭州"));
+ }
+
+ /**
+ * 返回一个欢迎信息。
+ * @see Java Dcoumentation
+ * @param name - 访问者名称
+ * @param region - 地域信息
+ * @return - 欢迎信息语句
+ */
+ public static String getMessage(String name, String region) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Hello ");
+ builder.append(name);
+ builder.append(", Welcome to ");
+ builder.append(region);
+ builder.append(" !!");
+ return builder.toString();
+ }
+
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/WelcomeMain.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/WelcomeMain.java
new file mode 100644
index 0000000..153bed9
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/WelcomeMain.java
@@ -0,0 +1,51 @@
+package com.wdbyte.comment;
+
+/**
+ * 输出一个名称和地域的问候信息。
+ * 如:Hello 朋友,welcome to 杭州
+ *
+ * @author https://www.wdbyte.com
+ */
+public class WelcomeMain {
+
+ /**
+ * 启动应用程序
+ *
+ * @param args - 应用启动参数
+ */
+ public static void main(String[] args) {
+ System.out.println(getMessage("朋友", "杭州"));
+ }
+
+ /**
+ * 返回一个欢迎信息。
+ *
+ * @param name - 访问者名称
+ * @param region - 地域信息
+ * @return - 欢迎信息
+ */
+ public static String getMessage(String name, String region) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("Hello ");
+ builder.append(name);
+ builder.append(", Welcome to ");
+ builder.append(region);
+ builder.append(" !!");
+ return builder.toString();
+ }
+
+
+ /**
+ * 计算两数之和
+ * @param x 数字1
+ * @param y 数字2
+ * @return
+ */
+ public int add(int x, int y) {
+ /*
+ * 计算两数之和
+ */
+ int s = x + y;
+ return s;
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/allclasses-frame.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/allclasses-frame.html
new file mode 100644
index 0000000..d1e5c11
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/allclasses-frame.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+所有类
+
+
+
+
+
+所有类
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/allclasses-noframe.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/allclasses-noframe.html
new file mode 100644
index 0000000..4e6a6c4
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/allclasses-noframe.html
@@ -0,0 +1,19 @@
+
+
+
+
+
+所有类
+
+
+
+
+
+所有类
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/JavaDocDemo.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/JavaDocDemo.html
new file mode 100644
index 0000000..12f6a1c
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/JavaDocDemo.html
@@ -0,0 +1,310 @@
+
+
+
+
+
+JavaDocDemo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+- 概要:
+- 嵌套 |
+- 字段 |
+- 构造器 |
+- 方法
+
+
+- 详细资料:
+- 字段 |
+- 构造器 |
+- 方法
+
+
+
+
+
+
+
+
+
+
+- java.lang.Object
+-
+
+- com.wdbyte.comment.JavaDocDemo
+
+
+
+
+
+
+-
+
+
+
+
+-
+
+
+
方法概要
+
+所有方法 静态方法 具体方法
+
+| 限定符和类型 |
+方法和说明 |
+
+
+static java.lang.String |
+getMessage(java.lang.String name,
+ java.lang.String region)
+返回一个欢迎信息。
+ |
+
+
+static void |
+main(java.lang.String[] args)
+启动应用程序
+ |
+
+
+
+-
+
+
+
从类继承的方法 java.lang.Object
+clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
+
+
+
+
+
+
+
+
+-
+
+
+-
+
+
+
构造器详细资料
+
+
+
+
+-
+
JavaDocDemo
+public JavaDocDemo()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+- 概要:
+- 嵌套 |
+- 字段 |
+- 构造器 |
+- 方法
+
+
+- 详细资料:
+- 字段 |
+- 构造器 |
+- 方法
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-frame.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-frame.html
new file mode 100644
index 0000000..cafb6ef
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-frame.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+com.wdbyte.comment
+
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-summary.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-summary.html
new file mode 100644
index 0000000..14848c8
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-summary.html
@@ -0,0 +1,140 @@
+
+
+
+
+
+com.wdbyte.comment
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-
+
+类概要
+
+| 类 |
+说明 |
+
+
+
+| JavaDocDemo |
+
+ 输出一个名称和地域的问候信息。
+ |
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-tree.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-tree.html
new file mode 100644
index 0000000..dad782d
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/com/wdbyte/comment/package-tree.html
@@ -0,0 +1,129 @@
+
+
+
+
+
+com.wdbyte.comment 类分层结构
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/constant-values.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/constant-values.html
new file mode 100644
index 0000000..be8d957
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/constant-values.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+常量字段值
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/deprecated-list.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/deprecated-list.html
new file mode 100644
index 0000000..a03d078
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/deprecated-list.html
@@ -0,0 +1,120 @@
+
+
+
+
+
+已过时的列表
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/help-doc.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/help-doc.html
new file mode 100644
index 0000000..b96669f
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/help-doc.html
@@ -0,0 +1,217 @@
+
+
+
+
+
+API 帮助
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-
+
程序包
+每个程序包都有一个页面, 其中包含它的类和接口的列表及其概要。此页面可以包含六个类别:
+
+- 接口 (斜体)
+- 类
+- 枚举
+- 异常错误
+- 错误
+- 注释类型
+
+
+-
+
类/接口
+每个类, 接口, 嵌套类和嵌套接口都有各自的页面。其中每个页面都由三部分 (类/接口说明, 概要表, 以及详细的成员说明) 组成:
+
+- 类继承图
+- 直接子类
+- 所有已知子接口
+- 所有已知实现类
+- 类/接口声明
+- 类/接口说明
+
+
+- 嵌套类概要
+- 字段概要
+- 构造器概要
+- 方法概要
+
+
+- 字段详细资料
+- 构造器详细资料
+- 方法详细资料
+
+每个概要条目都包含该项目的详细说明的第一句。概要条目按字母顺序排列, 而详细说明则按其在源代码中出现的顺序排列。这样保持了程序员所建立的逻辑分组。
+
+-
+
注释类型
+每个注释类型都有各自的页面, 其中包含以下部分:
+
+- 注释类型声明
+- 注释类型说明
+- 必需元素概要
+- 可选元素概要
+- 元素详细资料
+
+
+-
+
枚举
+每个枚举都有各自的页面, 其中包含以下部分:
+
+- 枚举声明
+- 枚举说明
+- 枚举常量概要
+- 枚举常量详细资料
+
+
+-
+
树 (类分层结构)
+对于所有程序包, 有一个类分层结构页面, 以及每个程序包的分层结构。每个分层结构页面都包含类的列表和接口的列表。从java.lang.Object开始, 按继承结构对类进行排列。接口不从java.lang.Object继承。
+
+- 查看“概览”页面时, 单击 "树" 将显示所有程序包的分层结构。
+- 查看特定程序包, 类或接口页面时, 单击 "树" 将仅显示该程序包的分层结构。
+
+
+-
+
已过时的 API
+已过时的 API 页面列出了所有已过时的 API。一般由于进行了改进并且通常提供了替代的 API, 所以建议不要使用已过时的 API。在将来的实现过程中, 可能会删除已过时的 API。
+
+-
+
索引
+索引 包含按字母顺序排列的所有类, 接口, 构造器, 方法和字段的列表。
+
+-
+
上一个/下一个
+这些链接使您可以转至下一个或上一个类, 接口, 程序包或相关页面。
+
+-
+
框架/无框架
+这些链接用于显示和隐藏 HTML 框架。所有页面均具有有框架和无框架两种显示方式。
+
+-
+
所有类
+所有类链接显示所有类和接口 (除了非静态嵌套类型)。
+
+-
+
序列化表格
+每个可序列化或可外部化的类都有其序列化字段和方法的说明。此信息对重新实现者有用, 而对使用 API 的开发者则没有什么用处。尽管导航栏中没有链接, 但您可以通过下列方式获取此信息: 转至任何序列化类, 然后单击类说明的 "另请参阅" 部分中的 "序列化表格"。
+
+-
+
常量字段值
+常量字段值页面列出了静态最终字段及其值。
+
+
+
此帮助文件适用于使用标准 doclet 生成的 API 文档。
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/index-all.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/index-all.html
new file mode 100644
index 0000000..06a699f
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/index-all.html
@@ -0,0 +1,157 @@
+
+
+
+
+
+索引
+
+
+
+
+
+
+
+
+
+
+
+C G J M
+
+
+
C
+
+- com.wdbyte.comment - 程序包 com.wdbyte.comment
+-
+
+
+
+
+
G
+
+- getMessage(String, String) - 类 中的静态方法com.wdbyte.comment.JavaDocDemo
+-
+
返回一个欢迎信息。
+
+
+
+
+
+
J
+
+- JavaDocDemo - com.wdbyte.comment中的类
+-
+
输出一个名称和地域的问候信息。
+
+- JavaDocDemo() - 类 的构造器com.wdbyte.comment.JavaDocDemo
+-
+
+
+
+
+
M
+
+- main(String[]) - 类 中的静态方法com.wdbyte.comment.JavaDocDemo
+-
+
启动应用程序
+
+
+
C G J M
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/index.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/index.html
new file mode 100644
index 0000000..720515c
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/index.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+生成的文档 (无标题)
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/overview-tree.html b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/overview-tree.html
new file mode 100644
index 0000000..50e2869
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/overview-tree.html
@@ -0,0 +1,133 @@
+
+
+
+
+
+类分层结构
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/package-list b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/package-list
new file mode 100644
index 0000000..84f8f0f
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/package-list
@@ -0,0 +1 @@
+com.wdbyte.comment
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/script.js b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/script.js
new file mode 100644
index 0000000..b346356
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/script.js
@@ -0,0 +1,30 @@
+function show(type)
+{
+ count = 0;
+ for (var key in methods) {
+ var row = document.getElementById(key);
+ if ((methods[key] & type) != 0) {
+ row.style.display = '';
+ row.className = (count++ % 2) ? rowColor : altColor;
+ }
+ else
+ row.style.display = 'none';
+ }
+ updateTabs(type);
+}
+
+function updateTabs(type)
+{
+ for (var value in tabs) {
+ var sNode = document.getElementById(tabs[value][0]);
+ var spanNode = sNode.firstChild;
+ if (value == type) {
+ sNode.className = activeTableTab;
+ spanNode.innerHTML = tabs[value][1];
+ }
+ else {
+ sNode.className = tableTab;
+ spanNode.innerHTML = "" + tabs[value][1] + "";
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/stylesheet.css b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/stylesheet.css
new file mode 100644
index 0000000..98055b2
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/comment/doc/stylesheet.css
@@ -0,0 +1,574 @@
+/* Javadoc style sheet */
+/*
+Overall document style
+*/
+
+@import url('resources/fonts/dejavu.css');
+
+body {
+ background-color:#ffffff;
+ color:#353833;
+ font-family:'DejaVu Sans', Arial, Helvetica, sans-serif;
+ font-size:14px;
+ margin:0;
+}
+a:link, a:visited {
+ text-decoration:none;
+ color:#4A6782;
+}
+a:hover, a:focus {
+ text-decoration:none;
+ color:#bb7a2a;
+}
+a:active {
+ text-decoration:none;
+ color:#4A6782;
+}
+a[name] {
+ color:#353833;
+}
+a[name]:hover {
+ text-decoration:none;
+ color:#353833;
+}
+pre {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+}
+h1 {
+ font-size:20px;
+}
+h2 {
+ font-size:18px;
+}
+h3 {
+ font-size:16px;
+ font-style:italic;
+}
+h4 {
+ font-size:13px;
+}
+h5 {
+ font-size:12px;
+}
+h6 {
+ font-size:11px;
+}
+ul {
+ list-style-type:disc;
+}
+code, tt {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ padding-top:4px;
+ margin-top:8px;
+ line-height:1.4em;
+}
+dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ padding-top:4px;
+}
+table tr td dt code {
+ font-family:'DejaVu Sans Mono', monospace;
+ font-size:14px;
+ vertical-align:top;
+ padding-top:4px;
+}
+sup {
+ font-size:8px;
+}
+/*
+Document title and Copyright styles
+*/
+.clear {
+ clear:both;
+ height:0px;
+ overflow:hidden;
+}
+.aboutLanguage {
+ float:right;
+ padding:0px 21px;
+ font-size:11px;
+ z-index:200;
+ margin-top:-9px;
+}
+.legalCopy {
+ margin-left:.5em;
+}
+.bar a, .bar a:link, .bar a:visited, .bar a:active {
+ color:#FFFFFF;
+ text-decoration:none;
+}
+.bar a:hover, .bar a:focus {
+ color:#bb7a2a;
+}
+.tab {
+ background-color:#0066FF;
+ color:#ffffff;
+ padding:8px;
+ width:5em;
+ font-weight:bold;
+}
+/*
+Navigation bar styles
+*/
+.bar {
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ padding:.8em .5em .4em .8em;
+ height:auto;/*height:1.8em;*/
+ font-size:11px;
+ margin:0;
+}
+.topNav {
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ float:left;
+ padding:0;
+ width:100%;
+ clear:right;
+ height:2.8em;
+ padding-top:10px;
+ overflow:hidden;
+ font-size:12px;
+}
+.bottomNav {
+ margin-top:10px;
+ background-color:#4D7A97;
+ color:#FFFFFF;
+ float:left;
+ padding:0;
+ width:100%;
+ clear:right;
+ height:2.8em;
+ padding-top:10px;
+ overflow:hidden;
+ font-size:12px;
+}
+.subNav {
+ background-color:#dee3e9;
+ float:left;
+ width:100%;
+ overflow:hidden;
+ font-size:12px;
+}
+.subNav div {
+ clear:left;
+ float:left;
+ padding:0 0 5px 6px;
+ text-transform:uppercase;
+}
+ul.navList, ul.subNavList {
+ float:left;
+ margin:0 25px 0 0;
+ padding:0;
+}
+ul.navList li{
+ list-style:none;
+ float:left;
+ padding: 5px 6px;
+ text-transform:uppercase;
+}
+ul.subNavList li{
+ list-style:none;
+ float:left;
+}
+.topNav a:link, .topNav a:active, .topNav a:visited, .bottomNav a:link, .bottomNav a:active, .bottomNav a:visited {
+ color:#FFFFFF;
+ text-decoration:none;
+ text-transform:uppercase;
+}
+.topNav a:hover, .bottomNav a:hover {
+ text-decoration:none;
+ color:#bb7a2a;
+ text-transform:uppercase;
+}
+.navBarCell1Rev {
+ background-color:#F8981D;
+ color:#253441;
+ margin: auto 5px;
+}
+.skipNav {
+ position:absolute;
+ top:auto;
+ left:-9999px;
+ overflow:hidden;
+}
+/*
+Page header and footer styles
+*/
+.header, .footer {
+ clear:both;
+ margin:0 20px;
+ padding:5px 0 0 0;
+}
+.indexHeader {
+ margin:10px;
+ position:relative;
+}
+.indexHeader span{
+ margin-right:15px;
+}
+.indexHeader h1 {
+ font-size:13px;
+}
+.title {
+ color:#2c4557;
+ margin:10px 0;
+}
+.subTitle {
+ margin:5px 0 0 0;
+}
+.header ul {
+ margin:0 0 15px 0;
+ padding:0;
+}
+.footer ul {
+ margin:20px 0 5px 0;
+}
+.header ul li, .footer ul li {
+ list-style:none;
+ font-size:13px;
+}
+/*
+Heading styles
+*/
+div.details ul.blockList ul.blockList ul.blockList li.blockList h4, div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
+ background-color:#dee3e9;
+ border:1px solid #d0d9e0;
+ margin:0 0 6px -8px;
+ padding:7px 5px;
+}
+ul.blockList ul.blockList ul.blockList li.blockList h3 {
+ background-color:#dee3e9;
+ border:1px solid #d0d9e0;
+ margin:0 0 6px -8px;
+ padding:7px 5px;
+}
+ul.blockList ul.blockList li.blockList h3 {
+ padding:0;
+ margin:15px 0;
+}
+ul.blockList li.blockList h2 {
+ padding:0px 0 20px 0;
+}
+/*
+Page layout container styles
+*/
+.contentContainer, .sourceContainer, .classUseContainer, .serializedFormContainer, .constantValuesContainer {
+ clear:both;
+ padding:10px 20px;
+ position:relative;
+}
+.indexContainer {
+ margin:10px;
+ position:relative;
+ font-size:12px;
+}
+.indexContainer h2 {
+ font-size:13px;
+ padding:0 0 3px 0;
+}
+.indexContainer ul {
+ margin:0;
+ padding:0;
+}
+.indexContainer ul li {
+ list-style:none;
+ padding-top:2px;
+}
+.contentContainer .description dl dt, .contentContainer .details dl dt, .serializedFormContainer dl dt {
+ font-size:12px;
+ font-weight:bold;
+ margin:10px 0 0 0;
+ color:#4E4E4E;
+}
+.contentContainer .description dl dd, .contentContainer .details dl dd, .serializedFormContainer dl dd {
+ margin:5px 0 10px 0px;
+ font-size:14px;
+ font-family:'DejaVu Sans Mono',monospace;
+}
+.serializedFormContainer dl.nameValue dt {
+ margin-left:1px;
+ font-size:1.1em;
+ display:inline;
+ font-weight:bold;
+}
+.serializedFormContainer dl.nameValue dd {
+ margin:0 0 0 1px;
+ font-size:1.1em;
+ display:inline;
+}
+/*
+List styles
+*/
+ul.horizontal li {
+ display:inline;
+ font-size:0.9em;
+}
+ul.inheritance {
+ margin:0;
+ padding:0;
+}
+ul.inheritance li {
+ display:inline;
+ list-style:none;
+}
+ul.inheritance li ul.inheritance {
+ margin-left:15px;
+ padding-left:15px;
+ padding-top:1px;
+}
+ul.blockList, ul.blockListLast {
+ margin:10px 0 10px 0;
+ padding:0;
+}
+ul.blockList li.blockList, ul.blockListLast li.blockList {
+ list-style:none;
+ margin-bottom:15px;
+ line-height:1.4;
+}
+ul.blockList ul.blockList li.blockList, ul.blockList ul.blockListLast li.blockList {
+ padding:0px 20px 5px 10px;
+ border:1px solid #ededed;
+ background-color:#f8f8f8;
+}
+ul.blockList ul.blockList ul.blockList li.blockList, ul.blockList ul.blockList ul.blockListLast li.blockList {
+ padding:0 0 5px 8px;
+ background-color:#ffffff;
+ border:none;
+}
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
+ margin-left:0;
+ padding-left:0;
+ padding-bottom:15px;
+ border:none;
+}
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
+ list-style:none;
+ border-bottom:none;
+ padding-bottom:0;
+}
+table tr td dl, table tr td dl dt, table tr td dl dd {
+ margin-top:0;
+ margin-bottom:1px;
+}
+/*
+Table styles
+*/
+.overviewSummary, .memberSummary, .typeSummary, .useSummary, .constantsSummary, .deprecatedSummary {
+ width:100%;
+ border-left:1px solid #EEE;
+ border-right:1px solid #EEE;
+ border-bottom:1px solid #EEE;
+}
+.overviewSummary, .memberSummary {
+ padding:0px;
+}
+.overviewSummary caption, .memberSummary caption, .typeSummary caption,
+.useSummary caption, .constantsSummary caption, .deprecatedSummary caption {
+ position:relative;
+ text-align:left;
+ background-repeat:no-repeat;
+ color:#253441;
+ font-weight:bold;
+ clear:none;
+ overflow:hidden;
+ padding:0px;
+ padding-top:10px;
+ padding-left:1px;
+ margin:0px;
+ white-space:pre;
+}
+.overviewSummary caption a:link, .memberSummary caption a:link, .typeSummary caption a:link,
+.useSummary caption a:link, .constantsSummary caption a:link, .deprecatedSummary caption a:link,
+.overviewSummary caption a:hover, .memberSummary caption a:hover, .typeSummary caption a:hover,
+.useSummary caption a:hover, .constantsSummary caption a:hover, .deprecatedSummary caption a:hover,
+.overviewSummary caption a:active, .memberSummary caption a:active, .typeSummary caption a:active,
+.useSummary caption a:active, .constantsSummary caption a:active, .deprecatedSummary caption a:active,
+.overviewSummary caption a:visited, .memberSummary caption a:visited, .typeSummary caption a:visited,
+.useSummary caption a:visited, .constantsSummary caption a:visited, .deprecatedSummary caption a:visited {
+ color:#FFFFFF;
+}
+.overviewSummary caption span, .memberSummary caption span, .typeSummary caption span,
+.useSummary caption span, .constantsSummary caption span, .deprecatedSummary caption span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ padding-bottom:7px;
+ display:inline-block;
+ float:left;
+ background-color:#F8981D;
+ border: none;
+ height:16px;
+}
+.memberSummary caption span.activeTableTab span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ margin-right:3px;
+ display:inline-block;
+ float:left;
+ background-color:#F8981D;
+ height:16px;
+}
+.memberSummary caption span.tableTab span {
+ white-space:nowrap;
+ padding-top:5px;
+ padding-left:12px;
+ padding-right:12px;
+ margin-right:3px;
+ display:inline-block;
+ float:left;
+ background-color:#4D7A97;
+ height:16px;
+}
+.memberSummary caption span.tableTab, .memberSummary caption span.activeTableTab {
+ padding-top:0px;
+ padding-left:0px;
+ padding-right:0px;
+ background-image:none;
+ float:none;
+ display:inline;
+}
+.overviewSummary .tabEnd, .memberSummary .tabEnd, .typeSummary .tabEnd,
+.useSummary .tabEnd, .constantsSummary .tabEnd, .deprecatedSummary .tabEnd {
+ display:none;
+ width:5px;
+ position:relative;
+ float:left;
+ background-color:#F8981D;
+}
+.memberSummary .activeTableTab .tabEnd {
+ display:none;
+ width:5px;
+ margin-right:3px;
+ position:relative;
+ float:left;
+ background-color:#F8981D;
+}
+.memberSummary .tableTab .tabEnd {
+ display:none;
+ width:5px;
+ margin-right:3px;
+ position:relative;
+ background-color:#4D7A97;
+ float:left;
+
+}
+.overviewSummary td, .memberSummary td, .typeSummary td,
+.useSummary td, .constantsSummary td, .deprecatedSummary td {
+ text-align:left;
+ padding:0px 0px 12px 10px;
+}
+th.colOne, th.colFirst, th.colLast, .useSummary th, .constantsSummary th,
+td.colOne, td.colFirst, td.colLast, .useSummary td, .constantsSummary td{
+ vertical-align:top;
+ padding-right:0px;
+ padding-top:8px;
+ padding-bottom:3px;
+}
+th.colFirst, th.colLast, th.colOne, .constantsSummary th {
+ background:#dee3e9;
+ text-align:left;
+ padding:8px 3px 3px 7px;
+}
+td.colFirst, th.colFirst {
+ white-space:nowrap;
+ font-size:13px;
+}
+td.colLast, th.colLast {
+ font-size:13px;
+}
+td.colOne, th.colOne {
+ font-size:13px;
+}
+.overviewSummary td.colFirst, .overviewSummary th.colFirst,
+.useSummary td.colFirst, .useSummary th.colFirst,
+.overviewSummary td.colOne, .overviewSummary th.colOne,
+.memberSummary td.colFirst, .memberSummary th.colFirst,
+.memberSummary td.colOne, .memberSummary th.colOne,
+.typeSummary td.colFirst{
+ width:25%;
+ vertical-align:top;
+}
+td.colOne a:link, td.colOne a:active, td.colOne a:visited, td.colOne a:hover, td.colFirst a:link, td.colFirst a:active, td.colFirst a:visited, td.colFirst a:hover, td.colLast a:link, td.colLast a:active, td.colLast a:visited, td.colLast a:hover, .constantValuesContainer td a:link, .constantValuesContainer td a:active, .constantValuesContainer td a:visited, .constantValuesContainer td a:hover {
+ font-weight:bold;
+}
+.tableSubHeadingColor {
+ background-color:#EEEEFF;
+}
+.altColor {
+ background-color:#FFFFFF;
+}
+.rowColor {
+ background-color:#EEEEEF;
+}
+/*
+Content styles
+*/
+.description pre {
+ margin-top:0;
+}
+.deprecatedContent {
+ margin:0;
+ padding:10px 0;
+}
+.docSummary {
+ padding:0;
+}
+
+ul.blockList ul.blockList ul.blockList li.blockList h3 {
+ font-style:normal;
+}
+
+div.block {
+ font-size:14px;
+ font-family:'DejaVu Serif', Georgia, "Times New Roman", Times, serif;
+}
+
+td.colLast div {
+ padding-top:0px;
+}
+
+
+td.colLast a {
+ padding-bottom:3px;
+}
+/*
+Formatting effect styles
+*/
+.sourceLineNo {
+ color:green;
+ padding:0 30px 0 0;
+}
+h1.hidden {
+ visibility:hidden;
+ overflow:hidden;
+ font-size:10px;
+}
+.block {
+ display:block;
+ margin:3px 10px 2px 0px;
+ color:#474747;
+}
+.deprecatedLabel, .descfrmTypeLabel, .memberNameLabel, .memberNameLink,
+.overrideSpecifyLabel, .packageHierarchyLabel, .paramLabel, .returnLabel,
+.seeLabel, .simpleTagLabel, .throwsLabel, .typeNameLabel, .typeNameLink {
+ font-weight:bold;
+}
+.deprecationComment, .emphasizedPhrase, .interfaceName {
+ font-style:italic;
+}
+
+div.block div.block span.deprecationComment, div.block div.block span.emphasizedPhrase,
+div.block div.block span.interfaceName {
+ font-style:normal;
+}
+
+div.contentContainer ul.blockList li.blockList h2{
+ padding-bottom:0px;
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCalc.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCalc.java
new file mode 100644
index 0000000..5c39fa8
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCalc.java
@@ -0,0 +1,68 @@
+package com.wdbyte.date;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/26
+ */
+public class JavaDateCalc {
+ public static void main(String[] args) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ Date date = new Date();
+ System.out.println(String.format("当前时间:%s", sdf.format(date)));
+ date = new JavaDateCalc().addDay(date, 3);
+ System.out.println(String.format("增加三天:%s", sdf.format(date)));
+ date = new JavaDateCalc().minDay(date, 1);
+ System.out.println(String.format("减去一天:%s", sdf.format(date)));
+ date = new JavaDateCalc().addMonth(date, 2);
+ System.out.println(String.format("增加两个月:%s", sdf.format(date)));
+ }
+
+ /**
+ * 增加天数
+ *
+ * @param date
+ * @param addDay
+ * @return
+ */
+ public Date addDay(Date date, int addDay) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.add(Calendar.DATE, addDay);
+ Date newDate = cal.getTime();
+ return newDate;
+ }
+
+ /**
+ * 减少天数
+ *
+ * @param date
+ * @param minDay
+ * @return
+ */
+ public Date minDay(Date date, int minDay) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.add(Calendar.DATE, -minDay);
+ Date newDate = cal.getTime();
+ return newDate;
+ }
+
+ /**
+ * 增加月份
+ *
+ * @param date
+ * @param addMonth
+ * @return
+ */
+ public Date addMonth(Date date, int addMonth) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.add(Calendar.MONTH, addMonth);
+ Date newDate = cal.getTime();
+ return newDate;
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCalc2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCalc2.java
new file mode 100644
index 0000000..922030f
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCalc2.java
@@ -0,0 +1,24 @@
+package com.wdbyte.date;
+
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/26
+ */
+public class JavaDateCalc2 {
+ public static void main(String[] args) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ Date date = new Date();
+ System.out.println(String.format("当前时间:%s", sdf.format(date)));
+ // 三天的毫秒数:3 * 24 * 3600 * 1000
+ date = new Date(date.getTime() + 3 * 24 * 3600 * 1000);
+ System.out.println(String.format("增加三天:%s", sdf.format(date)));
+
+ date = new Date(date.getTime() - 1 * 60 * 1000);
+ System.out.println(String.format("减去一分钟:%s", sdf.format(date)));
+ }
+
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCreate.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCreate.java
new file mode 100644
index 0000000..44c6bbb
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateCreate.java
@@ -0,0 +1,22 @@
+package com.wdbyte.date;
+
+import java.util.Date;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/25
+ */
+public class JavaDateCreate {
+ public static void main(String[] args) {
+ Date date = new Date();
+ // 输出时间
+ System.out.println(date); // Tue Apr 25 20:28:23 CST 2023
+ // 输出毫秒数
+ System.out.println(date.getTime()); // 1682425703429
+
+ // 当前毫秒数创建对象
+ //Date date2 = new Date(System.currentTimeMillis());
+ Date date2 = new Date(1682425703429L);
+ System.out.println(date2); // Tue Apr 25 20:28:23 CST 2023
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateDiff.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateDiff.java
new file mode 100644
index 0000000..09e3363
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateDiff.java
@@ -0,0 +1,54 @@
+package com.wdbyte.date;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/25
+ */
+public class JavaDateDiff {
+
+ public static void main(String[] args) throws InterruptedException {
+ // 获取当前时间
+ Date date1 = new Date();
+ // 休眠 3 秒
+ Thread.sleep(3000);
+ // 再获取一次当前时间
+ Date date2 = new Date();
+
+ // 很明显 date1 在 date2 之前,,所以 true
+ boolean before = date1.before(date2);
+ System.out.println(before); // true
+
+ // 很明显 date2 在 date1 之后,所以 true
+ boolean after = date2.after(date1);
+ System.out.println(after); // true
+
+ // date2 不在 date1 之前,所以 false
+ System.out.println(date2.before(date1)); // false
+
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ System.out.println("date1:"+sdf.format(date1));
+ System.out.println("date2:"+sdf.format(date2));
+ Long diff = date1.getTime() - date2.getTime();
+ if (diff > 0) {
+ System.out.println("date1 > date2");
+ }
+ if (diff < 0) {
+ System.out.println("date1 < date2");
+ }
+ if (diff == 0) {
+ System.out.println("date1 = date2");
+ }
+ exec();
+ }
+
+ public static void exec() throws InterruptedException {
+ long start = System.currentTimeMillis();
+ // 做点什么
+ Thread.sleep(3000);
+ long end = System.currentTimeMillis();
+ System.out.println("耗时:" + (end - start) + "ms");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateFormat.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateFormat.java
new file mode 100644
index 0000000..96a3c89
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/date/JavaDateFormat.java
@@ -0,0 +1,32 @@
+package com.wdbyte.date;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/25
+ */
+public class JavaDateFormat {
+
+ public static void main(String[] args) throws ParseException {
+ Date date = new Date();
+
+ // 时间格式化,yyyy 年份,MM 月份, dd 当月第多少天, hh:mm:ss 分别为时分秒
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ String formatDate = simpleDateFormat.format(date);
+ System.out.println(formatDate);
+
+ SimpleDateFormat sdf1 = new SimpleDateFormat("当前日期是: yyyy-MM-dd");
+ SimpleDateFormat sdf2 = new SimpleDateFormat("当前时间是: hh:mm:ss");
+ System.out.println(sdf1.format(date));
+ System.out.println(sdf2.format(date));
+
+
+ String strDate = "2023-01-19 10:30:00";
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ Date myDate = sdf.parse(strDate);
+ System.out.println(sdf.format(myDate));
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Calc.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Calc.java
new file mode 100644
index 0000000..d42ac62
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Calc.java
@@ -0,0 +1,30 @@
+package com.wdbyte.enum2;
+
+/**
+ * 计算枚举类
+ */
+public enum Calc {
+ // 加法
+ PLUS {
+ public int apply(int x, int y) {
+ return x + y;
+ }
+ },
+ // 减法
+ MINUS {
+ public int apply(int x, int y) {
+ return x - y;
+ }
+ },
+ // 乘法
+ MULTIPLY {
+ public int apply(int x, int y) {
+ return x * y;
+ }
+ };
+
+ public int apply(int x, int y){
+ // todo
+ return x + y;
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/CalcTest.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/CalcTest.java
new file mode 100644
index 0000000..56e2465
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/CalcTest.java
@@ -0,0 +1,19 @@
+package com.wdbyte.enum2;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/05/01
+ */
+public class CalcTest {
+ public static void main(String[] args) {
+ // 加法
+ int res = Calc.PLUS.apply(2, 3);
+ System.out.println(res);
+ // 减法
+ res = Calc.MINUS.apply(2, 3);
+ System.out.println(res);
+ // 乘法
+ res = Calc.MULTIPLY.apply(2, 3);
+ System.out.println(res);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Rectangle.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Rectangle.java
new file mode 100644
index 0000000..43ba0ac
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Rectangle.java
@@ -0,0 +1,28 @@
+package com.wdbyte.enum2;
+
+/**
+ * 矩形枚举类
+ */
+public enum Rectangle implements Shape {
+ SMALL(3, 4),
+ MEDIUM(4, 5),
+ LARGE(5, 6);
+
+ private int length;
+ private int width;
+
+ Rectangle(int length, int width) {
+ this.length = length;
+ this.width = width;
+ }
+
+ public double getArea() {
+ return length * width;
+ }
+
+ public static void main(String[] args) {
+ Shape shape = Rectangle.LARGE;
+ double shapeArea = shape.getArea();
+ System.out.println(shapeArea);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Shape.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Shape.java
new file mode 100644
index 0000000..8bc2d2d
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Shape.java
@@ -0,0 +1,12 @@
+package com.wdbyte.enum2;
+
+/**
+ * 形状接口
+ */
+public interface Shape {
+ /**
+ * 计算面积
+ * @return
+ */
+ double getArea();
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Weekday.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Weekday.java
new file mode 100644
index 0000000..e8aa799
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/Weekday.java
@@ -0,0 +1,11 @@
+package com.wdbyte.enum2;
+
+public enum Weekday {
+ MONDAY,
+ TUESDAY,
+ WEDNESDAY,
+ THURSDAY,
+ FRIDAY,
+ SATURDAY,
+ SUNDAY
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/WeekdayTest.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/WeekdayTest.java
new file mode 100644
index 0000000..30e6fd8
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/enum2/WeekdayTest.java
@@ -0,0 +1,30 @@
+package com.wdbyte.enum2;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/05/01
+ */
+public class WeekdayTest {
+ public static void main(String[] args) {
+ Weekday day = Weekday.MONDAY;
+ if (day == Weekday.MONDAY) {
+ System.out.println("Today is Monday.");
+ }
+
+ Weekday[] weekdays = Weekday.values();
+ for (Weekday weekday : weekdays) {
+ System.out.println(weekday);
+ }
+
+ for (Weekday weekday : weekdays) {
+ System.out.println(weekday.ordinal());
+ }
+ Weekday monday = Weekday.MONDAY;
+ switch (monday){
+ case MONDAY :{System.out.println("周一");break;}
+ case SUNDAY :{System.out.println("周末");break;}
+ }
+ System.out.println(Weekday.valueOf("MONDAY"));
+ System.out.println(Weekday.valueOf("MONDAY1"));
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException1.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException1.java
new file mode 100644
index 0000000..8fe2506
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException1.java
@@ -0,0 +1,12 @@
+package com.wdbyte.exception;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class JavaException1 {
+
+ public static void main(String[] args) {
+ String str = null;
+ System.out.println(str.length());
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException2.java
new file mode 100644
index 0000000..c5b2386
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException2.java
@@ -0,0 +1,13 @@
+package com.wdbyte.exception;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class JavaException2 {
+
+ public static void main(String[] args) {
+ String[] strArr = {"www", "wdbyte", "com"};
+ System.out.println(strArr[0]);
+ System.out.println(strArr[3]);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException3.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException3.java
new file mode 100644
index 0000000..5e37b10
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException3.java
@@ -0,0 +1,19 @@
+package com.wdbyte.exception;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class JavaException3 {
+
+ public static void main(String[] args) {
+ String[] strArr = {"www", "wdbyte", "com"};
+ try {
+ System.out.println(strArr[0]);
+ System.out.println(strArr[3]);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println("发生数组访问越界异常,不能访问超过数组长度的元素,数组长度为:" + strArr.length);
+ System.out.println("异常描述:" + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException4.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException4.java
new file mode 100644
index 0000000..0ba0f3d
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException4.java
@@ -0,0 +1,19 @@
+package com.wdbyte.exception;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class JavaException4 {
+
+ public static void main(String[] args) {
+ String[] strArr = {"www", "wdbyte", "com"};
+ try {
+ System.out.println(strArr[0]);
+ System.out.println(strArr[3]);
+ } catch (ArrayIndexOutOfBoundsException e) {
+ //throw e;
+ throw new RuntimeException(e);
+ }
+ System.out.println("执行完成。");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException5.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException5.java
new file mode 100644
index 0000000..9366d98
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException5.java
@@ -0,0 +1,35 @@
+package com.wdbyte.exception;
+
+import org.apache.commons.lang3.ObjectUtils.Null;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class JavaException5 {
+
+ public static void main(String[] args) {
+ String[] strArr = {"www", null, "com"};
+ try {
+ System.out.println(strArr[0].length());
+ // 空指针异常
+ System.out.println(strArr[1].length());
+ System.out.println(strArr[3].length());
+ } catch (ArrayIndexOutOfBoundsException e) {
+ System.out.println("发生数组访问越界异常,不能访问超过数组长度的元素,数组长度为:" + strArr.length);
+ } catch (NullPointerException e) {
+ System.out.println("发现空指针异常");
+ }
+ System.out.println("执行完成。");
+
+ try {
+ System.out.println(strArr[0].length());
+ // 空指针异常
+ System.out.println(strArr[1].length());
+ // 越界异常
+ System.out.println(strArr[3].length());
+ } catch (Exception e) {
+ System.out.println("发生异常:" + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException6.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException6.java
new file mode 100644
index 0000000..2b68230
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException6.java
@@ -0,0 +1,20 @@
+package com.wdbyte.exception;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/27
+ */
+public class JavaException6 {
+
+ public static void main(String[] args) {
+ try {
+ Files.readAllLines(Paths.get("c:/abc.txt"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException7.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException7.java
new file mode 100644
index 0000000..bdbbc19
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException7.java
@@ -0,0 +1,22 @@
+package com.wdbyte.exception;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/27
+ */
+public class JavaException7 {
+
+ public static void main(String[] args) {
+ try {
+ Files.readAllLines(Paths.get("c:/abc.txt"));
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException8.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException8.java
new file mode 100644
index 0000000..1f86646
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/JavaException8.java
@@ -0,0 +1,33 @@
+package com.wdbyte.exception;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class JavaException8 {
+
+ public static void main(String[] args) {
+ int result = 0;
+ try {
+ result = calc(4, 2);
+ System.out.println("4 / 2 = " + result);
+ } catch (MyException e) { // 不处理异常会报错
+ e.printStackTrace();
+ }
+
+ try {
+ result = calc(4, 0);
+ System.out.println("4 / 0 = " + result);
+ } catch (MyException e) { // 不处理异常会报错
+ e.printStackTrace();
+ }
+ }
+
+ public static int calc(int a, int b) throws MyException {
+ if (b == 0) {
+ throw new MyException("除数不能为0");
+ }
+ return a / b;
+ }
+}
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/MyException.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/MyException.java
new file mode 100644
index 0000000..a91c4a2
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/MyException.java
@@ -0,0 +1,7 @@
+package com.wdbyte.exception;
+
+public class MyException extends Exception {
+ public MyException(String message) {
+ super(message);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/ReadFile.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/ReadFile.java
new file mode 100644
index 0000000..664cfc3
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/ReadFile.java
@@ -0,0 +1,45 @@
+package com.wdbyte.exception;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ReadFile {
+
+ public static void main(String[] args) {
+
+ File file = new File("pom2.xml");
+ FileReader fileReader = null;
+ BufferedReader bufferedReader = null;
+ try {
+ fileReader = new FileReader(file);
+ bufferedReader = new BufferedReader(fileReader);
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ System.out.println(line);
+ }
+ bufferedReader.close();
+ fileReader.close();
+ } catch (FileNotFoundException e) {
+ System.out.println("文件不存在");
+ } catch (IOException e) {
+ System.out.println("读取文件失败");
+ } finally {
+ try {
+ System.out.println("开始关闭资源");
+ if (bufferedReader != null) {
+ bufferedReader.close();
+ System.out.println("关闭 bufferedReader");
+ }
+ if (fileReader != null) {
+ fileReader.close();
+ System.out.println("关闭 fileReader");
+ }
+ } catch (IOException e) {
+ System.out.println("关闭文件失败");
+ }
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/ReadFile2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/ReadFile2.java
new file mode 100644
index 0000000..d238afb
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/exception/ReadFile2.java
@@ -0,0 +1,25 @@
+package com.wdbyte.exception;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+
+public class ReadFile2 {
+
+ public static void main(String[] args) {
+ File file = new File("pom.xml");
+ try (FileReader fileReader = new FileReader(file); BufferedReader bufferedReader = new BufferedReader(
+ fileReader);) {
+ String line;
+ while ((line = bufferedReader.readLine()) != null) {
+ System.out.println(line);
+ }
+ } catch (FileNotFoundException e) {
+ System.out.println("文件不存在");
+ } catch (IOException e) {
+ System.out.println("读取文件失败");
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/JavaExtends.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/JavaExtends.java
new file mode 100644
index 0000000..df818b3
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/JavaExtends.java
@@ -0,0 +1,71 @@
+package com.wdbyte.oop;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/03/31
+ */
+public class JavaExtends {
+ public static void main(String[] args) {
+ Student student = new Student();
+ printSleep(student);
+ }
+ public static void printSleep(Person person){
+ person.sleep();
+ }
+}
+
+class Person {
+ public void eat() {
+ System.out.println("吃饭");
+ }
+
+ public void sleep() {
+ System.out.println("睡觉");
+ }
+}
+
+class Student extends Person {
+
+ public Student() {
+ super();
+ }
+
+ public void study() {
+ System.out.println("学习");
+ }
+
+ @Override
+ public void eat() {
+ System.out.println("吃大米");
+ }
+
+ @Override
+ public void sleep() {
+ System.out.println("上课时不能睡觉");
+ }
+}
+
+interface One {
+ public void print_geek();
+}
+
+interface Two {
+ public void print_for();
+}
+
+interface Three extends One, Two {
+ public void print_geek();
+}
+
+class Teach implements Three{
+
+ @Override
+ public void print_for() {
+
+ }
+
+ @Override
+ public void print_geek() {
+
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/AbsPerson.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/AbsPerson.java
new file mode 100644
index 0000000..c142711
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/AbsPerson.java
@@ -0,0 +1,15 @@
+package com.wdbyte.oop.abs;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/17
+ */
+public abstract class AbsPerson {
+ public int age = 22;
+
+ public void eat() {
+ System.out.println("吃饭");
+ }
+
+ public abstract void sleep();
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/AbsPerson2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/AbsPerson2.java
new file mode 100644
index 0000000..2617065
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/AbsPerson2.java
@@ -0,0 +1,13 @@
+package com.wdbyte.oop.abs;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public abstract class AbsPerson2 {
+
+ public void sayHello() {
+ System.out.println("say hello");
+ }
+
+ public abstract void sleep();
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/PersonTest.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/PersonTest.java
new file mode 100644
index 0000000..02144e2
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/PersonTest.java
@@ -0,0 +1,23 @@
+package com.wdbyte.oop.abs;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/17
+ */
+public class PersonTest {
+ public static void main(String[] args) {
+ AbsPerson absPerson = new Student();
+ System.out.println(absPerson.age);
+ absPerson.eat();
+ absPerson.sleep();
+
+ Student student = new Student();
+ Teacher teacher = new Teacher();
+ sleep(student);
+ sleep(teacher);
+ }
+
+ public static void sleep(AbsPerson person) {
+ person.sleep();
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/Student.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/Student.java
new file mode 100644
index 0000000..dbfa7b7
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/Student.java
@@ -0,0 +1,13 @@
+package com.wdbyte.oop.abs;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/17
+ */
+public class Student extends AbsPerson {
+
+ @Override
+ public void sleep() {
+ System.out.println("学生上课不能睡觉");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/Teacher.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/Teacher.java
new file mode 100644
index 0000000..1db8158
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/abs/Teacher.java
@@ -0,0 +1,13 @@
+package com.wdbyte.oop.abs;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/17
+ */
+public class Teacher extends AbsPerson {
+
+ @Override
+ public void sleep() {
+ System.out.println("老师教课时不能睡觉");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/InterfacePerson.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/InterfacePerson.java
new file mode 100644
index 0000000..0cd8562
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/InterfacePerson.java
@@ -0,0 +1,9 @@
+package com.wdbyte.oop.interfac;
+
+public interface InterfacePerson {
+ default void sayHello(){
+ System.out.println("say hello");
+ }
+
+ void sleep();
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface.java
new file mode 100644
index 0000000..e700d09
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface.java
@@ -0,0 +1,53 @@
+package com.wdbyte.oop.interfac;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/13
+ */
+public class JavaInterface {
+
+ public static void main(String[] args) {
+ MyInterface.staticMethod();
+ System.out.println(MyInterface.param);
+ }
+}
+
+interface MyInterface {
+ String param = null;
+ void method1();
+ void method2();
+ // 默认方法
+ default void defaultMethod() {
+ System.out.println("default method");
+ }
+ // 私有方法
+ private void privateMethod() {
+ System.out.println("private method");
+ }
+ // 静态方法
+ static void staticMethod() {
+ System.out.println("static method");
+ }
+ // 私有静态方法
+ private static void privateStaticMethod() {
+ System.out.println("private static method");
+ }
+}
+interface IMobilePhone{
+ void mehtod1();
+}
+interface MyInterface2{
+ void mehtod2();
+}
+class IPhone14 implements IMobilePhone{
+ @Override
+ public void mehtod1() {
+ }
+
+}
+class Xiaomi14 implements IMobilePhone{
+ @Override
+ public void mehtod1() {
+ }
+
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface2.java
new file mode 100644
index 0000000..db299b1
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface2.java
@@ -0,0 +1,66 @@
+package com.wdbyte.oop.interfac;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/13
+ */
+public class JavaInterface2 {
+ public static void main(String[] args) {
+ //XPhone xPhone = new XPhone();
+ //xPhone.powerUp();
+ //xPhone.call();
+ }
+}
+
+
+
+/**
+ * 手机系统功能接口
+ */
+interface IMobilePhoneSystem{
+ // 开机
+ void powerUp();
+ // 显示
+ void display();
+ // 声音
+ void sound();
+}
+
+/**
+ * 手机基本功能
+ */
+interface IMobilePhoneBasicFunction extends IMobilePhoneSystem {
+ // 打电话
+ void call();
+ // 发短信
+ void sendMessage();
+}
+
+
+class XPhone implements IMobilePhoneBasicFunction{
+
+ @Override
+ public void powerUp() {
+ System.out.println("XPhone 开始开机");
+ }
+
+ @Override
+ public void display() {
+ System.out.println("XPhone 开始显示");
+ }
+
+ @Override
+ public void sound() {
+ System.out.println("XPhone 发出声音");
+ }
+
+ @Override
+ public void call() {
+ System.out.println("XPhone 开始拨打电话");
+ }
+
+ @Override
+ public void sendMessage() {
+ System.out.println("XPhone 开始发送短信");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface3.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface3.java
new file mode 100644
index 0000000..abd9ff9
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/interfac/JavaInterface3.java
@@ -0,0 +1,15 @@
+package com.wdbyte.oop.interfac;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/14
+ */
+public class JavaInterface3 {
+ public static void main(String[] args) {
+ System.out.println(MyInterface.param);
+ }
+ interface MyInterface{
+ String param = "https://www.wdbyte.com";
+ }
+}
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/AliyunOss.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/AliyunOss.java
new file mode 100644
index 0000000..3bedb6c
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/AliyunOss.java
@@ -0,0 +1,17 @@
+package com.wdbyte.oop.polymorphism;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/18
+ */
+public class AliyunOss implements Oss {
+ @Override
+ public void upload(String content) {
+ try {
+ Thread.sleep(10);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println("文件已经上传到阿里云 OSS,内容:" + content);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Animal.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Animal.java
new file mode 100644
index 0000000..a0d456f
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Animal.java
@@ -0,0 +1,17 @@
+package com.wdbyte.oop.polymorphism;
+
+import java.util.Arrays;
+
+public class Animal {
+ public void makeSound() {
+ System.out.println("动物发出叫声");
+ }
+
+ public static void main(String[] args) {
+ Animal cat = new Cat();
+ Animal dog = new Dog();
+ for (Animal animal : Arrays.asList(cat, dog)) {
+ animal.makeSound();
+ }
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Cat.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Cat.java
new file mode 100644
index 0000000..152e261
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Cat.java
@@ -0,0 +1,8 @@
+package com.wdbyte.oop.polymorphism;
+
+public class Cat extends Animal{
+ @Override
+ public void makeSound(){
+ System.out.println("喵喵喵");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Dog.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Dog.java
new file mode 100644
index 0000000..ec6066a
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Dog.java
@@ -0,0 +1,8 @@
+package com.wdbyte.oop.polymorphism;
+
+public class Dog extends Animal{
+ @Override
+ public void makeSound(){
+ System.out.println("汪汪汪");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Oss.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Oss.java
new file mode 100644
index 0000000..8fd2af8
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/Oss.java
@@ -0,0 +1,14 @@
+package com.wdbyte.oop.polymorphism;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/18
+ */
+public interface Oss {
+
+ /**
+ * 文件上传
+ * @param content
+ */
+ void upload(String content);
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/OssUtil.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/OssUtil.java
new file mode 100644
index 0000000..5a07fc1
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/OssUtil.java
@@ -0,0 +1,28 @@
+package com.wdbyte.oop.polymorphism;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/18
+ */
+public class OssUtil {
+ /**
+ * OSS 上传工具类
+ *
+ * @param oss
+ * @param content
+ */
+ public static void upload(Oss oss, String content) {
+ long start = System.currentTimeMillis();
+ oss.upload(content);
+ long end = System.currentTimeMillis();
+ System.out.println("上传耗时:" + (end - start) + "ms");
+ }
+
+ public static void main(String[] args) {
+ AliyunOss aliyunOss = new AliyunOss();
+ TencentOss tencentOss = new TencentOss();
+ upload(aliyunOss, "Hello aliyun");
+ System.out.println("------------");
+ upload(tencentOss, "Hello tencent");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/TencentOss.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/TencentOss.java
new file mode 100644
index 0000000..4993abd
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/TencentOss.java
@@ -0,0 +1,17 @@
+package com.wdbyte.oop.polymorphism;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/18
+ */
+public class TencentOss implements Oss {
+ @Override
+ public void upload(String content) {
+ try {
+ Thread.sleep(100);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println("文件已经上传到腾讯云 OSS,内容:" + content);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Animal.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Animal.java
new file mode 100644
index 0000000..0353708
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Animal.java
@@ -0,0 +1,7 @@
+package com.wdbyte.oop.polymorphism.inter;
+
+public interface Animal{
+ void makeSound();
+}
+
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Cat.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Cat.java
new file mode 100644
index 0000000..1a6e10c
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Cat.java
@@ -0,0 +1,8 @@
+package com.wdbyte.oop.polymorphism.inter;
+
+public class Cat implements Animal{
+ @Override
+ public void makeSound(){
+ System.out.println("喵喵喵");
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Dog.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Dog.java
new file mode 100644
index 0000000..8843325
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Dog.java
@@ -0,0 +1,8 @@
+package com.wdbyte.oop.polymorphism.inter;
+
+public class Dog implements Animal{
+ @Override
+ public void makeSound(){
+ System.out.println("汪汪汪");
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Test.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Test.java
new file mode 100644
index 0000000..9d15814
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Test.java
@@ -0,0 +1,23 @@
+package com.wdbyte.oop.polymorphism.inter;
+
+import java.util.Arrays;
+
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/18
+ */
+public class Test {
+ public static void main(String[] args) {
+ Animal cat = new Cat();
+ Animal dog = new Dog();
+ for (Animal animal : Arrays.asList(cat, dog)) {
+ animal.makeSound();
+ }
+ }
+
+ public static void makeSound(Animal animal){
+ animal.makeSound();
+ }
+}
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Test2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Test2.java
new file mode 100644
index 0000000..a1b7e3b
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/oop/polymorphism/inter/Test2.java
@@ -0,0 +1,20 @@
+package com.wdbyte.oop.polymorphism.inter;
+
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/04/18
+ */
+public class Test2 {
+ public static void main(String[] args) {
+ Animal cat = new Cat();
+ Animal dog = new Dog();
+ makeSound(cat); // 喵喵喵
+ makeSound(dog); // 汪汪汪
+ }
+
+ public static void makeSound(Animal animal) {
+ animal.makeSound();
+ }
+}
+
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo.java
new file mode 100644
index 0000000..a2de8cc
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo.java
@@ -0,0 +1,13 @@
+package com.wdbyte.scanner;
+
+import java.util.Scanner;
+
+public class ScannerDemo {
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+ scanner.useDelimiter(System.lineSeparator());
+ System.out.println("请输入一个字符串:");
+ String inputString = scanner.next();
+ System.out.println("你输入的字符串是:" + inputString);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo2.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo2.java
new file mode 100644
index 0000000..dc6337e
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo2.java
@@ -0,0 +1,16 @@
+package com.wdbyte.scanner;
+
+import java.util.Scanner;
+
+public class ScannerDemo2 {
+ public static void main(String[] args) {
+ Scanner scanner = new Scanner(System.in);
+ System.out.println("请输入一个整数:");
+ int inputInt = scanner.nextInt();
+ System.out.println("你输入的整数是:" + inputInt);
+
+ System.out.println("请输入一个浮点数:");
+ double inputDouble = scanner.nextDouble();
+ System.out.println("你输入的浮点数是:" + inputDouble);
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo3.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo3.java
new file mode 100644
index 0000000..d701062
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/scanner/ScannerDemo3.java
@@ -0,0 +1,15 @@
+package com.wdbyte.scanner;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.util.Scanner;
+
+public class ScannerDemo3 {
+ public static void main(String[] args) throws FileNotFoundException {
+ File inputFile = new File("pom.xml");
+ Scanner scanner = new Scanner(inputFile);
+ while (scanner.hasNextLine()) {
+ System.out.println(scanner.nextLine());
+ }
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/string/JavaString.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/string/JavaString.java
new file mode 100644
index 0000000..bc4d4e6
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/string/JavaString.java
@@ -0,0 +1,68 @@
+package com.wdbyte.string;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/03/22
+ */
+public class JavaString {
+ public static void main(String[] args) {
+ //String str1 = "Hello world";
+ //String str2 = "Hello world";
+ //String str3 = new String("Hello world");
+ //String str4 = new String("Hello world");
+ //
+ //System.out.println(str1 == str2);
+ //System.out.println(str3 == str4);
+ //System.out.println(str1 == str4);
+ // 比较
+ //String str1 = "abc";
+ //String str2 = "abz";
+ //System.out.println(str1.compareTo(str2));
+ //System.out.println(str2.compareTo(str1));
+ //// 输出:-23
+ //// 输出:23
+ //System.out.println("19999".compareTo("2"));
+ //// 输出:-1
+
+ //
+ //// CharSequence
+ //String str = "Hello, world!";
+ //str.chars().forEach(System.out::println);
+ //str.chars().mapToObj(c -> (char) c).forEach(System.out::print);
+
+ //String str1 = "Hello";
+ //String str2 = "world";
+ //String str3 = str1 + str2;
+ //String str4 = str1 + str2;
+ //String str5 = "Hello" + "world";
+ //String str6 = "Hello" + "world";
+ //System.out.println(str3 == str4);
+ //System.out.println(str5 == str6);
+
+ //String str1 = new StringBuilder("计算机").append("软件").toString();
+ //System.out.println(str1.intern() == str1);
+ //String str2 = new StringBuilder("ja").append("va").toString();
+ //System.out.println(str2.intern() == str2);
+ //
+ //String b = "12";
+ //String d = new StringBuilder("计算机").append("软件").toString();
+ //String c = new StringBuilder("计算机").append("软件").toString();
+ //String a = "计算机软件";
+ //System.out.println(a == d);
+ //System.out.println(a == c);
+ String str0 = "abc";
+ String str1 = new String("abc");
+ String str3 = "abc";
+ System.out.println(str1 == str0);
+ System.out.println(str3 == str0);
+ str1.intern();
+ String str2 = new String("Hello,world");
+ System.out.println(str1 == str2);
+ }
+
+ public void test() {
+ String str1 = "Hello, world!";
+ String str2 = "Hello, world!";
+ System.out.println(str1 == str2);
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/string/JavaStringBuilder.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/string/JavaStringBuilder.java
new file mode 100644
index 0000000..514054b
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/string/JavaStringBuilder.java
@@ -0,0 +1,38 @@
+package com.wdbyte.string;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2023/03/30
+ */
+public class JavaStringBuilder {
+
+ public static void main(String[] args) {
+ StringBuilder sb1 = new StringBuilder();
+ System.out.println(sb1.capacity()); // 容量:16
+ StringBuilder sb2 = new StringBuilder("wdbyte.com");
+ System.out.println(sb2.capacity()); // 容量:26
+
+ StringBuilder sb3 = new StringBuilder("www");
+ sb3.append(".wdbyte.com");
+ System.out.println(sb3.toString()); //
+
+ StringBuilder sb4 = new StringBuilder("wdbyte");
+ sb4.insert(0,"www.");
+ System.out.println(sb4.toString()); // www.wdbyte
+ sb4.insert(10,".com");
+ System.out.println(sb4.toString()); // www.wdbyte.com
+
+ StringBuilder sb5 = new StringBuilder("www.wdbyte.com");
+ sb5.delete(0,4);
+ System.out.println(sb5); // wdbyte.com
+
+ StringBuilder sb6 = new StringBuilder("hello world!");
+ sb6.replace(6,11, "java"); // 结果为 "hello java!"
+ System.out.println(sb6);
+
+ StringBuilder sb7 = new StringBuilder("hello world!");
+ sb7.reverse();
+ System.out.println(sb7);
+
+ }
+}
diff --git a/core-java-modules/core-java-base/src/main/java/com/wdbyte/thread/CompletableFutureTest.java b/core-java-modules/core-java-base/src/main/java/com/wdbyte/thread/CompletableFutureTest.java
new file mode 100644
index 0000000..7887015
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/java/com/wdbyte/thread/CompletableFutureTest.java
@@ -0,0 +1,74 @@
+package com.wdbyte.thread;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.Future;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/11/01
+ */
+public class CompletableFutureTest {
+
+ /**
+ * 异步执行程序后,对正常响应和异常响应进行处理
+ */
+ @Test
+ public void completableFutureTest1() {
+ CompletableFuture completableFuture1 = CompletableFuture.supplyAsync(() -> {
+ sleep(2000);
+ System.out.println("do.....");
+ return 1;
+ });
+
+ completableFuture1.thenAccept(res -> {
+ System.out.println("收到结果:" + res
+ );
+ });
+
+ System.out.println("等待");
+ sleep(10 * 1000);
+ }
+ @Test
+ public void completableFutureTest2() {
+ CompletableFuture completableFuture2 = CompletableFuture.supplyAsync(() -> {
+ sleep(2000);
+ System.out.println("do2.....");
+ return 10 / 0;
+ });
+ completableFuture2.exceptionally(except -> {
+ System.out.println("发生异常:" + except.getMessage());
+ return 0;
+ });
+
+ System.out.println("等待");
+ sleep(10 * 1000);
+ }
+
+ @Test
+ public void completableFutureTest3() {
+ CompletableFuture completableFuture1 = CompletableFuture.supplyAsync(() -> {
+ sleep(2000);
+ System.out.println("do.....");
+ return 1;
+ });
+
+ completableFuture1.thenAccept(res -> {
+ System.out.println("收到结果:" + res
+ );
+ });
+
+ System.out.println("等待");
+ sleep(10 * 1000);
+ }
+
+ void sleep(long millis){
+ try {
+ Thread.sleep(millis);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-base/src/main/resources/META-INF/maven/archetype.xml b/core-java-modules/core-java-base/src/main/resources/META-INF/maven/archetype.xml
new file mode 100644
index 0000000..5cfc7cc
--- /dev/null
+++ b/core-java-modules/core-java-base/src/main/resources/META-INF/maven/archetype.xml
@@ -0,0 +1,9 @@
+
+ core-java-base
+
+ src/main/java/App.java
+
+
+ src/test/java/AppTest.java
+
+
diff --git "a/core-java-modules/core-java-base/\351\233\206\345\220\210\346\241\206\346\236\266\345\205\263\347\263\273\345\233\276.uml" "b/core-java-modules/core-java-base/\351\233\206\345\220\210\346\241\206\346\236\266\345\205\263\347\263\273\345\233\276.uml"
new file mode 100644
index 0000000..1e2c5c9
--- /dev/null
+++ "b/core-java-modules/core-java-base/\351\233\206\345\220\210\346\241\206\346\236\266\345\205\263\347\263\273\345\233\276.uml"
@@ -0,0 +1,138 @@
+
+
+ JAVA
+ java.util.ArrayList
+
+ java.util.HashSet
+ com.sun.jmx.remote.internal.ArrayQueue
+ java.util.Vector
+ java.util.Set
+ java.util.TreeSet
+ java.util.concurrent.ArrayBlockingQueue
+ java.util.List
+ java.util.TreeMap
+ java.util.concurrent.ConcurrentHashMap
+ java.util.LinkedHashSet
+ java.util.Stack
+ java.util.concurrent.DelayQueue
+ java.util.Map
+ java.util.LinkedList
+ java.lang.Iterable
+ java.util.AbstractList
+ java.util.Collection
+ java.util.HashMap
+ java.util.Queue
+ java.util.LinkedHashMap
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ All
+ private
+
+
diff --git a/core-java-modules/core-java-collect/pom.xml b/core-java-modules/core-java-collect/pom.xml
new file mode 100644
index 0000000..0e0ba53
--- /dev/null
+++ b/core-java-modules/core-java-collect/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ core-java-collect
+
+
+ 8
+ 8
+ UTF-8
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-collect/src/main/java/com/wdbyte/collection/EnumMapTest.java b/core-java-modules/core-java-collect/src/main/java/com/wdbyte/collection/EnumMapTest.java
new file mode 100644
index 0000000..1370449
--- /dev/null
+++ b/core-java-modules/core-java-collect/src/main/java/com/wdbyte/collection/EnumMapTest.java
@@ -0,0 +1,25 @@
+package com.wdbyte.collection;
+
+import java.util.EnumMap;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/10/20
+ */
+public class EnumMapTest {
+ public static void main(String[] args) {
+ EnumMap enumMap = new EnumMap(Week.class);
+ enumMap.put(Week.a,null);
+ System.out.println(enumMap.get(Week.a));
+ }
+}
+
+enum Week {
+ a,
+ b,
+ c,
+ d,
+ e,
+ f,
+ g
+}
diff --git a/core-java-modules/core-java-collect/src/main/java/com/wdbyte/collection/JavaArrays.java b/core-java-modules/core-java-collect/src/main/java/com/wdbyte/collection/JavaArrays.java
new file mode 100644
index 0000000..144cdcb
--- /dev/null
+++ b/core-java-modules/core-java-collect/src/main/java/com/wdbyte/collection/JavaArrays.java
@@ -0,0 +1,146 @@
+package com.wdbyte.collection;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import java.util.function.IntFunction;
+import java.util.function.ToIntFunction;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2024/03/04
+ */
+public class JavaArrays {
+
+ @Test
+ public void print() {
+ String[] arr = new String[] {"a", "b", "c", "d"};
+ System.out.println(Arrays.toString(arr));
+ }
+
+ @Test
+ public void init() {
+ String[] arr = new String[] {"a", "b", "c", "d"};
+ String[] copyOf2 = Arrays.copyOf(arr, 2);
+ String[] copyOfRange = Arrays.copyOfRange(arr, 1, 3);
+
+ System.out.println(Arrays.toString(arr));
+ System.out.println(Arrays.toString(copyOf2));
+ System.out.println(Arrays.toString(copyOfRange));
+
+ // 目标大小大于原始大小,则copyOf 会用null填充数组 。
+ String[] copyOf10 = Arrays.copyOf(arr, 10);
+ System.out.println(Arrays.toString(copyOf10));
+ }
+
+ @Test
+ public void fill() {
+ String[] arr = new String[5];
+ Arrays.fill(arr, "java");
+ System.out.println(Arrays.toString(arr));
+
+ // 生成 100以内的 随机数
+ IntFunction intFunction = i -> new Random().nextInt(100);
+ Integer[] intArr = new Integer[5];
+ Arrays.setAll(intArr, intFunction);
+ System.out.println(Arrays.toString(intArr));
+ }
+
+ @Test
+ public void diff() {
+ String[] arr = new String[] {"a", "b", "c", "d"};
+ Object[] arr1 = new Object[] {arr, new String[] {"a", "b", "c", "d"}};
+ Object[] arr2 = new Object[] {arr, arr};
+
+ System.out.println(Arrays.equals(arr1, arr2));
+ System.out.println(Arrays.deepEquals(arr1, arr2));
+
+ // hashCode
+ System.out.println(Arrays.hashCode(arr2));
+ System.out.println(Arrays.deepHashCode(arr2));
+
+ arr[0] = null;
+ System.out.println(Arrays.hashCode(arr2));
+ System.out.println(Arrays.deepHashCode(arr2));
+ }
+
+ @Test
+ public void sort() {
+ // 生成 100以内的 随机数
+ IntFunction intFunction = i -> new Random().nextInt(100);
+ Integer[] intArr = new Integer[5];
+ Arrays.setAll(intArr, intFunction);
+ System.out.println(Arrays.toString(intArr));
+
+ Arrays.sort(intArr);
+ System.out.println(Arrays.toString(intArr));
+
+ //long cost = 0;
+ //for (int ii = 0; ii < 10; ii++) {
+ // IntFunction intFunction = i -> new Random().nextInt(100000);
+ // Integer[] intArr = new Integer[100000];
+ // Arrays.setAll(intArr, intFunction);
+ //
+ // long start = System.currentTimeMillis();
+ // Arrays.sort(intArr);
+ // long end = System.currentTimeMillis();
+ // cost = cost + (end - start);
+ //}
+ //System.out.println(cost / 10);
+ //
+ //cost = 0;
+ //for (int ii = 0; ii < 10; ii++) {
+ // IntFunction intFunction = i -> new Random().nextInt(100000);
+ // Integer[] intArr = new Integer[100000];
+ // Arrays.setAll(intArr, intFunction);
+ //
+ // long start = System.currentTimeMillis();
+ // Arrays.parallelSort(intArr);
+ // long end = System.currentTimeMillis();
+ // cost = cost + (end - start);
+ //}
+ //System.out.println(cost / 10);
+ }
+
+ @Test
+ public void search() {
+ Integer[] intArr = new Integer[] {2, 3, 4, 5, 6, 7, 8, 9};
+ int index = Arrays.binarySearch(intArr, 3);
+ System.out.println("index:"+index);
+ System.out.println(intArr[index]);
+ }
+
+ @Test
+ public void stream() {
+ Integer[] intArr = new Integer[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+ System.out.println(Arrays.stream(intArr).count());
+ ToIntFunction toIntFunction = i -> (int)i;
+ System.out.println(Arrays.stream(intArr).mapToInt(toIntFunction).sum());
+ }
+
+ @Test
+ public void cast() {
+ String[] arr = new String[] {"a", "b", "c", "d"};
+ Object[] arr2 = new Object[] {arr, arr};
+
+ System.out.println(Arrays.toString(arr));
+ System.out.println(Arrays.toString(arr2));
+
+ System.out.println(Arrays.deepToString(arr));
+ System.out.println(Arrays.deepToString(arr2));
+
+ List list = Arrays.asList(arr);
+ System.out.println(list);
+ System.out.println(list.getClass());
+ // list.add("e"); 报错
+ }
+
+ @Test
+ public void prefix() {
+ Integer[] intArr = new Integer[] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
+ Arrays.parallelPrefix(intArr, (left, right) -> left + right);
+ System.out.println(Arrays.toString(intArr));
+ }
+}
diff --git a/core-java-modules/core-java-io/README.md b/core-java-modules/core-java-io/README.md
new file mode 100644
index 0000000..85360a7
--- /dev/null
+++ b/core-java-modules/core-java-io/README.md
@@ -0,0 +1,9 @@
+## core-java-io
+当前模块包含 IO 相关代码
+
+### 相关文章
+- [Java 创建和写入文件](https://www.wdbyte.com/java/io/file-create-write/)
+- [Java 读取文件](https://www.wdbyte.com/java/io/file-read/)
+- [Java 追加内容到文件](https://www.wdbyte.com/java/io/file-append/)
+- [Java 如何删除文件](https://www.wdbyte.com/java/io/file-delete/)
+- [字符图案,我用字符画个冰墩墩](https://www.wdbyte.com/java/char-image.html)
\ No newline at end of file
diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml
new file mode 100644
index 0000000..30c75c1
--- /dev/null
+++ b/core-java-modules/core-java-io/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ core-java-io
+ 1.0.0-SNAPSHOT
+ core-java-io
+ jar
+
+
+ 21
+ 21
+
+
+
+
+ com.google.guava
+ guava
+ 32.1.3-jre
+
+
+ commons-io
+ commons-io
+ 2.7
+
+
+
+
+
diff --git a/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileAppendDemo.java b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileAppendDemo.java
new file mode 100644
index 0000000..53879c8
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileAppendDemo.java
@@ -0,0 +1,179 @@
+package com.wdbyte.io.file;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.common.base.Charsets;
+import com.google.common.io.FileWriteMode;
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/12/12
+ */
+public class FileAppendDemo {
+
+ @Test
+ public void appendLine1() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/test1.txt");
+ // 写入一行数据
+ Files.write(path, "line append1".getBytes(StandardCharsets.UTF_8),
+ StandardOpenOption.CREATE, StandardOpenOption.APPEND);
+ // 写入一个换行符
+ Files.write(path, System.lineSeparator().getBytes(StandardCharsets.UTF_8),
+ StandardOpenOption.APPEND);
+ }
+
+ @Test
+ public void appendLine2() throws IOException {
+ String path = "/Users/darcy/wdbyte/test1.txt";
+ try (FileWriter fileWriter = new FileWriter(path, true)) {
+ fileWriter.write("line append2");
+ fileWriter.write(System.lineSeparator());
+ }
+ }
+ @Test
+ public void appendLine3() throws IOException {
+ String path = "/Users/darcy/wdbyte/test1.txt";
+ try (FileWriter fileWriter = new FileWriter(path, true)) {
+ BufferedWriter bw = new BufferedWriter(fileWriter);
+ bw.write("line append3");
+ bw.newLine();
+ }
+ }
+
+ @Test
+ public void appendLine4() throws IOException {
+ String path = "/Users/darcy/wdbyte/test1.txt";
+ try (FileOutputStream fileOutputStream = new FileOutputStream(path, true)) {
+ fileOutputStream.write("line append4".getBytes(StandardCharsets.UTF_8));
+ fileOutputStream.write(System.lineSeparator().getBytes(StandardCharsets.UTF_8));
+ }
+ }
+
+ /**
+ * java 11 Files.writeString
+ * @throws IOException
+ */
+ public void appendLineJava11() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/test1.txt");
+ Files.writeString(path, "line appendLineJava11",
+ StandardOpenOption.CREATE,
+ StandardOpenOption.APPEND);
+ }
+
+
+ /**
+ * Java 8
+ *
+ * @throws IOException
+ */
+ @Test
+ public void appendLineJava8() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/test1.txt");
+ List dataList = new ArrayList<>();
+ dataList.add("line1 appendLineJava8");
+ dataList.add("line2 appendLineJava8");
+ dataList.add("line3 appendLineJava8");
+
+ Files.write(path, dataList,
+ StandardOpenOption.CREATE,
+ StandardOpenOption.APPEND);
+
+ Files.write(path, System.lineSeparator().getBytes(StandardCharsets.UTF_8),
+ StandardOpenOption.CREATE,
+ StandardOpenOption.APPEND);
+ }
+
+ @Test
+ public void appendLineList() throws IOException {
+ String path = "/Users/darcy/wdbyte/test1.txt";
+ List dataList = new ArrayList<>();
+ dataList.add("line1 appendLineList");
+ dataList.add("line2 appendLineList");
+ dataList.add("line3 appendLineList");
+
+ try (FileWriter fileWriter = new FileWriter(path, true)) {
+ BufferedWriter bw = new BufferedWriter(fileWriter);
+ for (String data : dataList) {
+ bw.write(data);
+ bw.newLine();
+ }
+ }
+ }
+
+ @Test
+ public void appendByCommonsIo() throws IOException {
+ File file = new File("/Users/darcy/wdbyte/test1.txt");
+ String content = "hello commons io,appendByCommonsIo";
+ FileUtils.writeStringToFile(file, content, StandardCharsets.UTF_8, true);
+ FileUtils.writeStringToFile(file, System.lineSeparator(), StandardCharsets.UTF_8, true);
+ }
+
+ @Test
+ public void appendListByCommonsIo() throws IOException {
+ File file = new File("/Users/darcy/wdbyte/test1.txt");
+ List dataList = new ArrayList<>();
+ dataList.add("line1 hello commons io,appendListByCommonsIo");
+ dataList.add("line2 hello commons io,appendListByCommonsIo");
+ dataList.add("line3 hello commons io,appendListByCommonsIo");
+ FileUtils.writeLines(file, dataList, true);
+ }
+
+ @Test
+ public void appendData(){
+ // 创建File对象指向要追加内容的文件
+ File file = new File("/Users/darcy/wdbyte/test1.txt");
+ // 要追加的内容
+ String contentToAppend = "Hello, Guava!";
+ try {
+ // 使用Guava的Files类以追加模式写入内容
+ com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND)
+ .write(contentToAppend);
+
+ // 如果需要追加新行,可以使用下面的代码
+ com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, com.google.common.io.FileWriteMode.APPEND)
+ .write(contentToAppend + System.lineSeparator());
+ System.out.println("Content appended successfully.");
+ } catch (IOException e) {
+ System.err.println("Error appending content to file: " + e.getMessage());
+ }
+ }
+
+ @Test
+ public void appendDataListByGuava(){
+ // 创建File对象指向要追加内容的文件
+ File file = new File("/Users/darcy/wdbyte/test1.txt");
+
+ // 要追加的内容
+ List dataList = new ArrayList<>();
+ dataList.add("line1 hello commons io,appendDataListByGuava");
+ dataList.add("line2 hello commons io,appendDataListByGuava");
+ dataList.add("line3 hello commons io,appendDataListByGuava");
+
+ try {
+ // 使用Guava的Files类以追加模式写入内容
+ com.google.common.io.Files.asCharSink(file, Charsets.UTF_8, FileWriteMode.APPEND)
+ .writeLines(dataList);
+
+ System.out.println("Content appended successfully.");
+ } catch (IOException e) {
+ System.err.println("Error appending content to file: " + e.getMessage());
+ }
+ }
+
+
+
+
+}
diff --git a/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileCreateAndWriteDemo.java b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileCreateAndWriteDemo.java
new file mode 100644
index 0000000..158942d
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileCreateAndWriteDemo.java
@@ -0,0 +1,108 @@
+package com.wdbyte.io.file;
+
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/11/06
+ */
+public class FileCreateAndWriteDemo {
+
+ @Test
+ public void test0() throws IOException {
+ String content = "www.wdbyte.com,java 7";
+ String filePath = "/Users/darcy/wdbyte/test0.txt";
+ try (FileWriter fw = new FileWriter(filePath);
+ BufferedWriter bw = new BufferedWriter(fw)) {
+ bw.write(content);
+ bw.newLine();
+ }
+
+ // 追加模式
+ try (FileWriter fw = new FileWriter(filePath, true);
+ BufferedWriter bw = new BufferedWriter(fw)) {
+ bw.write(content);
+ bw.newLine();
+ }
+ }
+
+ /**
+ * JDK 7
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test1() throws IOException {
+ String content = "www.wdbyte.com, java 7";
+ Path path = Paths.get("/Users/darcy/wdbyte/test1.txt");
+ // string -> bytes
+ Files.write(path, content.getBytes(StandardCharsets.UTF_8));
+ }
+
+ /**
+ * JDK 7 追加
+ * @throws IOException
+ */
+ @Test
+ public void test2() throws IOException {
+ String content = "www.wdbyte.com,java 7" + System.lineSeparator();
+ Path path = Paths.get("/Users/darcy/wdbyte/test2.txt");
+ Files.write(path, content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE,
+ StandardOpenOption.APPEND);
+ Files.write(path, content.getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE,
+ StandardOpenOption.APPEND);
+ }
+
+ /**
+ * JDK 7 写入 List
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test3() throws IOException {
+ List dataList = Arrays.asList("www", "wdbyte", "com", "java 7");
+ Path path = Paths.get("/Users/darcy/wdbyte/test3.txt");
+ Files.write(path, dataList);
+ }
+
+ @Test
+ public void test4() throws IOException {
+ String content = "www.wdbyte.com,java 7";
+ Path path = Paths.get("/Users/darcy/wdbyte/test4.txt");
+ // 默认 utf_8
+ try (BufferedWriter bw = Files.newBufferedWriter(path)) {
+ bw.write(content);
+ bw.newLine();
+ }
+ // 追加模式
+ try (BufferedWriter bw = Files.newBufferedWriter(path,
+ StandardOpenOption.CREATE, StandardOpenOption.APPEND)) {
+ bw.write(content);
+ bw.newLine();
+ }
+ }
+
+ /**
+ * JDK 11
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test5() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/test5.txt");
+ Files.writeString(path, "www.wdbyte.com,java 11");
+ }
+
+
+}
diff --git a/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileDelete.java b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileDelete.java
new file mode 100644
index 0000000..f865382
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileDelete.java
@@ -0,0 +1,73 @@
+package com.wdbyte.io.file;
+
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/12/18
+ */
+public class FileDelete {
+
+ @Test
+ public void deleteFile() {
+ Path path = Paths.get("/Users/darcy/wdbyte/test.txt");
+ try {
+ Files.delete(path);
+ System.out.println("文件删除成功");
+ } catch (Exception e) {
+ System.out.println("文件删除失败");
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void deleteIfExists() {
+ Path path = Paths.get("/Users/darcy/wdbyte/test.txt");
+ try {
+ boolean deleted = Files.deleteIfExists(path);
+ if (deleted) {
+ System.out.println("文件删除成功");
+ } else {
+ System.out.println("文件不存在或者无法删除");
+ }
+ } catch (Exception e) {
+ System.out.println("文件删除失败");
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void delete() {
+ File file = new File("/Users/darcy/wdbyte/test.txt");
+ if (file.delete()) {
+ System.out.println("文件删除成功");
+ } else {
+ System.out.println("文件删除失败");
+ }
+ }
+
+ @Test
+ public void deleteOnExit() {
+ File file = new File("/Users/darcy/wdbyte/test.txt");
+ file.deleteOnExit();
+ }
+
+ @Test
+ public void forceDelete() {
+ File file = new File("/Users/darcy/wdbyte/test.txt");
+ try {
+ FileUtils.forceDelete(file);
+ System.out.println("文件删除成功");
+ } catch (Exception e) {
+ System.out.println("文件删除失败");
+ e.printStackTrace();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileReadDemo.java b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileReadDemo.java
new file mode 100644
index 0000000..276e0e8
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/file/FileReadDemo.java
@@ -0,0 +1,178 @@
+package com.wdbyte.io.file;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.Scanner;
+import java.util.stream.Stream;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.jupiter.api.Test;
+
+/**
+ * @author www.wdbyte.com
+ * @date 2023/11/08
+ */
+public class FileReadDemo {
+
+ public static void main(String[] args) {
+ Path path = Paths.get("/Users/darcy/wdbyte");
+ System.out.println(Files.isDirectory(path));
+ System.out.println(path.toFile().isFile());
+ System.out.println(path.toFile().isDirectory());
+ }
+
+ /**
+ * java 8
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test1() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/log.txt");
+ List lines = Files.readAllLines(path, StandardCharsets.UTF_8);
+ for (String line : lines) {
+ System.out.println(line);
+ }
+ }
+
+ /**
+ * java 8
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test2() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/log.txt");
+ byte[] bytes = Files.readAllBytes(path);
+ String content = new String(bytes, StandardCharsets.UTF_8);
+ System.out.println(content);
+ }
+
+ /**
+ * java 8
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test3() throws IOException, InterruptedException {
+ Path path = Paths.get("/Users/darcy/wdbyte/log.txt");
+ try (Stream stream = Files.lines(path);) {
+ stream.forEach(System.out::println);
+ }
+ try (Stream stream = Files.lines(path);) {
+ stream.parallel().forEachOrdered(System.out::println);
+ }
+ }
+
+ /**
+ * java 11
+ * 要求:文件小于2G
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test4() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/log.txt");
+ String content = Files.readString(path, StandardCharsets.UTF_8);
+ System.out.println(content);
+ }
+
+ @Test
+ public void test5() {
+ File file = new File("/Users/darcy/wdbyte/log.txt");
+ String line;
+ // 默认读取缓冲区大小 8K
+ try (BufferedReader br = new BufferedReader(new FileReader(file))) {
+ while ((line = br.readLine()) != null) {
+ System.out.println(line);
+ }
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+
+ // 定义缓冲区大小为 128 K
+ int buffer = 128 * 1024;
+ try (BufferedReader br = new BufferedReader(new FileReader(file), buffer)) {
+ while ((line = br.readLine()) != null) {
+ System.out.println(line);
+ }
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * java 8
+ *
+ * @throws IOException
+ */
+ @Test
+ public void test6() throws IOException {
+ Path path = Paths.get("/Users/darcy/wdbyte/log.txt");
+ String line;
+ try (BufferedReader br = Files.newBufferedReader(path, StandardCharsets.UTF_8);) {
+ while ((line = br.readLine()) != null) {
+ System.out.println(line);
+ }
+ }
+ }
+
+ /**
+ * 自古以来
+ */
+ @Test
+ public void test7() {
+ File file = new File("/Users/darcy/wdbyte/log.txt");
+ try (Scanner sc = new Scanner(new FileReader(file))) {
+ while (sc.hasNextLine()) {
+ String line = sc.nextLine();
+ System.out.println(line);
+ }
+ } catch (FileNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 自古以来
+ */
+ @Test
+ public void test8() {
+ File file = new File("/Users/darcy/wdbyte/log.txt");
+ try (FileInputStream fis = new FileInputStream(file);
+ BufferedInputStream bis = new BufferedInputStream(fis);) {
+
+ StringBuilder content = new StringBuilder();
+ int data;
+ while ((data = bis.read()) != -1) {
+ content.append((char)data);
+ }
+ System.out.println(content.toString());
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Test
+ public void readFileByApacheCommons() throws IOException {
+ File file = new File("/Users/darcy/wdbyte/test.txt");
+ List list = FileUtils.readLines(file, StandardCharsets.UTF_8);
+ for (String data : list) {
+ System.out.println(data);
+ }
+ }
+}
diff --git a/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/image/GeneratorTextImage.java b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/image/GeneratorTextImage.java
new file mode 100644
index 0000000..986ab3d
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/image/GeneratorTextImage.java
@@ -0,0 +1,104 @@
+package com.wdbyte.io.image;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+/**
+ *
+ * 根据图片生成字符图案
+ * 1.图片大小缩放
+ * 2.遍历图片像素点
+ * 3.获取图片像素点亮度
+ * 4.匹配字符
+ * 5.输出图案
+ *
+ * @website https://www.wdbyte.com
+ */
+public class GeneratorTextImage {
+
+ public static void main(String[] args) throws Exception {
+ BufferedImage image = resizeImage("/Users/darcy/Downloads/sanli.jpg", 120);
+ printImage(image);
+ }
+
+ /**
+ * 图片缩放
+ *
+ * @param srcImagePath 图片路径
+ * @param targetWidth 目标宽度
+ * @return
+ * @throws IOException
+ */
+ public static BufferedImage resizeImage(String srcImagePath, int targetWidth) throws IOException {
+ Image srcImage = ImageIO.read(new File(srcImagePath));
+ int targetHeight = getTargetHeight(targetWidth, srcImage);
+ BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
+ Graphics2D graphics2D = resizedImage.createGraphics();
+ graphics2D.drawImage(srcImage, 0, 0, targetWidth, targetHeight, null);
+ graphics2D.dispose();
+ return resizedImage;
+ }
+
+ /**
+ * 图片缩放
+ *
+ * @param srcImagePath 图片路径
+ * @param targetWidth 目标宽度
+ * @return
+ * @throws IOException
+ */
+ public static BufferedImage resizeImage2(String srcImagePath, int targetWidth) throws IOException {
+ Image srcImage = ImageIO.read(new File(srcImagePath));
+ int targetHeight = getTargetHeight(targetWidth, srcImage);
+ Image image = srcImage.getScaledInstance(targetWidth, targetHeight, Image.SCALE_DEFAULT);
+ BufferedImage bufferedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
+ bufferedImage.getGraphics().drawImage(image, 0, 0, null);
+ return bufferedImage;
+ }
+
+ /**
+ * 根据指定宽度,计算等比例高度
+ *
+ * @param targetWidth 目标宽度
+ * @param srcImage 图片信息
+ * @return
+ */
+ private static int getTargetHeight(int targetWidth, Image srcImage) {
+ int targetHeight = srcImage.getHeight(null);
+ if (targetWidth < srcImage.getWidth(null)) {
+ targetHeight = Math.round((float)targetHeight / ((float)srcImage.getWidth(null) / (float)targetWidth));
+ }
+ return targetHeight;
+ }
+
+ /**
+ * 图片打印
+ *
+ * @param image
+ * @throws IOException
+ */
+ public static void printImage(BufferedImage image) throws IOException {
+ final char[] PIXEL_CHAR_ARRAY = {'W', '@', '#', '8', '&', '*', 'o', ':', '.', ' '};
+ int width = image.getWidth();
+ int height = image.getHeight();
+ for (int i = 0; i < height; i++) {
+ for (int j = 0; j < width; j++) {
+ int rgb = image.getRGB(j, i);
+ Color color = new Color(rgb);
+ int red = color.getRed();
+ int green = color.getGreen();
+ int blue = color.getBlue();
+ // 一个用于计算RGB像素点灰度的公式
+ Double grayscale = 0.2126 * red + 0.7152 * green + 0.0722 * blue;
+ double index = grayscale / (Math.ceil(255 / PIXEL_CHAR_ARRAY.length) + 0.5);
+ System.out.print(PIXEL_CHAR_ARRAY[(int)(Math.floor(index))]);
+ }
+ System.out.println();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/image/GeneratorTextImageMini.java b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/image/GeneratorTextImageMini.java
new file mode 100644
index 0000000..4bad1d8
--- /dev/null
+++ b/core-java-modules/core-java-io/src/main/java/com/wdbyte/io/image/GeneratorTextImageMini.java
@@ -0,0 +1,89 @@
+package com.wdbyte.io.image;
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+/**
+ *
+ * 根据图片生成字符图案
+ * 1.图片大小缩放
+ * 2.遍历图片像素点
+ * 3.获取图片像素点亮度
+ * 4.匹配字符
+ * 5.输出图案
+ *
+ * @website https://www.wdbyte.com
+ */
+public class GeneratorTextImageMini {
+
+ public static void main(String[] args) throws Exception {
+ //BufferedImage image = resizeImage("/Users/darcy/Downloads/sanli.jpg", 120);
+ BufferedImage image = ImageIO.read(new File("/Users/darcy/Downloads/刘看山.jpg"));
+ printImage(image);
+ }
+
+ /**
+ * 图片缩放
+ *
+ * @param srcImagePath 图片路径
+ * @param targetWidth 目标宽度
+ * @return
+ * @throws IOException
+ */
+ public static BufferedImage resizeImage(String srcImagePath, int targetWidth) throws IOException {
+ Image srcImage = ImageIO.read(new File(srcImagePath));
+ int targetHeight = getTargetHeight(targetWidth, srcImage);
+ BufferedImage resizedImage = new BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB);
+ Graphics2D graphics2D = resizedImage.createGraphics();
+ graphics2D.drawImage(srcImage, 0, 0, targetWidth, targetHeight, null);
+ graphics2D.dispose();
+ return resizedImage;
+ }
+
+ /**
+ * 根据指定宽度,计算等比例高度
+ *
+ * @param targetWidth 目标宽度
+ * @param srcImage 图片信息
+ * @return
+ */
+ private static int getTargetHeight(int targetWidth, Image srcImage) {
+ int targetHeight = srcImage.getHeight(null);
+ if (targetWidth < srcImage.getWidth(null)) {
+ targetHeight = Math.round((float)targetHeight / ((float)srcImage.getWidth(null) / (float)targetWidth));
+ }
+ return targetHeight;
+ }
+
+ /**
+ * 图片打印
+ *
+ * @param image
+ * @throws IOException
+ */
+ public static void printImage(BufferedImage image) throws IOException {
+ final char[] PIXEL_CHAR_ARRAY = {'W', '@', '#', '8', '&', '*', 'o', ':', '.', ' '};
+ //final char[] PIXEL_CHAR_ARRAY = {',', '.', ' '};
+ int width = image.getWidth();
+ int height = image.getHeight();
+ for (int i = 0; i < height; i++) {
+ for (int j = 0; j < width; j++) {
+ int rgb = image.getRGB(j, i);
+ Color color = new Color(rgb);
+ int red = color.getRed();
+ int green = color.getGreen();
+ int blue = color.getBlue();
+ // 一个用于计算RGB像素点灰度的公式
+ Double grayscale = 0.2126 * red + 0.7152 * green + 0.0722 * blue;
+ double index = grayscale / (Math.ceil(255 / PIXEL_CHAR_ARRAY.length) + 0.5);
+ System.out.print(PIXEL_CHAR_ARRAY[(int)(Math.floor(index))]);
+ }
+ System.out.println();
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-io/src/main/resources/bingdundun.jpeg b/core-java-modules/core-java-io/src/main/resources/bingdundun.jpeg
new file mode 100644
index 0000000..8243a8a
Binary files /dev/null and b/core-java-modules/core-java-io/src/main/resources/bingdundun.jpeg differ
diff --git a/core-java-modules/core-java-io/src/main/resources/sanli.jpg b/core-java-modules/core-java-io/src/main/resources/sanli.jpg
new file mode 100644
index 0000000..ff009b0
Binary files /dev/null and b/core-java-modules/core-java-io/src/main/resources/sanli.jpg differ
diff --git a/core-java-modules/core-java-io/src/main/resources/tiger.png b/core-java-modules/core-java-io/src/main/resources/tiger.png
new file mode 100644
index 0000000..97635d6
Binary files /dev/null and b/core-java-modules/core-java-io/src/main/resources/tiger.png differ
diff --git a/core-java-modules/core-java-io/target/classes/bingdundun.jpeg b/core-java-modules/core-java-io/target/classes/bingdundun.jpeg
new file mode 100644
index 0000000..8243a8a
Binary files /dev/null and b/core-java-modules/core-java-io/target/classes/bingdundun.jpeg differ
diff --git a/core-java-modules/core-java-os/.gitignore b/core-java-modules/core-java-os/.gitignore
new file mode 100644
index 0000000..5ff6309
--- /dev/null
+++ b/core-java-modules/core-java-os/.gitignore
@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store
\ No newline at end of file
diff --git a/core-java-modules/core-java-os/README.md b/core-java-modules/core-java-os/README.md
new file mode 100644
index 0000000..bfb1c8a
--- /dev/null
+++ b/core-java-modules/core-java-os/README.md
@@ -0,0 +1,6 @@
+## core-java-os
+当前模块包含操作系统操作相关代码
+
+### 相关文章
+
+- [ProcessBuilder API 使用教程](https://www.wdbyte.com/java/os/processbuilder/)
\ No newline at end of file
diff --git a/core-java-modules/core-java-os/pom.xml b/core-java-modules/core-java-os/pom.xml
new file mode 100644
index 0000000..721644b
--- /dev/null
+++ b/core-java-modules/core-java-os/pom.xml
@@ -0,0 +1,28 @@
+
+
+ 4.0.0
+
+ com.wdbyte.core-java-modules
+ core-java-modules
+ 1.0.0-SNAPSHOT
+
+
+ core-java-os
+
+
+ 17
+ 17
+ UTF-8
+
+
+
+
+ commons-io
+ commons-io
+ 2.12.0
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ExecDemo.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ExecDemo.java
new file mode 100644
index 0000000..4b73eb6
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ExecDemo.java
@@ -0,0 +1,18 @@
+package com.wdbyte.os.process;
+
+import java.io.IOException;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class ExecDemo {
+
+ public static void main(String[] args) throws InterruptedException {
+ System.out.println("开始处理数据...");
+ for (int i = 0; i < 10; i++) {
+ Thread.sleep(1000);
+ System.out.println(i);
+ }
+ System.out.println("数据处理完毕");
+ }
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest1.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest1.java
new file mode 100644
index 0000000..919fb7f
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest1.java
@@ -0,0 +1,52 @@
+package com.wdbyte.os.process;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+import org.apache.commons.io.IOUtils;
+
+/**
+ * Process 输出Java 版本号
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest1 {
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ // 构建执行命令
+ ProcessBuilder processBuilder = new ProcessBuilder("java","-version");
+ // 重定向 ERROR 流(有些 JDK 版本 Java 命令通过 ERROR 流输出)
+ processBuilder.redirectErrorStream(true);
+ // 运行命令 java -version
+ Process process = processBuilder.start();
+ // 过去PID
+ long pid = process.pid();
+ // 一次性获取运行结果
+ //String result = convertInputStreamToString(process.getInputStream());
+ String result = IOUtils.toString(process.getInputStream());
+ // 等到运行结束
+ int exitCode = process.waitFor();
+
+ System.out.println("pid:" + pid);
+ System.out.println("result:" + result);
+ System.out.println("exitCode:" + exitCode);
+ }
+
+ public static String convertInputStreamToString(InputStream inputStream) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {
+ String line = null;
+ while ((line = bufferedReader.readLine()) != null) {
+ sb.append(line);
+ sb.append(System.lineSeparator());
+ }
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } finally {
+ inputStream.close();
+ }
+ return sb.toString();
+ }
+
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest10.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest10.java
new file mode 100644
index 0000000..6c980d9
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest10.java
@@ -0,0 +1,42 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest10 {
+ private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
+
+ public static void main(String[] args) throws InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.directory(new File(BASE_DIR));
+ processBuilder.command("java", "ExecDemo.java");
+ // 把子线程 I/O 输出重定向当前进程
+ processBuilder.inheritIO();
+
+ // 创建 CompletableFuture 对象
+ CompletableFuture future = CompletableFuture.supplyAsync(() -> {
+ try {
+ // 命令执行
+ Process process = processBuilder.start();
+ // 任务超时时间
+ process.waitFor();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ return null;
+ });
+
+ // 注册回调函数,处理异步等待的结果
+ future.thenAccept(result -> {
+ System.out.println("进程执行结束");
+ });
+ System.out.println("主进程等待");
+ Thread.sleep(20 * 1000);
+ }
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest2.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest2.java
new file mode 100644
index 0000000..7075784
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest2.java
@@ -0,0 +1,32 @@
+package com.wdbyte.os.process;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.commons.io.IOUtils;
+
+/**
+ * 修改环境变量
+ *
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest2 {
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ Map environment = processBuilder.environment();
+ environment.forEach((k, v) -> System.out.println(k + ":" + v));
+ System.out.println("--------------");
+ processBuilder.environment().put("my_website", "www.wdbyte.com");
+ processBuilder.command("/bin/bash", "-c", "echo $my_website");
+
+ Process process = processBuilder.start();
+ long pid = process.pid();
+ String result = IOUtils.toString(process.getInputStream());
+ int exitCode = process.waitFor();
+
+ System.out.println("pid:" + pid);
+ System.out.println("result:" + result);
+ System.out.println("exitCode:" + exitCode);
+ }
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest3.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest3.java
new file mode 100644
index 0000000..3042923
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest3.java
@@ -0,0 +1,31 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.commons.io.IOUtils;
+
+/**
+ * 修改工作目录
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest3 {
+
+ private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.directory(new File(BASE_DIR));
+ processBuilder.command("/bin/bash", "-c", "pwd");
+ Process process = processBuilder.start();
+
+ long pid = process.pid();
+ String result = IOUtils.toString(process.getInputStream());
+ int exitCode = process.waitFor();
+
+ System.out.println("pid:" + pid);
+ System.out.println("result:" + result);
+ System.out.println("exitCode:" + exitCode);
+ }
+
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest4.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest4.java
new file mode 100644
index 0000000..73d91be
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest4.java
@@ -0,0 +1,36 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+/**
+ * 输出日志到指定文件
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest4 {
+ private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.directory(new File(BASE_DIR));
+ processBuilder.command("/bin/bash", "-c", "ls -l");
+
+ File logFile = new File(BASE_DIR + "/process_log.txt");
+ // 输出到日志文件
+ processBuilder.redirectOutput(logFile);
+ // 追加日志到文件
+ // processBuilder.redirectOutput(ProcessBuilder.Redirect.appendTo(logFile));
+ // 是否输出ERROR日志到文件
+ processBuilder.redirectErrorStream(true);
+
+ Process process = processBuilder.start();
+ long pid = process.pid();
+ int exitCode = process.waitFor();
+ System.out.println("pid:" + pid);
+ System.out.println("exitCode:" + exitCode);
+
+ // 读取日志
+ Files.lines(logFile.toPath()).forEach(System.out::println);
+ }
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest5.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest5.java
new file mode 100644
index 0000000..54c4752
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest5.java
@@ -0,0 +1,40 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+
+/**
+ * 输出日志到指定文件
+ *
+ * @author https://www.wdbyte.com
+ **
+ */
+public class ProcessBuilderTest5 {
+ private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.directory(new File(BASE_DIR));
+ // 执行命令 xxx,命令不存在,会报 ERROR 日志
+ processBuilder.command("/bin/bash", "-c", "xxx");
+
+ File infoLogFile = new File(BASE_DIR + "/process_log_info.txt");
+ File errorLogFile = new File(BASE_DIR + "/process_log_error.txt");
+ // 日志输出到文件
+ processBuilder.redirectOutput(infoLogFile);
+ processBuilder.redirectError(errorLogFile);
+ Process process = processBuilder.start();
+
+ long pid = process.pid();
+ int exitCode = process.waitFor();
+
+ System.out.println("pid:" + pid);
+ System.out.println("exitCode:" + exitCode);
+
+ // 读取 ERROR 日志
+ Files.lines(errorLogFile.toPath()).forEach(System.out::println);
+ }
+
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest6.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest6.java
new file mode 100644
index 0000000..8c71d3b
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest6.java
@@ -0,0 +1,23 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 子线程 I/O 重定向到当前线程
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest6 {
+ public static void main(String[] args) throws IOException, InterruptedException {
+
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.directory(new File("./"));
+ processBuilder.command("/bin/bash", "-c", "ls -l");
+ // 把子线程 I/O 输出重定向当前进程
+ processBuilder.inheritIO();
+ Process process = processBuilder.start();
+ int exitCode = process.waitFor();
+ System.out.println("exitCode:" + exitCode);
+ }
+
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest7.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest7.java
new file mode 100644
index 0000000..bbcf647
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest7.java
@@ -0,0 +1,30 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * 运行一个 Java 程序
+ *
+ * @author https://www.wdbyte.com
+ **
+ */
+public class ProcessBuilderTest7 {
+ private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.directory(new File(BASE_DIR));
+ processBuilder.command("java", "ExecDemo.java");
+ // 把子线程 I/O 输出重定向当前进程
+ processBuilder.inheritIO();
+ Process process = processBuilder.start();
+
+ long pid = process.pid();
+ int exitCode = process.waitFor();
+
+ System.out.println("pid:" + pid);
+ System.out.println("exitCode:" + exitCode);
+ }
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest8.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest8.java
new file mode 100644
index 0000000..d38fbec
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest8.java
@@ -0,0 +1,40 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.ProcessBuilder.Redirect;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Java 9 中新增的管道操作
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest8 {
+ private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ ProcessBuilder ls = new ProcessBuilder("/bin/bash", "-c", "ls -l");
+ ProcessBuilder wc = new ProcessBuilder("wc", "-l");
+ // 追加日志到文件
+ File pipeLineLogFile = getFile(BASE_DIR + "/pipe_line_log.txt");
+ wc.redirectOutput(Redirect.appendTo(pipeLineLogFile));
+
+ List processes = ProcessBuilder.startPipeline(Arrays.asList(ls, wc));
+ Process process = processes.get(processes.size() - 1);
+
+ System.out.println("pid:" + process.pid());
+ System.out.println("exitCode:" + process.waitFor());
+
+ Files.lines(pipeLineLogFile.toPath()).forEach(System.out::println);
+ }
+
+ public static File getFile(String filePath) throws IOException {
+ File logFile = new File(filePath);
+ if (!logFile.exists()) {
+ logFile.createNewFile();
+ }
+ return logFile;
+ }
+}
diff --git a/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest9.java b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest9.java
new file mode 100644
index 0000000..6ee7b23
--- /dev/null
+++ b/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process/ProcessBuilderTest9.java
@@ -0,0 +1,34 @@
+package com.wdbyte.os.process;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 运行一个 Java 程序
+ * 等待一定时间后检查状态,未结束则直接杀死进程。
+ *
+ * @author https://www.wdbyte.com
+ */
+public class ProcessBuilderTest9 {
+ private static String BASE_DIR = "/Users/darcy/git/JavaNotes/core-java-modules/core-java-os/src/main/java/com/wdbyte/os/process";
+
+ public static void main(String[] args) throws IOException, InterruptedException {
+ ProcessBuilder processBuilder = new ProcessBuilder();
+ processBuilder.directory(new File(BASE_DIR));
+ processBuilder.command("java", "ExecDemo.java");
+ // 把子线程 I/O 输出重定向当前进程
+ processBuilder.inheritIO();
+ Process process = processBuilder.start();
+ // 等待一定时间
+ boolean waitFor = process.waitFor(3, TimeUnit.SECONDS);
+ System.out.println("waitFor:" + waitFor);
+ // 若未退出,杀死子进程
+ if (!waitFor) {
+ process.destroyForcibly();
+ process.waitFor();
+ System.out.println("杀死进程:" + process);
+ }
+
+ }
+}
diff --git a/core-java-modules/core-java-performance-code/README.md b/core-java-modules/core-java-performance-code/README.md
new file mode 100644
index 0000000..28ac9e0
--- /dev/null
+++ b/core-java-modules/core-java-performance-code/README.md
@@ -0,0 +1,6 @@
+## core-java-performance-code
+当前模块包含代码性能相关代码
+
+### 相关文章
+
+- [Java 中的 5 个代码性能提升技巧](https://www.wdbyte.com/java/code-5-tips.html)
\ No newline at end of file
diff --git a/core-java-modules/core-java-performance-code/pom.xml b/core-java-modules/core-java-performance-code/pom.xml
new file mode 100644
index 0000000..b998e88
--- /dev/null
+++ b/core-java-modules/core-java-performance-code/pom.xml
@@ -0,0 +1,35 @@
+
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+ core-java-performance-code
+ 1.0.0-SNAPSHOT
+ jar
+
+
+ 1.8
+ 1.8
+
+
+
+
+
+ org.openjdk.jmh
+ jmh-core
+ 1.33
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ 1.33
+ provided
+
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/EnumIteration.java b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/EnumIteration.java
new file mode 100644
index 0000000..c4a708f
--- /dev/null
+++ b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/EnumIteration.java
@@ -0,0 +1,56 @@
+package com.wdbyte;
+
+import java.util.EnumSet;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+
+/**
+ * 枚举类遍历测试
+ *
+ * @author https://www.wdbyte.com
+ * @date 2021/12/07
+ */
+@State(Scope.Benchmark)
+@Warmup(iterations = 3, time = 3)
+@Measurement(iterations = 5, time = 3)
+public class EnumIteration {
+
+ enum FourteenEnum {
+ a, b, c, d, e, f, g,
+ h, i, j, k, l, m, n,
+ o, p, q, r, s, t,
+ u, v, w, x, y, z;
+
+ static final FourteenEnum[] VALUES;
+ static {
+ VALUES = values();
+ }
+ }
+
+ @Benchmark
+ public void valuesEnum(Blackhole bh) {
+ for (FourteenEnum value : FourteenEnum.values()) {
+ bh.consume(value.ordinal());
+ }
+ }
+
+ @Benchmark
+ public void enumSetEnum(Blackhole bh) {
+ for (FourteenEnum value : EnumSet.allOf(FourteenEnum.class)) {
+ bh.consume(value.ordinal());
+ }
+ }
+
+ @Benchmark
+ public void cacheEnums(Blackhole bh) {
+ for (FourteenEnum value : FourteenEnum.VALUES) {
+ bh.consume(value.ordinal());
+ }
+ }
+}
+
diff --git a/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/EnumMapBenchmark.java b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/EnumMapBenchmark.java
new file mode 100644
index 0000000..a0da851
--- /dev/null
+++ b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/EnumMapBenchmark.java
@@ -0,0 +1,92 @@
+package com.wdbyte;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.SplittableRandom;
+import java.util.UUID;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+
+@State(Scope.Benchmark)
+@Warmup(iterations = 3, time = 3)
+@Measurement(iterations = 5, time = 3)
+public class EnumMapBenchmark {
+
+ enum AnEnum {
+ a, b, c, d, e, f, g,
+ h, i, j, k, l, m, n,
+ o, p, q, r, s, t,
+ u, v, w, x, y, z;
+ }
+
+ /** 要查找的 key 的数量 */
+ private static int size = 10000;
+ /** 随机数种子 */
+ private static int seed = 99;
+
+ @State(Scope.Benchmark)
+ public static class EnumMapState {
+ private EnumMap map;
+ private AnEnum[] values;
+
+ @Setup(Level.Trial)
+ public void setup() {
+ map = new EnumMap<>(AnEnum.class);
+ values = new AnEnum[size];
+ AnEnum[] enumValues = AnEnum.values();
+ SplittableRandom random = new SplittableRandom(seed);
+ for (int i = 0; i < size; i++) {
+ int nextInt = random.nextInt(0, Integer.MAX_VALUE);
+ values[i] = enumValues[nextInt % enumValues.length];
+ }
+ for (AnEnum value : enumValues) {
+ map.put(value, UUID.randomUUID().toString());
+ }
+ }
+ }
+
+ @State(Scope.Benchmark)
+ public static class HashMapState{
+ private HashMap map;
+ private String[] values;
+
+ @Setup(Level.Trial)
+ public void setup() {
+ map = new HashMap<>();
+ values = new String[size];
+ AnEnum[] enumValues = AnEnum.values();
+ int pos = 0;
+ SplittableRandom random = new SplittableRandom(seed);
+ for (int i = 0; i < size; i++) {
+ int nextInt = random.nextInt(0, Integer.MAX_VALUE);
+ values[i] = enumValues[nextInt % enumValues.length].toString();
+ }
+ for (AnEnum value : enumValues) {
+ map.put(value.toString(), UUID.randomUUID().toString());
+ }
+ }
+ }
+
+ @Benchmark
+ public void enumMap(EnumMapState state, Blackhole bh) {
+ for (AnEnum value : state.values) {
+ bh.consume(state.map.get(value));
+ }
+ }
+
+ @Benchmark
+ public void hashMap(HashMapState state, Blackhole bh) {
+ for (String value : state.values) {
+ bh.consume(state.map.get(value));
+ }
+ }
+}
+
+
diff --git a/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/HashMapKey.java b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/HashMapKey.java
new file mode 100644
index 0000000..31e622b
--- /dev/null
+++ b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/HashMapKey.java
@@ -0,0 +1,73 @@
+package com.wdbyte;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.commons.lang3.tuple.MutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OperationsPerInvocation;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2021/12/06
+ */
+@State(Scope.Thread)
+@Fork(2)
+@Warmup(iterations = 3, time = 3)
+@Measurement(iterations = 5, time = 3)
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+public class HashMapKey {
+
+ private int size = 1024;
+ private Map stringMap;
+ private Map pairMap;
+ private String[] prefixes;
+ private String[] suffixes;
+
+ @Setup(Level.Trial)
+ public void setup() {
+ prefixes = new String[size];
+ suffixes = new String[size];
+ stringMap = new HashMap<>();
+ pairMap = new HashMap<>();
+ for (int i = 0; i < size; ++i) {
+ prefixes[i] = UUID.randomUUID().toString();
+ suffixes[i] = UUID.randomUUID().toString();
+ stringMap.put(prefixes[i] + ";" + suffixes[i], i);
+ // use new String to avoid reference equality speeding up the equals calls
+ pairMap.put(new MutablePair(prefixes[i], suffixes[i]), i);
+ }
+ }
+
+ @Benchmark
+ @OperationsPerInvocation(1024)
+ public void stringKey(Blackhole bh) {
+ for (int i = 0; i < prefixes.length; i++) {
+ bh.consume(stringMap.get(prefixes[i] + ";" + suffixes[i]));
+ }
+ }
+
+ @Benchmark
+ @OperationsPerInvocation(1024)
+ public void pairMap(Blackhole bh) {
+ for (int i = 0; i < prefixes.length; i++) {
+ bh.consume(pairMap.get(new MutablePair(prefixes[i], suffixes[i])));
+ }
+ }
+
+}
diff --git a/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/HashMapSize.java b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/HashMapSize.java
new file mode 100644
index 0000000..45ed900
--- /dev/null
+++ b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/HashMapSize.java
@@ -0,0 +1,36 @@
+package com.wdbyte;
+
+import java.util.HashMap;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2021/12/06
+ */
+@State(Scope.Benchmark)
+@Warmup(iterations = 3,time = 3)
+@Measurement(iterations = 5,time = 3)
+public class HashMapSize {
+
+ @Param({"14"})
+ int keys;
+
+ @Param({"16", "32"})
+ int size;
+
+ @Benchmark
+ public HashMap getHashMap() {
+ HashMap map = new HashMap<>(size);
+ for (int i = 0; i < keys; i++) {
+ map.put(i, i);
+ }
+ return map;
+ }
+
+}
diff --git a/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/StringInJdk.java b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/StringInJdk.java
new file mode 100644
index 0000000..97e754b
--- /dev/null
+++ b/core-java-modules/core-java-performance-code/src/main/java/com/wdbyte/StringInJdk.java
@@ -0,0 +1,56 @@
+package com.wdbyte;
+
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2021/12/23
+ */
+@State(Scope.Benchmark)
+@Warmup(iterations = 3, time = 3)
+@Measurement(iterations = 5, time = 3)
+public class StringInJdk {
+
+ @Param({"10000"})
+ private int size;
+ private String[] stringArray;
+ private List byteList;
+
+ @Setup(Level.Trial)
+ public void setup() {
+ byteList = new ArrayList<>(size);
+ stringArray = new String[size];
+ for (int i = 0; i < size; i++) {
+ String uuid = UUID.randomUUID().toString();
+ stringArray[i] = uuid;
+ byteList.add(uuid.getBytes(StandardCharsets.UTF_8));
+ }
+ }
+
+ @Benchmark
+ public void byteToString(Blackhole bh) {
+ for (byte[] bytes : byteList) {
+ bh.consume(new String(bytes, StandardCharsets.UTF_8));
+ }
+ }
+
+ @Benchmark
+ public void stringToByte(Blackhole bh) {
+ for (String s : stringArray) {
+ bh.consume(s.getBytes(StandardCharsets.UTF_8));
+ }
+ }
+}
diff --git a/core-java-modules/core-java-string/README.md b/core-java-modules/core-java-string/README.md
new file mode 100644
index 0000000..94dd352
--- /dev/null
+++ b/core-java-modules/core-java-string/README.md
@@ -0,0 +1,6 @@
+## core-java-io
+当前模块包含 String 相关代码
+
+### 相关文章
+
+- [Java 中拼接 String 的 N 种方式](https://www.wdbyte.com/java/string-concat.html)
\ No newline at end of file
diff --git a/core-java-modules/core-java-string/pom.xml b/core-java-modules/core-java-string/pom.xml
new file mode 100644
index 0000000..b6a5e1f
--- /dev/null
+++ b/core-java-modules/core-java-string/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ core-java-modules
+ com.wdbyte.core-java-modules
+ 1.0.0-SNAPSHOT
+
+ 4.0.0
+
+ core-java-string
+
+
+ 17
+ 17
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-string/src/main/java/com/wdbyte/string/StringConcat.java b/core-java-modules/core-java-string/src/main/java/com/wdbyte/string/StringConcat.java
new file mode 100644
index 0000000..93ff077
--- /dev/null
+++ b/core-java-modules/core-java-string/src/main/java/com/wdbyte/string/StringConcat.java
@@ -0,0 +1,88 @@
+package com.wdbyte.string;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.StringJoiner;
+import java.util.stream.Collectors;
+
+/**
+ * @author https://www.wdbyte.com
+ * @date 2022/02/16
+ */
+public class StringConcat {
+
+ public static void main(String[] args) {
+ System.out.println(concat());
+ System.out.println(concat2());
+ System.out.println(concat3());
+ System.out.println(concat4());
+ System.out.println(concat5());
+ System.out.println(concat6());
+ System.out.println(concat7());
+ }
+
+ public static String concat() {
+ String[] values = {"https", "://", "www.", "wdbyte", ".com", null};
+ String result = "";
+
+ for (String value : values) {
+ result = result + value;
+ }
+ return result;
+ }
+
+ public static String concat2() {
+ String[] values = {"https", "://", "www.", "wdbyte", ".com", null};
+ String result = String.join("", values);
+ return result;
+ }
+
+ public static String concat3() {
+ String[] values = {"https", "://", "www.", "wdbyte", ".com", null};
+ String result = "";
+ for (String value : values) {
+ result = result + nullToString(value);
+ }
+ return result;
+ }
+
+ public static String concat4() {
+ String[] values = {"https", "://", "www.", "wdbyte", ".com", null};
+ String result = "";
+ for (String value : values) {
+ result = result.concat(nullToString(value));
+ }
+ return result;
+ }
+
+ public static String concat5() {
+ String[] values = {"https", "://", "www.", "wdbyte", ".com", null};
+ StringBuilder result = new StringBuilder();
+ for (String value : values) {
+ result = result.append(nullToString(value));
+ }
+ return result.toString();
+ }
+
+ public static String concat6() {
+ String[] values = {"https", "://", "www.", "wdbyte", ".com", null};
+ StringJoiner result = new StringJoiner("");
+ for (String value : values) {
+ result = result.add(nullToString(value));
+ }
+ return result.toString();
+ }
+
+ public static String concat7() {
+ String[] values = {"https", "://", "www.", "wdbyte", ".com", null};
+ String result = Arrays.stream(values)
+ .filter(Objects::nonNull)
+ .collect(Collectors.joining());
+ return result;
+ }
+
+ public static String nullToString(String value) {
+ return value == null ? "" : value;
+ }
+
+}
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 66adcd7..b3a49a2 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -14,13 +14,32 @@
pom
- 1.8
- 1.8
+ 21
+ 21
core-java-performance
core-java-8
+ core-java-9
+ core-java-18
+ core-java-20
+ core-java-21
+ core-java-performance-code
+ core-java-io
+ core-java-string
+ core-java-collect
+ core-java-base
+ core-java-os
+
+
+ org.junit.jupiter
+ junit-jupiter
+ 5.9.1
+
+
+
+
\ No newline at end of file
diff --git a/docs/computer/protocol-http.md b/docs/computer/protocol-http.md
deleted file mode 100644
index dc47d7d..0000000
--- a/docs/computer/protocol-http.md
+++ /dev/null
@@ -1,223 +0,0 @@
----
-title: 网络协议之HTTP
-date: 2018-07-14 00:37:19
-updated: 2018-07-14 00:37:19
-url: computer/protocol-http
-categories:
-- 计算机
-tags:
-- 协议
-- HTTP
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-
-### HTTP的简介
-
-超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。
-
-
-
- 
-
-HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
-
-HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
-
-HTTP协议工作于客户端-服务端架构为上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。Web服务器根据接收到的请求后,向客户端发送响应信息。
-
-### HTTP的特点
-1. 支持客户/服务器模式。
-1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。
-由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
-1. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
-1. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
-1. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
-
-### HTTP的URL(UniformResourceLocator)
-URL格式:
- ```
- http://host[:port][abs_path]
-```
-
-`http`表示要通过HTTP协议来定位网络资源。
-`host`表示合法的Internet主机域名或IP地址(以点分十进制格式表示)。
-`port`用于指定一个端口号,拥有被请求资源的服务器主机监听该端口的TCP连接。
-如果port是空,则使用`缺省的端口80`。当服务器的端口不是80的时候,需要显式指定端口号。
-`abs_path`指定请求资源的URI(Uniform Resource Identifier,统一资源定位符),如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出。通常这个工作浏览器就帮我们完成了。
-
-### HTTP的请求消息Request
-消息格式:
- 
-
-先来看下HTTP的请求消息头:
-```
- - Accept: text/html,image/* 【浏览器告诉服务器,它支持的数据类型】
- - Accept-Charset: ISO-8859-1 【浏览器告诉服务器,它支持哪种字符集】
- - Accept-Encoding: gzip,compress 【浏览器告诉服务器,它支持的压缩格式】
- - Accept-Language: en-us,zh-cn 【浏览器告诉服务器,它的语言环境】
- - Host: www.codingme.net:80【浏览器告诉服务器,它的想访问哪台主机】
- - If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,缓存数据的时间】
- - Referer: http://www.codingme.net/index.jsp【浏览器告诉服务器,客户机是从那个页面来的—反盗链】
- - 8.User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)【浏览器告诉服务器,浏览器的内核是什么】
- - Cookie【浏览器告诉服务器,带来的Cookie是什么】
- - Connection: close/Keep-Alive 【浏览器告诉服务器,请求完后是断开链接还是保持链接】
- - Date: Tue, 11 Jul 2000 18:23:51 GMT【浏览器告诉服务器,请求的时间
-```
-使用Chrome请求网址进行观察:
- 
-Chrome请求信息
-
-```
-Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
-Accept-Encoding:gzip, deflate
-Accept-Language:zh-CN,zh;q=0.8
-Connection:keep-alive
-Cookie:JSESSIONID=2A40A51EDDE663C840A2D03B7587D660; Hm_lvt_1b51c3ea9a3e7b1a2bc55df97ab4efd3=1500964170,1500976171,1500994669,1501056813; Hm_lpvt_1b51c3ea9a3e7b1a2bc55df97ab4efd3=1501056816
-Host:blog.codingme.net
-Upgrade-Insecure-Requests:1
-User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3080.5 Safari/537.36
-```
-### HTTP的响应消息Response
-一个完整的HTTP响应应该包含四个部分:
-
-1. 一个状态行【用于描述服务器对请求的处理结果。】
-1. 多个消息头【用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理等一会儿它回送的数据】
-1. 一个空行
-1. 实体内容【服务器向客户端回送的数据】
-
-响应消息头的详细解释:
-
- - Location: http://www.codingme.net/index.jsp 【服务器告诉浏览器要跳转到哪个页面】
- - Server:apache tomcat【服务器告诉浏览器,服务器的型号是什么】
- - Content-Encoding: gzip 【服务器告诉浏览器数据压缩的格式】
- - Content-Length: 80 【服务器告诉浏览器回送数据的长度】
- - Content-Language: zh-cn 【服务器告诉浏览器,服务器的语言环境】
- - Content-Type: text/html; charset=GB2312 【服务器告诉浏览器,回送数据的类型】
- - Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器该资源上次更新时间】
- - Refresh: 1;url=http://www.codingme.net【服务器告诉浏览器要定时刷新】
- - Content-Disposition: attachment; filename=aaa.zip【服务器告诉浏览器以下载方式打开数据】
- - Transfer-Encoding: chunked 【服务器告诉浏览器数据以分块方式回送】
- - Set-Cookie:SS=Q0=5Lb_nQ; path=/search【服务器告诉浏览器要保存Cookie】
- - Expires: -1【服务器告诉浏览器不要设置缓存】
- - Cache-Control: no-cache 【服务器告诉浏览器不要设置缓存】
- - Pragma: no-cache 【服务器告诉浏览器不要设置缓存】
- - Connection: close/Keep-Alive 【服务器告诉浏览器连接方式】
- - Date: Tue, 11 Jul 2000 18:23:51 GMT【服务器告诉浏览器回送数据的时间】
-
-Chrome请求网址http://bing.codingme.net 抓包展示;
- 
-
-
-### HTTP的状态码
-状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
-
-1xx:指示信息--表示请求已接收,继续处理
-
-2xx:成功--表示请求已被成功接收、理解、接受
-
-3xx:重定向--要完成请求必须进行更进一步的操作
-
-4xx:客户端错误--请求有语法错误或请求无法实现
-
-5xx:服务器端错误--服务器未能实现合法的请求
-
-常见状态码:
-
-- 200 OK //客户端请求成功
-- 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
-- 401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
-- 403 Forbidden //服务器收到请求,但是拒绝提供服务
-- 404 Not Found //请求资源不存在,eg:输入了错误的URL
-- 500 Internal Server Error //服务器发生不可预期的错误
-- 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
-
-详情可以查看[更多状态码](http://kb.cnblogs.com/page/168720/)
-
-
-### HTTP的请求方法(动作)
-HTTP协议中定义了8种方法来表明不同的动作
-1. OPTIONS
- 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性。
-
-1. HEAD
- 向服务器索与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。
-
-1. GET
- 向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。
- Loadrunner中对应get请求函数:web_link和web_url.
-
-1. POST
- 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form.
-
-1. PUT
- 向指定资源位置上传其最新内容。
-
-1. DELETE
- 请求服务器删除Request-URL所标识的资源。
-
-1. TRACE
- 回显服务器收到的请求,主要用于测试或诊断。
-
-1. CONNECT
-HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
-
-### TCP的三次握手
-HTTP使用TCP进行输出传输,在建立TCP连接时会进行三次握手。
-
-所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。在socket编程中,这一过程由客户端执行connect来触发,整个流程如下图所示:
-
- 
-
-1. 建立连接时,客户端发送SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认
-1. 服务器收到SYN包,必须确认客户的SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态
-1. 客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手,客户端与服务器开始传送数据。
-
-### HTTP协议工作流程
-以访问网站为例,在回车之后所发生的动作:
-
-1. 浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
-1. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
-1. 浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
-1. 服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
-1. 释放 TCP连接;
-1. 浏览器将该 html 文本并显示内容;
-
-### GET请求和POST请求的区别
-使用Chrome浏览器进行GET请求测试:
->Request URL:http://localhost:8888/01-web_servlet/loginServlet?username=zxy&password=123
-Request Method:GET
-Status Code:200
-Remote Address:[::1]:8888
-Referrer Policy:no-referrer-when-downgrade
-
-使用Chrome浏览器进行POST请求测试:
->Request URL:http://localhost:8888/01-web_servlet/loginServlet
-Request Method:POST
-Status Code:200
-Remote Address:[::1]:8888
-Referrer Policy:no-referrer-when-downgrade
-
-由测试可以看到GET和POST最明显的区别就是
-1. GET携带的参数传递置于URL中以?分割URL和传输数据,多个参数用&连接,如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,`不安全`,
-POST把提交的数据放置在是HTTP包的包体中。因此,GET提交的数据会在地址栏中显示出来,而`POST`提交,地址栏`不会改变`
-1. 网上搜索得到如下区别
-1. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
-1. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
-1. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
-1. GET产生一个TCP数据包;POST产生两个TCP数据包。
-
-
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
-
diff --git a/docs/desgin-pattern/pattern-singleton.md b/docs/desgin-pattern/pattern-singleton.md
deleted file mode 100644
index 5a4cabc..0000000
--- a/docs/desgin-pattern/pattern-singleton.md
+++ /dev/null
@@ -1,210 +0,0 @@
----
-title: 设计模式 -创建型模式之单例模式的五种实现
-date: 2018-03-08 16:03:28
-url: dp/pattern-singleton
-updated: 2018-03-08 16:03:28
-categories:
-- 设计模式
-tags:
-- 设计模式
-- 单例模式
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-# 单例模式(Singleton)
-
-单例模式是在 `GOF`的23种设计模式里较为简单的一种,下面引用百度百科介绍:
->单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例
-
-
-
-许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
-
-在Java中,确保一个类只有一个对象实例可以通过权限的修饰来实现。
-# 单例模式 - 饿汉模式
-单例模式的饿汉模式指全局的单例实例在第一次被使用时构建。
-具体实现:
-```
- // 单例模式的饿汉模式实现
- public class Singleton {
- private final static Singleton SINGLETON= new Singleton();
- // Private constructor suppresses
- private Singleton() {}
-
- // default public constructor
- public static Singleton getInstance() {
- return SINGLETON;
- }
- }
-```
-在饿汉模式实现方式中,程序的主要特点是:
-1. 私有构造方法
-2. 私有静态属性,维护自身实例
-3. 静态服务方法,获取实例
-4. 初始化时候创建,消耗初始化系统资源
-
-# 单例模式 - 懒汉模式 - 普通
-
-懒汉模式,也是最常用的形式,饿汉模式让程序在初始化时候进行加载,有时为了节约资源,我们需要在需要的时候进行加载,这时候我们可以使用懒汉模式。
-具体实现:
-```
-public class SingletonLayload {
- // 私有化自身类对象
- private static SingletonLayload SINGLETON;
- // 私有化构造方法
- private SingletonLayload() {}
-
- // 静态方法获取实例
- public static SingletonLayload getInstance() {
- if(SINGLETON== null ) {
- SINGLETON= new SingletonLayload();
- }
- return SINGLETON;
- }
-}
-```
-# 单例模式 - 懒汉模式 - 同步锁
-在多线程的环境中,简单的单例模式将会出现问题,试想在上面的懒汉模式中,如果多线程并发执行`getInstance()`,当线程A执行到:
->`INSTANCE = new SingletonLayload();`
-
-却还没有执行完毕时,线程B执行到`if(INSTANCE == null )`,此时就无法保证单例特性。
-因此在多线程环境中,单例模式需要使用同步锁确保实现真正的单例。
-具体实现:
-```
-public class SingletonLayloadSyn {
- // 私有化自身类对象
- private static SingletonLayloadSyn SINGLETON;
- // 私有化构造方法
- private SingletonLayloadSyn() {}
- // 静态方法获取实例
- public static synchronized SingletonLayloadSyn getInstance() {
- if(SINGLETON == null ) {
- SINGLETON = new SingletonLayloadSyn();
- }
- return SINGLETON;
- }
-
-}
-```
- 通过在`getInstance()`方法上添加 `synchronized` 关键字可以解决多线程带来的问题。
-
-# 单例模式 - 懒汉模式 - 双重校验锁
-使用上面的( 多线程下 - 懒汉模式 - 同步锁)方式在解决多线程问题时虽然可以达到确保线程安全的目的,但是使用了`synchronized `关键字之后在需要多次调用时,会让代码的执行效率大大降低。那么有没有在确保线程安全的同时又可以兼顾效率的方法呢?
-具体实现:
-
-```
-public class SingletonLayLoadSynDCL {
- // 私有化自身类对象
- private static SingletonLayLoadSynDCL SINGLETON;
- // 私有化构造方法
- private SingletonLayLoadSynDCL() {
- }
-
- public static SingletonLayLoadSynDCL getInstance() {
- if (SINGLETON == null) {
- synchronized(SingletonLayLoadSynDCL.class) {
- SINGLETON = new SingletonLayLoadSynDCL();
- }
- }
- return SINGLETON;
- }
-}
-```
-使用 `synchronized` 确保线程安全,在SINGLETON 为 `null` 时才进行创建实例,但是仍然不能 保证在实例未创建完成时候有新的线程执行到 `if (SINGLETON == null)`;因此,仍然不够安全。
-修改 `getInstance()`方法。
-具体实现:
-
-```
-public class SingletonLayLoadSynDCL {
- // 私有化自身类对象
- private static SingletonLayLoadSynDCL SINGLETON;
- // 私有化构造方法
- private SingletonLayLoadSynDCL() {
- }
-
- // 使用双重校验锁确保线程安全的同时兼顾执行效率
- public static SingletonLayLoadSynDCL getInstance() {
- if (SINGLETON == null) { // 第一重检查
- synchronized (SingletonLayLoadSynDCL.class) {
- if (SINGLETON == null) { //第二重检查
- SINGLETON = new SingletonLayLoadSynDCL();
- }
- }
- }
- return SINGLETON;
-
- }
-}
-```
-看似完美的双检查模式,在理论上是没有问题的。但是在实际的情况里,有可能发生在没有构造完毕的情况下SINGLETON 引用已经不是 NULL 的情况,这时候如果有其他线程执行到`if (SINGLETON == null) { // 第一重检查`则会获取到一个不正确的 SINGLETON 引用。这是由于`JVM` 的无序写入引起的。
-
-幸好,在 `JDK1.5` 之后,提供了`volatile`关键字,用于确保被修饰的变量的读写不允许被控制。因此修改上面具体实现为:
-```
-/**
- *
- * 使用双重校验锁以及volatile关键字确保线程安全的同时兼顾执行效率
- * @author niujinpeng
- */
-public class SingletonLayLoadSynDCL {
- // 私有化自身类对象
- // private static SingletonLayLoadSynDCL SINGLETON;
- private volatile static SingletonLayLoadSynDCL SINGLETON;
- // 私有化构造方法
- private SingletonLayLoadSynDCL() {}
-
- // 使用双重校验锁确保线程安全的同时兼顾执行效率
- public static SingletonLayLoadSynDCL getInstance() {
- if (SINGLETON == null) {
- synchronized (SingletonLayLoadSynDCL.class) {
- if (SINGLETON == null) {
- SINGLETON = new SingletonLayLoadSynDCL();
- }
- }
- }
- return SINGLETON;
-
- }
-}
-```
-
-# 单例模式 - 懒汉模式 - 内部类
-除了使用上面的懒汉模式实现方式之外,在解决多线程问题中,《Effective Java》的作者给出了另外一种保证线程安全且兼顾效率的方式,利用了静态内部类以及类加载特性实现。静态内部类只有在调用时才会加载,而静态属性随着类的加载而加载,类的加载初始化只会有一次。因此保证了获取实例的唯一性。
-具体实现:
-```
-package cn.snowflow.pattern.singleton;
-/**
- *
- * 利用静态内部类实现线程安全且兼顾效率的单例模式
- * @author niujinpeng
- */
-public class SingletonLayloadSynSafe {
- //静态内部类
- public static class SingletonHolder{
- static final SingletonLayloadSynSafe INSTANCE =
- new SingletonLayloadSynSafe();
- }
- // 私有化构造方法
- private SingletonLayloadSynSafe() {}
-
- // 公有方法获取实例
- public static SingletonLayloadSynSafe getInstance() {
- return SingletonHolder.INSTANCE;
- }
-
-}
-
-```
-
-如果使用单例模式-饿汉模式,推荐`【单例模式 - 饿汉模式】`
-如果使用单例模式-懒汉模式,推荐`【单例模式 - 懒汉模式 - 内部类 】`
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/develop/web-base-01.md b/docs/develop/web-base-01.md
deleted file mode 100644
index c80b540..0000000
--- a/docs/develop/web-base-01.md
+++ /dev/null
@@ -1,202 +0,0 @@
----
-title: Web笔记(一) Web 简介与开发环境搭建
-date: 2018-08-15 05:03:59
-url: develop/web/web/base-01
-updated: 2018-08-15 05:03:59
-categories:
- - Java 开发
-tags:
- - Tomcat
- - Java EE
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-### Web应用程序的工作原理
-大多数的Web应用程序结构都是采用最为流行的B/S软件开发体系结构,将Web应用程序部署在Web服务器上,只要Web服务器启动,用户就可以通过客户端浏览器发送[HTTP](http://www.codingme.net/post/java-web-01)请求到Web服务器,此时运行在Web服务器上对应的Web应用程序将处理客户端请求,处理完成后做出响应。
-
-Web应用程序工作原理图如下:
-
-
-
-
-### Web应用开发技术
-Web应用开发技术又分为客户端开发技术,服务器开发技术。
-客户端开发技术:
-
-1. HTML
-1. CSS
-1. JavaScript
-...
-
-服务器开发技术:
-1. PHP
-1. ASP.NET
-1. Servlet
-1. JSP
-...
-
-两个概念:
-`静态页面`:类似于HTML这种单纯的客户端页面,在每次访问的时候得到的信息都是相同的吗吗,和后台没有任何交互,它是实际存在的,无需经过服务器的编译,直接加载到客户浏览器上显示出来。我们称之为静态页面。
-
-`动态页面`:相对静态页面,显示的内容可以随着时间、环境或者数据库操作的结果而发生改变的。我们称之为动态页面。
-
-### Web 服务器
-进行Java Web开发环境的搭建,首先我们需要了解下Web服务器。
-WEB服务器也称为WWW(WORLD WIDE WEB)服务器,主要功能是提供网上信息浏览服务,Web服务器可以解析HTTP协议。当Web服务器接收到一个HTTP请求,会返回一个HTTP响应,例如送回一个HTML页面。为了处理一个请求Web服务器可以响应一个静态页面或图片,进行页面跳转或者把动态响应的产生委托给一些其它的程序例如CGI脚本,JSP脚本,servlets,ASP脚本,服务器端JavaScript,或者一些其它的服务器端技术。
-关于HTTP协议详细信息可以查看[网络协议之HTTP](https://www.wdbyte.com/2018/07/computer/protocol-http/)
-
-几种常见的Web服务器。
-1. Resin
-Resin是CAUCHO公司的产品,是一个非常流行的application server,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JAVA语言开发。
-1. JBoss
-是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用。JBoss是一个管理EJB的容器和服务器,支持EJB 1.1、EJB 2.0和EJB3的规范。但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
-1. WebSphere
-WebSphere 是 IBM 的软件平台。它包含了编写、运行和监视全天候的工业强度的随需应变 Web 应用程序和跨平台、跨产品解决方案所需要的整个中间件基础设施,如服务器、服务和工具。WebSphere 提供了可靠、灵活和健壮的软件。
-1. WebLogic
-WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。
-1. Tomcat
-Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
-
-
-
-### 安装与配置JDK
-
-Java web开发首先我们需要配置web服务器,这样我们才能通过web服务器部署发布web项目,才可以进行访问,这里选择Tomcat作为web服务器,Tomcat基于运行基于Jre环境,因此我们在配置Tomcat 之前需要配置Java环境。
-
-jdk的下载与安装这里不说,只顺便说一下win下环境变量的配置。
-
-1. 配置环境变量 :右键我的电脑 → 属性→ 高级系统设置 → 环境变量
-1. 在系统变量里新建JAVA_HOME 变量,值为JDK安装路径
-1. 新建`classpath`变量,值为:
- .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar
-
-1. 修改PATH变量值,在值后添加:
- %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
-
-配置完毕后运行命令java -version有版本信息打印说明配置成功
-```dos
-Microsoft Windows [版本 10.0.15063]
-(c) 2017 Microsoft Corporation。保留所有权利。
-
-C:\Users\Niu>java -version
-java version "1.8.0_111"
-Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
-Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
-
-C:\Users\Niu>
-```
-### 安装与启动Tomcat
-Tomcat是免费的开源软件,可在直接在官方网站下载。
-[http://tomcat.apache.org/](http://tomcat.apache.org/)
-1.可以直接在左侧选择版本:
-
-
-
-2.选择版本后可以在下方进行下载,可以选择下载安装版或者解压版,这里选择了解压版
-tar.gz文件是Linux操作系统下的安装版本
-exe文件是Windows系统下的安装版本
-zip文件是Windows系统下的压缩版本
-
-
-
-3.下载完成后解压缩,得到Tomcat目录,
-
-
-
-4.可以在%Tomcat%\conf\server.xml中修改默认端口号(默认为8080)
-
-```xml
-
-```
-5.配置完毕后可以运行%Tomcat%\bin\startup.sh进行启动
-
-
-
-6.浏览器访问http://localhost:8080 进行测试
-
-
-
-#### Eclipse中使用Tomcat
-点击菜单:Window → Prefences → Server → Runtime Environments
-点击左边Add按钮,选择Apache,选择Tomcat版本,点击NEXT
-
-
-
-
-至此,Java Web集成开发环境配置完成,可以在Eclipse中Server面板中新建Tomcat Server进行启动。
-
-新建Server:
-
-
-
-完成创建:
-
-
-
-完成创建之后可以在新建的server上右键选择start进行启动,启动效果如同双击startup.bat,console控制台会同步显示启动信息。
-
-### web项目开发
-
-在环境搭建完成之后,我们应该使用这个环境进行Web项目的开发。这里使用一个简单的例子,来演示如何使用Eclipse开发并且部署一个Web项目。
-
-#### 创建web项目
-首先我们打开Eclipse,点击菜单File -> new -> project 新建项目
-
-
-
-选择Web Project项目进行创建
-
-
-
-填写项目名称等信息
-
-
-
-点击两次Next之后,创建web.xm信息,完成项目创建
-
-
-
-查看项目目录结构
-
-
-
-为了实验效果,我们在WebContent下创建一个index.html文件,编写Hello web内容进行部署演示。
-WebContent 上右键 NEW - >File - >输入文件名index.html完成文件创建。
-编写内容:
-
-```html
-
-
-
- Web test
-
-
- Hello web
-
-
-```
-#### 部署web项目
-在eclipse中使用Tomcat进行启动项目
-在已经创建完毕的Tomcat server上右键添加项目,然后进行启动即可
-
-
-
-#### 访问web项目
-可以看到项目启动在8080端口,启动完毕,此时可以通过浏览器进行项目访问。
-
-http://localhost:8080/web-Test/index.html
-
-
-
-此时,在Eclipse中创建部署启动一个Web项目已经完成。
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/develop/web-base-02.md b/docs/develop/web-base-02.md
deleted file mode 100644
index de3ed6b..0000000
--- a/docs/develop/web-base-02.md
+++ /dev/null
@@ -1,189 +0,0 @@
----
-title: Web笔记(二)Tomcat 使用总结
-date: 2018-08-23 09:12:31
-url: develop/web/web/base-02
-updated: 2018-08-23 09:12:31
-categories:
- - Java 开发
-tags:
-- Tomcat
-- Java EE
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-### Tomcat 介绍
-Tomcat是由Apache软件基金会下属的Jakarta项目开发的一个Servlet容器,按照Sun Microsystems提供的技术规范,实现了对Servlet和JavaServer Page(JSP)的支持,并提供了作为Web服务器的一些特有功能,如Tomcat管理和控制平台、安全域管理和Tomcat阀等。由于Tomcat本身也内含了一个HTTP服务器,它也可以被视作一个单独的Web服务器。但是,不能将Tomcat和Apache HTTP服务器混淆,Apache HTTP服务器是一个用C语言实现的HTTPWeb服务器;这两个HTTP web server不是捆绑在一起的。Apache Tomcat包含了一个配置管理工具,也可以通过编辑XML格式的配置文件来进行配置。(摘录自[Wiki](https://zh.wikipedia.org/wiki/Apache_Tomcat))([Apache Tomcat](http://tomcat.apache.org/))
-
-
-### Tomcat 安装
-Tomcat是免费的开源软件,可在直接在官方网站下载。
-[http://tomcat.apache.org/](http://tomcat.apache.org/)
-1.可以直接在左侧选择版本:
-
-
-
-2.选择版本后可以在下方进行下载,可以选择下载安装版或者解压版,这里选择了解压版
-tar.gz文件是Linux操作系统下的安装版本
-exe文件是Windows系统下的安装版本
-zip文件是Windows系统下的压缩版本
-
-
-
-3.下载完成后解压缩,得到Tomcat目录,
-
-
-
-### Tomcat 的默认端口
-
-Tomcat 修改HTTP默认端口,可以直接修改Tomcat 目录下\conf \server.xml文件。默认端口号为8080,修改为想要的端口,重启Tomcat即可。
-```xml
-
-```
-若要修改成8081端口:
-```xml
-
-```
-### Tomcat 的虚拟目录配置
-什么是虚拟目录呢,简单的说,我们可以根据请求的路径不同,来发布不同的项目。如此形式:我们想要
-在访问http://www.codingme.net/testA 时,进入A项目。
-在访问http://www.codingme.net/testB 时,进入B项目。
-这个时候我们就需要配置虚拟目录来完成这个操作。
-此时的URL:http://www.codingme.net/testA 不是单纯的路径,而是协议域名端口号+WEB应用testA。
-#### 自动映射虚拟目录
-在Tomcat 默认情况下,我们可以看到 %Tomca%\conf \server.xml文件最底部有配置如下:
-
-```xml
-
-
-
-
-
-
-```
-这里Tomcat 默认配置了虚拟主机localhost,基础应用目录webapps,也就是%Tomca%\webapps\ 目录,Tomcat 服务器会自动管理webapps目录下的所有web应用,并把它映射成虚似目录。
-因此在需要配置虚拟目录时我们可以直接把项目复制到webapps 目录下进行发布
-示例:
-1. 复制项目到webapps下
-
-
-2. 查看test/ index.html 文件内容
- 
-3. 运行%Tomcat%/bin/startup.bat 启动Tomcat
-4. 进行访问测试http://localhost:8080/test/index.html
-
-
-
-注意:http://localhost:8080 会默认访问 webapps/ROOT文件夹中的内容。
-
-#### 修改server.xml 映射虚拟目录
-
-我们也可以通过在server.xml 文件中的host 元素之间添加配置代码来配置虚拟目录:添加代码如下;
-
-```xml
-Context path="/app" docBase="D:/app" debug="0" reloadable="true" crossContext="true"/>
-```
-
-
-
-配置中我们配置了访问路径为/app ,项目路径D:/app 因此我们只要把要发布的内容放入D:/app 文件夹中即可。
- 配置完毕后 运行%Tomcat%/bin/startup.bat 启动Tomcat,可以通过
-> http://localhost:8080/app/index.html
-
-访问到D:/app/index.html,需要多个虚拟目录可以直接配置多条配置。
-
-注意:若想使用http://localhost:8080 访问项目则需要配置 `path=""`
-注意:配置中的path值和docBase中的文件夹名称没有任何关系。
-
-#### 在conf /Catalina /localhost 增加xml文件映射虚拟目录
-
-博主比较推荐这一种。
-在%Tomcat%/conf/Catalina/localhost目录中,增加配置文件来配置虚拟目录。
-配置文件名称格式为:虚拟目录路径.xml
-举个栗子:
-在%Tomcat%/conf/Catalina/localhost目录中增加文件 `blog.xml`
-写入内容:
-
-```xml
-
-
-
-```
-
-
-D盘下blog文件夹中内容:
-
-
-
-`docBase="d:/blog" ` 指定了Web应用存放位置为D盘下blog文件夹中。
-`reloadable="true" `表示当blog文件夹中文件有变化中,自动加载。
-配置完毕启动Tomcat后就可以通过访问到blog文件夹中的内容。
-
-> http://localhost:8080/blog
-
-
-
-注意:需要多个虚拟目录可以多建立几个配置文件,文件名不能相同。
-注意:若想使用http://localhost:8080 访问项目则需要配置文件名为`ROOT.xml`。
-注意:文件名blog.xml 和配置中d:/blog 没有关系,文件名可以写成其他,如blog111.xml,那么在访问时就要访问http://localhost:8080/blog111
-
-### Tomcat 的虚拟主机
-
-首先我们先了解虚拟主机的用处,一个虚拟主机也就是一个网站。比如我们`只有一个服务器`,一个服务器上只有一个80端口,我们需要发布两个web项目,那么我们可以使用虚拟目录,把两个项目发布到两个不同的路径之下,但是如果我们有两个不同的域名需要把两个项目对应两个域名,我们就需要配置虚拟主机了。
-
-示例:两个域名
-一个是`www.aaaa.com`
-一个是 `www.bbbb.com`
-
-为了实验效果,我们配置C:\Windows\System32\drivers\etc\hosts 文件,添加两行映射。
-```
-127.0.0.1 www.aaaa.com
-127.0.0.1 www.bbbb.com
-```
-此时我们本机可以使用 localhost / www.aaaa.com / www.bbbb.com 进行访问。
-
-配置虚拟主机指定www.aaaa.com访问是的内容。
-1:在server.xml中Engine元素中添加一个host子元素
-```xml
-
-
-
-```
-其中的
-1. name表示在访问的域名是www.aaaa.com时会使用此配置。
-1. appBase="d:/aaaa" 指定了项目的发布路径。
-
-启动Tomcat后,此时在使用www.aaaa.com进行访问时候,会默认显示d:/aaaa/ROOT中的内容。
-
-
-
-如果存在 d:/aaaa/test,则可以通过http://www.aaaa.com:8080/test 进行访问。
-此时test也就是www.aaaa.com的虚拟目录。
-添加www.bbbb.com 访问同上。
-
-### Tomcat 的单例多实例配置
-参考之前文章
-[Linux配置Tomcat的单机多实例](https://www.wdbyte.com/2018/08/develop/install-tomcat-many-instance/)
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/develop/web-base-03.md b/docs/develop/web-base-03.md
deleted file mode 100644
index 1bcf2ab..0000000
--- a/docs/develop/web-base-03.md
+++ /dev/null
@@ -1,348 +0,0 @@
----
-title: Web笔记(三)Servlet 的类与接口API
-date: 2018-09-01 09:58:35
-url: develop/web/web/base-03
-updated: 2018-09-01 09:58:35
-categories:
- - Java 开发
-tags:
- - Servlet
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-### Servlet 介绍
-Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
-使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
-Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。但是相比于 CGI,Servlet 有以下几点优势:
- - 性能明显更好。
- - Servlet 在 Web 服务器的地址空间内执行。这样它就没有必要再创建一个单独的进程来处理每个客户端请求。
- - Servlet 是独立于平台的,因为它们是用 Java 编写的。
- - 服务器上的 Java 安全管理器执行了一系列限制,以保护服务器计算机上的资源。因此,Servlet 是可信的。
- - Java 类库的全部功能对 Servlet 来说都是可用的。它可以通过 sockets 和 RMI 机制与 applets、数据库或其他软件进行交互。
-
-
-### Servlet API
-Servlet API 包含两个包,分别是:javax.servlet 与javax.servlet.http包。具体的类与接口结构如下图:
-
-
-
-Servlet 的运行需要Web 服务器的支持,Web服务器可以通过调用Servlet对象提提供的标准API ,对客户端请求做出处理。
-[官方API](https://tomcat.apache.org/tomcat-5.5-doc/servletapi/)
-
-#### Servlet 接口
- 定义所有 servlet 都必须实现的方法。
-servlet 是运行在 Web 服务器中的小型 Java 程序。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
-要实现此接口,可以编写一个扩展 javax.servlet.GenericServlet 的一般 servlet,或者编写一个扩展 javax.servlet.http.HttpServlet 的 HTTP servlet。
-此接口定义了初始化 servlet 的方法、为请求提供服务的方法和从服务器移除 servlet 的方法。这些方法称为生命周期方法,它们是按以下顺序调用的:
-
-1. 构造 servlet,然后使用 init 方法将其初始化。
-2. 处理来自客户端的对 service 方法的所有调用。
-3. 从服务中取出 servlet,然后使用 destroy 方法销毁它,最后进行垃圾回收并终止它。
-
-除了生命周期方法之外,此接口还提供了 getServletConfig 方法和 getServletInfo 方法,servlet 可使用前一种方法获得任何启动信息,而后一种方法允许 servlet 返回有关其自身的基本信息,比如作者、版本和版权。
-
-Servlet 接口中定义的方法如下:
-
-```java
-//当Servlet将要卸载时由Servlet引擎调用,用于是释放资源
-void destroy()
-
-//由 servlet 容器调用,指示将该 servlet 放入服务。servlet 容器
-//仅在实例化 servlet 之后调用 init 方法一次。在 servlet 可以接
-//收任何请求之前,init 方法必须成功完成。
-void init(ServletConfig config) throws ServletException
-
-//由 servlet 容器调用,以允许 servlet 响应某个请求。此方法仅在
-//servlet 的 init() 方法成功完成之后调用。
-void service(ServletRequest req, ServletResponse res) throws ServletException, java.io.IOException
-
-//返回 ServletConfig 对象,该对象包含此 servlet 的初始化和启动
-//参数。返回的 ServletConfig 对象是传递给 init 方法的对象。此接
-//口的实现负责存储 ServletConfig 对象,以便此方法可以返回该对象。
-//实现此接口的 GenericServlet 类已经这样做了。
-ServletConfig getServletConfig()
-
-// 返回有关 servlet 的信息,比如作者、版本和版权。。
-String getServletInfo()
-
-```
-
-#### ServletConfig 接口
-由Servlet接口中的Init方法我们可以发现,init方法在做初始化工作的时候会传入ServletConfig类型的参数进行初始化工作, Servlet 容器使用的 ServletConfig配置对象,该对象在初始化期间将信息传递给 Servlet。
-
-ServletConfig 接口中定义的方法如下:
-
-```java
-//返回包含指定初始化参数的值的 String,如果参数不存在,则返回 null。
-String getInitParameter(String name)
-
-//返回一个存储所有初始化变量的枚举函数,如果Servlet没有初始化变量,
-//返回一个空的枚举函数
-java.util.Enumeration getInitParameterNames()
-
-//返回一个ServletConfig 对象的引用
-ServletContext getServletContext()
-
-//返回此 servlet 实例的名称。该名称可能是通过服务器管理提供的
-//在 Web 应用程序部署描述符中分配,或者对于未注册(和未命名)
-//的 servlet 实例,该名称将是该 servlet 的类名称。
-String getServletName()
-
-```
-
-#### GenericServlet 接口
- 定义一般的、与协议无关的 Servlet。要编写用于 Web 上的 HTTP Servlet,请改为扩展 javax.servlet.http.HttpServlet。GenericServlet 实现 Servlet 和 ServletConfig 接口。**实现了Servlet 接口中除service()方法之外的所有抽象方法,但是是默认实现。**Servlet可以直接扩展 GenericServlet,GenericServlet 使编写 Servlet变得更容易。它提供生命周期方法 init 和 destroy 的简单版本,以及 ServletConfig 接口中的方法的简单版本。GenericServlet 还实现 log 方法,在 ServletContext 接口中对此进行了声明。
-
-要编写一般的 servlet,只需重写抽象 service 方法即可。在开发中很少使用,不再说明。
-#### HttpServlet 接口
-HttpServlet 类继承GenericServlet 类,是一个抽象类。在Java Web 开发中自定义Servlet 通常都是直接集成HttpServlet 类,此类实现了Servlet 接口中的service(ServletRequest request,ServletResponse response) 方法,用来处理客户端请求,根据request中的getMethod方法来调用不同的处理方法,例如,get方法,则调用doGet方法进行处理,也因此HttpServlet定义了处理不同请求的不同方法。
-
-
-
-
-#### ServletRequest 和 ServletResponse 接口
- 定义将客户端请求信息提供给某个 servlet 的对象。servlet 容器创建 ServletRequest 对象,并将该对象作为参数传递给该 servlet 的 service 方法。
-ServletRequest 对象提供包括参数名称、参数值、属性和输入流的数据。扩展 ServletRequest 的接口可提供其他特定于协议的数据,例如 javax.servlet.http.HttpServletRequest 提供的 HTTP 数据。
-
-ServletRequest中有很多有用的方法:
-```java
-//返回指定servlet上下文(web应用)的URL的前缀。
-String getContextPath()
-
-//返回请求URI上下文后的子串
-String getServletPath()
-
-//返回指定的HTTP头标指。如果其由请求给出,则名字应为大小写不敏感。
-String getHeader(String name)
-
-//返回具有指定名字的请求属性,如果不存在则返回null。属性可由servlet
-//引擎设置或使用setAttribute()显式加入。
-Object getAttribute(String name)
-
-//以指定名称保存请求中指定对象的引用。
-void setAttribute(String name,Object obj)
-
-//返回指定输入参数,如果不存在,返回null。
-String getParameter(String name)
-
-//返回请求所用的字符编码。
-String getCharacteEncoding()
-
-```
-具体可以参考官方API
-[ServletRequest API](https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletRequest.html)
-
-ServletResponse 中有很多有用的方法:
-```java
-//返回响应使用字符解码的名字。除非显式设置,否则为ISO-8859-1
-String getCharacterEncoding()
-
-//返回用于将返回的二进制输出写入客户端的流,此方法和getWrite()
-//方法二者只能调用其一。
-OutputStream getOutputStream()throws IOException
-
-//返回用于将返回的文本输出写入客户端的一个字符写入器,此方法和
-//getOutputStream()二者只能调用其一。
-Writer getWriter()throws IOException
-
-//设置内容类型。在HTTP servlet中即设置Content-Type头标。
-void setContentType(String type)
-```
-具体可以参考官方API
-[ServletResponse API](https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletResponse.html)
-
-#### HttpServletRequest 和 HttpServletResponse 接口
-HttpServletRequest 是专用于HTTP的ServletRequest 子接口,客户端浏览器的请求被封装成一个HttpServletRequest 对象,请求信息请求的地址,参数,数据,上传的文件,IP地址,甚至操作系统信息都包含在内。
-主要处理:
-
-1. 读取和写入HTTP头标
-2. 取得和设置cookies
-3. 取得路径信息
-4. 标识HTTP会话。
-
-HttpServletRequest 常用方法:
-```java
-//返回与请求相关cookie的一个数组。
-Cookie[] getCookies()
-
-//返回HTTP请求方法(例如GET、POST等等)
-String getMethod()
-
- //返回客户端的会话ID
-String getRequestedSessionId()
-
- //调用getSession(true)的简化版。
-HttpSession getSession()
-
-//返回当前HTTP会话,如果不存在,则创建一个新的会话,create参数为true。
-HttpSession getSession(boolean create)
-
-//返回URL中一部分,从“/”开始,包括上下文,但不包括任意查询字符串。
-String getRequestURI()
-
-//返回查询字符串,即URL中?后面的部份。
-String getQueryString()
-
-//返回指定servlet上下文(web应用)的URL的前缀。
-String getContextPath()
-```
-HttpServletResponse 则继承了ServletResponse 接口。都提供了与HTTP有关的方法,主要是对HTTP状态码和Cookie的管理。
-```java
-//将一个Set-Cookie头标加入到响应。
-void addCookie(Cookie cookie)
-
-//设置响应状态码为指定值(可选的状态信息)
-void sendError(int status)
-
-//重定向到某一个Web组件
-void sendRedirect(String location)
-```
-
-#### ServletContext 接口
-一个ServletContext 接口对象表示一个Web应用程序的上下文,运行在Java虚拟机中每个Web应用程序都有一个与之香瓜你的Servlet上下文,Sevetl API提供了一个ServletContext 接口老表示上下文,它提供了一些方法可以让Servlet 通过这些方法与Servlet 容器进行通信。
-常用方法:
-```java
-//将对象绑定到此 servlet 上下文中的给定属性名称。若存在,则替换之
-void setAttribute(String name, Object object)
-
-//返回Servlet 上下文中名字为name的对象,名字是name的对象是全局对象
-//因此可以被同一个Servlet 在任意时候访问,或者上下文中任意其他的Servlet访问
-Object getAttribute(String name)
-
-// 返回包含指定上下文范围初始化参数值的 String,如果参数不存在,则返回 null
-String getInitParameter(String name)
-```
-[ServletContext 接口官方API](https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html)
-
-#### HttpSession 接口
- 提供一种方式,跨多个页面请求或对 Web 站点的多次访问标识用户并存储有关该用户的信息。
-HttpSession 接口用于记录HTTP客户端和HTTP会话之间的关联,且可以在多个连接和请求中持续一段时间,Session则可以让无状态的HTTP请求在多个请求时识别用户记录状态。
-
-此接口允许 servlet
-查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问时间
-将对象绑定到会话,允许跨多个用户连接保留用户信息。
-
-常用方法:
-```java
-
-//使此会话无效,然后取消对任何绑定到它的对象的绑定。
-void invalidate()
-
-//从此会话中移除与指定名称绑定在一起的对象。如果会话没有与
-//指定名称绑定在一起的对象,则此方法不执行任何操作。
-void removeAttribute(String name)
-
-//使用指定名称将对象绑定到此会话。如果具有同样名称的对象已
-//经绑定到该会话,则替换该对象。
- void setAttribute(String name, Object value)
-
-//返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑
-//定在该名称下,则返回 null。
- Object getAttribute(String name)
-
-//返回创建此会话的时间,该时间是用自格林威治标准时间 1970
-//年 1 月 1 日午夜起经过的毫秒数来测量的。
-long getCreationTime()
-
-//返回包含分配给此会话的唯一标识符的字符串。
-String getId()
-
-//超时时间以秒为单位。负数则永不超时。
-void setMaxInactiveInterval(int interval)
-
-//返回 servlet 容器在客户端访问之间将使此会话保持打开状态
-//的最大时间间隔,以秒为单位。
-int getMaxInactiveInterval()
-```
-
-
-### 附录:HttpServletRequest的请求信息获取
-
-```java
-/**
- * HttpServletRequest请求参数获取测试
- * @author niumoo
- */
-@WebServlet("/dispense")
-public class DispenseServlet extends HttpServlet {
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- // 获取请求方式:GET
- System.out.println("req.getMethod():" + req.getMethod());
-
- // 获取项目名称:/dispense
- System.out.println("req.getContextPath():" + req.getContextPath());
-
- // 获取完整请求路径:http://localhost:8888/dispense/dispense
- System.out.println("req.getRequestURL():" + req.getRequestURL());
-
- // 获取除了域名外的请求数据:/dispense/dispense
- System.out.println("req.getRequestURI():" + req.getRequestURI());
-
- // 获取请求参数:name=codingme.net
- System.out.println("req.getQueryString():" + req.getQueryString());
- // 获取请求头:
- System.out.println("req.getHeader(\"user-Agent\"):" + req.getHeader("user-Agent"));
-
- System.out.println("-------------------------------------------------");
- // 获取所有的消息头名称
- Enumeration headerNames = req.getHeaderNames();
- // 获取获取的消息头名称,获取对应的值,并输出
- while (headerNames.hasMoreElements()) {
- String nextElement = headerNames.nextElement();
- System.out.println(nextElement + ":" + req.getHeader(nextElement));
- }
-
- System.out.println("---------------------------------------------------");
- // 根据名称获取此重名的所有数据
- System.out.println("req.getHeader(\"accept\"):" + req.getHeader("accept"));
-
- // 获取请求主机名
- System.out.println("req.getHeader(\"host\"):" + req.getHeader("host"));
-
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doGet(req, resp);
- }
-}
-
-```
-请求:http://localhost:8888/dispense/dispense?name=codingme.net
-输出:
-
-```
-req.getMethod():GET
-req.getContextPath():/dispense
-req.getRequestURL():http://localhost:8888/dispense/dispense
-req.getRequestURI():/dispense/dispense
-req.getQueryString():name=codingme.net
-req.getHeader("user-Agent"):Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3080.5 Safari/537.36
---------------------------------------------------------
-host:localhost:8888
-connection:keep-alive
-cache-control:max-age=0
-upgrade-insecure-requests:1
-user-agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3080.5 Safari/537.36
-accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
-accept-encoding:gzip, deflate, br
-accept-language:zh-CN,zh;q=0.8
-cookie:_ga=GA1.1.1003706294.1499565784; Hm_lvt_57ccbd5c600ed4e6bdb9458e666b6409=1499849256,1499853602,1499950574; Hm_lvt_1b51c3ea9a3e7b1a2bc55df97ab4efd3=1499952403
-----------------------------------------------------------
-req.getHeader("accept"):text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
-req.getHeader("host"):localhost:8888
-```
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/develop/web-base-04.md b/docs/develop/web-base-04.md
deleted file mode 100644
index c928d93..0000000
--- a/docs/develop/web-base-04.md
+++ /dev/null
@@ -1,295 +0,0 @@
----
-title: Web笔记(四)Servlet 程序开发
-date: 2018-09-04 20:35:44
-url: develop/web/web/base-04
-updated: 2018-09-04 20:35:44
-categories:
- - Java 开发
-tags:
- - Servlet
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-### Servlet 的编写
-Servlet本质上是一个Java类,创建一个Servlet很简单,就是定义一个Java类,这个类继承自`javax.servlet.http.HttpServlet`类,覆盖其中的doGet和doPost方法,在doGet和doPost中编写处理请求的代码。
-由于 Servlet 不是 Java 平台标准版的组成部分,所以必须添加jar包:`servlet-api.jar`
-可以在Tomcat下lib目录下找到,也可自行下载添加。在创建Web项目的时候如果有选择Tomcat ,则会自动添加,如何创建一个web项目并部署到Tomcat,可以参考之前文章。
-[Web笔记(一) Web 简介与开发环境搭建
-](https://www.wdbyte.com/2018/08/develop/web/web-base-01/)
-
-
-编写第一个Servlet ,我们可以直接在Eclipse 中的Web项目里新建Servelt。
-
-
-也可以普通创建类手动继承HttpServlet。在创建完毕后需要手动重写doGet和doPost方法。
-
-
-使用第一种方法新建 FirstServlet.java 类(注意看代码注释)
-```java
-package net.codingme.servlet;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import javax.servlet.ServletException;
-import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-/**
- * 第一个servlet测试
- *
- */
-//@WebServlet("/firstServlet")
-public class FirstServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
- public FirstServlet() {
- super();
- }
-
- // get请求处理
- protected void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //设置响应的文本类型和字符编码
- response.setContentType("text/html;charset=UTF-8");
- //通过输出流向客户端做出响应
- PrintWriter out = response.getWriter();
- out.println("");
- out.println("firest servlet
");
- out.println("");
- out.close();
- }
-
- protected void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request, response);
- }
-
-}
-
-```
-HTTP的请求方式除了`get`和`post`请求之外还有put、delete等,get和post是最为常用两种请求方式,所以通常只覆盖doGet和doPost方法。
-`response.setContentType("text/html;charset=UTF-8");`用于设置响应的文本类型和编码方式,通过响应对象获得输出流对象out,用于向客户端浏览器输出响应内容,代码中输出的HTML标记,这实际上是一个动态的Web的页面。
-关于HTTP协议的相关知识可以查看文章[网络协议之HTTP](https://www.wdbyte.com/2018/07/computer/protocol-http/)
-
-
-### Servlet 的web.xml配置
-Servlet编写完成之后,需要在工程`WEBROOT/WEB-INF/web.xml`中进行配置才可以生效,web.xml是Web应用的主配置文件,包含Web应用配置的主要信息。
-
-在web.xml中根元素``中配置Servlet,代码如下:
-```java
-
- first
- net.codingme.servlet.FirstServlet
-
-
-
- first
- /firstServlet
-
-```
-配置解释:
-```java
-
- servlet名
- servlet的class的全名
-
-
-
- servlet名
- servlet的访问路径
-
-```
-
-### Servlet 3.0的注解配置
-
-如果Servlet版本是`3.0`及以上的,可以使用`@WebServlet`注解进行配置,省去了web.xml中的繁琐配置。此方式和通过web.xml配置Servlet`二选一`即可。
-
-**@WebServlet主要属性列表**
-
-| 属性名|类型|描述|
-| ------------ | ------------ | ------------ |
-| name |String | 指定 Servlet 的 name 属性,等价于 。如果没有显式指定,则该 Servlet 的取值即为类的全限定名。 |
-| value | String[] | 该属性等价于 urlPatterns 属性。两个属性不能同时使用。 |
-| urlPatterns | String[] | 指定一组 Servlet 的 URL 匹配模式。等价于 标签。 |
-| loadOnStartup | int | 指定 Servlet 的加载顺序,等价于 标签。 |
-| initParams |WebInitParam[] | 指定一组 Servlet 初始化参数,等价于 标签。 |
-|asyncSupported |boolean | 声明 Servlet 是否支持异步操作模式,等价于 标签。 |
-|description |String | 该 Servlet 的描述信息,等价于 标签。 |
-| displayName |String | 该 Servlet 的显示名,通常配合工具使用,等价于 标签。 |
-
-**@WebServlet完整的使用例子**
-```java
-@WebServlet(urlPatterns = {"/simple"}, asyncSupported = true,
-loadOnStartup = -1, name = "SimpleServlet", displayName = "ss",
-initParams = {@WebInitParam(name = "username", value = "tom")}
-)
-
-```
-
-只配置访问路径的示例:
-```java
-package net.codingme.servlet;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.servlet.ServletException;
-import javax.servlet.annotation.WebServlet;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-
-/**
- * 第一个servlet测试
- * 使用注解配置访问路径
- */
- @WebServlet(urlPatterns= {"/firstServlet"})
-public class FirstServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
-
- public FirstServlet() {
- super();
- }
- .
- .
- .
-```
-
-### Servlet 的运行与访问
-Servlet配置完成之后,把Servlet所在工程项目部署到web服务器上并启动。
-发布成功之后可以访问servlet配置的路径进行访问。
-格式如:`协议://服务器地址:端口号/WEB应用名/Servlet的访问路径`
-那么web服务器是如何找到对应的servlet类的呢?
-1. 查找web.xml中Servlet配置信息中的``值与请求路径相匹配的项。
-1. 访问到对应的(``中``与``中``值相等,)``,可以访问到指定的Servlet类。
-1. web服务器将在第一次访问servlet时实例化一个servlet对象用于处理请求。
-
-访问Servlet有三种方式
- - 直接在浏览器地址中输入访问路径来访问
- - 通过超链接来访问
- - 通过提交表单来访问
-
-访问测试:
-
-
-
-### Servlet 的初始化参数
-
-自定义的Servlet继承了了HttpServlet,HttpServlet继承了GenericServlet,GenericServlet类实现了ServletConfig接口,所以自定义的Servlet中可以直接使用ServletConfig中的`getInitParameter(String name)`方法。也可直接通过getServletName()方法获得Servlet名字,也就是web.xml中相应的``元素的``的值。如果没有配置会返回Servlet类名。
-
-
-#### 编写Servlet
-```java
-package net.codingme.servlet;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- *
- * Servlet获得初始化参数
- *
- * @author Niu on 2017年7月25日 下午6:14:23
- */
-public class GetInitParamServlet extends HttpServlet {
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //通过getInitParameter方法获得配置文件中设置的初始化值
- String name = this.getInitParameter("name");
- String password = this.getInitParameter("password");
-
- //通过getServletName方法获得配置文件中设置Servlet名字
- String servletName = this.getServletName();
-
- //设置响应文本类型和编码方式
- resp.setContentType("text/html;charset=UTF-8");
-
- //通过输出流向客户端做出相应
- PrintWriter out = resp.getWriter();
- out.println("name:"+name);
- out.println("
");
- out.println("password:"+password);
- out.println("
");
- out.println("servletName:"+servletName);
- out.close();
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- doGet(req, resp);
- }
-
-}
-```
-
-
-#### 配置Servlet
-初始化了两个参数,分别是`name:xy`和`password:123`,访问路径/getInitParam
-
-```xml
-
-
- getInitParam
- net.codingme.servlet.GetInitParamServlet
-
-
- name
- xy
-
-
- password
- 123
-
-
-
- getInitParam
- /getInitParam
-
-
-```
-
-
-#### 测试Servlet
-访问配置的路径:http://localhost:8080/servlet-GetInitParam/getInitParam
-
-获取到配置的初始化参数。
-
-**GitHub**:[获取初始化参数](https://github.com/niumoo/webcore/tree/master/servlet-GetInitParam)
-
-### Servlet 的开发总结
-Servlet开发步骤:
-1. 编写Servlet,编写一个Java类,继承HttpServlet类并覆盖doGet和doPost方法
-2. 在配置文件web.xml中配置Servlet(Servlet3.0以上版本可以使用注解)
-3. 将Servlet所在Java Web项目部署到Web服务器上,例如Tomcat
-4. 启动Web服务器
-5. 请求访问Servlet
-
-Servlet执行流程:
-1. 客户端浏览器向Web服务器发送请求访问某一个Servlet
-1. Web服务器根据配置信息定位到具体的Servlet
-3. 如果这个Servlet是第一次被访问,此时Servlet对象在内存中不存在,则创建这个Servlet对象,如果这个Servlet已经被访问过,则Servlet的对象已经存在内存中,然后创建一个线程操作这个Servlet对象,完成具体功能。
-4. 获得运行结果,通过响应对象(response)设置响应参数并将结果返回到客户端。
-5. 客户端将相应结果显示在浏览器中。
-
-
-GitHub:[第一个Servlet](https://github.com/niumoo/webcore/tree/master/servlet-First)
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/develop/web-base-05.md b/docs/develop/web-base-05.md
deleted file mode 100644
index 63d4a77..0000000
--- a/docs/develop/web-base-05.md
+++ /dev/null
@@ -1,177 +0,0 @@
----
-title: Web笔记(五)Servlet 的生命周期
-date: 2018-09-06 20:35:44
-url: develop/web/web/base-05
-updated: 2018-09-06 20:35:44
-categories:
- - Java 开发
-tags:
- - Servlet
- - Java EE
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-Servlet的声明周期是由servlet的容器(web服务器)来控制的,通过简单的概括可以分为4步:
-
-Servlet类加载 → 实例化Servlet → Servlet提供服务 → 销毁Servlet。
-
-1. Serlvet 类加载,该阶段仅仅执行一次。
-1. 实例化Servlet ,该阶段仅执行一次、
-1. Servlet 调用 service() 方法来处理客户端的请求,客户端请求一次执行一次,具体的执行次数取决于客户端的请求次数。
-1. Servlet 通过调用 destroy() 方法销毁Servlet,只在web服务器停止服务时执行一次。
-
-
-### 开发
-通过一个简单的例子来演示Servlet 的生命周期,编写 LiftServlet.java。
-```java
-package net.codingme.servlet;
-
-import javax.servlet.annotation.WebServlet;
-import java.io.IOException;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- *
- * Desc:Servlet生命周期测试
- *
- * @author niumoo on 2017年7月24日 上午11:04:40
- */
-//@WebServlet("/LiftServlet")
-public class LiftServlet extends HttpServlet {
-
- // 不能被覆盖,这里是web服务器的servlet初始化
- @Override
- public void init(ServletConfig config) throws ServletException {
- System.out.println("Web服务器初始化Servlet : init(ServletConfi confit)");
- super.init(config);
- }
-
- // 可以添加特定的初始化代码
- @Override
- public void init() throws ServletException {
- System.out.println("初始化init()");
- super.init();
- }
-
- // 不能被覆盖
- @Override
- public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
- System.out.println("调用服务:service(ServletRequest arg0, ServletResponse arg1)");
- super.service(arg0, arg1);
- }
-
- // service会检查请求类型,用来判断调用什么方法,不要覆盖
- @Override
- protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
- System.out.println("调用服务:service(HttpServletRequest arg0, HttpServletResponse arg1)");
- super.service(arg0, arg1);
- }
-
- /**
- * get方法
- */
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- System.out.println("GET方法:doGet()");
- resp.getWriter().println("servlet get");
- }
-
- // 当web服务器正常停止时调用次销毁方法
- @Override
- public void destroy() {
- System.out.println("销毁:destroy()");
- super.destroy();
- }
-}
-```
-
-
-### 配置
-配置web.xml
-```xml
-
-
- liftServlet
- net.codingme.servlet.LiftServlet
-
-
- liftServlet
- /liftServlet
-
-```
-
-代码中配置了LiftServlet 的访问路径为/liftServlet。
-
-### 访问
-
-访问路径:http://localhost:8080/servlet-LifeCycle/liftServlet
-
-访问两次链接 ,观察控制台输出:
-
-```
-信息: Starting ProtocolHandler ["http-nio-8080"]
-八月 06, 2017 11:32:09 上午 org.apache.coyote.AbstractProtocol start
-信息: Starting ProtocolHandler ["ajp-nio-8009"]
-八月 06, 2017 11:32:09 上午 org.apache.catalina.startup.Catalina start
-信息: Server startup in 2705 ms
-Web服务器初始化Servlet : init(ServletConfi confit)
-初始化init()
-调用服务:service(ServletRequest arg0, ServletResponse arg1)
-调用服务:service(HttpServletRequest arg0, HttpServletResponse arg1)
-GET方法:doGet()
-调用服务:service(ServletRequest arg0, ServletResponse arg1)
-调用服务:service(HttpServletRequest arg0, HttpServletResponse arg1)
-GET方法:doGet()
-八月 06, 2017 11:32:42 上午 org.apache.catalina.core.StandardServer await
-信息: A valid shutdown command was received via the shutdown port. Stopping the Server instance.
-八月 06, 2017 11:32:42 上午 org.apache.coyote.AbstractProtocol pause
-信息: Pausing ProtocolHandler ["http-nio-8080"]
-八月 06, 2017 11:32:42 上午 org.apache.coyote.AbstractProtocol pause
-信息: Pausing ProtocolHandler ["ajp-nio-8009"]
-八月 06, 2017 11:32:43 上午 org.apache.catalina.core.StandardService stopInternal
-信息: Stopping service [Catalina]
-八月 06, 2017 11:32:43 上午 org.apache.catalina.core.ApplicationContext log
-信息: SessionListener: contextDestroyed()
-八月 06, 2017 11:32:43 上午 org.apache.catalina.core.ApplicationContext log
-信息: ContextListener: contextDestroyed()
-销毁:destroy()
-八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol stop
-信息: Stopping ProtocolHandler ["http-nio-8080"]
-八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol stop
-信息: Stopping ProtocolHandler ["ajp-nio-8009"]
-八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol destroy
-信息: Destroying ProtocolHandler ["http-nio-8080"]
-八月 06, 2017 11:32:43 上午 org.apache.coyote.AbstractProtocol destroy
-信息: Destroying ProtocolHandler ["ajp-nio-8009"]
-```
-
-### 总结
-
-1. **servlet初始化**:运行一次,调用`init(ServletConfig config)`创建ServletConfig对象。调用`init()` 创建servlet对象并将两者关联。可以将代码放入init()方法完成特定的初始化工作。
-
-1. **servlet服务**:每次请求运行, 接收到请求通过`service(ServletRequest arg0, ServletResponse arg1)`方法进行处理,然后把请求对象封装成HttpServletRequest,响应对象封装成HttpServletResponse调用`service(HttpServletRequest arg0, HttpServletResponse arg1)`处理。在这个方法里会根据请求方式调用doGet或者doPost方法进行处理。
-
-1. **servlet销毁**:运行一次,销毁Servlet 对象,销毁与之关联的ServletConfig对象,
-
-可以看到,在第一次访问时调用初始化代码,再次访问只调用服务代码,正常停止Tomcat,调用销毁代码。
-
-**GitHub**:[Servlet 生命周期](https://github.com/niumoo/webcore/tree/master/servlet-LifeCycle)
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/elasticsearch/elasticsearch-base-curd.md b/docs/elasticsearch/elasticsearch-base-curd.md
deleted file mode 100644
index c12d95f..0000000
--- a/docs/elasticsearch/elasticsearch-base-curd.md
+++ /dev/null
@@ -1,814 +0,0 @@
----
-title: 全文搜索ElasticSearch(一)数据的增删改查
-date: 2018-04-16 00:44:28
-url: lucene/elasticsearch-base-curd
-tags:
-- Elasticsearch
-categories:
-- Elasticsearch
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-
-ElasticSearch采用Java编写,提供简单易用的RESTFul API。我们可以直接通过API接口进行操作。
-笔者使用的ElasticSearch版本:elasticsearch-6.3.0
-
-
-
-API基本格式 http://:/<索引>/<类型>/<文档id>
-常用的HTTP动词 GET/PUT/POST/DELETE
-[RESTFul资料](http://www.ruanyifeng.com/blog/2014/05/restful_api)
-
-## 索引创建
-### 非结构化创建
-使用Head插件直接点击添加索引创建。
-直接请求创建 $ curl -XPUT http://localhost:9200/book
-
-### 结构化创建
-
-方式1:首先创建book索引
-```
-PUT http://localhost:9200/book。
-```
-
-再添加novel类型以及定义结构。
-```json
-POST http://localhost:9200/book/novel/_mappings
-{
- "novel": {
- "properties": {
- "title": {
- "type": "text"
- }
- }
- }
-}
-```
-
-方式2:直接创建people结构化索引指定配置信息已经数据结构。
-```json
-// 创建
-PUT http://localhost:9200/people
-{
- "settings":{
- "number_of_shards": 3,
- "number_of_replicas": 1
- },
- "mappings":{
- "man":{
- "properties":{
- "name":{
- "type":"text"
- },
- "country":{
- "type":"keyword"
- },
- "age":{
- "type":"integer"
- },
- "date":{
- "type":"date",
- "format":"yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis"
- }
- }
- },
- "woman":{
-
- }
- }
-}
-
-// 响应
-{
- "acknowledged": true,
- "shards_acknowledged": true
-}
-
-```
-
-### 查看索引信息
-
-查询一个索引是否为结构化索引,我们只需要查询索引信息,然后查看mappings属性是否有值,如果为空,则为非结构化索引,如果有相关的属性值,则是结构化索引。下面查看book索引信息:
-```json
-GET http://localhost:9200/book?pretty=true
-{
- "book": {
- "aliases": {},
- "mappings": {
- "novel": {
- "properties": {
- "title": {
- "type": "text"
- }
- }
- }
- },
- "settings": {
- "index": {
- "creation_date": "1523851142335",
- "number_of_shards": "5",
- "number_of_replicas": "1",
- "uuid": "nbQPVXqqR--eRy_1S3OZqw",
- "version": {
- "created": "5050199"
- },
- "provided_name": "book"
- }
- }
- }
-}
-```
-
-## 数据插入
-
-### 根据文档ID插入
-直接POST请求 http://:/<索引>/<类型>/<文档id>
-传入JSON数据就可以完成数据插入:
-```json
-POST http://localhost:9200/people/man/1
-{
- "name":"达西",
- "conuntry":"China",
- "age":24,
- "date":"1994-11-01"
-}
-
-// 响应
-{
- "_index": "people",
- "_type": "man",
- "_id": "1",
- "_version": 1,
- "result": "created",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- },
- "created": true
-}
-```
-
-### 自动生成文档ID插入
-在发起POST请求的时候,不指定ID的值,ES会自动生成一个ID值。
-```json
-POST http://localhost:9200/people/man
-{
- "name":"超级玛丽",
- "conuntry":"China",
- "age":24,
- "date":"1994-11-01"
-}
-
-// 响应
-{
- "_index": "people",
- "_type": "man",
- "_id": "AWLNIi3-QcKhhHA2xN6t", // 自动生成的ID值
- "_version": 1,
- "result": "created",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- },
- "created": true
-}
-```
-
-## 数据修改
-
-### 直接修改
-修改people索引中类型为man的ID为1的文档的name字段值为“曹操”
-```json
-POST http://localhost:9200/people/man/1/_update
-{
- "doc":{
- "name":"曹操"
- }
-}
-
-// 响应
-{
- "_index": "people",
- "_type": "man",
- "_id": "1",
- "_version": 5,
- "result": "updated",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- }
-}
-```
-
-### 脚本修改
-修改people索引中类型为man的ID为1的文档的age字段值为自增10。
-```json
-POST http://localhost:9200/people/man/1/_update
-{
- "script":{
- "lang":"painless",
- "inline":"ctx._source.age+=10"
- }
-}
-
-// 响应
-{
- "_index": "people",
- "_type": "man",
- "_id": "1",
- "_version": 9,
- "result": "updated",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- }
-}
-```
-另外一种方式
-```json
-POST http://localhost:9200/people/man/1/_update
-{
- "script":{
- "lang":"painless",
- "inline":"ctx._source.age=params.age",
- "params":{
- "age":900
- }
- }
-}
-// 响应
-{
- "_index": "people",
- "_type": "man",
- "_id": "1",
- "_version": 10,
- "result": "updated",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- }
-}
-```
-
-## 删除
-
-### 文档删除
-删除people索引中类型为man,ID为1的文档。
-```json
-DELETE http://localhost:9200/people/man/1
-
-// 响应
-{
- "found": true,
- "_index": "people",
- "_type": "man",
- "_id": "1",
- "_version": 11,
- "result": "deleted",
- "_shards": {
- "total": 2,
- "successful": 1,
- "failed": 0
- }
-}
-```
-
-### 索引删除
-删除people索引
-```json
-DELETE http://localhost:9200/people
-
-// 响应
-{
- "acknowledged": true
-}
-```
-
-## 基本查询
-### 数据准备
-创建book索引,设置结构:
-
-```json
-POST http://localhost:9200/book/novel/_mappings
-{
- "novel":{
- "properties":{
- "title":{
- "type":"text"
- },
- "author":{
- "type":"text"
- },
- "word_count":{
- "type":"integer"
- },
- "publish_date":{
- "type":"date",
- "format":"yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || epoch_millis"
- }
- }
- }
-}
-
-// 响应
-{
- "acknowledged": true
-}
-
-```
-录入用于测试的数据:
-```json
-{"title":"超级玛丽秘籍","author":"王五","word_count":5000,"publish_date":"1994-11-01"}
-{"title":"三国志","author":"陈寿","word_count":30000,"publish_date":"1995-11-01"}
-{"title":"三国演绎","author":"罗贯中","word_count":30000,"publish_date":"1994-03-01"}
-{"title":"玛丽与管道工","author":"玛丽","word_count":10000,"publish_date":"1994-03-01"}
-{"title":"史记","author":"司马迁","word_count":20000,"publish_date":"1994-08-01"}
-{"title":"如何蹦的更高","author":"玛丽","word_count":20000,"publish_date":"1994-08-01"}
-```
-## 查询
-### 全部查询
-查询book索引中类型为novel的所有文档信息。
-```json
-GET localhost:9200/book/novel/_search?pretty=true
-
-// 响应
-{
- "took" : 80, // 花费时间
- "timed_out" : false,
- "_shards" : {
- "total" : 5,
- "successful" : 5,
- "failed" : 0
- },
- "hits" : {
- "total" : 5, //总条数
- "max_score" : 1.0,
- "hits" : [
- {
- "_index" : "book",
- "_type" : "novel",
- "_id" : "AWLOAAZzQcKhhHA2xN6z",
- "_score" : 1.0, //评分
- "_source" : {
- "title" : "超级玛丽秘籍",
- "author" : "王五",
- "word_count" : 5000,
- "publish_date" : "1994-11-01"
- }
- },
- {
- "_index" : "book",
- "_type" : "novel",
- "_id" : "AWLOAEe5QcKhhHA2xN62",
- "_score" : 1.0,
- "_source" : {
- "title" : "玛丽与管道工",
- "author" : "陈寿",
- "word_count" : 10000,
- "publish_date" : "1994-03-01"
- }
- },
- {
- "_index" : "book",
- "_type" : "novel",
- "_id" : "AWLOAB8bQcKhhHA2xN60",
- "_score" : 1.0,
- "_source" : {
- "title" : "三国志",
- "author" : "陈寿",
- "word_count" : 30000,
- "publish_date" : "1995-11-01"
- }
- },
- {
- "_index" : "book",
- "_type" : "novel",
- "_id" : "AWLOADU4QcKhhHA2xN61",
- "_score" : 1.0,
- "_source" : {
- "title" : "三国演绎",
- "author" : "罗贯中",
- "word_count" : 30000,
- "publish_date" : "1994-03-01"
- }
- },
- {
- "_index" : "book",
- "_type" : "novel",
- "_id" : "AWLOAFiZQcKhhHA2xN63",
- "_score" : 1.0,
- "_source" : {
- "title" : "史记",
- "author" : "司马迁",
- "word_count" : 20000,
- "publish_date" : "1994-08-01"
- }
- }
- ]
- }
-}
-
-```
-
-### 精确查询
-查询book索引中类型为novel的ID为AWLOAFiZQcKhhHA2xN63的文档信息。
-```json
-GET localhost:9200/book/novel/AWLOAFiZQcKhhHA2xN63?pretty=true
-// 响应
-{
- "_index" : "book",
- "_type" : "novel",
- "_id" : "AWLOAFiZQcKhhHA2xN63",
- "_version" : 1,
- "found" : true,
- "_source" : {
- "title" : "史记",
- "author" : "司马迁",
- "word_count" : 20000,
- "publish_date" : "1994-08-01"
- }
-}
-
-```
-
-
-### 限制查询条数
-搜索从第一条开始的1条数据。
-```json
-POST http://localhost:9200/book/novel/_search
-{
- "query":{
- "match_all":{}
- },
- "from":1,
- "size":1
-}
-
-// 响应
-{
- "took": 37,
- "timed_out": false,
- "_shards": {
- "total": 5,
- "successful": 5,
- "failed": 0
- },
- "hits": {
- "total": 5,
- "max_score": 1,
- "hits": [
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAEe5QcKhhHA2xN62",
- "_score": 1,
- "_source": {
- "title": "玛丽与管道工",
- "author": "陈寿",
- "word_count": 10000,
- "publish_date": "1994-03-01"
- }
- }
- ]
- }
-}
-```
-
-### 关键词排序查询
-查询标题里含有“三国”的书籍,并且按出版日期降序排列。
-
-```json
-POST http://localhost:9200/book/novel/_search
-{
- "query":{
- "match":{
- "title":"三国"
- }
- },
- "sort":[
- {
- "publish_date":{"order":"desc"}
- }
- ]
-}
-
-// 响应
-{
- "took": 200,
- "timed_out": false,
- "_shards": {
- "total": 5,
- "successful": 5,
- "failed": 0
- },
- "hits": {
- "total": 2,
- "max_score": 0.34450945,
- "hits": [
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAB8bQcKhhHA2xN60",
- "_score": 0.34450945,
- "_source": {
- "title": "三国志",
- "author": "陈寿",
- "word_count": 30000,
- "publish_date": "1995-11-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOADU4QcKhhHA2xN61",
- "_score": 0.34450945,
- "_source": {
- "title": "三国演绎",
- "author": "罗贯中",
- "word_count": 30000,
- "publish_date": "1994-03-01"
- }
- }
- ]
- }
-}
-```
-
-### 聚合查询
-类似于数据库中的分组查询,下面的例子演示按照书籍字数统计数据,按照发布时间统计数量。
-```json
-POST http://localhost:9200/book/novel/_search
-{
- "aggs":{
- "group_by_word_count":{
- "terms":{
- "field":"word_count"
- }
- },
- "group_by_author":{
- "terms":{
- "field":"publish_date"
- }
- }
- }
-
-}
-// 响应
-{
- "took": 4,
- "timed_out": false,
- "_shards": {
- "total": 5,
- "successful": 5,
- "failed": 0
- },
- "hits": {
- "total": 5,
- "max_score": 1,
- "hits": [
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAAZzQcKhhHA2xN6z",
- "_score": 1,
- "_source": {
- "title": "超级玛丽秘籍",
- "author": "王五",
- "word_count": 5000,
- "publish_date": "1994-11-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAEe5QcKhhHA2xN62",
- "_score": 1,
- "_source": {
- "title": "玛丽与管道工",
- "author": "陈寿",
- "word_count": 10000,
- "publish_date": "1994-03-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAB8bQcKhhHA2xN60",
- "_score": 1,
- "_source": {
- "title": "三国志",
- "author": "陈寿",
- "word_count": 30000,
- "publish_date": "1995-11-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOADU4QcKhhHA2xN61",
- "_score": 1,
- "_source": {
- "title": "三国演绎",
- "author": "罗贯中",
- "word_count": 30000,
- "publish_date": "1994-03-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAFiZQcKhhHA2xN63",
- "_score": 1,
- "_source": {
- "title": "史记",
- "author": "司马迁",
- "word_count": 20000,
- "publish_date": "1994-08-01"
- }
- }
- ]
- },
- "aggregations": {
- "group_by_word_count": {
- "doc_count_error_upper_bound": 0,
- "sum_other_doc_count": 0,
- "buckets": [
- {
- "key": 30000,
- "doc_count": 2
- },
- {
- "key": 5000,
- "doc_count": 1
- },
- {
- "key": 10000,
- "doc_count": 1
- },
- {
- "key": 20000,
- "doc_count": 1
- }
- ]
- },
- "group_by_author": {
- "doc_count_error_upper_bound": 0,
- "sum_other_doc_count": 0,
- "buckets": [
- {
- "key": 762480000000,
- "key_as_string": "1994-03-01 00:00:00",
- "doc_count": 2
- },
- {
- "key": 775699200000,
- "key_as_string": "1994-08-01 00:00:00",
- "doc_count": 1
- },
- {
- "key": 783648000000,
- "key_as_string": "1994-11-01 00:00:00",
- "doc_count": 1
- },
- {
- "key": 815184000000,
- "key_as_string": "1995-11-01 00:00:00",
- "doc_count": 1
- }
- ]
- }
- }
-}
-
-```
-
-### 统计查询
-聚合查询也可以用于查询统计信息,下面的例子演示统计书籍字数信息,统计书籍字数最小的字数信息。
-```json
-POST http://localhost:9200/book/novel/_search
-{
- "aggs":{
- "grades_word_count":{
- "stats":{
- "field":"word_count"
- }
- },
- "min_word_count":{
- "min":{
- "field":"word_count"
- }
- }
- }
-
-}
-// 响应
-{
- "took": 44,
- "timed_out": false,
- "_shards": {
- "total": 5,
- "successful": 5,
- "failed": 0
- },
- "hits": {
- "total": 5,
- "max_score": 1,
- "hits": [
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAAZzQcKhhHA2xN6z",
- "_score": 1,
- "_source": {
- "title": "超级玛丽秘籍",
- "author": "王五",
- "word_count": 5000,
- "publish_date": "1994-11-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAEe5QcKhhHA2xN62",
- "_score": 1,
- "_source": {
- "title": "玛丽与管道工",
- "author": "陈寿",
- "word_count": 10000,
- "publish_date": "1994-03-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAB8bQcKhhHA2xN60",
- "_score": 1,
- "_source": {
- "title": "三国志",
- "author": "陈寿",
- "word_count": 30000,
- "publish_date": "1995-11-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOADU4QcKhhHA2xN61",
- "_score": 1,
- "_source": {
- "title": "三国演绎",
- "author": "罗贯中",
- "word_count": 30000,
- "publish_date": "1994-03-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAFiZQcKhhHA2xN63",
- "_score": 1,
- "_source": {
- "title": "史记",
- "author": "司马迁",
- "word_count": 20000,
- "publish_date": "1994-08-01"
- }
- }
- ]
- },
- "aggregations": {
- "grades_word_count": {
- "count": 5,
- "min": 5000,
- "max": 30000,
- "avg": 19000,
- "sum": 95000
- },
- "min_word_count": {
- "value": 5000
- }
- }
-}
-```
-
-
-## 参考资料
-[Elasticsearch Reference](https://www.elastic.co/guide/en/elasticsearch/reference/5.5/index.html)
-[Elasticsearch: 权威指南](https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html) (低版本)
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/elasticsearch/elasticsearch-plug-head.md b/docs/elasticsearch/elasticsearch-plug-head.md
deleted file mode 100644
index 7fd948f..0000000
--- a/docs/elasticsearch/elasticsearch-plug-head.md
+++ /dev/null
@@ -1,83 +0,0 @@
----
-title: 全文搜索ElasticSearch(三)Head插件的安装与使用
-date: 2018-10-12 19:14:17
-url: lucene/elasticsearch-head
-tags:
-- Elasticsearch
-- 插件
-- Elasticsearch Head
-categories:
-- Elasticsearch
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-
-### elasticsearch-head 介绍
-
-`elasticsearch-head`是一个用于浏览器和与`elasticsearch`进行交互的Web前端程序。 `elasticsearch-head`是托管在github上的,可以自由的下载安装使用。
-
-GitHub地址:https://github.com/mobz/elasticsearch-head
-
-### elasticsearch-head 下载
-
-head插件可以直接在github页面上点击`clone or download`进行下载然后解压,也可以使用git命令进行下载。
-
-`git clone git://github.com/mobz/elasticsearch-head.git`
-
-### elasticsearch-head 启动
-
-#### 方式1:使用nodejs启动
-
-这种方式需要使用[nodejs](https://nodejs.org/en/download/)环境进行启动。
-
-1. `git clone git://github.com/mobz/elasticsearch-head.git`
-1. `cd elasticsearch-head`
-1. `npm install`
-1. `npm run start`
-1. `open`
-
-#### 方式2:使用Tomcat启动
-
-观察解压的`elasticsearch-head` 目录和文件,我们发现head插件只是一个前端页面,因此我们可以运行于任何web服务器,如`Nginx`,`Tomcat`等。因为笔者开发环境是`JDK`,所以使用`Tomcat`进行测试。
-1. 解压Tomcat,进入webapps目录。
-2. 拷贝解压后的head插件内容到`webapps`文件夹。
-
-3. Tomcat启动。
-4. `open` http://localhost:8080/elasticsearch-head/
-
-这时候如果启动了`elasticsearch`,会发现head插件并不能连接到`elasticsearch`,打开浏览器控制台会发现由于跨域问题产生的错误日志。
-
-
-这时候我们需要配置`elasticsearch`允许跨域访问,打开`elasticsearch`的配置文件config/elasticsearch.yml在里面添加允许跨域配置。
-```
-# 跨域问题
-http.cors.enabled: true
-http.cors.allow-origin: "*"
-```
-再次启动`elasticsearch`,会发现`head`可以正常连接到ES了。
-
-
-
-#### 方式3:使用chrome扩展插件
-此种方式安装的`head`插件,安装简单,没有跨域问题,但是需要可以上`外网`。
-
-1. 打开chrome插件地址 [Elasticsearch Head](https://chrome.google.com/webstore/detail/elasticsearch-head/ffmkiejjmecolpfloofpjologoblkegm/)
-
-2. 点击添加至Chrome
- 
-3. 等待安装完毕
-4. 点击chrome扩展中的head图标运行
-
-
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/elasticsearch/elasticsearch-query.md b/docs/elasticsearch/elasticsearch-query.md
deleted file mode 100644
index 19b9e65..0000000
--- a/docs/elasticsearch/elasticsearch-query.md
+++ /dev/null
@@ -1,288 +0,0 @@
----
-title: 全文搜索ElasticSearch(二)深入搜索
-date: 2018-04-27 15:14:17
-url: lucene/elasticsearch-query
-tags:
-- Elasticsearch
-categories:
-- Elasticsearch
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-现在,我们已经学会了如何使用 Elasticsearch 作为一个简单的 NoSQL 风格的分布式文档存储系统。我们可以将一个 JSON 文档扔到 Elasticsearch 里,然后根据 ID 检索。但 Elasticsearch 真正强大之处在于可以从无规律的数据中找出有意义的信息——从“大数据”到“大信息”。
-
-Elasticsearch 不只会存储(stores) 文档,为了能被搜索到也会为文档添加索引(indexes) ,这也是为什么我们使用结构化的 JSON 文档,而不是无结构的二进制数据。
-
-文档中的每个字段都将被索引并且可以被查询 。不仅如此,在简单查询时,Elasticsearch 可以使用 所有(all) 这些索引字段,以惊人的速度返回结果。这是你永远不会考虑用传统数据库去做的一些事情。
-
-
-笔者使用的ElasticSearch版本:**elasticsearch-5.5.1**
-## 数据准备
-```json
-{"title":"超级玛丽秘籍","author":"王五","word_count":5000,"publish_date":"1994-11-01"}
-{"title":"三国志","author":"陈寿","word_count":30000,"publish_date":"1995-11-01"}
-{"title":"三国演绎","author":"罗贯中","word_count":30000,"publish_date":"1994-03-01"}
-{"title":"玛丽与管道工","author":"玛丽","word_count":10000,"publish_date":"1994-03-01"}
-{"title":"史记","author":"司马迁","word_count":20000,"publish_date":"1994-08-01"}
-{"title":"如何蹦的更高","author":"玛丽","word_count":20000,"publish_date":"1994-08-01"}
-```
-
-## 子条件查询
-
-### Query context
-在查询过程中,除了判断文档是否满足查询条件外,ES还会计算一个_score来标识匹配的程度,旨在判断目标文档和查询条件匹配的**有多好**。
-
-常用查询:
-全文本查询,针对**文本类型数据**
-
-#### 全文本查询-模糊查询
-
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "match":{
- "title":"三国志"
- }
- }
-}
-// 响应
-{
- "took": 4,
- "timed_out": false,
- "_shards": {
- "total": 5,
- "successful": 5,
- "failed": 0
- },
- "hits": {
- "total": 2,
- "max_score": 0.99938464,
- "hits": [
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOAB8bQcKhhHA2xN60",
- "_score": 0.99938464,
- "_source": {
- "title": "三国志",
- "author": "陈寿",
- "word_count": 30000,
- "publish_date": "1995-11-01"
- }
- },
- {
- "_index": "book",
- "_type": "novel",
- "_id": "AWLOADU4QcKhhHA2xN61",
- "_score": 0.34450945,
- "_source": {
- "title": "三国演绎",
- "author": "罗贯中",
- "word_count": 30000,
- "publish_date": "1994-03-01"
- }
- }
- ]
- }
-}
-```
-
-#### 全文本查询-短语查询
-查询书籍名字就是”三国志”的书籍信息。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "match_phrase":{
- "title":"三国志"
- }
- }
-}
-
-```
-
-#### 全文本查询-多字段查询
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "multi_match":{
- "query":"玛丽",
- "fields":["author","title"]
- }
- }
-}
-```
-#### 全文本查询-语法查询
-查询“三国”和”演绎”同时匹配的书籍信息或者可以匹配“超级玛丽”的书籍信息。
-
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "query_string":{
- "query":"(三国 AND 演绎) OR 超级玛丽"
- }
- }
-}
-```
-
-指定字段的语法查询,查询标题中包含三国或者玛丽的书籍信息。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "query_string":{
- "query":"三国 OR 玛丽",
- "fields":["title"]
- }
- }
-}
-```
-
-字段级别查询,针对结构化数据,如数字,日期等
-#### 字段级别查询-精确查询
-查询书籍字数为10000的书籍信息。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "term":{
- "word_count":10000
- }
- }
-}
-```
-
-#### 字段级别查询-范围查询
-查询书籍字数大于等于10000且小于等于20000的书籍信息,gte中的e是equals,等于的意思。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "range":{
- "word_count":{
- "gte":10000,
- "lte":20000
- }
- }
- }
-}
-```
-
-
-### Filter context
-在查询的过程中,只判断该文档是否满足条件,只有YES或者NO的结果。
-使用Filter查询书籍字数为10000的书籍信息。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "bool":{
- "filter":{
- "term":{
- "word_count":10000
- }
- }
- }
- }
-}
-```
-
-## 复合条件查询
-
-### 固定分数查询
-"boost":2用于指定查询出来的信息评分都为2。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "constant_score":{
- "filter":{
- "match":{
- "title":"三国"
- }
- },
- "boost":2
- }
- }
-}
-```
-### 组合或关系查询
-查询作者是陈寿或者标题为三国志的书籍信息。
-should表示条件之间是或的关系。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "bool":{
- "should":[
- {
- "match":{
- "author":"陈寿"
- }
- },
- {
- "match":{
- "title":"三国志"
- }
- }
- ]
- }
- }
-}
-```
-### 组合与关系查询
-查询作者是陈寿或者标题为三国志的书籍信息。
-Must表示条件之间是且的关系。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "bool":{
- "must":[
- {
- "match":{
- "author":"陈寿"
- }
- },
- {
- "match":{
- "title":"三国志"
- }
- }
- ]
- }
- }
-}
-```
-
-### 组合非关系查询
-查询作者不是陈寿的书籍信息。
-```json
-POST http://localhost:9200/book/_search
-{
- "query":{
- "bool":{
- "must_not":{
- "match":{
- "author":"陈寿"
- }
- }
- }
- }
-}
-```
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/elasticsearch/solr-install.md b/docs/elasticsearch/solr-install.md
deleted file mode 100644
index 50ade55..0000000
--- a/docs/elasticsearch/solr-install.md
+++ /dev/null
@@ -1,204 +0,0 @@
----
-title: Solr7.3.0入门教程,部署Solr到Tomcat,配置Solr中文分词器
-date: 2018-04-13 17:31:11
-url: lucene/solr-install
-tags:
-- Solr
-- 中文分词
-categories:
-- Elasticsearch
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-### solr 基本介绍
-
-Apache Solr (读音: SOLer) 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Field 构成,每个 Field 表示资源的一个属性。Solr 中的每个 Document 需要有能唯一标识其自身的属性,默认情况下这个属性的名字是 id,在 Schema 配置文件中使用:id进行描述。
-Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。文档通过Http利用XML加到一个搜索集合中。查询该集合也是通过 http收到一个XML/JSON响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,高亮显示搜索结果,通过索引复制来提高可用性,提 供一套强大Data Schema来定义字段,类型和设置文本分析,提供基于Web的管理界面等。
-
-
-
-#### solr 名称来源
-Search On Lucene Replication
-
-#### solr 历史
-2004年 CNET 开发 Solar,为 CNET 提供站内搜索服务
-2006年1月捐献给 Apache ,成为 Apache 的孵化项目
-一年后 Solr 孵化成熟,发布了1.2版,并成为 Lucene 的子项目
-2010年6月,solr 发布了的1.4.1版,这是1.4的 bugfix 版本,1.4.1的solr使用的lucene是2.9版本的
-solr 从1.4.x版本以后,为了保持和lucene同步的版本,solr直接进入3.0版本。
-
-### 环境准备
-1. 下载JDK8 安装且配置环境变量
- 可以直接在[JDK官方网站](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)进行下载。
- 安装完毕之后[配置环境变量](https://jingyan.baidu.com/article/c85b7a6414f2ee003bac95d5.html)。
-
-2. 下载Solr7.3.0并解压
- 可以直接在[Solr官方网站](https://lucene.apache.org/whoweare.html)进行下载。
-
- 
- http://mirrors.hust.edu.cn/apache/lucene/solr/
-
-3. 下载Tomcat 8或者 Tomcat 9 并解压
- 可以直接在[Tomcat官方网站](https://tomcat.apache.org/download-90.cgi)进行下载安装。
- https://tomcat.apache.org/download-90.cgi
-
- 
-
-### 部署Solr到Tomcat
-说明: 我的解压路径
-```
-#Solr:D:\develop\solr-7.3.0
-#Tomcat:D:\webserver\apache-tomcat-9.0.1
-```
-#### 复制Solr文件到Tomcat
-1. 拷贝文件夹
-D:\develop\solr-7.3.0\server\solr-webapp\webapp 到
-D:\webserver\apache-tomcat-9.0.1\webapps\ 下,并且重命名为`solr7.3`
-2. 复制D:\develop\solr-7.3.0\server\lib\ext 下的所有Jar包到
-D:\webserver\apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\lib
-3. 复制D:\develop\solr-7.3.0\dist下的
- `solr-dataimporthandler-7.3.0.jar`
- `solr-dataimporthandler-extras-7.3.0.jar `
-到D:\webserver\apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\lib
-4. 复制D:\develop\solr-7.3.0\server\lib下的`metrics-`开头的五个Jar
-到D:\webserver\apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\lib
-5. 复制D:\develop\solr-7.3.0\server\resources\log4j.properties到
-D:\webserver\apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\classes
-#### 配置Solr Home
-1. 新建文件夹D:\develop\solr-7.3.0-home,复制D:\develop\solr-7.3.0\server\solr下的所有内容到D:\develop\solr-7.3.0-home。
-2. 打开D:\webserver\apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\web.xml
-在47行配置SolrHome,用于指定数据存放位置。
-```
-
- solr/home
- D:\develop\solr-7.3.0-home
- java.lang.String
-
-```
-#### 关闭安全约束
-注释掉D:\webserver\apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\web.xml最下方的安全约束,让项目启动之后可以正常访问。
-
-```xml
-
-
-```
-#### Tomcat启动访问
-至此,Solr配置以及完成,启动Tomcat访问
-http://localhost:8080/solr7.3/index.html
-
-)
-
-### 创建Solr Core
-点击网页左侧菜单Core Admin
-输入
- name:blog
- instanceDir:blog
-点击`Add Core`,网页上方提示在D:\develop\solr-7.3.0-home\blog下无法找到solrconfig.xml:
-
-```
-Error CREATEing SolrCore 'blog': Unable to create core [blog] Caused by: Can't find resource 'solrconfig.xml' in classpath or 'D:\develop\solr-7.3.0-home\blog'
-```
-我们复制官方给出的默认配置,复制
-D:\develop\solr-7.3.0-home\configsets\_default\conf
-到D:\develop\solr-7.3.0-home\blog下,回到页面,再次点击`Add Core`,等待页面添加成功自动刷新。
-此时,在SolrHome下的blog文件夹下生成了相关文件:
-
-
-
-### 添加 Core 字段
-#### 在页面上添加
-打开http://localhost:8080/solr7.3/index.html选择左侧菜单`Core Selector` 选择刚才添加的blog,接着选择下面的Schema。可以在出现的页面上填写字段信息name:title,field type:string,然后点击`Add Field`完成添加。
-[Solr中的Field、CopyField、DynamicField与其他Field](https://blog.csdn.net/u011518678/article/details/51871925)
-#### 在配置文件中添加
-我们打开文件:
-D:\develop\solr-7.3.0-home\blog\conf\managed-schema
-搜索title关键词,搜索到如下信息:
-```
-
-```
-可见,我们刚才在页面添加的字段信息最终会生成此条配置,因此,我们也可以拷贝这个配置更改name值为content就可以完成content字段的添加。
-
-配置完成之后点击页面`Core Admin `然后点击`Reload`刷新信息,我们就可以在Schema中查看到content字段。
-
-### 添加/更新/查询数据
-
-在页面选择blog Core,选择Documents,在Document(s)中输入下面内容进行数据然后点击Submit Document添加数据,如果ID已经存在,则为更新。如果JSON中没有写ID字段,会随机生成ID。
-
-```
-{
- "id": "10000",
- "title": "Sorl入门教程",
- "content": "sorl下载,solr配置,solr启动"
-}
-```
-提交之后可以看到成功添加信息的反馈。
-
-```
-Status: success
-Response:
-{
- "responseHeader": {
- "status": 0,
- "QTime": 4
- }
-}
-```
-
-数据已经成功添加,如果需要查询数据可以点击左侧`Query`,点击`Execute Query`查询出刚才添加的数据。
-
-
-### 中文分词器的使用
-
-在已经运行的页面上,选择blog Core,然后选择`Analysis`,输入中国人民,字段类型选择_text_,点击`Analyse Values`可以看到没有中文分词器的结果:
-
-
-
-下面使用中文分词器,下载ikanalyzer-solr6.5
-解压将`IKAnalyzer.cfg.xml`以及`stopword.dic`解压到
-\apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\classes
-
- 解压将里面的两个jar包`ik-analyzer-solr5-5.x.jar`以及`solr-analyzer-ik-5.1.0.jar`解压到
- \apache-tomcat-9.0.1\webapps\solr7.3\WEB-INF\lib
-
- 打开刚才创建的blog core目录\solr-7.3.0-home\blog\conf,编辑managed-schema文件添加配置:
-
-```
-
-
-
-```
-
-在页面选择Core Admin -> blog -> Reload 刷新配置,然后选择blog Core,然后选择`Analysis`,输入中国人民,字段类型选择text_ik,点击`Analyse Values`可以看到没有中文分词器的结果:
-
-
-
-
-### 参考资料
-[Solr官方文档](https://lucene.apache.org/solr/guide/7_3/solr-tutorial.html)
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/htmlcss/css-mac-window.md b/docs/htmlcss/css-mac-window.md
deleted file mode 100644
index 62bda8d..0000000
--- a/docs/htmlcss/css-mac-window.md
+++ /dev/null
@@ -1,95 +0,0 @@
----
-title: CSS - 使用CSS实现Mac窗口效果
-date: 2018-08-15 05:42:55
-updated: 2018-08-15 05:42:55
-url: html-css/css-mac-window
-categories:
-- 前端开发
-tags:
-- Css
-- Html
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-来不及了,直接贴代码。
-### HTML代码
-
-```html
-
-
-
- Wait,i know you
- keep hungry keep foolish
- 苍苍之天不可得久视,堂堂之地不可得久履,道此绝矣!
- 告后世及其孙子,忽忽锡锡,恐见故里,毋负天地,
- 更亡更在,去如舍庐,下敦闾里!人固当死,慎毋敢佞。
-
-
-```
-
-### CSS代码
-主要是三个圆点
-```css
-.user-bio {
- font-size: 14px;
- color: #6a737d;
-}
-.user-bio .user-bio-top {
- height: 15px;
- background-color: #E3E3E3;
- padding: 8px 12px;
- border-top-left-radius: 3px;
- border-top-right-radius: 3px;
-}
-.user-bio .user-bio-body {
- background-color: #EEEEEE;
- width: 100%;
- font-size: 13px;
- color: #666666;
- overflow: auto;
- padding: 20px;
- font-family: "Source Code Pro", Consolas, Menlo, Monaco, "Courier New", monospace;
-}
-.user-bio .user-bio-top div{
- float: left;
- margin-right: 10px;
- width:13px;
- height:13px;
- background-color:#FF5F57;
- border-radius:50px;
-}
-.user-bio .user-bio-top .circle-yellow{
- float: left;
- margin-right: 10px;
- width:13px;
- height:13px;
- background-color:#FFBD2E;
- border-radius:50px;
-}
-.user-bio .user-bio-top .circle-green{
- float: left;
- margin-right: 10px;
- width:13px;
- height:13px;
- background-color:#28CA42;
- border-radius:50px;
-}
-```
-### 最终效果
-
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/htmlcss/jquery-easing-anchor-animation.md b/docs/htmlcss/jquery-easing-anchor-animation.md
deleted file mode 100644
index e92ee26..0000000
--- a/docs/htmlcss/jquery-easing-anchor-animation.md
+++ /dev/null
@@ -1,136 +0,0 @@
----
-title: Jquery - 使用jquery-easing.js实现页面锚点平滑滚动
-date: 2018-08-19 08:48:03
-updated: 2018-08-19 08:48:03
-url: html-css/jquery-easing-anchor-animation
-categories:
-- 前端开发
-tags:
-- Css
-- Javascript
-- 平滑滚动
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-
-### 使用jquery-easing.js实现页面锚点平滑滚动
-
-使用[jquery easing.js](http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js "jquery easing.js")可以实现多动动画效果。
-jquery easing.js中定义了很多种不同的动画效果,动画速度和时间的关系图可以参考此图:
-
-
-
-
-
-使用easeInOutExpo效果示例锚点的平滑滚动效果,直接上代码。
-
-### 效果图
-
-
-
-### HTML代码
-```html
-
-
-
-
-
- 平滑滚动
-
-
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- TO P1
-
-
-
-
-
-
-
-```
-
-
-### Anchor-animation.js代码
-```javascript
-(function($) {
- // Smooth scrolling using jQuery easing
- $('a[href*="#"]:not([href="#"])').click(function() {
- if (location.pathname.replace(/^\//, '') == this.pathname.replace(/^\//, '') && location.hostname == this.hostname) {
- var target = $(this.hash);
- target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
- if (target.length) {
- $('html, body').animate({
- scrollTop: target.offset().top
- }, 1000, "easeInOutExpo");
- return false;
- }
- }
- });
-})(jQuery); // End of use strict
-```
-
-### jquery-easing.js代码
-此处因为只使用到了easeInOutExpo方法,所以我删除了其他没有用到的方法,只保留了easeInOutExpo方法。
-
-```javascript
-jQuery.easing['jswing'] = jQuery.easing['swing'];
-
-jQuery.extend( jQuery.easing,
-{
- def: 'easeOutQuad',
- swing: function (x, t, b, c, d) {
- //alert(jQuery.easing.default);
- return jQuery.easing[jQuery.easing.def](x, t, b, c, d);
- },
-
- easeInOutExpo: function (x, t, b, c, d) {
- if (t==0) return b;
- if (t==d) return b+c;
- if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
- return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
- }
-});
-
-
-```
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/java/java-load-balancing.md b/docs/java/java-load-balancing.md
deleted file mode 100644
index 3ec146f..0000000
--- a/docs/java/java-load-balancing.md
+++ /dev/null
@@ -1,280 +0,0 @@
----
-title: 一篇有趣的负载均衡算法实现
-date: 2020-05-29 07:37:19
-url: algorithm/load-balancing
-categories:
-- Java 开发
-tags:
-- 负载均衡
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-**负载均衡**(Load balancing)是一种在多个计算机(网络、CPU、磁盘)之间均匀分配资源,以提高资源利用的技术。使用负载均衡可以最大化服务吞吐量,可能最小化响应时间,同时由于使用负载均衡时,会使用多个服务器节点代单点服务,也提高了服务的可用性。
-
-负载均衡的实现可以软件可以硬件,硬件如大名鼎鼎的 F5 负载均衡设备,软件如 NGINX 中的负载均衡实现,又如 Springcloud Ribbon 组件中的负载均衡实现。
-
-如果看到这里你还不知道负载均衡是干嘛的,那么只能放一张图了,毕竟没图说个啥。
-
-
-
-负载均衡要做到在多次请求下,每台服务器被请求的次数大致相同。但是实际生产中,可能每台机器的性能不同,我们会希望性能好的机器承担的请求更多一些,这也是正常需求。
-
-如果这样说下来你看不懂,那我就再举个例子好了,一排可爱的小熊(服务器)站好。
-
-
-
-这时有人(用户)要过来打脸(请求访问)。
-
-
-
-那么怎么样我们才能让这每一个可爱的小熊被打的次数大致相同呢?
-
-又或者熊 4 比较胖,抗击打能力是别人的两倍,我们怎么提高熊 4 被打的次数也是别人的两倍呢?
-
-又或者每次出手的力度不同,有重有轻,恰巧熊 4 总是承受这种大力度啪啪打脸,熊 4 即将不省熊事,还要继续打它吗?
-
-这些都是值的思考的问题。
-
-**说了那么多,口干舌燥,我双手已经饥渴难耐了,迫不及待的想要撸起代码了。**
-
-## 1. 随机访问
-
-上面说了,为了负载均衡,我们必须保证多次出手后,熊 1 到熊 4 被打次数均衡。比如使用随机访问法,根据数学上的概率论,随机出手次数越多,每只熊被打的次数就会越相近。代码实现也比较简单,使用一个随机数,随机访问一个就可以了。
-
-```java
-/** 服务器列表 */
-private static List serverList = new ArrayList<>();
-static {
- serverList.add("192.168.1.2");
- serverList.add("192.168.1.3");
- serverList.add("192.168.1.4");
- serverList.add("192.168.1.5");
-}
-
-/**
- * 随机路由算法
- */
-public static String random() {
- // 复制遍历用的集合,防止操作中集合有变更
- List tempList = new ArrayList<>(serverList.size());
- tempList.addAll(serverList);
- // 随机数随机访问
- int randomInt = new Random().nextInt(tempList.size());
- return tempList.get(randomInt);
-}
-```
-
-因为使用了非线程安全的集合,所以在访问操作时操作的是集合的拷贝,下面几种轮询方式中也是这种思想。
-
-写一个模拟请求方法,请求10w次,记录请求结果。
-
-```java
-public static void main(String[] args) {
- HashMap serverMap = new HashMap<>();
- for (int i = 0; i < 20000; i++) {
- String server = random();
- Integer count = serverMap.get(server);
- if (count == null) {
- count = 1;
- } else {
- count++;
- }
- // 记录
- serverMap.put(server, count);
- }
- // 路由总体结果
- for (Map.Entry entry : serverMap.entrySet()) {
- System.out.println("IP:" + entry.getKey() + ",次数:" + entry.getValue());
- }
-}
-```
-
-运行得到请求结果。
-
-```
-IP:192.168.1.3,次数:24979
-IP:192.168.1.2,次数:24896
-IP:192.168.1.5,次数:25043
-IP:192.168.1.4,次数:25082
-```
-
-每台服务器被访问的次数都趋近于 2.5w,有点负载均衡的意思。但是随机毕竟是随机,是不能保证访问次数绝对均匀的。
-
-## 2. 轮询访问
-
-轮询访问就简单多了,拿上面的熊1到熊4来说,我们一个接一个的啪啪 - 打脸,熊1打完打熊2,熊2打完打熊3,熊4打完打熊1,最终也是实现了被打均衡。但是保证均匀总是要付出代价的,随机访问中需要随机,轮询访问中需要什么来保证轮询呢?
-
-```java
-/** 服务器列表 */
-private static List serverList = new ArrayList<>();
-static {
- serverList.add("192.168.1.2");
- serverList.add("192.168.1.3");
- serverList.add("192.168.1.4");
- serverList.add("192.168.1.5");
-}
-private static Integer index = 0;
-
-/**
- * 随机路由算法
- */
-public static String randomOneByOne() {
- // 复制遍历用的集合,防止操作中集合有变更
- List tempList = new ArrayList<>(serverList.size());
- tempList.addAll(serverList);
- String server = "";
- synchronized (index) {
- index++;
- if (index == tempList.size()) {
- index = 0;
- }
- server = tempList.get(index);;
- }
- return server;
-}
-```
-
-由代码里可以看出来,为了保证轮询,必须记录上次访问的位置,为了让在并发情况下不出现问题,还必须在使用位置记录时进行加锁,很明显这种互斥锁增加了性能开销。
-
-依旧使用上面的测试代码测试10w次请求负载情况。
-
-```java
-IP:192.168.1.3,次数:25000
-IP:192.168.1.2,次数:25000
-IP:192.168.1.5,次数:25000
-IP:192.168.1.4,次数:25000
-```
-
-## 3. 轮询加权
-
-上面演示了轮询方式,还记的一开始提出的熊4比较胖抗击打能力强,可以承受别人2倍的挨打次数嘛?上面两种方式都没有体现出来熊 4 的这个特点,熊 4 窃喜,不痛不痒。但是熊 1 到 熊 3 已经在崩溃的边缘,不行,我们必须要让胖着多打,能者多劳,提高整体性能。
-
-```java
-/** 服务器列表 */
-private static HashMap serverMap = new HashMap<>();
-static {
- serverMap.put("192.168.1.2", 2);
- serverMap.put("192.168.1.3", 2);
- serverMap.put("192.168.1.4", 2);
- serverMap.put("192.168.1.5", 4);
-}
-private static Integer index = 0;
-
-/**
- * 加权路由算法
- */
-public static String oneByOneWithWeight() {
- List tempList = new ArrayList();
- HashMap tempMap = new HashMap<>();
- tempMap.putAll(serverMap);
- for (String key : serverMap.keySet()) {
- for (int i = 0; i < serverMap.get(key); i++) {
- tempList.add(key);
- }
- }
- synchronized (index) {
- index++;
- if (index == tempList.size()) {
- index = 0;
- }
- return tempList.get(index);
- }
-}
-```
-
-这次记录下了每台服务器的整体性能,给出一个数值,数值越大,性能越好。可以承受的请求也就越多,可以看到服务器 `192.168.1.5` 的性能为 4,是其他服务器的两倍,依旧 10 w 请求测试。
-
-```java
-IP:192.168.1.3,次数:20000
-IP:192.168.1.2,次数:20000
-IP:192.168.1.5,次数:40000
-IP:192.168.1.4,次数:20000
-```
-
- `192.168.1.5` 承担了 2 倍的请求。
-
-## 4. 随机加权
-
-随机加权的方式和轮询加权的方式大致相同,只是把使用互斥锁轮询的方式换成了随机访问,按照概率论来说,访问量增多时,服务访问也会达到负载均衡。
-
-```java
-/** 服务器列表 */
-private static HashMap serverMap = new HashMap<>();
-static {
- serverMap.put("192.168.1.2", 2);
- serverMap.put("192.168.1.3", 2);
- serverMap.put("192.168.1.4", 2);
- serverMap.put("192.168.1.5", 4);
-}
-/**
- * 加权路由算法
- */
-public static String randomWithWeight() {
- List tempList = new ArrayList();
- HashMap tempMap = new HashMap<>();
- tempMap.putAll(serverMap);
- for (String key : serverMap.keySet()) {
- for (int i = 0; i < serverMap.get(key); i++) {
- tempList.add(key);
- }
- }
- int randomInt = new Random().nextInt(tempList.size());
- return tempList.get(randomInt);
-}
-```
-
-依旧 10 w 请求测试,`192.168.1.5` 的权重是其他服务器的近似两倍,
-
-```log
-IP:192.168.1.3,次数:19934
-IP:192.168.1.2,次数:20033
-IP:192.168.1.5,次数:39900
-IP:192.168.1.4,次数:20133
-```
-
-## 5. IP-Hash
-
-上面的几种方式要么使用随机数,要么使用轮询,最终都达到了请求的负载均衡。但是也有一个很明显的缺点,就是同一个用户的多次请求很有可能不是同一个服务进行处理的,这时问题来了,如果你的服务依赖于 session ,那么因为服务不同, session 也会丢失,不是我们想要的,所以出现了一种根据请求端的 ip 进行哈希计算来决定请求到哪一台服务器的方式。这种方式可以保证同一个用户的请求落在同一个服务上。
-
-```java
-private static List serverList = new ArrayList<>();
-static {
- serverList.add("192.168.1.2");
- serverList.add("192.168.1.3");
- serverList.add("192.168.1.4");
- serverList.add("192.168.1.5");
-}
-
-/**
- * ip hash 路由算法
- */
-public static String ipHash(String ip) {
- // 复制遍历用的集合,防止操作中集合有变更
- List tempList = new ArrayList<>(serverList.size());
- tempList.addAll(serverList);
- // 哈希计算请求的服务器
- int index = ip.hashCode() % serverList.size();
- return tempList.get(Math.abs(index));
-}
-```
-
-## 6. 总结
-
-上面的四种方式看似不错,那么这样操作下来真的体现了一开始说的负载均衡吗?答案是不一定的。就像上面的最后一个提问。
-
-> 又或者每次出手的力度不同,有重有轻,恰巧熊 4 总是承受这种大力度啪啪打脸,熊 4 即将不省熊事,还要继续打它吗?
-
-服务器也是这个道理,每次请求进行的操作对资源的消耗可能是不同的。比如说某些操作它对 CPU 的使用就是比较高,也很正常。**所以负载均衡有时不能简单的通过请求的负载来作为负载均衡的唯一依据**。还可以结合服务的当前连接数量、最近响应时间等维度进行总体均衡,总而言之,就是为了达到资源使用的负载均衡。
-
-
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/java/java-think-code-standards.md b/docs/java/java-think-code-standards.md
deleted file mode 100644
index f4d3338..0000000
--- a/docs/java/java-think-code-standards.md
+++ /dev/null
@@ -1,159 +0,0 @@
----
-title: Java 开发的编程噩梦,这些坑你没踩过算我输
-date: 2020-08-07 08:01:01
-url: java/java-code-standards
-tags:
- - 开发技巧
-categories:
- - Java 开发
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-很多 Java 初学者在开始编程时会出现一些问题,这些问题并不是指某个特定领域的问题,也不是指对某个业务不熟悉而导致的问题,而是对基础知识不够熟悉导致的问题。而就是这些问题让我们编写了一些不够健壮的代码。
-这篇文章会列举几种编程初学者常常出现的一些问题,我相信这些问题多多少少也曾困扰着现在或曾经的你。如果觉得文章不错,不妨点赞分享,让更多人跳过这些开发中的坑。
-
-## 随处可见的 Null 值
-我见过很多的代码会把 Null 值作为返回值,当你预期是一个字符串时,意外得到了一个 Null 值;当你预期得到一个 List 时,意外又得到了一个 Null 值,如果你不进行处理,那么你还会意外得到 `NullPointerException`.
-就像下面这样。
-
-```java
-// 情况1
-String userTag = getUserTag();
-if (userTag.equals("admin")) { // NullPointerException
- // ...
-}
-
-// 情况2
-List carList = getCarList();
-for (String car : carList) { // NullPointerException
- // ...
-}
-
-```
-为了防止这种情况,你可以在 List 返回时给出一个空的集合而不是 Null,如果是字符串,你可以把要确定有值对象放在比较的前面。
-
-```java
-if ("admin".equals(userTag)) {
- // ...
-}
-// 或者
-if (Objects.equals(userTag,"admin")){
- // ...
-}
-```
-
-## 没有进行空值检查
-可能你考虑到了上面的 Null 值情况,但是在实际处理时没有考虑空值情况,比如字符空串空串 "",或者集合为空。那么在后续处理时又有可能得到一个 `NullPointerException`. 所以你应该进行空值判断。
-```java
-String userTag = getUserTag();
-if (userTag != null && userTag.trim() != "") {
- // ...
-}
-
-List carList = getCarList();
-if (carList != null && !carList.isEmpty()) {
- // ...
-}
-```
-## 忽略的异常处理
-异常处理总是一件烦人的事,而忽略异常似乎总有一种吸引人的魔力。我见过像下面这样的代码。
-
-```java
-try {
- List result= request();
- // ...
-}catch (Exception e){
-
-}
-```
-
-你没有看错,catch 中没有任何内容,后来出现了问题,看着日志文件一片太平无迹可寻。异常是故意抛出来的,你应该正确处理它们或者继续抛出。而且同时,你该输出一行日志用来记录这个异常,方便以后的问题追踪。
-
-## 没有释放资源
-
-在读取文件或者请求网络资源时,总是需要进行 close 操作,这很重要,否则可能会阻塞其他线程的使用。但是初学者可能会忘记这一步操作。其实在 Java 7 开始,就提供了 `try-with-resources` 自动关闭资源的特性,只需要把打开的资源放入 `try` 中。
-
-```java
-try (FileReader fileReader = new FileReader("setting.xml")) {
- // fileReader.read();
- // ...
-} catch (Exception e) {
- e.printStackTrace();
-}
-```
-像上面这样,不需要在 `finally` 里手动调用 `fileReader` 的 `close` 方法关闭资源,因为放在 `try` 里的资源调用会在使用完毕时自动调用 `close`. 而且不管是否有异常抛出,这很实用。
-
-## ConcuretModificationException
-
-总有一天你会遇到 `ConcuretModificationException` ,然后开始百度搜索它的解决方式,这个异常最常见的场景是你在遍历一个集合时进行更新操作,比如像下面这样。
-```java
-List list = new ArrayList<>();
-list.add("a1");
-list.add("b1");
-list.add("b2");
-list.add("c1");
-for (String s : list) {
- if ("b1".equals(s)) {
- list.remove(s);
- }
-}
-```
-
-这个异常很有用处,因为 ArrayList 不是线程安全的集合,假设你这边一边遍历,另一个线程不断更新,非线程安全集合会导致你的遍历结果不正确,所以这个异常的存在是合理的。同理 HashMap 也是如此,关于 HashMap 之前已经有一篇文章详细介绍了,可以参考 [最通俗易懂的 HashMap 源码分析解读](https://mp.weixin.qq.com/s/q-rWq79HmzPe08gyfOjaIA)。
-
-## 缺少注释
-
-**准确的注释可以救人于水火**,这点有时候一点也不夸张。虽然说优秀的代码本身就是非常好的注释,但是这实际开发起来,很少发生。注释并不需要你事无巨细的一一记录,但是你该在核心逻辑添加应有的注释,比如复杂逻辑的实现思路,当前逻辑业务需求。某个判断的添加原因,某个异常的发生情况等等。这可以让你在未来的某一天需要回看现在的代码时感谢自己。更可以**让你在某天的甩锅中轻松胜出**。
-
-## 不进行代码测试
-
-我见过有些同事在功能开发完毕后直接扔给对接同事使用,而自己却没有经过任何测试,或者只是测试了某个简单的情况。测试是开发过程中的重要环节,没有经过严格测试的代码很难说没有问题,我觉得在功能开发完毕后至少需要**单元测试**,**特殊用例**测试,**集成测试**以及其他形式的测试。**严格的测试不仅可以第一时间发现问题,更可以减少后面不必要的对接调试时间**。
-
-## 重复造轮子
-
-你知道的,Java 社区非常活跃,存在着大量的第三方类库,开源作者可能花费了数年时间去维护和完善类库,这些类库非常优秀。同时 JDK 也提供了大量的常用的功能封装。这些都可以**为我们的开发速度插上翅膀**。所以,当你需要一个功能时候,应该首先看下 JDK 和已经引入的类库中是否已经存在相同功能,而不是自己重复造轮子,而且大部分情况下你造的轮子还不如别人好。
-
-下面举些例子。
-
-- 你需要日志记录,可以使用 logback.
-- 你需要网络操作,可以使用 netty.
-- 你需要解析 JSON,可以使用 gson.
-- 你需要解析表格,可以使用 apache poi.
-- 你需要通用操作,可以使用 apache commons.
-
-另外一种情况是,你可能不知道某个功能在 JDK 中已经实现,这时候你应该多多查看 JDK Document. 我就在工作中见到过同事手写字符串 split,为了获取时间戳把 Date 对象转换到 Calendar.
-
-## 缺少必要的沟通
-
-这个部分是和开发没有关系的,但是这个环节往往会影响最终的开发结果。进行具体的开发之前,你应该详细的沟通并理解功能的需求,这样你才能针对具体的需求写出不偏离实际需要的代码。有时候你很有可能因为缺少必要的沟通,错误了理解了需求,最终在开发完毕后发现自己写的功能完全没有用处。
-
-## 没有代码规范
-
-代码规范性非常重要,如果一个项目里充斥着各种稀奇古怪的代码规范,会让维护者十分头疼。而且软件行业高速发展,对开发者的综合素质要求也越来越高,优秀的编程习惯也可以提高软件的最终质量。比如:标新立异的命名风格挑战阅读习惯;五花八门的错误码人为地 增加排查问题的难度;工程结构混 乱导致后续项目维护艰难;没有鉴权的漏洞代码易被黑客攻击;质量低下的代码上线之后漏洞百出等等。因为没有统一的代码规范,开发中的问题可能层出不穷。
-
-下面简单列举些应该统一的开发规范。如**命名风格如何是好;常量名称结构怎样;代码格式怎么统一;日期时间格式如何处理;集合处理注意事项;日志打印有无规范;前后交互具体规约**等。
-
-上面所说的开发规范代码规范推荐阿里推出的 《**Java 开发手册**》,里面详细列举了在 Java 开发中各个方面应该遵守的规约和规范。最新版本在 8月 3日已经发布,可以在公众号 “**未读代码**” 直接回复 "java " **获取最新版 pdf.**
-
-## 总结
-
-Bug 和技术上的误解都是美丽的谜团,福尔摩斯般的我们终将解决这些问题。命运自己掌握,每一次探清的这些技术误解,都会增加我们对开发编码的理解。**尽情接招吧,色彩斑斓才有趣,万般体验才是人生,不管是多样的技术,还是多样的问题,我都想看见。**
-
-
-
-**参考:**
-
-[1] [A beginner’s guide to Java programming nightmares](https://jaxenter.com/java-programming-nightmares-156749.html)
-
-[2] [Java™ Platform, Standard Edition 8 API Specification](https://docs.oracle.com/javase/8/docs/api/)
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/jdk/java-07-feature.md b/docs/jdk/java-07-feature.md
deleted file mode 100644
index a650b6a..0000000
--- a/docs/jdk/java-07-feature.md
+++ /dev/null
@@ -1,462 +0,0 @@
----
-title: 还看不懂同事代码?快来补一波 Java 7 语法特性
-# toc: false
-date: 2020-01-08 08:01:01
-url: jdk/jdk7-start
-tags:
- - Java7
- - AutoCloseable
-categories:
- - Java 新特性
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-# 前言
-
-Java 平台自出现到目前为止,已经 20 多个年头了,这 20 多年间 Java 也一直作为最流行的程序设计语言之一,不断面临着其他新兴编程语言的挑战与冲击。Java 语言是一种**静态强类型**语言,这样的语言特性可以让 Java 编译器在**编译阶段**发现错误,这对于构建出一个**稳定安全且健壮**的应用来说,尤为重要。但是也因为这种特性,让 Java 开发似乎变得缺少灵活性,开发某些功能的应用时,代码量可能是其他语言的几倍。Java 开发的不足之处也体现越来越复杂的 JDK 上,越来越复杂的 JDK 让开发者完全理解的难度变的非常大。以至于开发者有时会重复实现一个 JDK 中已经提供了的功能。
-
-为了跟上互联网应用编程发展的脚步, Java 从 9 版本开始调整了 JDK 发布的节奏,JDK 的每次更新都注重**提高生产效率**,提高 **JVM 性能**,推行**模块化**等,让开发者可以更多的专注于业务本身,而不是浪费过多的时间在语言特性上。 Java 语言的更新要在语言的严谨性和灵活性上找到一个平衡点,毕竟灵活性可以减少编码的复杂度,而严谨性是构建复杂且健壮应用的基石。
-
-# Java 7 语言特性
-
-Java 重要的更新版本是在 Java 5 版本,这个版本中增加了如泛型、增强 for、自动装箱拆箱、枚举类型,可变参数、注解等一系列**重要功能**,但是随后的 Java 6 中并没有增加新的重要的语言特性。Java 5 的发布是在 2004 年,已经很久远了,网上关于 Java 的教程也大多是基于 Java 6 的,也因此我准备从 Java 7 开始介绍每个 Java 版本的新特性。
-
-下面所有代码的运行演示都是基于 **Java 7 ** ,所以你如果尝试下面的代码,需要**安装并配置** Jdk 1.7 或者已上版本。
-
-# 1. switch String
-
-在 Java 7 之前,switch 语法中只支持整数类型以及这些整数类型的封装类进行判断,在 Java 7 中,支持了 string 字符串类型的判断,使用起来非常的简单,但是实用性是很高的。
-
-## 1.1. switch String 基本用法
-
-编写一个简单的 switch 判断字符串的测试类。
-
-```java
-public class SwitchWithString {
-
- public static void main(String[] args) {
- String gender = "男";
- System.out.println(gender.hashCode());
- switch (gender) {
- case "男":
- System.out.println("先生你好");
- break;
- case "女":
- System.out.println("女士你好");
- break;
- default:
- System.out.println("你好");
- }
- }
-}
-```
-
-switch 判断字符串使用起来很简单,结果也显而易见会先输出 gender 变量的 hashCode,然后输出匹配结果“先生你好”。
-
-```java
-30007
-先生你好
-```
-
-在使用 switch string 时候,如果结合 Java 5 的**枚举类**,那么效果会更好,Java 7 之前使用 switch 结合枚举类要为每个枚举值编数字代号,Java 7 之后可以枚举进行 switch。
-
-## 1.2. switch String 实现原理
-
-但是这个支持**只是编译器层面的支持**, Java 虚拟机依旧是不支持的。在对字符串进行 switch 时,编译器会把字符串**转换成整数**类型再进行判断。为了验证上面说的只是编译器层面的支持,我们反编译(可以使用 Jad 反编译工具,也可以在 Idea 中双击编译生成的 class )生成的 class 文件,看到编译器把 switch string 转换成了字符串 hashCode 判断,为了防止 hashCode 冲突,又使用了 equals 再次判断。
-
-```java
-public class SwitchWithString {
- public SwitchWithString() {
- }
-
- public static void main(String[] args) {
- String gender = "男";
- System.out.println(gender.hashCode());
- byte var3 = -1;
- switch(gender.hashCode()) {
- case 22899:
- if (gender.equals("女")) {
- var3 = 1;
- }
- break;
- case 30007:
- if (gender.equals("男")) {
- var3 = 0;
- }
- }
-
- switch(var3) {
- case 0:
- System.out.println("先生你好");
- break;
- case 1:
- System.out.println("女士你好");
- break;
- default:
- System.out.println("你好");
- }
-
- }
-}
-```
-
-# 2. try-with-resource
-
-Java 不同于 C++,需要开发者自己管理每一块内存,大多时候 Java 虚拟机都可以很好的帮我们进行资源管理,但是也有时候需要手动释放一些资源,比如数据库连接、磁盘文件连接、网络连接等。换句话说,只要是资源数量有限的,都需要我们手动的进行释放。
-
-## 2.1. try-catch-finally
-
-在操作有限资源的时候,可能会出现各种异常,不管是读取阶段还是在最后关闭资源的过程中,都有可能出现问题,我们通常会使用下面的方式 `try-catch-finally` 保证资源的释放。
-
-像下面这样。
-
-```java
-/**
- * 释放资源
- *
- * @author www.wdbyte.com
- */
-public class TryCatachFinally {
-
- /**
- * 异常处理
- *
- * @param args
- */
- public static void main(String[] args) throws Exception {
- FileInputStream inputStream = null;
- try {
- inputStream = new FileInputStream("jdk-feature-7.iml");
- } catch (FileNotFoundException e) {
- throw e;
- } finally {
- if (inputStream != null) {
- try {
- inputStream.close();
- } catch (IOException e) {
- throw e;
- }
- }
- }
- }
-}
-```
-
-看看这恶心的代码结构,为了捕获异常,我们写了一个 `catch`,为了能保证释放资源,我们又写了 `finally` 进行资源释放,在资源释放时为了捕捉 `close` 时抛出的异常,我们又写了一个 `try-catch`。最后看着这复杂的代码,如果有人告诉你这段代码有 `bug`,那你一定不会相信。但是确实是这样,看起来严密的代码逻辑,当 `try` 中的代码逻辑和 `close` 方法同时产生异常的时候,`try` 中的异常信息会丢失。
-
-可以看这里例子。
-
-```java
-package net.codingme.feature.jdk7;
-
-import java.io.IOException;
-
-/**
- * 释放资源
- *
- * @author www.wdbyte.com
- */
-public class TryCatachFinallyThrow {
-
- /**
- * 异常处理
- *
- * @param args
- */
- public static void main(String[] args) throws Exception {
- read();
- }
-
- public static void read() throws Exception {
- FileRead fileRead = null;
- try {
- fileRead = new FileRead();
- fileRead.read();
- } catch (Exception e) {
- throw e;
- } finally {
- if (fileRead != null) {
- try {
- fileRead.close();
- } catch (Exception e) {
- throw e;
- }
- }
- }
-
- }
-}
-
-class FileRead {
-
- public void read() throws Exception {
- throw new IOException("读取异常");
- }
-
- public void close() throws Exception {
- System.out.println("资源关闭");
- throw new IOException("关闭异常");
- }
-}
-```
-
-很明显代码里 `read` 和 `close` 方法都会产生异常,但是运行程序发现只能收到 `close` 的异常信息。
-
-```log
-资源关闭
-Exception in thread "main" java.io.IOException: 关闭异常
- at net.codingme.feature.jdk7.FileRead.close(TryCatachFinallyThrow.java:51)
- at net.codingme.feature.jdk7.TryCatachFinallyThrow.read(TryCatachFinallyThrow.java:33)
- at net.codingme.feature.jdk7.TryCatachFinallyThrow.main(TryCatachFinallyThrow.java:20)
-```
-
-**异常信息丢失**了,可怕的是你以为只是 `close` 时发生了异常而已。
-
-## 2.2. try-autocloseable
-
-上面的问题在 Java 7 中其实已经提供了新的解决方式,Java 7 中对 `try` 进行了增强,可以保证资源**总能被正确释放** 。使用增强 `try` 的前提是 `try` 中的类实现了 `AutoCloseable` 接口,在 Java 7 中大量的需要释放资源的操作其实都已经实现了此接口了。
-
-
-
-实现了 `AutoCloseable` 的类,在增强 `try`中使用时,不用担心资源的关闭,在使用完毕会自动的调用 `close`方法,并且**异常不会丢失**。
-
-让我们编写的模拟资源操作的类实现 `AutoCloseable` 接口,然后时候增强 `try` 看看效果。
-
-```java
-package net.codingme.feature.jdk7;
-
-/**
- * 自动关闭
- *
- * @author www.wdbyte.com
- */
-public class AutoCloseResource {
- public static void main(String[] args) throws Exception {
- try (Mysql mysql = new Mysql();
- OracleDatabase oracleDatabase = new OracleDatabase()) {
- mysql.conn();
- oracleDatabase.conn();
- }
- }
-}
-
-class Mysql implements AutoCloseable {
-
- @Override
- public void close() throws Exception {
- System.out.println("mysql 已关闭");
- }
-
- public void conn() {
- System.out.println("mysql 已连接");
- }
-}
-
-class OracleDatabase implements AutoCloseable {
-
- @Override
- public void close() throws Exception {
- System.out.println("OracleDatabase 已关闭");
- }
-
- public void conn() {
- System.out.println("OracleDatabase 已连接");
- }
-}
-```
-
-测试类 Mysql 和 OracleDatabase 都是实现了 AutoCloseable,运行查看结果。
-
-```java
-mysql 已连接
-OracleDatabase 已连接
-OracleDatabase 已关闭
-mysql 已关闭
-```
-
-确认在发生异常时候异常信息不会丢失,写一个有异常的模拟测试类进行测试。
-
-```java
-package net.codingme.feature.jdk7;
-
-import java.io.IOException;
-
-/**
- * 释放资源
- *
- * @author www.wdbyte.com
- */
-public class AutoCloseThrow {
-
- public static void main(String[] args) throws Exception {
- try (FileReadAutoClose fileRead = new FileReadAutoClose()) {
- fileRead.read();
- }
- }
-}
-
-class FileReadAutoClose implements AutoCloseable {
-
- public void read() throws Exception {
- System.out.println("资源读取");
- throw new IOException("读取异常");
- }
-
- @Override
- public void close() throws Exception {
- System.out.println("资源关闭");
- throw new IOException("关闭异常");
- }
-}
-```
-
-运行查看异常信息。
-
-```log
-资源读取
-资源关闭
-Exception in thread "main" java.io.IOException: 读取异常
- at net.codingme.feature.jdk7.FileReadAutoClose.read(AutoCloseThrow.java:23)
- at net.codingme.feature.jdk7.AutoCloseThrow.main(AutoCloseThrow.java:14)
- Suppressed: java.io.IOException: 关闭异常
- at net.codingme.feature.jdk7.FileReadAutoClose.close(AutoCloseThrow.java:29)
- at net.codingme.feature.jdk7.AutoCloseThrow.main(AutoCloseThrow.java:15)
-```
-
-自动关闭,异常清晰,关闭异常存在于 `Suppressed` ,称为抑制异常,后续文章会详细介绍。
-
-# 3. try-catch
-
-在 Java 7 之前,一个 catch 只能捕获一个异常信息,当异常种类非常多的时候就很麻烦,但是在 Java 7 中,一个 catch 可以捕获多个异常信息,每个异常捕获之间使用 `|` 分割,
-
-```java
-package net.codingme.feature.jdk7;
-
-import java.io.IOException;
-
-/**
- * 多异常捕获
- */
-public class TryCatchMany {
-
- public static void main(String[] args) {
- try (TxtRead txtRead = new TxtRead()) {
- txtRead.reader();
- } catch (IOException | NoSuchFieldException e) {
- e.printStackTrace();
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-}
-
-class TxtRead implements AutoCloseable {
-
- @Override
- public void close() throws Exception {
- System.out.println("资源释放");
- }
-
- public void reader() throws IOException, NoSuchFieldException {
- System.out.println("数据读取");
- }
-}
-```
-
-需要注意的是,一个 catch 捕获多个异常时,不能出现重复的异常类型,也不能出现一个异常类型是另一个类的子类的情况。
-
-# 4. 二进制
-
-Java 7 开始,可以直接指定不同的进制数字。
-
-1. 二进制指定数字值,只需要使用 `0b` 或者 `OB` 开头。
-2. 八进制指定数字值,使用 `0` 开头。
-3. 十六进制指定数字值,使用 `0x` 开头。
-
-```java
-/**
- * 二进制
- *
- * @author www.wdbyte.com
- */
-public class Binary {
- public static void main(String[] args) {
- // 二进制
- System.out.println("------2进制-----");
- int a = 0b001;
- int b = 0b010;
- System.out.println(a);
- System.out.println(b);
- // 八进制
- System.out.println("------8进制-----");
- int a1 = 010;
- int b1 = 020;
- System.out.println(a1);
- System.out.println(b1);
- // 十六进制
- System.out.println("------16进制-----");
- int a2 = 0x10;
- int b2 = 0x20;
- System.out.println(a2);
- System.out.println(b2);
- }
-}
-```
-
-输出结果。
-
-```log
-------2进制-----
-1
-2
-------8进制-----
-8
-16
-------16进制-----
-16
-32
-```
-
-# 5. 数字下划线
-
-Java 7 开始支持在数字定义时候使用下划线分割,增加了数字的可读性。
-
-```java
-/**
- * 数字下环线
- *
- * @author www.wdbyte.com
- */
-public class NumberLine {
- public static void main(String[] args) {
- int a = 1_000;
- int b = 1_0__0_0_0_____00;
- System.out.println(a);
- System.out.println(b);
- }
-}
-```
-
-得到结果。
-
-```log
-1000
-1000000
-```
-
-# 6. 结束语
-
-虽然 Java 7 早在 2011 年就已经发布了,但是据我发现,使用到 Java 7 开始的新特性新语法的并不多,所以我的 JDK 新特性系列文章计划从 Java 7 开始,一直介绍到目前已经发布的 Java 13,以后 Java 新版本更新的同时,这个新特性系列文章也会持续更新。
-
-此去山高水远,愿能一路坚持,愿你我一路同行。
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/jdk/java-08-feature-lambda.md b/docs/jdk/java-08-feature-lambda.md
deleted file mode 100644
index 78325c3..0000000
--- a/docs/jdk/java-08-feature-lambda.md
+++ /dev/null
@@ -1,426 +0,0 @@
----
-title: 还看不懂同事的代码?Lambda 表达式、函数接口了解一下
-# toc: false
-date: 2019-11-11 08:01:01
-url: jdk/jdk8-lambda
-tags:
- - Java8
- - Lambda
-categories:
- - Java 新特性
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-当前时间:2019年 11月 11日,距离 JDK 14 发布时间(2020年3月17日)还有多少天?
-
-```java
-// 距离JDK 14 发布还有多少天?
-LocalDate jdk14 = LocalDate.of(2020, 3, 17);
-LocalDate nowDate = LocalDate.now();
-System.out.println("距离JDK 14 发布还有:"+nowDate.until(jdk14,ChronoUnit.DAYS)+"天");
-```
-
-
-
-# 1. 前言
-
-`Java 8` 早已经在2014 年 3月 18日发布,毫无疑问 `Java 8` 对 Java 来说绝对算得上是一次重大版本更新,它包含了十多项语言、库、工具、JVM 等方面的十多项新特性。比如提供了语言级的匿名函数,也就是被官方称为 `Lambda` 的表达式语法(外界也称为闭包,` Lambda` 的引入也让流式操作成为可能,减少了代码编写的复杂性),比如函数式接口,方法引用,重复注解。再比如 `Optional` 预防空指针,`Stearm` 流式操作,`LocalDateTime` 时间操作等。
-
-在前面的文章里已经介绍了 `Java 8` 的部分新特性。
-
-1. [Jdk14 都要出了,Jdk8 的时间处理姿势还不了解一下?](https://www.wdbyte.com/2019/10/jdk/jdk8-time/)
-
-2. [Jdk14都要出了,还不能使用 Optional优雅的处理空指针?](https://www.wdbyte.com/2019/11/jdk/jdk8-optional/)
-
-这一次主要介绍一下 Lambda 的相关情况。
-
-# 2. Lambda 介绍
-
-`Lambda` 名字来源于希腊字母表中排序第十一位的字母 λ,大写为Λ,英语名称为 `Lambda`。在 Java 中 `Lambda` 表达式(lambda expression)是一个匿名函数,在编写 Java 中的 `Lambda` 的时候,你也会发现 `Lambda` 不仅没有函数名称,有时候甚至连入参和返回都可以省略,这也让代码变得更加紧凑。
-
-# 3. 函数接口介绍
-
-上面说了这次是介绍 `Lambda` 表达式,为什么要介绍函数接口呢?其实 Java 中的函数接口在使用时,可以隐式的转换成 `Lambda` 表达式,在 `Java 8`中已经有很多接口已经声明为函数接口,如 Runnable、Callable、Comparator 等。
-
-函数接口的例子可以看下 `Java 8` 中的 `Runnable` 源码(去掉了注释)。
-
-```java
-package java.lang;
-
-@FunctionalInterface
-public interface Runnable {
- public abstract void run();
-}
-```
-
-那么什么样子的接口才是函数接口呢?有一个很简单的定义,也就是只有`一个抽象函数`的接口,函数接口使用注解 `@FunctionalInterface ` 进行声明(注解声明不是必须的,如果没有注解,也是只有一个抽象函数,依旧会被认为是函数接口)。多一个或者少一个抽象函数都不能定义为函数接口,如果使用了函数接口注解又不止一个抽象函数,那么编译器会拒绝编译。函数接口在使用时候可以隐式的转换成 Lambda 表达式。
-
-`Java 8` 中很多有很多不同功能的函数接口定义,都放在了 `Java 8` 新增的 `java.util.function`包内。下面是一些关于 `Java 8` 中函数接口功能的描述。
-
-| 序号 | 接口 & 描述 |
-| :----------------------- | ------------------------------------------------------------ |
-| **BiConsumer** | 代表了一个接受两个输入参数的操作,并且不返回任何结果 |
-| **BiFunction** | 代表了一个接受两个输入参数的方法,并且返回一个结果 |
-| **BinaryOperator** | 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 |
-| **BiPredicate** | 代表了一个两个参数的boolean值方法 |
-| **BooleanSupplier** | 代表了boolean值结果的提供方 |
-| **Consumer** | 代表了接受一个输入参数并且无返回的操作 |
-| **DoubleBinaryOperator** | 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。 |
-| **DoubleConsumer** | 代表一个接受double值参数的操作,并且不返回结果。 |
-| **DoubleFunction** | 代表接受一个double值参数的方法,并且返回结果 |
-| **DoublePredicate** | 代表一个拥有double值参数的boolean值方法 |
-| **DoubleSupplier** | 代表一个double值结构的提供方 |
-| **DoubleToIntFunction** | 接受一个double类型输入,返回一个int类型结果。 |
-| **DoubleToLongFunction** | 接受一个double类型输入,返回一个long类型结果 |
-| **DoubleUnaryOperator** | 接受一个参数同为类型double,返回值类型也为double 。 |
-| **Function** | 接受一个输入参数,返回一个结果。 |
-| **IntBinaryOperator** | 接受两个参数同为类型int,返回值类型也为int 。 |
-| **IntConsumer** | 接受一个int类型的输入参数,无返回值 。 |
-| **IntFunction** | 接受一个int类型输入参数,返回一个结果 。 |
-| **IntPredicate** | 接受一个int输入参数,返回一个布尔值的结果。 |
-| **IntSupplier** | 无参数,返回一个int类型结果。 |
-| **IntToDoubleFunction** | 接受一个int类型输入,返回一个double类型结果 。 |
-| **IntToLongFunction** | 接受一个int类型输入,返回一个long类型结果。 |
-| **IntUnaryOperator** | 接受一个参数同为类型int,返回值类型也为int 。 |
-| **LongBinaryOperator** | 接受两个参数同为类型long,返回值类型也为long。 |
-| **LongConsumer** | 接受一个long类型的输入参数,无返回值。 |
-| **LongFunction** | 接受一个long类型输入参数,返回一个结果。 |
-| **LongPredicate** | 接受一个long输入参数,返回一个布尔值类型结果。 |
-| **LongSupplier** | 无参数,返回一个结果long类型的值。 |
-| **LongToDoubleFunction** | 接受一个long类型输入,返回一个double类型结果。 |
-| **LongToIntFunction** | 接受一个long类型输入,返回一个int类型结果。 |
-| **LongUnaryOperator** | 接受一个参数同为类型long,返回值类型也为long。 |
-| **ObjDoubleConsumer** | 接受一个object类型和一个double类型的输入参数,无返回值。 |
-| **ObjIntConsumer** | 接受一个object类型和一个int类型的输入参数,无返回值。 |
-| **ObjLongConsumer** | 接受一个object类型和一个long类型的输入参数,无返回值。 |
-| **Predicate** | 接受一个输入参数,返回一个布尔值结果。 |
-| **Supplier** | 无参数,返回一个结果。 |
-| **ToDoubleBiFunction** | 接受两个输入参数,返回一个double类型结果 |
-| **ToDoubleFunction** | 接受一个输入参数,返回一个double类型结果 |
-| **ToIntBiFunction** | 接受两个输入参数,返回一个int类型结果。 |
-| **ToIntFunction** | 接受一个输入参数,返回一个int类型结果。 |
-| **ToLongBiFunction** | 接受两个输入参数,返回一个long类型结果。 |
-| **ToLongFunction** | 接受一个输入参数,返回一个long类型结果。 |
-| **UnaryOperator** | 接受一个参数为类型T,返回值类型也为T。 |
-
-(上面表格来源于菜鸟教程)
-
-# 3. Lambda 语法
-
-Lambda 的语法主要是下面几种。
-
-1. (params) -> expression
-
-3. (params) -> {statements;}
-
-Lambda 的语法特性。
- 1. 使用 `->` 分割 Lambda 参数和处理语句。
- 2. 类型可选,可以不指定参数类型,编译器可以自动判断。
- 3. 圆括号可选,如果只有一个参数,可以不需要圆括号,多个参数必须要圆括号。
- 4. 花括号可选,一个语句可以不用花括号,多个参数则花括号必须。
- 5. 返回值可选,如果只有一个表达式,可以自动返回,不需要 return 语句;花括号中需要 return 语法。
- 6. Lambda 中引用的外部变量必须为 final 类型,内部声明的变量不可修改,内部声明的变量名称不能与外部变量名相同。
-
-举几个具体的例子, params 在只有一个参数或者没有参数的时候,可以直接省略不写,像这样。
-
-```java
-// 1.不需要参数,没有返回值,输出 hello
-()->System.out.pritnln("hello");
-
-// 2.不需要参数,返回 hello
-()->"hello";
-
-// 3. 接受2个参数(数字),返回两数之和
-(x, y) -> x + y
-
-// 4. 接受2个数字参数,返回两数之和
-(int x, int y) -> x + y
-
-// 5. 两个数字参数,如果都大于10,返回和,如果都小于10,返回差
-(int x,int y) ->{
- if( x > 10 && y > 10){
- return x + y;
- }
- if( x < 10 && y < 10){
- return Math.abs(x-y);
- }
-};
-```
-
-通过上面的几种情况,已经可以大致了解 Lambda 的语法结构了。
-
-# 4. Lambda 使用
-
-## 4.1 对于函数接口
-
-从上面的介绍中已经知道了 Runnable 接口已经是函数接口了,它可以隐式的转换为 Lambda 表达式进行使用,通过下面的创建线程并运行的例子看下 `Java 8` 中 Lambda 表达式的具体使用方式。
-
-```java
-/**
- * Lambda 的使用,使用 Runnable 例子
- * @throws InterruptedException
- */
-@Test
-public void createLambda() throws InterruptedException {
- // 使用 Lambda 之前
- Runnable runnable = new Runnable() {
- @Override
- public void run() {
- System.out.println("JDK8 之前的线程创建");
- }
- };
- new Thread(runnable).start();
- // 使用 Lambda 之后
- Runnable runnable1Jdk8 = () -> System.out.println("JDK8 之后的线程创建");
- new Thread(runnable1Jdk8).start();
- // 更加紧凑的方式
- new Thread(() -> System.out.println("JDK8 之后的线程创建")).start();
-}
-```
-
-可以发现 `Java 8` 中的 `Lambda` 碰到了函数接口 Runnable,自动推断了要运行的 run 方法,不仅省去了 run 方法的编写,也代码变得更加紧凑。
-
-运行得到结果如下。
-
-```shell
-JDK8 之前的线程创建
-JDK8 之后的线程创建
-JDK8 之后的线程创建
-```
-
-上面的 Runnable 函数接口里的 run 方法是没有参数的情况,如果是有参数的,那么怎么使用呢?我们编写一个函数接口,写一个 `say` 方法接受两个参数。
-
-```java
-/**
- * 定义函数接口
- */
-@FunctionalInterface
-public interface FunctionInterfaceDemo {
- void say(String name, int age);
-}
-```
-
-编写一个测试类。
-
-```java
- /**
- * 函数接口,Lambda 测试
- */
- @Test
- public void functionLambdaTest() {
- FunctionInterfaceDemo demo = (name, age) -> System.out.println("我叫" + name + ",我今年" + age + "岁了");
- demo.say("金庸", 99);
- }
-```
-
-输出结果。
-
-```java
-我叫金庸,我今年99岁了。
-```
-
-## 4.2 对于方法引用
-
-方法引用这个概念前面还没有介绍过,方法引用可以让我们直接访问类的实例或者方法,在 Lambda 只是执行一个方法的时候,就可以不用 `Lambda` 的编写方式,而用方法引用的方式:`实例/类::方法`。这样不仅代码更加的紧凑,而且可以增加代码的可读性。
-
-通过一个例子查看方法引用。
-
-```java
-@Getter
-@Setter
-@ToString
-@AllArgsConstructor
-static class User {
- private String name;
- private Integer age;
-}
-public static List userList = new ArrayList();
-static {
- userList.add(new User("A", 26));
- userList.add(new User("B", 18));
- userList.add(new User("C", 23));
- userList.add(new User("D", 19));
-}
-/**
- * 测试方法引用
- */
-@Test
-public void methodRef() {
- User[] userArr = new User[userList.size()];
- userList.toArray(userArr);
- // User::getAge 调用 getAge 方法
- Arrays.sort(userArr, Comparator.comparing(User::getAge));
- for (User user : userArr) {
- System.out.println(user);
- }
-}
-```
-
-得到输出结果。
-
-Jdk8Lambda.User(name=B, age=18)
-Jdk8Lambda.User(name=D, age=19)
-Jdk8Lambda.User(name=C, age=23)
-Jdk8Lambda.User(name=A, age=26)
-
-## 4.3 对于遍历方式
-
-Lambda 带来了新的遍历方式,`Java 8` 为集合增加了 `foreach` 方法,它可以接受函数接口进行操作。下面看一下 `Lambda` 的集合遍历方式。
-
-```java
-/**
- * 新的遍历方式
- */
-@Test
-public void foreachTest() {
- List skills = Arrays.asList("java", "golang", "c++", "c", "python");
- // 使用 Lambda 之前
- for (String skill : skills) {
- System.out.print(skill+",");
- }
- System.out.println();
- // 使用 Lambda 之后
- // 方式1,forEach+lambda
- skills.forEach((skill) -> System.out.print(skill+","));
- System.out.println();
- // 方式2,forEach+方法引用
- skills.forEach(System.out::print);
-}
-```
-
-运行得到输出。
-
-```shell
-java,golang,c++,c,python,
-java,golang,c++,c,python,
-javagolangc++cpython
-```
-
-## 4.4 对于流式操作
-
-得益于 `Lambda` 的引入,让 `Java 8` 中的流式操作成为可能,`Java 8` 提供了 stream 类用于获取数据流,它专注对数据集合进行各种高效便利操作,提高了编程效率,且同时支持串行和并行的两种模式汇聚计算。能充分的利用多核优势。
-
-流式操作如此强大, `Lambda` 在流式操作中怎么使用呢?下面来感受流操作带来的方便与高效。
-
-流式操作一切从这里开始。
-
-```java
-// 为集合创建串行流
-stream()
-// 为集合创建并行流
-parallelStream()
-```
-
-流式操作的去重 `distinct`和过滤 `filter`。
-
-```java
-@Test
-public void streamTest() {
- List skills = Arrays.asList("java", "golang", "c++", "c", "python", "java");
- // Jdk8 之前
- for (String skill : skills) {
- System.out.print(skill + ",");
- }
- System.out.println();
- // Jdk8 之后-去重遍历
- skills.stream().distinct().forEach(skill -> System.out.print(skill + ","));
- System.out.println();
- // Jdk8 之后-去重遍历
- skills.stream().distinct().forEach(System.out::print);
- System.out.println();
- // Jdk8 之后-去重,过滤掉 ptyhon 再遍历
- skills.stream().distinct().filter(skill -> skill != "python").forEach(skill -> System.out.print(skill + ","));
- System.out.println();
- // Jdk8 之后转字符串
- String skillString = String.join(",", skills);
- System.out.println(skillString);
-}
-```
-
-运行得到结果。
-
-```shell
-java,golang,c++,c,python,java,
-java,golang,c++,c,python,
-javagolangc++cpython
-java,golang,c++,c,
-java,golang,c++,c,python,java
-```
-
-流式操作的数据转换(也称映射)`map`。
-
-```java
- /**
- * 数据转换
- */
- @Test
- public void mapTest() {
- List numList = Arrays.asList(1, 2, 3, 4, 5);
- // 数据转换
- numList.stream().map(num -> num * num).forEach(num -> System.out.print(num + ","));
-
- System.out.println();
-
- // 数据收集
- Set numSet = numList.stream().map(num -> num * num).collect(Collectors.toSet());
- numSet.forEach(num -> System.out.print(num + ","));
- }
-```
-
-运行得到结果。
-
-```shell
-1,4,9,16,25,
-16,1,4,9,25,
-```
-
-流式操作的数学计算。
-
-```java
-/**
- * 数学计算测试
- */
-@Test
-public void mapMathTest() {
- List list = Arrays.asList(1, 2, 3, 4, 5);
- IntSummaryStatistics stats = list.stream().mapToInt(x -> x).summaryStatistics();
- System.out.println("最小值:" + stats.getMin());
- System.out.println("最大值:" + stats.getMax());
- System.out.println("个数:" + stats.getCount());
- System.out.println("和:" + stats.getSum());
- System.out.println("平均数:" + stats.getAverage());
- // 求和的另一种方式
- Integer integer = list.stream().reduce((sum, cost) -> sum + cost).get();
- System.out.println(integer);
-}
-```
-
-运行得到结果。
-
-```shell
-得到输出
-最小值:1
-最大值:5
-个数:5
-和:15
-平均数:3.0
-15
-```
-
-# 5. Lambda 总结
-
-`Lamdba` 结合函数接口,方法引用,类型推导以及流式操作,可以让代码变得更加简洁紧凑,也可以借此开发出更加强大且支持并行计算的程序,函数编程也为 Java 带来了新的程序设计方式。但是缺点也很明显,在实际的使用过程中可能会发现调式困难,测试表示 `Lamdba` 的遍历性能并不如 for 的性能高,同事可能没有学习导致看不懂 `Lamdba` 等(可以推荐来看这篇文章)。
-
-文章代码已经上传到 [https://github.com/niumoo/jdk-feature)](https://github.com/niumoo/jdk-feature) 。
-
-
-**最后的话**
-
->文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,欢迎Star和指教。更有一线大厂面试点,Java程序员需要掌握的核心知识等文章,也整理了很多我的文字,欢迎 **Star** 和完善,希望我们一起变得优秀。
-
-文章有帮助可以点个「**赞**」或「**分享**」,都是支持,我都喜欢!
-文章每周持续更新,要实时关注我更新的文章以及分享的干货,可以关注「 **未读代码** 」公众号或者[我的博客](https://www.wdbyte.com/)。
-
-
\ No newline at end of file
diff --git a/docs/jdk/java-08-feature-optional.md b/docs/jdk/java-08-feature-optional.md
deleted file mode 100644
index 5f6005f..0000000
--- a/docs/jdk/java-08-feature-optional.md
+++ /dev/null
@@ -1,357 +0,0 @@
----
-title: Jdk14都要出了,还不能使用 Optional优雅的处理空指针?
-# toc: false
-date: 2019-11-04 08:01:01
-url: jdk/jdk8-optional
-tags:
- - Java8
- - Optional
-categories:
- - Java 新特性
----
-
-> 文章已经收录在 [Github.com/niumoo/JavaNotes](https://github.com/niumoo/JavaNotes) ,更有 Java 程序员所需要掌握的核心知识,欢迎Star和指教。
-> 欢迎关注我的[公众号](https://github.com/niumoo/JavaNotes#%E5%85%AC%E4%BC%97%E5%8F%B7),文章每周更新。
-
-# 1. 前言
-
-> 如果你没有处理过空指针,那么你不是一位真正的 Java 程序员。
-
-空指针确实会产生很多问题,我们经常遇到空的引用,然后又想从这个空的引用上去获取其他的值,接着理所当然的碰到了 `NullPointException`。这是你可能会想,这报错很好处理,然后你看了眼报错行数,对比了下代码。脑海里瞬间闪过 ”对对对,这里有可能为空“,然后加上 `null check`轻松处理。然而你不知道这已经是你处理的第多少个空指针异常了。
-
-为了解决上面的问题,在 Java SE8 中引入了一个新类 `java.util.Optional`,这个类可以**缓解**上面的问题。
-
-你可能已经发现了,上面我用的是**缓解**而不是**解决**。这也是很多人理解不太对的地方,以为 Java SE8 中的 `Optional` 类可以解决空指针问题。其实 Optional 类的的使用只是**提示**你这里可能存在空值,需要特殊处理,并提供了一些特殊处理的方法。如果你把 `Optional` 类当作空指针的救命稻草而不加思考的使用,那么依旧会碰到错误。
-
-因为 `Optional` 是的 Java SE8 中引入的,因此本文中难免会有一些 JDK8 中的语法,如 **Lambda** 表达式,流处理等,但是都是基本形式,不会有过于复杂的案例。
-
-# 2. Optional 创建
-
-Optional 的创建一共有三种方式。
-
-```java
-/**
- * 创建一个 Optional
- */
-@Test
-public void createOptionalTest() {
- // Optional 构造方式1 - of 传入的值不能为 null
- Optional helloOption = Optional.of("hello");
-
- // Optional 构造方式2 - empty 一个空 optional
- Optional emptyOptional = Optional.empty();
-
- // Optional 构造方式3 - ofNullable 支持传入 null 值的 optional
- Optional nullOptional = Optional.ofNullable(null);
-}
-```
-
-其中构造方式1中 `of` 方法,如果传入的值会空,会报出 `NullPointerException` 异常。
-
-# 3. Optional 判断
-
-Optional 只是一个包装对象,想要判断里面有没有值可以使用 `isPresent` 方法检查其中是否有值 。
-
-```java
-/**
- * 检查是否有值
- */
-@Test
-public void checkOptionalTest() {
- Optional helloOptional = Optional.of("Hello");
- System.out.println(helloOptional.isPresent());
-
- Optional