diff --git a/Basic-java/Basic-java.iml b/Basic-java/Basic-java.iml deleted file mode 100644 index c90834f..0000000 --- a/Basic-java/Basic-java.iml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/BasicJava.iml b/BasicJava.iml new file mode 100644 index 0000000..dadae47 --- /dev/null +++ b/BasicJava.iml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Enumeration/Enumeration.iml b/Enumeration/Enumeration.iml new file mode 100644 index 0000000..b1562b6 --- /dev/null +++ b/Enumeration/Enumeration.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Enumeration/pom.xml b/Enumeration/pom.xml new file mode 100644 index 0000000..b7b044a --- /dev/null +++ b/Enumeration/pom.xml @@ -0,0 +1,28 @@ + + + Basic-Java + com.crow + 1.0-SNAPSHOT + + 4.0.0 + + Enumeration + jar + + Enumeration + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/Basic-java/src/com/crow/Enumeration/EnumCoin.java b/Enumeration/src/main/java/com/crow/EnumCoin.java similarity index 96% rename from Basic-java/src/com/crow/Enumeration/EnumCoin.java rename to Enumeration/src/main/java/com/crow/EnumCoin.java index f855855..1d4b300 100644 --- a/Basic-java/src/com/crow/Enumeration/EnumCoin.java +++ b/Enumeration/src/main/java/com/crow/EnumCoin.java @@ -1,4 +1,4 @@ -package com.crow.Enumeration; +package com.crow; /** * Created by CrowHawk on 17/2/12. diff --git a/Basic-java/src/com/crow/Enumeration/EnumTest.java b/Enumeration/src/main/java/com/crow/EnumTest.java similarity index 89% rename from Basic-java/src/com/crow/Enumeration/EnumTest.java rename to Enumeration/src/main/java/com/crow/EnumTest.java index b7fa4ce..5f3cbd9 100644 --- a/Basic-java/src/com/crow/Enumeration/EnumTest.java +++ b/Enumeration/src/main/java/com/crow/EnumTest.java @@ -1,4 +1,4 @@ -package com.crow.Enumeration; +package com.crow; /** * Created by CrowHawk on 17/2/12. diff --git a/Enumeration/target/classes/com/crow/EnumCoin$1.class b/Enumeration/target/classes/com/crow/EnumCoin$1.class new file mode 100644 index 0000000..1ad9916 Binary files /dev/null and b/Enumeration/target/classes/com/crow/EnumCoin$1.class differ diff --git a/Enumeration/target/classes/com/crow/EnumCoin$2.class b/Enumeration/target/classes/com/crow/EnumCoin$2.class new file mode 100644 index 0000000..a7d491d Binary files /dev/null and b/Enumeration/target/classes/com/crow/EnumCoin$2.class differ diff --git a/Enumeration/target/classes/com/crow/EnumCoin.class b/Enumeration/target/classes/com/crow/EnumCoin.class new file mode 100644 index 0000000..afd13bf Binary files /dev/null and b/Enumeration/target/classes/com/crow/EnumCoin.class differ diff --git a/Enumeration/target/test-classes/com/crow/EnumTest.class b/Enumeration/target/test-classes/com/crow/EnumTest.class new file mode 100644 index 0000000..27ec5e0 Binary files /dev/null and b/Enumeration/target/test-classes/com/crow/EnumTest.class differ diff --git a/Generic/Generic.iml b/Generic/Generic.iml new file mode 100644 index 0000000..b1562b6 --- /dev/null +++ b/Generic/Generic.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Generic/pom.xml b/Generic/pom.xml new file mode 100644 index 0000000..5c9204e --- /dev/null +++ b/Generic/pom.xml @@ -0,0 +1,28 @@ + + + Basic-Java + com.crow + 1.0-SNAPSHOT + + 4.0.0 + + Generic + jar + + Generic + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/Basic-java/src/com/crow/Generic/GenericTest.java b/Generic/src/main/java/com/crow/GenericTest.java similarity index 85% rename from Basic-java/src/com/crow/Generic/GenericTest.java rename to Generic/src/main/java/com/crow/GenericTest.java index 5fbab0c..3f1812f 100644 --- a/Basic-java/src/com/crow/Generic/GenericTest.java +++ b/Generic/src/main/java/com/crow/GenericTest.java @@ -1,16 +1,21 @@ -package com.crow.Generic; +package com.crow; /** * Created by CrowHawk on 17/2/16. */ -import java.lang.reflect.*; -import java.util.*; +import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; +import java.util.Set; public class GenericTest { public static void main(String[] args) throws Exception{ - HashMap hashMap = new HashMap<>(); + HashMap hashMap = new HashMap(); hashMap.put("Tom", 1); hashMap.put("Jerry", 2); hashMap.put("Nick", 3); diff --git a/NIO/NIO.iml b/NIO/NIO.iml new file mode 100644 index 0000000..b1562b6 --- /dev/null +++ b/NIO/NIO.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/NIO/pom.xml b/NIO/pom.xml new file mode 100644 index 0000000..32ca5da --- /dev/null +++ b/NIO/pom.xml @@ -0,0 +1,28 @@ + + + Basic-Java + com.crow + 1.0-SNAPSHOT + + 4.0.0 + + NIO + jar + + NIO + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/NIO/src/main/java/com/crow/CopyFile.java b/NIO/src/main/java/com/crow/CopyFile.java new file mode 100644 index 0000000..f6f8266 --- /dev/null +++ b/NIO/src/main/java/com/crow/CopyFile.java @@ -0,0 +1,43 @@ +package com.crow; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +/** + * Created by CrowHawk on 17/9/4. + */ +public class CopyFile { + public static void main(String[] args) throws Exception { + if (args.length<2) { + System.err.println( "Usage: java CopyFile infile outfile" ); + System.exit( 1 ); + } + + String infile = args[0]; + String outfile = args[1]; + + FileInputStream fin = new FileInputStream( infile ); + FileOutputStream fout = new FileOutputStream( outfile ); + + FileChannel fcin = fin.getChannel(); + FileChannel fcout = fout.getChannel(); + + ByteBuffer buffer = ByteBuffer.allocate( 1024 ); + + while (true) { + buffer.clear(); + + int r = fcin.read(buffer); + + if (r == -1) { + break; + } + + buffer.flip(); + + fcout.write(buffer); + } + } +} diff --git a/NIO/src/main/java/com/crow/CreateArrayBuffer.java b/NIO/src/main/java/com/crow/CreateArrayBuffer.java new file mode 100644 index 0000000..886e3e6 --- /dev/null +++ b/NIO/src/main/java/com/crow/CreateArrayBuffer.java @@ -0,0 +1,24 @@ +package com.crow; + +import java.nio.ByteBuffer; + +/** + * Created by CrowHawk on 17/9/4. + */ +public class CreateArrayBuffer { + static public void main( String args[] ) throws Exception { + byte array[] = new byte[1024]; + + ByteBuffer buffer = ByteBuffer.wrap( array ); + + buffer.put( (byte)'a' ); + buffer.put( (byte)'b' ); + buffer.put( (byte)'c' ); + + buffer.flip(); + + System.out.println( (char)buffer.get() ); + System.out.println( (char)buffer.get() ); + System.out.println( (char)buffer.get() ); + } +} diff --git a/NIO/src/main/java/com/crow/CreateBuffer.java b/NIO/src/main/java/com/crow/CreateBuffer.java new file mode 100644 index 0000000..0fe8def --- /dev/null +++ b/NIO/src/main/java/com/crow/CreateBuffer.java @@ -0,0 +1,22 @@ +package com.crow; + +import java.nio.ByteBuffer; + +/** + * Created by CrowHawk on 17/9/4. + */ +public class CreateBuffer { + public static void main( String args[] ) throws Exception { + ByteBuffer buffer = ByteBuffer.allocate( 1024 ); + + buffer.put( (byte)'a' ); + buffer.put( (byte)'b' ); + buffer.put( (byte)'c' ); + + buffer.flip(); + + System.out.println( (char)buffer.get() ); + System.out.println( (char)buffer.get() ); + System.out.println( (char)buffer.get() ); + } +} diff --git a/NIO/src/main/java/com/crow/MultiPortEcho.java b/NIO/src/main/java/com/crow/MultiPortEcho.java new file mode 100644 index 0000000..81479ee --- /dev/null +++ b/NIO/src/main/java/com/crow/MultiPortEcho.java @@ -0,0 +1,108 @@ +package com.crow; + +import java.io.IOException; +import java.net.InetSocketAddress; +import java.net.ServerSocket; +import java.nio.ByteBuffer; +import java.nio.channels.SelectionKey; +import java.nio.channels.Selector; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; +import java.util.Iterator; +import java.util.Set; + +/** + * Created by CrowHawk on 17/9/4. + */ +public class MultiPortEcho { + private int ports[]; + private ByteBuffer echoBuffer = ByteBuffer.allocate( 1024 ); + + public MultiPortEcho( int ports[] ) throws IOException { + this.ports = ports; + + go(); + } + + private void go() throws IOException { + + Selector selector = Selector.open(); + + // Open a listener on each port, and register each one + // with the selector + for (int i=0; i < ports.length; i++) { + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.configureBlocking(false); + ServerSocket ss = ssc.socket(); + InetSocketAddress address = new InetSocketAddress(ports[i]); + ss.bind(address); + + //将新打开的 ServerSocketChannels 注册到 Selector上,指定监听accept事件 + SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT); + System.out.println("Going to listen on " + ports[i]); + } + + while (true) { + int num = selector.select();//返回该选择器中对I/O事件准备就绪的channel对应的key的数量 + Set selectedKeys = selector.selectedKeys();//返回key的集合 + Iterator it = selectedKeys.iterator(); + while (it.hasNext()) {//遍历key集合,集合中的元素为SelectionKey类型 + SelectionKey key = (SelectionKey) it.next(); + if ((key.readyOps() & SelectionKey.OP_ACCEPT) + == SelectionKey.OP_ACCEPT) {//检查发生了什么类型的事件 + // Accept the new connection + ServerSocketChannel ssc = (ServerSocketChannel)key.channel(); + SocketChannel sc = ssc.accept(); + sc.configureBlocking( false ); + + // Add the new connection to the selector + SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ );//监听read事件 + //Selector不会自己从已选择键集中移除SelectionKey实例。必须在处理完通道时自己移除。下次该通道变成就绪时,Selector会再次将其放入已选择键集中。 + it.remove(); + + System.out.println( "Got connection from "+sc ); + }else if ((key.readyOps() & SelectionKey.OP_READ) + == SelectionKey.OP_READ) { + // Read the data + SocketChannel sc = (SocketChannel)key.channel(); + + // Echo data + int bytesEchoed = 0; + while (true) { + echoBuffer.clear(); + int r = sc.read( echoBuffer ); + + if (r<=0) { + break; + } + echoBuffer.flip(); + + sc.write( echoBuffer ); + bytesEchoed += r; + } + + System.out.println( "Echoed "+bytesEchoed+" from "+sc ); + + it.remove(); + } + } + } + } + + public static void main( String args[] ) throws Exception { + if (args.length<=0) { + System.err.println( "Usage: java MultiPortEcho port [port port ...]" ); + System.exit( 1 ); + } + + int ports[] = new int[args.length]; + + for (int i=0; i 0; i++) { + System.out.println("Character" + i + ": " + (char)buffer.get()); + } + fin.close(); + } +} diff --git a/NIO/src/main/java/com/crow/ScatterGather.java b/NIO/src/main/java/com/crow/ScatterGather.java new file mode 100644 index 0000000..a911dd6 --- /dev/null +++ b/NIO/src/main/java/com/crow/ScatterGather.java @@ -0,0 +1,77 @@ +package com.crow; + +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.ServerSocketChannel; +import java.nio.channels.SocketChannel; + +/** + * Created by CrowHawk on 17/9/4. + */ +public class ScatterGather { + static private final int firstHeaderLength = 2; + static private final int secondHeaderLength = 4; + static private final int bodyLength = 6; + + static public void main( String args[] ) throws Exception { + if (args.length!=1) { + System.err.println( "Usage: java UseScatterGather port" ); + System.exit( 1 ); + } + + int port = Integer.parseInt( args[0] ); + + ServerSocketChannel ssc = ServerSocketChannel.open(); + InetSocketAddress address = new InetSocketAddress( port ); + ssc.socket().bind( address ); + + int messageLength = + firstHeaderLength + secondHeaderLength + bodyLength; + + ByteBuffer buffers[] = new ByteBuffer[3]; + buffers[0] = ByteBuffer.allocate( firstHeaderLength ); + buffers[1] = ByteBuffer.allocate( secondHeaderLength ); + buffers[2] = ByteBuffer.allocate( bodyLength ); + + SocketChannel sc = ssc.accept(); + + while (true) { + + // Scatter-read into buffers + int bytesRead = 0; + while (bytesRead < messageLength) { + long r = sc.read( buffers ); + bytesRead += r; + + System.out.println( "r "+r ); + for (int i=0; i < buffers.length; ++i) { + ByteBuffer bb = buffers[i]; + System.out.println( "b " + i + " " + bb.position() + " " + bb.limit() ); + } + } + + // Process message here + + // Flip buffers + for (int i=0; i + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Proxy/pom.xml b/Proxy/pom.xml new file mode 100644 index 0000000..5073b11 --- /dev/null +++ b/Proxy/pom.xml @@ -0,0 +1,28 @@ + + + Basic-Java + com.crow + 1.0-SNAPSHOT + + 4.0.0 + + Proxy + jar + + Proxy + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/Basic-java/src/com/crow/Proxy/Advice.java b/Proxy/src/main/java/com/crow/Advice.java similarity index 74% rename from Basic-java/src/com/crow/Proxy/Advice.java rename to Proxy/src/main/java/com/crow/Advice.java index 915827f..4383bbe 100644 --- a/Basic-java/src/com/crow/Proxy/Advice.java +++ b/Proxy/src/main/java/com/crow/Advice.java @@ -1,6 +1,6 @@ -package com.crow.Proxy; +package com.crow; -import java.lang.reflect.*; +import java.lang.reflect.Method; /** * Created by CrowHawk on 17/2/20. diff --git a/Basic-java/src/com/crow/Proxy/ImpAdvice.java b/Proxy/src/main/java/com/crow/ImpAdvice.java similarity index 95% rename from Basic-java/src/com/crow/Proxy/ImpAdvice.java rename to Proxy/src/main/java/com/crow/ImpAdvice.java index 380062e..7027aac 100644 --- a/Basic-java/src/com/crow/Proxy/ImpAdvice.java +++ b/Proxy/src/main/java/com/crow/ImpAdvice.java @@ -1,4 +1,4 @@ -package com.crow.Proxy; +package com.crow; import java.lang.reflect.Method; diff --git a/Basic-java/src/com/crow/Proxy/ProxyTest.java b/Proxy/src/main/java/com/crow/ProxyTest.java similarity index 88% rename from Basic-java/src/com/crow/Proxy/ProxyTest.java rename to Proxy/src/main/java/com/crow/ProxyTest.java index 562d3c7..d69bdf1 100644 --- a/Basic-java/src/com/crow/Proxy/ProxyTest.java +++ b/Proxy/src/main/java/com/crow/ProxyTest.java @@ -1,7 +1,9 @@ -package com.crow.Proxy; +package com.crow; -import java.lang.reflect.*; -import java.util.*; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.util.ArrayList; import java.util.Collection; /** diff --git a/README.md b/README.md index 957a279..70fa8a3 100644 --- a/README.md +++ b/README.md @@ -1,16 +1,32 @@ # JavaLearning -本仓库记录了我的Java进阶之路,旨在提供一个Java在线共享学习平台,帮助更多的Java学习者入门进阶 +本仓库记录了我的Java学习进阶之路,涵盖了Java基础、JDK源码、JVM中的重要知识,附有代码和博客讲解,旨在提供一个Java在线共享学习平台,帮助更多的Java学习者入门进阶。 ## 代码目录 + [Java基础](https://github.com/CrowHawk/JavaLearning/tree/master/Basic-java):包括枚举、范型、反射、动态代理的用法; + [JNA](https://github.com/CrowHawk/JavaLearning/tree/master/JNAPointer):演示了JNA的基本用法,使用Java调用C++代码。 ## 博客目录 +### Java基础 + [Java基础学习(1)——反射](https://crowhawk.github.io/2017/02/12/basic-java-reflect/) + [Java基础学习(2)——注解](https://crowhawk.github.io/2017/02/13/basic-java-annotation/) + [Java基础学习(3)——泛型](https://crowhawk.github.io/2017/02/21/basic-java-generic/) + [Java基础学习(4)——动态代理](https://crowhawk.github.io/2017/02/21/basic-java-proxy/) + [《Java多线程核心技术》读书笔记](https://crowhawk.github.io/2017/07/06/MultiThread/) +### JDK源码 ++ [Java集合框架源码解读(1)——ArrayList、LinkedList和Vector](https://crowhawk.github.io/2017/08/26/collections_1/) ++ [Java集合框架源码解读(2)——HashMap](https://crowhawk.github.io/2017/08/27/collections_2/) ++ [Java集合框架源码解读(3)——LinkedHashMap](https://crowhawk.github.io/2017/08/28/collctions_3/) ++ [Java集合框架源码解读(4)——WeakHashMap](https://crowhawk.github.io/2017/08/29/collection_4/) ++ [Java集合框架源码解读(5)——TreeMap](https://crowhawk.github.io/2017/08/31/collection_5/) + +### JVM ++ [深入理解JVM(1)——Java内存区域与Java对象](https://crowhawk.github.io/2017/08/09/jvm_1/) ++ [深入理解JVM(2)——GC算法与内存分配策略](https://crowhawk.github.io/2017/08/10/jvm_2/) ++ [深入理解JVM(3)——7种垃圾收集器](https://crowhawk.github.io/2017/08/15/jvm_3/) ++ [深入理解JVM(4)——如何优化Java GC「译」](https://crowhawk.github.io/2017/08/21/jvm_4/) ++ [深入理解JVM(5)——虚拟机类加载机制](https://crowhawk.github.io/2017/08/21/jvm_5/) ++ [深入理解JVM(6)——类加载器](https://crowhawk.github.io/2017/08/21/jvm_6/) + ## 联系作者 [Personal Website:Crow Home](https://crowhawk.github.io/) diff --git a/ReadAndShow.txt b/ReadAndShow.txt new file mode 100644 index 0000000..023431f --- /dev/null +++ b/ReadAndShow.txt @@ -0,0 +1 @@ +Read And Show. \ No newline at end of file diff --git a/Reflect/Reflect.iml b/Reflect/Reflect.iml new file mode 100644 index 0000000..b1562b6 --- /dev/null +++ b/Reflect/Reflect.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Reflect/pom.xml b/Reflect/pom.xml new file mode 100644 index 0000000..40d57c3 --- /dev/null +++ b/Reflect/pom.xml @@ -0,0 +1,28 @@ + + + Basic-Java + com.crow + 1.0-SNAPSHOT + + 4.0.0 + + Reflect + jar + + Reflect + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + + diff --git a/Basic-java/src/com/crow/Reflect/FieldReflect.java b/Reflect/src/main/java/com/crow/FieldReflect.java similarity index 94% rename from Basic-java/src/com/crow/Reflect/FieldReflect.java rename to Reflect/src/main/java/com/crow/FieldReflect.java index a01edd1..25263e9 100644 --- a/Basic-java/src/com/crow/Reflect/FieldReflect.java +++ b/Reflect/src/main/java/com/crow/FieldReflect.java @@ -1,4 +1,4 @@ -package com.crow.Reflect; +package com.crow; /** diff --git a/Basic-java/src/com/crow/Reflect/ReflectTest.java b/Reflect/src/main/java/com/crow/ReflectTest.java similarity index 94% rename from Basic-java/src/com/crow/Reflect/ReflectTest.java rename to Reflect/src/main/java/com/crow/ReflectTest.java index d960b36..cb51a44 100644 --- a/Basic-java/src/com/crow/Reflect/ReflectTest.java +++ b/Reflect/src/main/java/com/crow/ReflectTest.java @@ -1,7 +1,8 @@ -package com.crow.Reflect; +package com.crow; import java.io.IOException; -import java.lang.reflect.*; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; /** diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..d8fff45 --- /dev/null +++ b/pom.xml @@ -0,0 +1,33 @@ + + 4.0.0 + + com.crow + Basic-Java + 1.0-SNAPSHOT + + Enumeration + Generic + Proxy + Reflect + JNA + NIO + + pom + + Basic-Java + http://maven.apache.org + + + UTF-8 + + + + + junit + junit + 3.8.1 + test + + +