diff --git a/java-utils.iml b/java-utils.iml
index b116e99..fcc4c7d 100644
--- a/java-utils.iml
+++ b/java-utils.iml
@@ -85,5 +85,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 634437b..ae5ba03 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
1.3.2
utf-8
1.8
+ 1.7.1
@@ -231,6 +232,17 @@
commons-io
2.5
+
+
+ org.powermock
+ powermock-module-junit4
+ ${powermock.version}
+
+
+ org.powermock
+ powermock-api-mockito2
+ ${powermock.version}
+
java-utils
diff --git a/resources/idea/go-settings.jar b/resources/idea/go-settings.jar
new file mode 100644
index 0000000..3332472
Binary files /dev/null and b/resources/idea/go-settings.jar differ
diff --git a/resources/idea/mac-settings.jar b/resources/idea/mac-settings.jar
index 5586c2c..b992bf5 100644
Binary files a/resources/idea/mac-settings.jar and b/resources/idea/mac-settings.jar differ
diff --git a/src/main/java/me/ehlxr/LambdaTest.java b/src/main/java/me/ehlxr/LambdaTest.java
index a88531a..64fe07d 100644
--- a/src/main/java/me/ehlxr/LambdaTest.java
+++ b/src/main/java/me/ehlxr/LambdaTest.java
@@ -46,5 +46,7 @@ public class LambdaTest {
System.out.println("------------求平方和-----new way-----");
System.out.println(list.stream().map(n -> n * n).reduce((x, y) -> x + y).get());
+ System.out.println();
+
}
}
diff --git a/src/main/java/me/ehlxr/hashing/Cluster.java b/src/main/java/me/ehlxr/hashing/Cluster.java
new file mode 100644
index 0000000..e1738db
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/Cluster.java
@@ -0,0 +1,26 @@
+package me.ehlxr.hashing;
+
+public class Cluster {
+ private static final int SERVER_SIZE_MAX = 1024;
+
+ private Server[] servers = new Server[SERVER_SIZE_MAX];
+ private int size = 0;
+
+ public void put(Entry e) {
+ int index = e.hashCode() % size;
+ servers[index].put(e);
+ }
+
+ public Entry get(Entry e) {
+ int index = e.hashCode() % size;
+ return servers[index].get(e);
+ }
+
+ public boolean addServer(Server s) {
+ if (size >= SERVER_SIZE_MAX)
+ return false;
+
+ servers[size++] = s;
+ return true;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/ehlxr/hashing/Entry.java b/src/main/java/me/ehlxr/hashing/Entry.java
new file mode 100644
index 0000000..d940724
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/Entry.java
@@ -0,0 +1,14 @@
+package me.ehlxr.hashing;
+
+public class Entry {
+ private String key;
+
+ Entry(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String toString() {
+ return key;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/ehlxr/hashing/Main.java b/src/main/java/me/ehlxr/hashing/Main.java
new file mode 100644
index 0000000..b60769d
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/Main.java
@@ -0,0 +1,51 @@
+package me.ehlxr.hashing;
+
+public class Main {
+
+ public static void main(String[] args) {
+ Cluster c = createCluster();
+
+ Entry[] entries = {
+ new Entry("i"),
+ new Entry("have"),
+ new Entry("a"),
+ new Entry("pen"),
+ new Entry("an"),
+ new Entry("apple"),
+ new Entry("applepen"),
+ new Entry("pineapple"),
+ new Entry("pineapplepen"),
+ new Entry("PPAP")
+ };
+
+ for (Entry e : entries) {
+ c.put(e);
+ }
+
+ c.addServer(new Server("192.168.0.6"));
+
+ findEntries(c, entries);
+
+ }
+
+ private static Cluster createCluster() {
+ Cluster c = new Cluster();
+ c.addServer(new Server("192.168.0.0"));
+ c.addServer(new Server("192.168.0.1"));
+ c.addServer(new Server("192.168.0.2"));
+ c.addServer(new Server("192.168.0.3"));
+ c.addServer(new Server("192.168.0.4"));
+ c.addServer(new Server("192.168.0.5"));
+ return c;
+ }
+
+ private static void findEntries(Cluster c, Entry[] entries) {
+ for (Entry e : entries) {
+ if (e == c.get(e)) {
+ System.out.println("重新找到了entry:" + e);
+ } else {
+ System.out.println("entry已失效:" + e);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/ehlxr/hashing/Server.java b/src/main/java/me/ehlxr/hashing/Server.java
new file mode 100644
index 0000000..ce0418c
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/Server.java
@@ -0,0 +1,21 @@
+package me.ehlxr.hashing;
+
+import java.util.*;
+
+public class Server {
+ private String name;
+ private Map entries;
+
+ Server(String name) {
+ this.name = name;
+ entries = new HashMap<>();
+ }
+
+ public void put(Entry e) {
+ entries.put(e, e);
+ }
+
+ public Entry get(Entry e) {
+ return entries.get(e);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/ehlxr/hashing/consistent/Cluster.java b/src/main/java/me/ehlxr/hashing/consistent/Cluster.java
new file mode 100644
index 0000000..b6f7c9e
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/consistent/Cluster.java
@@ -0,0 +1,41 @@
+package me.ehlxr.hashing.consistent;
+
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+public class Cluster {
+ private static final int SERVER_SIZE_MAX = 1024;
+
+ private SortedMap servers = new TreeMap<>();
+ private int size = 0;
+
+ public void put(Entry e) {
+ routeServer(e.hashCode()).put(e);
+ }
+
+ public Entry get(Entry e) {
+ return routeServer(e.hashCode()).get(e);
+ }
+
+ public Server routeServer(int hash) {
+ if (servers.isEmpty())
+ return null;
+
+ if (!servers.containsKey(hash)) {
+ SortedMap tailMap = servers.tailMap(hash);
+ hash = tailMap.isEmpty() ? servers.firstKey() : tailMap.firstKey();
+ // hash = servers.firstKey();
+ }
+ return servers.get(hash);
+ }
+
+ public boolean addServer(Server s) {
+ if (size >= SERVER_SIZE_MAX)
+ return false;
+
+ servers.put(s.hashCode(), s);
+
+ size++;
+ return true;
+ }
+}
diff --git a/src/main/java/me/ehlxr/hashing/consistent/Entry.java b/src/main/java/me/ehlxr/hashing/consistent/Entry.java
new file mode 100644
index 0000000..ebc478f
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/consistent/Entry.java
@@ -0,0 +1,18 @@
+package me.ehlxr.hashing.consistent;
+
+public class Entry {
+ private String key;
+
+ Entry(String key) {
+ this.key = key;
+ }
+
+ @Override
+ public String toString() {
+ return key;
+ }
+
+ public int hashCode() {
+ return key.hashCode();
+ }
+}
diff --git a/src/main/java/me/ehlxr/hashing/consistent/Main.java b/src/main/java/me/ehlxr/hashing/consistent/Main.java
new file mode 100644
index 0000000..68320e8
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/consistent/Main.java
@@ -0,0 +1,49 @@
+package me.ehlxr.hashing.consistent;
+
+public class Main {
+ public static void main(String[] args) {
+ Cluster c = createCluster();
+
+ Entry[] entries = {
+ new Entry("i"),
+ new Entry("have"),
+ new Entry("a"),
+ new Entry("pen"),
+ new Entry("an"),
+ new Entry("apple"),
+ new Entry("applepen"),
+ new Entry("pineapple"),
+ new Entry("pineapplepen"),
+ new Entry("PPAP")
+ };
+
+ for (Entry e : entries) {
+ c.put(e);
+ }
+
+ c.addServer(new Server("achuguniadsfaang"));
+ findEntries(c, entries);
+
+ }
+
+ private static Cluster createCluster() {
+ Cluster c = new Cluster();
+ c.addServer(new Server("international"));
+ c.addServer(new Server("china"));
+ c.addServer(new Server("japanjapan"));
+ c.addServer(new Server("Amarica"));
+ c.addServer(new Server("samsungtsisger"));
+ c.addServer(new Server("achuguniang"));
+ return c;
+ }
+
+ private static void findEntries(Cluster c, Entry[] entries) {
+ for (Entry e : entries) {
+ if (e == c.get(e)) {
+ System.out.println("重新找到了entry: " + e);
+ } else {
+ System.out.println("entry已失效: " + e);
+ }
+ }
+ }
+}
diff --git a/src/main/java/me/ehlxr/hashing/consistent/Server.java b/src/main/java/me/ehlxr/hashing/consistent/Server.java
new file mode 100644
index 0000000..03e6529
--- /dev/null
+++ b/src/main/java/me/ehlxr/hashing/consistent/Server.java
@@ -0,0 +1,26 @@
+package me.ehlxr.hashing.consistent;
+
+import java.util.*;
+
+public class Server {
+ private String name;
+ private Map entries;
+
+ Server(String name) {
+ this.name = name;
+ entries = new HashMap<>();
+ }
+
+ public void put(Entry e) {
+ entries.put(e, e);
+ }
+
+ public Entry get(Entry e) {
+ return entries.get(e);
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+}
diff --git a/src/main/java/me/ehlxr/powermock/ClassDependency.java b/src/main/java/me/ehlxr/powermock/ClassDependency.java
new file mode 100644
index 0000000..eba62db
--- /dev/null
+++ b/src/main/java/me/ehlxr/powermock/ClassDependency.java
@@ -0,0 +1,16 @@
+package me.ehlxr.powermock;
+
+/**
+ * Created by lixiangrong on 2017/11/3.
+ */
+public class ClassDependency {
+ public static boolean isExist() {
+ // do something
+ return false;
+ }
+
+ public final boolean isAlive() {
+ // do something
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/ehlxr/powermock/ClassUnderTest.java b/src/main/java/me/ehlxr/powermock/ClassUnderTest.java
new file mode 100644
index 0000000..9a7ed00
--- /dev/null
+++ b/src/main/java/me/ehlxr/powermock/ClassUnderTest.java
@@ -0,0 +1,44 @@
+package me.ehlxr.powermock;
+
+/**
+ * Created by lixiangrong on 2017/11/3.
+ */
+import java.io.File;
+/**
+ * Created by lixiangrong on 2017/7/21.
+ */
+public class ClassUnderTest {
+ public boolean callArgumentInstance(File file) {
+ return file.exists();
+ }
+ public boolean callInternalInstance(String path) {
+ File file = new File(path);
+ return file.exists();
+ }
+ public boolean callFinalMethod(ClassDependency refer) {
+ return refer.isAlive();
+ }
+ public boolean callSystemFinalMethod(String str) {
+ return str.isEmpty();
+ }
+ public boolean callStaticMethod() {
+ return ClassDependency.isExist();
+ }
+ public String callSystemStaticMethod(String str) {
+ return System.getProperty(str);
+ }
+ public boolean callPrivateMethod() {
+ return isExist();
+ }
+ public boolean callVoidPrivateMethod(){
+ testVoid();
+ return true;
+ }
+ private boolean isExist() {
+ // do something
+ return false;
+ }
+ private void testVoid(){
+ System.out.println("do nothing");
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/me/ehlxr/powermock/TestClassUnderTest.java b/src/main/java/me/ehlxr/powermock/TestClassUnderTest.java
new file mode 100644
index 0000000..197d04b
--- /dev/null
+++ b/src/main/java/me/ehlxr/powermock/TestClassUnderTest.java
@@ -0,0 +1,90 @@
+package me.ehlxr.powermock;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.mockito.PowerMockito;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import java.io.File;
+
+import static org.mockito.ArgumentMatchers.anyString;
+
+/**
+ * Created by lixiangrong on 2017/7/21.
+ */
+@RunWith(PowerMockRunner.class)
+public class TestClassUnderTest {
+ @Test
+ public void testCallArgumentInstance() {
+ File file = PowerMockito.mock(File.class);
+ ClassUnderTest underTest = new ClassUnderTest();
+ PowerMockito.when(file.exists()).thenReturn(true);
+ Assert.assertTrue(underTest.callArgumentInstance(file));
+ }
+
+ @Test
+ @PrepareForTest(ClassUnderTest.class)
+ public void testCallInternalInstance() throws Exception {
+ File file = PowerMockito.mock(File.class);
+ ClassUnderTest underTest = new ClassUnderTest();
+ PowerMockito.whenNew(File.class).withArguments("bbb").thenReturn(file);
+ PowerMockito.when(file.exists()).thenReturn(true);
+ Assert.assertTrue(underTest.callInternalInstance("bbb"));
+ }
+
+ @Test
+ @PrepareForTest(ClassDependency.class)
+ public void testCallFinalMethod() {
+ ClassDependency depencency = PowerMockito.mock(ClassDependency.class);
+ ClassUnderTest underTest = new ClassUnderTest();
+ PowerMockito.when(depencency.isAlive()).thenReturn(true);
+ Assert.assertTrue(underTest.callFinalMethod(depencency));
+ }
+
+ @Test
+ @PrepareForTest(ClassUnderTest.class)
+ public void testCallSystemFinalMethod() {
+ String str = PowerMockito.mock(String.class);
+ ClassUnderTest underTest = new ClassUnderTest();
+ PowerMockito.when(str.isEmpty()).thenReturn(false);
+ Assert.assertFalse(underTest.callSystemFinalMethod(str));
+ }
+
+ @Test
+ @PrepareForTest(ClassDependency.class)
+ public void testCallStaticMethod() {
+ ClassUnderTest underTest = new ClassUnderTest();
+ PowerMockito.mockStatic(ClassDependency.class);
+ PowerMockito.when(ClassDependency.isExist()).thenReturn(true);
+ Assert.assertTrue(underTest.callStaticMethod());
+ }
+
+ @Test
+ @PrepareForTest(ClassUnderTest.class)
+ public void testCallSystemStaticMethod() {
+ ClassUnderTest underTest = new ClassUnderTest();
+ PowerMockito.mockStatic(System.class);
+ PowerMockito.when(System.getProperty("aaa")).thenReturn("bbb");
+ Assert.assertEquals("bbb", underTest.callSystemStaticMethod("aaa"));
+ }
+
+ @Test
+ @PrepareForTest(ClassUnderTest.class)
+ public void testCallPrivateMethod() throws Exception {
+ ClassUnderTest underTest = PowerMockito.mock(ClassUnderTest.class);
+ PowerMockito.when(underTest.callPrivateMethod()).thenCallRealMethod();
+ PowerMockito.when(underTest, "isExist", anyString()).thenReturn(true);
+ Assert.assertTrue(underTest.callPrivateMethod());
+ }
+
+ @Test
+ @PrepareForTest(ClassUnderTest.class)
+ public void testCallVoidPrivateMethod() throws Exception {
+ ClassUnderTest underTest = PowerMockito.mock(ClassUnderTest.class);
+ PowerMockito.when(underTest.callVoidPrivateMethod()).thenCallRealMethod();
+ PowerMockito.doNothing().when(underTest, "testVoid");
+ Assert.assertTrue(underTest.callVoidPrivateMethod());
+ }
+}
\ No newline at end of file