From 849f9f0f254cad65730340fbf06a319c12aa79e8 Mon Sep 17 00:00:00 2001 From: byhieg Date: Fri, 5 May 2017 15:45:47 +0800 Subject: [PATCH 01/13] nothing --- .../java/cn/byhieg/niotutorial/NioTest.java | 44 +++++++++++++------ 1 file changed, 31 insertions(+), 13 deletions(-) diff --git a/src/main/java/cn/byhieg/niotutorial/NioTest.java b/src/main/java/cn/byhieg/niotutorial/NioTest.java index 7ee0a08..259ca37 100644 --- a/src/main/java/cn/byhieg/niotutorial/NioTest.java +++ b/src/main/java/cn/byhieg/niotutorial/NioTest.java @@ -6,6 +6,8 @@ import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.List; /** * Created by shiqifeng on 2017/4/10. @@ -14,22 +16,38 @@ public class NioTest { public static void main(String[] args) throws IOException { - String s = File.separator; - RandomAccessFile aFile = new RandomAccessFile("D:" + s + "read_file.txt","rw"); - FileChannel inChannel = aFile.getChannel(); - - ByteBuffer buf = ByteBuffer.allocate(48); - int bytesRead = inChannel.read(buf); - while (bytesRead != -1) { - buf.flip(); - while (buf.hasRemaining()) { - System.out.print((char) buf.get()); + for (int i = 2; i <= 100; i++) { + if(i == 2 || i == 5 || i == 7 || i == 3){ + System.out.print(i + " "); + continue; + } + if (i % 2 == 0 || i % 3 == 0 || i % 5 == 0 || i % 7 == 0) { + continue; } - buf.clear(); - bytesRead = inChannel.read(buf); + System.out.print(i + " "); + } + System.out.println(); + for (int i = 2 ; i <= 100;i++){ + if (isPrime(i)){ + System.out.print(i + " "); + } } + } + + + public static boolean isPrime(int n){ + if(n < 2){ + return false; + } + for (int i = 2; i <= Math.sqrt(n);i++){ + if (n % i == 0){ + return false; + } + } + return true; - aFile.close(); } + + } From 48d25d786f950fb80cd1690abcff7cbd789c9fbc Mon Sep 17 00:00:00 2001 From: byhieg Date: Fri, 5 May 2017 18:21:02 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=8E=9F=E5=AD=90?= =?UTF-8?q?=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concurrent/atom/AtomFactory.java | 36 ++++++++++ .../concurrent/atom/MyObject.java | 12 ++++ .../atomtest/AtomFactoryTest.java | 69 +++++++++++++++++++ 3 files changed, 117 insertions(+) create mode 100644 src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java create mode 100644 src/main/java/cn/byhieg/threadtutorial/concurrent/atom/MyObject.java create mode 100644 src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java diff --git a/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java b/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java new file mode 100644 index 0000000..36daa15 --- /dev/null +++ b/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java @@ -0,0 +1,36 @@ +package cn.byhieg.threadtutorial.concurrent.atom; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicIntegerArray; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Created by shiqifeng on 2017/5/5. + * Mail byhieg@gmail.com + */ +public class AtomFactory { + + private static final AtomFactory atomFactory = new AtomFactory(); + + private AtomFactory(){ + + } + + public static AtomFactory getInstance(){ + return atomFactory; + } + + public AtomicInteger createAtomInt(int a){ + return new AtomicInteger(a); + } + + public AtomicIntegerArray createAtomArray(int[] a) { + return new AtomicIntegerArray(a); + } + + public AtomicReference createAtomReference(MyObject object){ + AtomicReference objectAtomicReference = new AtomicReference<>(); + return objectAtomicReference; + } +} diff --git a/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/MyObject.java b/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/MyObject.java new file mode 100644 index 0000000..69ebbb6 --- /dev/null +++ b/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/MyObject.java @@ -0,0 +1,12 @@ +package cn.byhieg.threadtutorial.concurrent.atom; + +/** + * Created by shiqifeng on 2017/5/5. + * Mail byhieg@gmail.com + */ +public class MyObject { + + public String name = "byhieg"; + public int age = 24; + public volatile int id = 1; +} diff --git a/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java b/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java new file mode 100644 index 0000000..67aad49 --- /dev/null +++ b/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java @@ -0,0 +1,69 @@ +package cn.byhieg.threadtutorialtest.concurrenttest.atomtest; + +import cn.byhieg.threadtutorial.concurrent.atom.AtomFactory; + +import cn.byhieg.threadtutorial.concurrent.atom.MyObject; +import junit.framework.TestCase; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicIntegerArray; +import java.util.concurrent.atomic.AtomicReference; + +/** + * Created by shiqifeng on 2017/5/5. + * Mail byhieg@gmail.com + */ +public class AtomFactoryTest extends TestCase { + AtomicInteger integer; + AtomicIntegerArray array; + AtomicReference reference; + + public void setUp() throws Exception { + super.setUp(); + integer = AtomFactory.getInstance().createAtomInt(1); + } + + public void testAtomInt() throws Exception { + new Thread(()->{ + for (int i = 0; i < 10; i++) { + integer.getAndIncrement(); + System.out.println(getName() + " " + integer.get()); + } + }).start(); + + new Thread(()->{ + for (int i = 0; i < 10; i++) { + integer.getAndIncrement(); + System.out.println(getName() + " " + integer.get()); + } + }).start(); + + Thread.sleep(1000); + } + + public void testAtomArray() throws Exception { + int [] value = new int[]{1,2,3,4}; + array = AtomFactory.getInstance().createAtomArray(value); + array.getAndSet(1,10); + System.out.println(array.get(1)); + System.out.println(value[1]); + } + + public void testAtomRef()throws Exception { + MyObject object = new MyObject(); + reference = AtomFactory.getInstance().createAtomReference(object); + reference.set(object); + MyObject newObject = new MyObject(); + newObject.name = "xiaoli"; + reference.compareAndSet(object, newObject); + System.out.println(reference.get().name); + + } + + + public void tearDown() throws Exception { + + } + + +} \ No newline at end of file From 4d5f713eb52b6fba5cb2228c32bf3edb732569e1 Mon Sep 17 00:00:00 2001 From: byhieg Date: Sun, 7 May 2017 10:28:38 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8E=9F=E5=AD=90?= =?UTF-8?q?=E7=B1=BB=E6=9B=B4=E6=96=B0=E5=AD=97=E6=AE=B5=E7=9A=84=E6=96=B9?= =?UTF-8?q?=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../threadtutorial/concurrent/atom/AtomFactory.java | 12 ++++++------ .../concurrenttest/atomtest/AtomFactoryTest.java | 13 +++++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java b/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java index 36daa15..f5da772 100644 --- a/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java +++ b/src/main/java/cn/byhieg/threadtutorial/concurrent/atom/AtomFactory.java @@ -1,9 +1,6 @@ package cn.byhieg.threadtutorial.concurrent.atom; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicIntegerArray; -import java.util.concurrent.atomic.AtomicLong; -import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.atomic.*; /** * Created by shiqifeng on 2017/5/5. @@ -30,7 +27,10 @@ public AtomicIntegerArray createAtomArray(int[] a) { } public AtomicReference createAtomReference(MyObject object){ - AtomicReference objectAtomicReference = new AtomicReference<>(); - return objectAtomicReference; + return new AtomicReference<>(); + } + + public AtomicIntegerFieldUpdater createAtomIntegerUpdate(String fieldName) { + return AtomicIntegerFieldUpdater.newUpdater(MyObject.class, fieldName); } } diff --git a/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java b/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java index 67aad49..e8b706a 100644 --- a/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java +++ b/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/atomtest/AtomFactoryTest.java @@ -7,6 +7,7 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicIntegerArray; +import java.util.concurrent.atomic.AtomicIntegerFieldUpdater; import java.util.concurrent.atomic.AtomicReference; /** @@ -17,6 +18,7 @@ public class AtomFactoryTest extends TestCase { AtomicInteger integer; AtomicIntegerArray array; AtomicReference reference; + AtomicIntegerFieldUpdater updater; public void setUp() throws Exception { super.setUp(); @@ -24,6 +26,7 @@ public void setUp() throws Exception { } public void testAtomInt() throws Exception { + System.out.println("int原子类"); new Thread(()->{ for (int i = 0; i < 10; i++) { integer.getAndIncrement(); @@ -42,6 +45,7 @@ public void testAtomInt() throws Exception { } public void testAtomArray() throws Exception { + System.out.println("原子类数组"); int [] value = new int[]{1,2,3,4}; array = AtomFactory.getInstance().createAtomArray(value); array.getAndSet(1,10); @@ -50,6 +54,7 @@ public void testAtomArray() throws Exception { } public void testAtomRef()throws Exception { + System.out.println("原子类"); MyObject object = new MyObject(); reference = AtomFactory.getInstance().createAtomReference(object); reference.set(object); @@ -57,7 +62,15 @@ public void testAtomRef()throws Exception { newObject.name = "xiaoli"; reference.compareAndSet(object, newObject); System.out.println(reference.get().name); + } + + public void testUpdater() throws Exception { + System.out.println("原子类更新字段"); + updater = AtomFactory.getInstance().createAtomIntegerUpdate("id"); + MyObject object = new MyObject(); + System.out.println(updater.getAndIncrement(object)); + System.out.println(updater.get(object)); } From dfdea96492994c84d4874c4a43dffad3e8be3fe0 Mon Sep 17 00:00:00 2001 From: byhieg Date: Sun, 7 May 2017 12:12:31 +0800 Subject: [PATCH 04/13] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Builder=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designpatterntutorial/builder/Person.java | 73 +++++++++++++++++++ .../BuilderTest.java | 16 ++++ 2 files changed, 89 insertions(+) create mode 100644 src/main/java/cn/byhieg/designpatterntutorial/builder/Person.java create mode 100644 src/test/java/cn/byhieg/designpatterntutorialtest/BuilderTest.java diff --git a/src/main/java/cn/byhieg/designpatterntutorial/builder/Person.java b/src/main/java/cn/byhieg/designpatterntutorial/builder/Person.java new file mode 100644 index 0000000..91077fd --- /dev/null +++ b/src/main/java/cn/byhieg/designpatterntutorial/builder/Person.java @@ -0,0 +1,73 @@ +package cn.byhieg.designpatterntutorial.builder; + +/** + * Created by shiqifeng on 2017/5/7. + * Mail byhieg@gmail.com + */ +public class Person { + + private int age; + private String name; + private int height; + private int weight; + + public int getAge() { + return age; + } + + public String getName() { + return name; + } + + public int getHeight() { + return height; + } + + public int getWeight() { + return weight; + } + + public Person(Builder builder) { + age = builder.age; + name = builder.name; + height = builder.height; + weight = builder.weight; + } + + @Override + public String toString() { + return "age = " + age + " name = " + name + " height = " + height + " weight = " + weight; + } + + public static class Builder{ + + private int age; + private String name; + private int height; + private int weight; + + public Builder setAge(int age) { + this.age = age; + return this; + } + + public Builder setName(String name) { + this.name = name; + return this; + } + + public Builder setHeight(int height) { + this.height = height; + return this; + } + + public Builder setWeight(int weight) { + this.weight = weight; + return this; + } + + public Person build() { + return new Person(this); + } + } +} diff --git a/src/test/java/cn/byhieg/designpatterntutorialtest/BuilderTest.java b/src/test/java/cn/byhieg/designpatterntutorialtest/BuilderTest.java new file mode 100644 index 0000000..2a67a00 --- /dev/null +++ b/src/test/java/cn/byhieg/designpatterntutorialtest/BuilderTest.java @@ -0,0 +1,16 @@ +package cn.byhieg.designpatterntutorialtest; + +import cn.byhieg.designpatterntutorial.builder.Person; +import junit.framework.TestCase; + +/** + * Created by shiqifeng on 2017/5/7. + * Mail byhieg@gmail.com + */ +public class BuilderTest extends TestCase { + public void testBuild() throws Exception { + Person person = new Person.Builder().setAge(24).setHeight(178).setName("byhieg").setWeight(80).build(); + System.out.println(person.toString()); + } + +} \ No newline at end of file From 3c1aee624f2df428e7986d32e493b8eeefaa1dc4 Mon Sep 17 00:00:00 2001 From: byhieg Date: Sun, 7 May 2017 16:03:30 +0800 Subject: [PATCH 05/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0Alert=20Builder?= =?UTF-8?q?=E7=9A=84Builder=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../builder/SimpleDialog.java | 78 ++++++++++++++++++ .../builder/SimpleDialogController.java | 81 +++++++++++++++++++ .../SimpleDialogTest.java | 18 +++++ 3 files changed, 177 insertions(+) create mode 100644 src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialog.java create mode 100644 src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialogController.java create mode 100644 src/test/java/cn/byhieg/designpatterntutorialtest/SimpleDialogTest.java diff --git a/src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialog.java b/src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialog.java new file mode 100644 index 0000000..0d90062 --- /dev/null +++ b/src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialog.java @@ -0,0 +1,78 @@ +package cn.byhieg.designpatterntutorial.builder; + +/** + * Created by shiqifeng on 2017/5/7. + * Mail byhieg@gmail.com + */ +public class SimpleDialog { + + + public SimpleDialogController controller; + + public SimpleDialog(){ + controller = new SimpleDialogController(); + } + + public void setIcon(String icon) { + controller.setIcon(icon); + } + + public void setTitle(String title) { + controller.setTitle(title); + } + + public void setMessage(String message) { + controller.setMessage(message); + } + + public void setPositiveButton(String positiveButton) { + controller.setPositiveButton(positiveButton); + } + + public void setNegativeButton(String negativeButton) { + controller.setNegativeButton(negativeButton); + } + + + public static class Builder{ + SimpleDialogController.DialogParams P; + + public Builder(){ + P = new SimpleDialogController.DialogParams(); + } + + public Builder setIcon(String icon){ + P.icon = icon; + return this; + } + + public Builder setTitle(String title) { + P.title = title; + return this; + } + + public Builder setMessage(String message) { + P.message = message; + return this; + } + + public Builder setPositiveButton(String positiveButton) { + P.positiveButton = positiveButton; + return this; + } + + public Builder setNegativeButton(String negativeButton) { + P.negativeButton = negativeButton; + return this; + } + + public SimpleDialog create(){ + SimpleDialog dialog = new SimpleDialog(); + P.apply(dialog.controller); + System.out.println(" ICON = " + P.icon + " MESSAGE = " + P.message + " positiveButton = " + P.positiveButton + " negativeButton" + P.negativeButton); + return dialog; + } + } + + +} diff --git a/src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialogController.java b/src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialogController.java new file mode 100644 index 0000000..4d41b74 --- /dev/null +++ b/src/main/java/cn/byhieg/designpatterntutorial/builder/SimpleDialogController.java @@ -0,0 +1,81 @@ +package cn.byhieg.designpatterntutorial.builder; + +/** + * Created by shiqifeng on 2017/5/7. + * Mail byhieg@gmail.com + */ +public class SimpleDialogController { + + private String icon; + private String title; + private String message; + private String positiveButton; + private String negativeButton; + + public void setIcon(String icon) { + this.icon = icon; + } + + public void setTitle(String title) { + this.title = title; + } + + public void setMessage(String message) { + this.message = message; + } + + public void setPositiveButton(String positiveButton) { + this.positiveButton = positiveButton; + } + + public void setNegativeButton(String negativeButton) { + this.negativeButton = negativeButton; + } + + public String getIcon() { + return icon; + } + + public String getTitle() { + return title; + } + + public String getMessage() { + return message; + } + + public String getPositiveButton() { + return positiveButton; + } + + public String getNegativeButton() { + return negativeButton; + } + + public static class DialogParams{ + public String icon; + public String title; + public String message; + public String positiveButton; + public String negativeButton; + + public void apply(SimpleDialogController controller) { + if (icon != null) { + controller.setIcon(icon); + } + if (title != null) { + controller.setTitle(title); + } + if (message != null) { + controller.setMessage(message); + } + if (positiveButton != null) { + controller.setPositiveButton(positiveButton); + } + if (negativeButton != null) { + controller.setNegativeButton(negativeButton); + } + } + } + +} diff --git a/src/test/java/cn/byhieg/designpatterntutorialtest/SimpleDialogTest.java b/src/test/java/cn/byhieg/designpatterntutorialtest/SimpleDialogTest.java new file mode 100644 index 0000000..002115a --- /dev/null +++ b/src/test/java/cn/byhieg/designpatterntutorialtest/SimpleDialogTest.java @@ -0,0 +1,18 @@ +package cn.byhieg.designpatterntutorialtest; + +import cn.byhieg.designpatterntutorial.builder.SimpleDialog; +import junit.framework.TestCase; + +/** + * Created by shiqifeng on 2017/5/7. + * Mail byhieg@gmail.com + */ +public class SimpleDialogTest extends TestCase { + + public void testBuilder() throws Exception { + SimpleDialog dialog = new SimpleDialog.Builder().setIcon("图标").setMessage("这是Dialog").setPositiveButton("确认").setNegativeButton("否定").create(); + + + } + +} \ No newline at end of file From c41dde8e35e07469c621afc9df071f95994b5d56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E7=90=A6=E5=B3=B0?= Date: Tue, 9 May 2017 09:59:08 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=9F=E4=BA=A7?= =?UTF-8?q?=E8=80=85=E6=B6=88=E8=B4=B9=E8=80=85-=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E9=98=9F=E5=88=97=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../concurrent/blocking/ArrayBlock.java | 21 +++++++++++++++---- .../concurrent/blocking/Costumer.java | 2 +- .../concurrent/blocking/Producer.java | 3 +-- .../blockingtest/ArrayBlockTest.java | 2 +- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/ArrayBlock.java b/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/ArrayBlock.java index b31b674..3687b31 100644 --- a/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/ArrayBlock.java +++ b/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/ArrayBlock.java @@ -1,7 +1,10 @@ package cn.byhieg.threadtutorial.concurrent.blocking; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; +import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; + +import javax.sound.midi.SoundbankResource; +import java.lang.management.LockInfo; +import java.util.concurrent.*; /** * Created by byhieg on 17/5/3. @@ -11,8 +14,18 @@ public class ArrayBlock { private BlockingQueue blockingQueue; - public ArrayBlock(){ - blockingQueue = new ArrayBlockingQueue(1024); + public ArrayBlock(int index) { + switch (index) { + case 0: + blockingQueue = new ArrayBlockingQueue(3); + break; + case 1: + blockingQueue = new LinkedBlockingQueue<>(); + break; + case 2: + blockingQueue = new SynchronousQueue<>(); + break; + } } public BlockingQueue getBlockingQueue() { diff --git a/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Costumer.java b/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Costumer.java index d69c647..f88b45f 100644 --- a/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Costumer.java +++ b/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Costumer.java @@ -20,7 +20,7 @@ public void run() { super.run(); while (true) { try { - Thread.sleep(2000); + Thread.sleep(5000); String str = blockingQueue.take(); System.out.println(getName() + " 取出数据 " + str); } catch (InterruptedException e) { diff --git a/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Producer.java b/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Producer.java index 5298546..a2d12eb 100644 --- a/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Producer.java +++ b/src/main/java/cn/byhieg/threadtutorial/concurrent/blocking/Producer.java @@ -14,9 +14,8 @@ public void run() { super.run(); for (int i = 0 ; i < 5;i++) { try { - System.out.println(getName() + " 生产数据"); blockingQueue.put(i + ""); - Thread.sleep(1000); + System.out.println(getName() + " 生产数据"); } catch (InterruptedException e) { e.printStackTrace(); } diff --git a/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/blockingtest/ArrayBlockTest.java b/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/blockingtest/ArrayBlockTest.java index 8c695b2..c48566c 100644 --- a/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/blockingtest/ArrayBlockTest.java +++ b/src/test/java/cn/byhieg/threadtutorialtest/concurrenttest/blockingtest/ArrayBlockTest.java @@ -15,7 +15,7 @@ public class ArrayBlockTest extends TestCase { ArrayBlock block; public void setUp() throws Exception { super.setUp(); - block = new ArrayBlock(); + block = new ArrayBlock(2); } public void tearDown() throws Exception { From 5a4753da6357fef702ca6118b6ac07a6fcc7a85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E7=90=A6=E5=B3=B0?= Date: Sun, 18 Jun 2017 17:03:55 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BD=92=E5=B9=B6?= =?UTF-8?q?=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/byhieg/algorithmtutorial/Sort.java | 54 +++++++++++++++++++ .../algorithmtutorialtest/SortTest.java | 9 +++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/byhieg/algorithmtutorial/Sort.java b/src/main/java/cn/byhieg/algorithmtutorial/Sort.java index 6229a1f..6794e42 100644 --- a/src/main/java/cn/byhieg/algorithmtutorial/Sort.java +++ b/src/main/java/cn/byhieg/algorithmtutorial/Sort.java @@ -128,6 +128,59 @@ public void bubbleSort2(int[] nums) { } } + /** + * 归并排序,将数组一分为二,对于每一子数组继续进行上述步骤,直到子数组只有1个元素,那么自然是有序的。 + * 然后不断合并两个数组,直到合并到整个数组。 + * 时间复杂度o(NlgN) + * 空间复杂度o(N) + * @param nums + */ + public void mergeSort(int[] nums) { + int length = nums.length; + int low = 0; + int high = length - 1; + realSort(nums, low, high); + } + + /** + * 归并排序真正的sort函数 + * @param nums 待排序的数组 + * @param low 最低位 + * @param high 最高位 + */ + private void realSort(int[] nums, int low, int high) { + int mid = (low + high) / 2; + if (low < high) { + realSort(nums, low, mid); + realSort(nums, mid + 1, high); + realMerge(nums, low, mid, high); + } + } + + private void realMerge(int[] nums, int low, int mid, int high) { + int[] tmpNums = new int[high - low + 1]; + int leftPoint = low; + int rightPoint = mid + 1; + int index = 0; + + while (leftPoint <= mid && rightPoint <= high) { + if (nums[leftPoint] < nums[rightPoint]) { + tmpNums[index++] = nums[leftPoint++]; + }else{ + tmpNums[index++] = nums[rightPoint++]; + } + } + + while (leftPoint <= mid) { + tmpNums[index++] = nums[leftPoint++]; + } + while (rightPoint <= high) { + tmpNums[index++] = nums[rightPoint++]; + } + + System.arraycopy(tmpNums, 0, nums, low, tmpNums.length); + } + /** * 快速排序,选定一个切分元素,每一轮排序后,都保证切分元素之前的元素都小于切分元素,切分元素之后的元素都大于切分元素 * 时间复杂度o(NlgN) @@ -263,4 +316,5 @@ public void sink(int [] nums, int i,int n) { } + } diff --git a/src/test/java/cn/byhieg/algorithmtutorialtest/SortTest.java b/src/test/java/cn/byhieg/algorithmtutorialtest/SortTest.java index 08c1d90..046daca 100644 --- a/src/test/java/cn/byhieg/algorithmtutorialtest/SortTest.java +++ b/src/test/java/cn/byhieg/algorithmtutorialtest/SortTest.java @@ -41,8 +41,13 @@ public void tearDown() throws Exception { // new Sort().quickSort(nums); // } - public void testHeapSort() throws Exception { - new Sort().heapSort(nums); +// public void testHeapSort() throws Exception { +// new Sort().heapSort(nums); +// } + + public void testMergeSort() throws Exception { + new Sort().mergeSort(nums); + } } \ No newline at end of file From e5a710dae2385bbff30cd53899a9197a0974df11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9F=B3=E7=90=A6=E5=B3=B0?= Date: Sat, 24 Jun 2017 21:44:36 +0800 Subject: [PATCH 08/13] =?UTF-8?q?=E4=BF=AE=E6=94=B9README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 21 ++++++++++++++---- .../JavaTutorial\347\233\256\345\275\225.jpg" | Bin 353150 -> 0 bytes .../JavaTutorial\347\233\256\345\275\225.png" | Bin 0 -> 400831 bytes 3 files changed, 17 insertions(+), 4 deletions(-) delete mode 100644 "images/JavaTutorial\347\233\256\345\275\225.jpg" create mode 100644 "images/JavaTutorial\347\233\256\345\275\225.png" diff --git a/README.md b/README.md index 49941a0..88bb506 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,8 @@ # JavaTutorial内容说明 该Java教程是学习Java过程中对Java知识点进行梳理。每一个包中的代码都有一个ReadMe来说明该包代码的作用以及知识点。 +src包里面是Java的源码,test包里面是针对源码的测试 -![Alt text](images/JavaTutorial目录.jpg) +![Alt text](images/JavaTutorial目录.png) ## ThreadTutorial内容说明 在源码路径下`cn.byhieg.threadtutorial`中放置的是Java多线程的代码和测试例子,在每一个章的包下,都有一个ReadMe来说明该章的知识点。 @@ -67,9 +68,6 @@ MapTutorial中的知识点有 - TreeMap的使用 - LinkedHashMap的使用 - - - ## AnnotationTutorial内容说明 在源码路径下`cn.byhieg.annotationtutorial`中放置的是Java注解类的代码和测试例子。在每一个包里面,都有一个ReadMe来说明该章的知识点。 @@ -79,7 +77,22 @@ MapTutorial中的知识点有 在源码路径下`cn.byhieg.iotutorial`中放置的是Java io类的代码和测试例子。在每一个包里面,都有一个ReadMe来说明该章的知识点。 +## DesignPattern内容说明 + +在源码路径下`cn.byhieg.designpatterntutorial`中放置的是Java 设计模式的代码和测试的例子。目前有 + +- 代理模式 +- 单例模式 +- builder模式 +## algorithmtutorial内容说明 +在源码路径下`cn.byhieg.algorithmtutorial`中放置的是Java实现的一些算法,内容如下: +- 二叉搜索树 +- 二叉树的常见的算法 +- 查找算法, +- 图的算法(DFS,BFS,Dijkstra) +- 单链表的算法 +- 排序算法。 diff --git "a/images/JavaTutorial\347\233\256\345\275\225.jpg" "b/images/JavaTutorial\347\233\256\345\275\225.jpg" deleted file mode 100644 index a4603a6e1fee9a5143d9d3147e1e181688b9c5e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 353150 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