├── .gitignore
├── Apache Commons
└── commons.md
├── Guava
├── 6-字符串处理:分割,连接,填充.md
├── Google Guava使用指南.md
└── Java 代码性能优化.md
├── IT视频教程目录.md
├── Node
├── RandomAccessFile.md
├── node.md
└── 内存管理.md
├── README.md
├── SUMMARY.md
├── assets
├── java.jpg
├── jdk.png
├── note.jpg
├── wechat.jpg
├── weixin.png
└── 支付宝.jpg
├── book.json
├── 第10章 反射机制
├── Annotation-Processing-Tool详解.md
├── Java动态代理.md
├── Java反射.md
├── Java注解.md
├── Java注解Annotation基础.md
├── README.md
├── img
│ └── Element.png
├── 依赖注入.md
├── 动态代理.md
├── 反射.md
├── 基础篇:带你从头到尾玩转注解.md
├── 注解.md
└── 类加载器.md
├── 第11章 新特性
├── Google Guava官方教程.md
├── Google Guava官方教程2.md
├── JDK新特性.md
├── Java8的十大新特性.md
├── Lambda表达式.md
├── README.md
├── 你应该更新的Java知识.md
├── 你应该更新的Java知识之Observer.md
├── 你应该更新的Java知识之常用程序库1.md
├── 你应该更新的Java知识之常用程序库2.md
├── 泛型基础1.md
├── 泛型基础2.md
└── 泛型封装.md
├── 第12章 内存管理
├── JVM 内存模型 Stack Heap.md
├── README.md
└── images
│ ├── jvm内存.png
│ ├── jvm内存10.png
│ ├── jvm内存2.png
│ ├── jvm内存3.png
│ ├── jvm内存4.png
│ ├── jvm内存5.png
│ ├── jvm内存6.png
│ ├── jvm内存7.png
│ ├── jvm内存8.png
│ ├── jvm内存9.png
│ ├── jvm内存区域.png
│ └── 运行时数据区.png
├── 第13章 GUI
└── README.md
├── 第1章 Java开发入门
├── JDK、JRE、JVM的区别与联系.md
├── Java概述.md
├── README.md
└── img
│ ├── 1500701808153.png
│ ├── 1500701831703.png
│ ├── 1500701903102.png
│ ├── 1500701931483.png
│ ├── 1500702002217.png
│ ├── 1500702034150.png
│ ├── 1500702052622.png
│ ├── 1500702103490.png
│ ├── 1500702206702.png
│ ├── 1500702230275.png
│ ├── 1500702273750.png
│ ├── 1500702562133.png
│ ├── compiler.png
│ ├── javac.png
│ ├── jdk1.png
│ ├── jdk2.png
│ ├── jdk3.png
│ ├── jdk4.png
│ ├── jvm.png
│ ├── jvm1.png
│ ├── jvm2.png
│ ├── jvm3.png
│ └── 詹姆斯·高斯林.png
├── 第2章 Java编程基础
├── Google Java编程风格指南.md
├── Java与指针.md
├── Java程序员必读的书籍.md
├── Java语法基础-1.md
├── Java语法基础-2.md
├── README.md
├── images
│ ├── 1502019084540.png
│ ├── 1502019174168.png
│ ├── Java开发手册_1.webp
│ ├── Java开发手册_2.webp
│ ├── Java开发手册_3.webp
│ ├── Java开发手册_4.webp
│ ├── Java开发手册_5.webp
│ ├── java_basic_01.png
│ ├── java_basic_02.png
│ ├── java_basic_03.png
│ ├── java_basic_04.png
│ ├── java_basic_05.png
│ ├── java_basic_06.png
│ ├── java_basic_07.png
│ ├── java_basic_08.png
│ ├── java_basic_09.png
│ ├── java_basic_10.png
│ ├── java_basic_11.png
│ ├── java_basic_12.png
│ ├── java_basic_13.png
│ ├── java_basic_14.png
│ ├── java_basic_15.png
│ ├── java_basic_16.png
│ ├── java_basic_17.png
│ ├── java_basic_18.png
│ ├── java_basic_19.png
│ ├── java_basic_20.png
│ ├── java_basic_21.png
│ ├── java_basic_22.png
│ ├── java_basic_23.png
│ ├── java_basic_24.png
│ ├── java_basic_25.png
│ ├── java_basic_26.png
│ ├── java_basic_27.png
│ ├── java_basic_28.png
│ ├── java_basic_29.png
│ ├── java_basic_30.png
│ ├── java_basic_31.png
│ ├── java_basic_32.png
│ ├── java_basic_33.png
│ ├── java_basic_34.png
│ ├── java_basic_35.png
│ ├── java_basic_36.png
│ ├── java_basic_37.png
│ ├── java_basic_38.png
│ ├── java_basic_39.png
│ ├── java_basic_40.png
│ ├── java_basic_41.png
│ ├── java_basic_42.png
│ ├── java_basic_43.png
│ ├── java_basic_44.png
│ ├── java_basic_45.png
│ ├── java_book_01.png
│ ├── java_book_02.png
│ ├── java_book_03.png
│ ├── java_book_04.png
│ ├── java_book_05.png
│ ├── java_book_06.png
│ ├── java_book_07.png
│ ├── java_book_08.png
│ ├── java_book_09.png
│ ├── java_book_10.png
│ ├── java_book_11.png
│ ├── java_book_12.png
│ ├── java_book_13.png
│ ├── java_book_14.png
│ ├── java_book_15.png
│ ├── java_book_16.png
│ ├── java_book_17.png
│ ├── java_book_18.png
│ ├── java_book_19.png
│ ├── java_book_20.png
│ ├── java_book_21.png
│ ├── java_book_22.png
│ ├── java_book_23.png
│ ├── java_book_24.png
│ ├── java_book_25.png
│ ├── java_book_26.png
│ └── java_book_27.png
├── 什么是堆和栈,它们在哪儿?.md
├── 基本数据类型包装类.md
├── 引用、指针和句柄的区别.md
├── 详细介绍JAVA和C++区别.md
├── 阿里 Java 开发手册最新完美版,千锤百炼始出炉.md
├── 阿里《Java开发手册》终极版!.md
└── 阿里巴巴Java开发手册.md
├── 第3章 面向对象
├── Object类.md
├── README.md
├── img
│ ├── 1491240419406.png
│ ├── 1491240434244.png
│ ├── 1491240451956.png
│ ├── 1491276104173.png
│ ├── 1491276277598.png
│ ├── 1491276429985.png
│ ├── 1491276565803.png
│ ├── 1491276648860.png
│ ├── 1491276689148.png
│ ├── 1491277295296.png
│ ├── 1491283464087.png
│ ├── 1491283688423.png
│ ├── 1491283722702.png
│ ├── 1491308047866.png
│ ├── 1491308096802.png
│ ├── 1491308113418.png
│ ├── 1491308129771.png
│ ├── 1491308142717.png
│ ├── 1491308168245.png
│ ├── 1491308191041.png
│ ├── 1491308214198.png
│ ├── 1491308228930.png
│ ├── 1491308244992.png
│ ├── 1491308269877.png
│ ├── 1491308285140.png
│ ├── 1491308317919.png
│ ├── 1491308344714.png
│ ├── 1491308350957.png
│ ├── 1491308364716.png
│ ├── 1491308380018.png
│ ├── 1491308397512.png
│ ├── 1491308420570.png
│ ├── 1491308433699.png
│ ├── 1491308448323.png
│ ├── 1491308458976.png
│ ├── 1491308470712.png
│ ├── 1491308482425.png
│ ├── 1491308497028.png
│ ├── 1491308507996.png
│ ├── 1491308522362.png
│ ├── 1491308534469.png
│ ├── 1491308546397.png
│ ├── 1491308560153.png
│ ├── 1491310549430.png
│ ├── 1500704359335.png
│ ├── 1500704447701.png
│ ├── 1500704467099.png
│ ├── 1500704487847.png
│ ├── 1500704901468.png
│ ├── 1500705144464.png
│ ├── 1500705286982.png
│ ├── OOP_01.png
│ ├── OOP_02.png
│ ├── OOP_03.png
│ ├── OOP_04.png
│ ├── OOP_05.png
│ ├── OOP_06.png
│ ├── OOP_07.png
│ ├── OOP_08.png
│ ├── OOP_09.png
│ ├── OOP_10.png
│ ├── OOP_11.png
│ ├── OOP_12.png
│ ├── OOP_13.png
│ ├── OOP_14.png
│ ├── OOP_15.png
│ ├── OOP_16.png
│ ├── object.png
│ ├── object2.png
│ ├── object3.png
│ ├── 接口回调1.jpg
│ ├── 接口回调2.jpg
│ └── 接口回调3.jpg
├── java内存模型.md
├── 内部类.md
├── 单例设计模式.md
├── 垃圾回收机制.md
├── 多态.md
├── 对象的深复制和浅复制.md
├── 封装.md
├── 异常.md
├── 抽象类与接口.md
├── 接口回调.md
├── 数组工具类.md
├── 文档注释.md
├── 深度思考Java成员变量的初始化.md
├── 继承.md
├── 闭包.md
└── 面向对象.md
├── 第4章 常见对象
├── Math类和Random类.md
├── README.md
├── String类.md
├── System类和Runtime类.md
├── img
│ ├── 1491233180836.png
│ ├── 1491233242191.png
│ ├── 1491233285336.png
│ ├── 1491268860124.png
│ ├── 1491271174524.png
│ ├── 1491271246139.png
│ ├── 1500705653143.png
│ ├── 1500705834086.png
│ ├── 1500705855076.png
│ ├── 1500705950098.png
│ ├── 1500706110171.png
│ ├── 1500707150203.png
│ ├── 1500707193893.png
│ ├── regex.png
│ ├── regex1.png
│ ├── regex2.png
│ └── 常用正则表达式.png
├── regex.md
├── 分组替换.md
├── 字符串格式化.md
├── 常用正则表达式.md
├── 常见对象.md
├── 格式化.md
├── 正则表达式基础.md
└── 正则表达式的应用.md
├── 第5章 多线程
├── Callable和Future.md
├── Fork_Join框架介绍.md
├── HandlerThread.md
├── JDK8对并发的新支持.md
├── Java中的Runnable、Callable、Future、FutureTask的区别与示例.md
├── Java并发工具包concurrent用户指南.md
├── Java程序死锁问题原理及解决方案.md
├── README.md
├── img
│ ├── LongAdder.png
│ ├── code.jpg
│ ├── coding.jpg
│ ├── concurrent.png
│ ├── fork_join_01.png
│ ├── fork_join_02.png
│ ├── fork_join_03.png
│ ├── fork_join_04.png
│ ├── lock.jpg
│ ├── thread.jpg
│ ├── thread_01.png
│ ├── thread_02.png
│ ├── thread_03.png
│ ├── thread_04.png
│ ├── thread_05.png
│ ├── thread_06.png
│ ├── thread_07.png
│ ├── thread_08.png
│ ├── thread_09.png
│ ├── thread_10.png
│ ├── thread_11.png
│ ├── thread_12.png
│ ├── thread_13.png
│ ├── thread_14.png
│ ├── thread_15.png
│ ├── thread_16.png
│ ├── thread_17.png
│ ├── thread_18.png
│ ├── thread_20.png
│ ├── thread_21.png
│ ├── thread_22.png
│ ├── thread_pool_01.png
│ ├── thread_pool_02.png
│ ├── thread_pool_03.png
│ ├── thread_pool_04.png
│ ├── thread_pool_05.png
│ ├── threadlocal.png
│ ├── threadpoolexecutor.png
│ ├── 任务.png
│ ├── 共享模式.jpg
│ ├── 挂起状态.jpg
│ └── 线程运行架构.png
├── volatile关键字解析.md
├── 什么时候使用CountDownLatch.md
├── 使用JDK5中同步技术的3个面试题.md
├── 原子类.md
├── 同步工具类.md
├── 多个线程之间共享数据的方式探讨.md
├── 多线程.md
├── 多线程问题总结.md
├── 定时器、互斥、同步通信技术.md
├── 线程池.md
├── 线程池2.md
├── 线程范围内共享数据.md
├── 线程锁技术.md
├── 阻塞队列.md
└── 集合及concurrent并发包总结.md
├── 第6章 集合框架
├── Collection接口.md
├── HashMap、哈希表、哈希函数.md
├── HashMap源码剖析.md
├── HashMap的实现原理.md
├── Java集合类型详解.md
├── LinkedHashMap源码剖析.md
├── LinkedList源码剖析.md
├── List接口.md
├── Map接口.md
├── Predicate和Stream操作集合.md
├── Queue接口.md
├── README.md
├── Set接口.md
├── images
│ ├── 1500707872157.png
│ ├── 1500708070711.png
│ ├── 6.1.jpg
│ ├── 6.2.png
│ ├── 6.3.jpg
│ ├── 6.4.jpg
│ ├── 6.5.jpg
│ ├── 6.6.png
│ ├── ArrayMap_1.png
│ ├── ArrayMap_2.png
│ ├── Collection_01.png
│ ├── Collection_02.png
│ ├── Collection_03.png
│ ├── Collection_04.png
│ ├── Collection_05.png
│ ├── hashmap实现原理1.png
│ ├── hashmap实现原理2.png
│ ├── hashmap实现原理3.png
│ ├── hashmap实现原理4.png
│ ├── hashmap实现原理5.png
│ ├── hashmap实现原理6.png
│ └── 集合框架.png
├── 线程安全的集合.md
├── 集合工具类.md
├── 集合框架2.md
├── 集合框架的综合应用.md
├── 集合的遍历.md
└── 高效集合.md
├── 第7章 IO流
├── AIO.md
├── IO流之File类.md
├── IO流之字符流.md
├── IO流之字节流.md
├── NIO.md
├── NIO和AIO.md
├── NIO工具类.md
├── README.md
├── img
│ ├── 1500708330117.png
│ ├── 1500708378450.png
│ ├── 1500708385651.png
│ ├── 1500708462472.png
│ ├── 1500708507437.png
│ ├── 1500708514090.png
│ ├── 1500708562018.png
│ ├── 1500708828607.png
│ ├── IO流.png
│ ├── clone1.png
│ ├── clone2.png
│ ├── clone3.png
│ ├── nio1.png
│ ├── nio10.png
│ ├── nio11.png
│ ├── nio12.png
│ ├── nio13.png
│ ├── nio14.png
│ ├── nio15.png
│ ├── nio16.png
│ ├── nio17.png
│ ├── nio18.png
│ ├── nio19.png
│ ├── nio2.png
│ ├── nio20.png
│ ├── nio21.png
│ ├── nio22.png
│ ├── nio3.png
│ ├── nio4.png
│ ├── nio5.png
│ ├── nio6.png
│ ├── nio7.png
│ ├── nio8.png
│ ├── nio9.png
│ ├── selector.png
│ └── 多线程服务器.png
├── 对象的深复制和浅复制.md
├── 常用IO流.md
├── 序列化流.md
└── 通过mark和reset方法重复利用InputStream.md
├── 第8章 网络编程
├── README.md
├── img
│ ├── 1491301899020.png
│ ├── 1500696169189.png
│ ├── 1500696433709.png
│ ├── 1500697304014.png
│ ├── 1500697450870.png
│ ├── 1500697479674.png
│ ├── 1500697742603.png
│ ├── 1500697917983.png
│ ├── 1500698079137.png
│ ├── 1500698230162.png
│ ├── 1500698398486.png
│ ├── 1500698550168.png
│ ├── 1500698579414.png
│ ├── http2.png
│ ├── http3.png
│ ├── http协议.png
│ ├── osi.png
│ ├── ping.png
│ ├── url.png
│ ├── urlconnection.png
│ ├── 三次握手.png
│ ├── 打包与解包.png
│ ├── 网络模型.png
│ ├── 网络编程.png
│ ├── 网络编程_01.png
│ ├── 网络编程_02.png
│ ├── 网络编程_03.png
│ ├── 网络编程_04.png
│ ├── 网络编程_05.png
│ ├── 网络编程_06.png
│ ├── 网络编程_07.png
│ ├── 网络编程_08.png
│ ├── 网络编程_09.png
│ ├── 网络编程_10.png
│ ├── 网络编程_11.png
│ ├── 网络编程_12.png
│ ├── 网络编程_13.png
│ ├── 网络编程_14.png
│ ├── 网络编程_15.png
│ ├── 网络编程_16.png
│ ├── 网络编程_17.png
│ ├── 网络编程_18.png
│ ├── 网络编程_19.png
│ ├── 网络编程_20.png
│ ├── 网络编程_21.png
│ └── 网络编程_22.png
├── 你应该知道的计算机网络知识.md
├── 写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket.md
└── 网络编程.md
└── 第9章 安全加密
├── Https扫盲贴.md
├── Https编程.md
├── README.md
├── base64.md
├── img
├── base64.png
├── 安全加密.png
├── 数字证书.png
└── 数字证书内容.png
├── 和安全有关的那些事.md
├── 对称加密.md
├── 数字签名和数字证书.md
├── 消息摘要MessageDigest.md
├── 网络安全.md
└── 非对称加密.md
/.gitignore:
--------------------------------------------------------------------------------
1 | # Node rules:
2 | ## Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
3 | .grunt
4 |
5 | ## Dependency directory
6 | ## Commenting this out is preferred by some people, see
7 | ## https://docs.npmjs.com/misc/faq#should-i-check-my-node_modules-folder-into-git
8 | node_modules
9 |
10 | # Book build output
11 | _book
12 |
13 | # eBook build output
14 | *.epub
15 | *.mobi
16 | *.pdf
--------------------------------------------------------------------------------
/Node/RandomAccessFile.md:
--------------------------------------------------------------------------------
1 | ## RandomAccessFile
2 |
3 | 随机访问流
--------------------------------------------------------------------------------
/Node/node.md:
--------------------------------------------------------------------------------
1 | ## 集合框架
2 |
3 | set集合
4 |
5 | map
6 |
7 | 元素是Entry< k, v >,Entry就是将key和value捆绑在一起
8 |
9 | 当一个set的元素是Entry的时候,该set就是一个map
10 |
11 | hash()算法可以快速的计算出存、取的地址,存和取元素的效率很高,但是hash算法不能表示出元素之间的关系。hash算法决定了集合是无序的。
12 |
13 | 数组+链表,bucket桶结构,hash冲突
14 |
15 | HashSet底层实现是HashMap
16 |
17 | TreeMap
18 |
19 | 红黑树,平衡二叉树,排序二叉树(二叉查找树,左小右大,中序有序),有序,自然排序compareTo()方法,比较器排序Comparator接口
20 |
21 | Entry< key, value >
22 |
23 | ## 断言assert
24 |
25 | ## IO流
26 |
27 | - 字节流
28 | - 字符流
29 | - 转换流
30 | - 高效流
31 | - 随机访问流
32 | - 序列化流
33 | - NIO jdk 4
34 | - Channel 通道,面向块的处理
35 | - Buffer 缓冲,capacity,limit,position
36 | - Files
37 | - Paths
38 | - FileVisitor 遍历文件和目录
39 |
40 | ### Buffer 缓冲区
41 |
42 | | 方法声明 | 功能描述 |
43 | | ---------- | ---------------------------------------- |
44 | | allocate() | 分配内存空间,创建Buffer对象 |
45 | | put() | 存数据 |
46 | | get() | 取数据 |
47 | | position() | 位置 |
48 | | limit() | 界限 |
49 | | capacity() | 容量 |
50 | | flip() | 为输出数据做好准备,limit = position;position = 0; |
51 | | clear() | 为装入数据做准备,limit = capacity;position = 0; |
52 |
53 | ### Channel 通道
54 |
55 | | 方法声明 | 功能描述 |
56 | | ------- | ------------------------------ |
57 | | map() | 将buffer对应的部分或全部数据映射成ByteBuffer |
58 | | write() | 向buffer写入数据 |
59 | | read() | 从buffer读取数据 |
60 |
61 | - AIO Jdk 7
62 | - 字符集和Charset
63 | - 编解码
64 | - 文件锁FileLock
65 |
66 | ### AIO
67 |
68 | Path
69 |
70 | | 方法声明 | 功能描述 |
71 | | -------------- | ---- |
72 | | getNameCount() | |
73 | | getRoot() | |
74 | | | |
75 |
76 | Paths
77 |
78 | | 方法声明 | 功能描述 |
79 | | ----- | ---- |
80 | | get() | |
81 | | | |
82 | | | |
83 |
84 | Files
85 |
86 | | 方法声明 | 功能描述 |
87 | | ---------- | ---- |
88 | | copy() | |
89 | | isHidden() | |
90 | | size() | |
91 | | write() | |
92 | | list() | |
93 | | lines() | |
94 |
95 |
96 |
97 | ## 网络编程
98 |
--------------------------------------------------------------------------------
/Node/内存管理.md:
--------------------------------------------------------------------------------
1 | ## 数组与内存控制
2 |
3 | 数组:长度不可变,连续的内存
4 |
5 | 变量,引用变量,数组变量,数组对象
6 |
7 | 数组变量是引用类型的变量,数组变量并不是数组本身,它只是指向堆内存中的数组对象。
8 |
9 | 数组变量只是一个引用变量,通常存放在栈内存中(也可被放入堆内存中),而数组对象就是保存在堆内存中的连续内存空间。
10 |
11 | 引用变量本质上只是一个指针,只要程序通过引用变量访问属性,或者通过引用变量调用方法,该引用变量将会由它所引用的对象代替。
12 |
13 | ### 引用类型的数组
14 |
15 | 引用类型数组的数组元素依然是引用类型的,因此数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了该引用变量所引用的对象(包括数组和Java对象)。
16 |
17 | 多维数组的本质
18 |
19 | ## 内存管理
20 |
21 | 内存管理:内存分配和内存回收。
--------------------------------------------------------------------------------
/assets/java.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/assets/java.jpg
--------------------------------------------------------------------------------
/assets/jdk.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/assets/jdk.png
--------------------------------------------------------------------------------
/assets/note.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/assets/note.jpg
--------------------------------------------------------------------------------
/assets/wechat.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/assets/wechat.jpg
--------------------------------------------------------------------------------
/assets/weixin.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/assets/weixin.png
--------------------------------------------------------------------------------
/assets/支付宝.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/assets/支付宝.jpg
--------------------------------------------------------------------------------
/book.json:
--------------------------------------------------------------------------------
1 | {
2 | "description": "Java基础入门教程",
3 | "title" : "Java基础入门",
4 | "language": "zh-hans",
5 | "author" : "AllenIverson",
6 | "gitbook": "3.2.3",
7 | "pdf": {
8 | "fontFamily": "等线"
9 | }
10 | }
--------------------------------------------------------------------------------
/第10章 反射机制/README.md:
--------------------------------------------------------------------------------
1 | ## 第10章 反射、注解、动态代理
2 |
3 | - [类加载器](类加载器.md)
4 | - [反射1](反射.md)
5 | - [反射2](Java反射.md)
6 | - [注解1](注解.md)
7 | - [注解2](Java注解.md)
8 | - [注解3](Java注解Annotation基础.md)
9 | - [基础篇:带你从头到尾玩转注解](基础篇:带你从头到尾玩转注解.md)
10 | - [编译时注解](Annotation-Processing-Tool详解.md)
11 | - [依赖注入](依赖注入.md)
12 | - [动态代理1](动态代理.md)
13 | - [动态代理2](Java动态代理.md)
--------------------------------------------------------------------------------
/第10章 反射机制/img/Element.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第10章 反射机制/img/Element.png
--------------------------------------------------------------------------------
/第10章 反射机制/依赖注入.md:
--------------------------------------------------------------------------------
1 | ## 公共技术点之依赖注入
2 |
3 | > [Android 开源项目源码解析](http://a.codekk.com/)
4 |
5 | ## 1. 依赖
6 |
7 | 如果在 Class A 中,有 Class B 的实例,则称 Class A 对 Class B 有一个依赖。例如下面类 Human 中用到一个 Father 对象,我们就说类 Human 对类 Father 有一个依赖。
8 |
9 | ```java
10 | public class Human {
11 | ...
12 | Father father;
13 | ...
14 | public Human() {
15 | father = new Father();
16 | }
17 | }
18 | ```
19 |
20 | 仔细看这段代码我们会发现存在一些问题:
21 |
22 | - 如果现在要改变 father 生成方式,如需要用`new Father(String name)`初始化 father,需要修改 Human 代码;
23 | - 如果想测试不同 Father 对象对 Human 的影响很困难,因为 father 的初始化被写死在了 Human 的构造函数中;
24 | - 如果`new Father()`过程非常缓慢,单测时我们希望用已经初始化好的 father 对象 Mock 掉这个过程也很困难。
25 |
26 | ## 2. 依赖注入
27 |
28 | 上面将依赖在构造函数中直接初始化是一种 Hard init 方式,弊端在于两个类不够独立,不方便测试。我们还有另外一种 Init 方式,如下:
29 |
30 | ```java
31 | public class Human {
32 | ...
33 | Father father;
34 | ...
35 | public Human(Father father) {
36 | this.father = father;
37 | }
38 | }
39 | ```
40 |
41 | 上面代码中,我们将 father 对象作为构造函数的一个参数传入。在调用 Human 的构造方法之前外部就已经初始化好了 Father 对象。**像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。**
42 | 现在我们发现上面 1 中存在的两个问题都很好解决了,简单的说依赖注入主要有两个好处:
43 |
44 | - 解耦,将依赖之间解耦。
45 | - 因为已经解耦,所以方便做单元测试,尤其是 Mock 测试。
46 |
47 | ## 3. Java 中的依赖注入
48 |
49 | 依赖注入的实现有多种途径,而在 Java 中,使用注解是最常用的。通过在字段的声明前添加 @Inject 注解进行标记,来实现依赖对象的自动注入。
50 |
51 | ```java
52 | public class Human {
53 | ...
54 | @Inject Father father;
55 | ...
56 | public Human() {
57 | }
58 | }
59 | ```
60 |
61 | 上面这段代码看起来很神奇:只是增加了一个注解,Father 对象就能自动注入了?这个注入过程是怎么完成的?
62 |
63 | 实质上,如果你只是写了一个 @Inject 注解,Father 并不会被自动注入。你还需要使用一个依赖注入框架,并进行简单的配置。现在 Java 语言中较流行的依赖注入框架有 [Google Guice](https://github.com/google/guice)、[Spring](http://projects.spring.io/spring-framework/) 等,而在 Android 上比较流行的有 [RoboGuice](https://github.com/roboguice/roboguice)、[Dagger](http://square.github.io/dagger/) 等。其中 Dagger 是我现在正在项目中使用的。如果感兴趣,你可以到 [Dagger 实现原理解析](http://a.codekk.com/detail/Android/%E6%89%94%E7%89%A9%E7%BA%BF/Dagger%20%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90) 了解更多依赖注入和 Dagger 实现原理相关信息。
64 |
--------------------------------------------------------------------------------
/第11章 新特性/Google Guava官方教程2.md:
--------------------------------------------------------------------------------
1 | [原文链接](http://code.google.com/p/guava-libraries/wiki/GuavaExplained) [译文链接](http://ifeve.com/?p=8776) **译者:** 沈义扬,**罗立树,何一昕,****武祖 ** **校对**:方腾飞
2 |
3 | ## 引言
4 |
5 | Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitives support] 、并发库 [concurrency libraries] 、通用注解 [common annotations] 、字符串处理 [string processing] 、I/O 等等。 所有这些工具每天都在被Google的工程师应用在产品服务中。
6 |
7 | 查阅Javadoc并不一定是学习这些库最有效的方式。在此,我们希望通过此文档为Guava中最流行和最强大的功能,提供更具可读性和解释性的说明。
8 |
9 | ## 译文格式说明
10 |
11 | - Guava中的类被首次引用时,都会链接到Guava的API文档。如:[Optional](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/base/Optional.html)。
12 | - Guava和JDK中的方法被引用时,一般都会链接到Guava或JDK的API文档,一些人所共知的JDK方法除外。如:Optional.of(T),Map.get(key)
13 | - 译者对文档的额外说明以斜体显示,并且以“*译者注**:*”开始。
14 |
15 | **目录**
16 |
17 | ## 1. 基本工具 [Basic utilities]
18 |
19 | 让使用Java语言变得更舒适
20 |
21 | 1.1 [使用和避免null](http://ifeve.com/using-and-avoiding-null/):null是模棱两可的,会引起令人困惑的错误,有些时候它让人很不舒服。很多Guava工具类用快速失败拒绝null值,而不是盲目地接受
22 |
23 | 1.2 [前置条件](http://ifeve.com/google-guava-preconditions/): 让方法中的条件检查更简单
24 |
25 | 1.3 [常见Object方法](http://ifeve.com/google-guava-commonobjectutilities/): 简化Object方法实现,如hashCode()和toString()
26 |
27 | 1.4 [排序: Guava强大的”流畅风格比较器”](http://ifeve.com/google-guava-ordering/)
28 |
29 | 1.5 [Throwables](http://ifeve.com/google-guava-throwables/):简化了异常和错误的传播与检查
30 |
31 | ## 2. 集合[Collections]
32 |
33 | Guava对JDK集合的扩展,这是Guava最成熟和为人所知的部分
34 |
35 | 2.1 [不可变集合](http://ifeve.com/google-guava-immutablecollections/): 用不变的集合进行防御性编程和性能提升。
36 |
37 | 2.2 [新集合类型](http://ifeve.com/google-guava-newcollectiontypes/): multisets, multimaps, tables, bidirectional maps等
38 |
39 | 2.3 [强大的集合工具类](http://ifeve.com/google-guava-collectionutilities/): 提供java.util.Collections中没有的集合工具
40 |
41 | 2.4 [扩展工具类](http://ifeve.com/google-guava-collectionhelpersexplained/):让实现和扩展集合类变得更容易,比如创建`Collection的装饰器,或实现迭代器`
42 |
43 | ## 3. [缓存](http://ifeve.com/google-guava-cachesexplained)[Caches]
44 |
45 | Guava Cache:本地缓存实现,支持多种缓存过期策略
46 |
47 | ## 4. [函数式风格](http://ifeve.com/google-guava-functional/)[Functional idioms]
48 |
49 | Guava的函数式支持可以显著简化代码,但请谨慎使用它
50 |
51 | ## 5. 并发[Concurrency]
52 |
53 | 强大而简单的抽象,让编写正确的并发代码更简单
54 |
55 | 5.1 [ListenableFuture](http://ifeve.com/google-guava-listenablefuture/):完成后触发回调的Future
56 |
57 | 5.2 [Service框架](http://ifeve.com/google-guava-serviceexplained/):抽象可开启和关闭的服务,帮助你维护服务的状态逻辑
58 |
59 | ## 6. [字符串处理](http://ifeve.com/google-guava-strings/)[Strings]
60 |
61 | 非常有用的字符串工具,包括分割、连接、填充等操作
62 |
63 | ## 7. [原生类型](http://ifeve.com/google-guava-primitives/)[Primitives]
64 |
65 | 扩展 JDK 未提供的原生类型(如int、char)操作, 包括某些类型的无符号形式
66 |
67 | ## 8. [区间](http://ifeve.com/google-guava-ranges/)[Ranges]
68 |
69 | 可比较类型的区间API,包括连续和离散类型
70 |
71 | ## 9. [I/O](http://ifeve.com/google-guava-io/)
72 |
73 | 简化I/O尤其是I/O流和文件的操作,针对Java5和6版本
74 |
75 | ## 10. [散列](http://ifeve.com/google-guava-hashing/)[Hash]
76 |
77 | 提供比`Object.hashCode()`更复杂的散列实现,并提供布鲁姆过滤器的实现
78 |
79 | ## 11. [事件总线](http://ifeve.com/google-guava-eventbus/)[EventBus]
80 |
81 | 发布-订阅模式的组件通信,但组件不需要显式地注册到其他组件中
82 |
83 | ## 12. [数学运算](http://ifeve.com/google-guava-math/)[Math]
84 |
85 | 优化的、充分测试的数学工具类
86 |
87 | ## 13. [反射](http://ifeve.com/guava-reflection/)[Reflection]
88 |
89 | Guava 的 Java 反射机制工具类
--------------------------------------------------------------------------------
/第11章 新特性/Java8的十大新特性.md:
--------------------------------------------------------------------------------
1 | Java 8可谓是自Java 5以来最具革命性的版本了,她在语言、编译器、类库、开发工具以及Java虚拟机等方面都带来了不少新特性。我们来一一回顾一下这些特性。
2 |
3 | **一、Lambda表达式**
4 |
5 | Lambda表达式可以说是Java 8最大的卖点,她将函数式编程引入了Java。Lambda允许把函数作为一个方法的参数,或者把代码看成数据。
6 |
7 | 一个Lambda表达式可以由用逗号分隔的参数列表、–>符号与函数体三部分表示。例如:
8 |
9 | Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );
10 |
11 | 1 Arrays.asList( "p", "k", "u","f", "o", "r","k").forEach( e -> System.out.println( e ) );
12 |
13 | 为了使现有函数更好的支持Lambda表达式,Java 8引入了函数式接口的概念。函数式接口就是只有一个方法的普通接口。java.lang.Runnable与java.util.concurrent.Callable是函数式接口最典型的例子。为此,Java 8增加了一种特殊的注解@FunctionalInterface:
14 |
15 | ```
16 | 1 @FunctionalInterface
17 | 2 public interface Functional {
18 | 3 void method();
19 | 4 }
20 | ```
21 |
22 | **二、接口的默认方法与静态方法**
23 |
24 | 我们可以在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。例如:
25 |
26 | ```
27 | 1 public interface DefaultFunctionInterface {
28 | 2 default String defaultFunction() {
29 | 3 return "default function";
30 | 4 }
31 | 5 }
32 | ```
33 |
34 | 我们还可以在接口中定义静态方法,使用static关键字,也可以提供实现。例如:
35 |
36 | ```
37 | 1 public interface StaticFunctionInterface {
38 | 2 static String staticFunction() {
39 | 3 return "static function";
40 | 4 }
41 | 5 }
42 | ```
43 |
44 | 接口的默认方法和静态方法的引入,其实可以认为引入了C++中抽象类的理念,以后我们再也不用在每个实现类中都写重复的代码了。
45 |
46 | **三、方法引用**
47 |
48 | 通常与Lambda表达式联合使用,可以直接引用已有Java类或对象的方法。一般有四种不同的方法引用:
49 |
50 | 1. 构造器引用。语法是Class::new,或者更一般的Class< T >::new,要求构造器方法是没有参数;
51 | 2. 静态方法引用。语法是Class::static_method,要求接受一个Class类型的参数;
52 | 3. 特定类的任意对象方法引用。它的语法是Class::method。要求方法是没有参数的;
53 | 4. 特定对象的方法引用,它的语法是instance::method。要求方法接受一个参数,与3不同的地方在于,3是在列表元素上分别调用方法,而4是在某个对象上调用方法,将列表元素作为参数传入;
54 |
55 | **四、重复注解**
56 |
57 | 在Java 5中使用注解有一个限制,即相同的注解在同一位置只能声明一次。Java 8引入重复注解,这样相同的注解在同一地方也可以声明多次。重复注解机制本身需要用@Repeatable注解。Java 8在编译器层做了优化,相同注解会以集合的方式保存,因此底层的原理并没有变化。
58 |
59 | **五、扩展注解的支持**
60 |
61 | Java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。
62 |
63 | **六、Optional**
64 |
65 | Java 8引入Optional类来防止空指针异常,Optional类最先是由Google的Guava项目引入的。Optional类实际上是个容器:它可以保存类型T的值,或者保存null。使用Optional类我们就不用显式进行空指针检查了。
66 |
67 | **七、Stream**
68 |
69 | Stream API是把真正的函数式编程风格引入到Java中。其实简单来说可以把Stream理解为MapReduce,当然Google的MapReduce的灵感也是来自函数式编程。她其实是一连串支持连续、并行聚集操作的元素。从语法上看,也很像linux的管道、或者链式编程,代码写起来简洁明了,非常酷帅!
70 |
71 | **八、Date/Time API (JSR 310)**
72 |
73 | Java 8新的Date-Time API (JSR 310)受Joda-Time的影响,提供了新的java.time包,可以用来替代 java.util.Date和java.util.Calendar。一般会用到Clock、LocaleDate、LocalTime、LocaleDateTime、ZonedDateTime、Duration这些类,对于时间日期的改进还是非常不错的。
74 |
75 | **九、JavaScript引擎Nashorn**
76 |
77 | Nashorn允许在JVM上开发运行JavaScript应用,允许Java与JavaScript相互调用。
78 |
79 | **十、Base64**
80 |
81 | 在Java 8中,Base64编码成为了Java类库的标准。Base64类同时还提供了对URL、MIME友好的编码器与解码器。
82 |
83 | 除了这十大新特性之外,还有另外的一些新特性:
84 |
85 | - **更好的类型推测机制**:Java 8在类型推测方面有了很大的提高,这就使代码更整洁,不需要太多的强制类型转换了。
86 | - **编译器优化**:Java 8将方法的参数名加入了字节码中,这样在运行时通过反射就能获取到参数名,只需要在编译时使用-parameters参数。
87 | - **并行(parallel)数组**:支持对数组进行并行处理,主要是parallelSort()方法,它可以在多核机器上极大提高数组排序的速度。
88 | - **并发(Concurrency)**:在新增Stream机制与Lambda的基础之上,加入了一些新方法来支持聚集操作。
89 | - **Nashorn引擎jjs**:基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。
90 | - **类依赖分析器jdeps**:可以显示Java类的包级别或类级别的依赖。
91 | - **JVM的PermGen空间被移除**:取代它的是Metaspace(JEP 122)。
92 |
93 | Java 8是一次变化巨大的更新,耗费了工程师大量的时间,还借鉴了很多其它语言和类库。我们无法在这里一一详细列举,以后有机会一定给大家详细解读一下。
--------------------------------------------------------------------------------
/第11章 新特性/Lambda表达式.md:
--------------------------------------------------------------------------------
1 | ## Lambda表达式
2 |
3 | Lambda表达式本质上是一种匿名方法,将代码块作为函数参数,函数式接口,相当于一个匿名方法,主要作用是代替匿名内部类的烦琐语法。
4 |
5 | Lambda表达式有三部分组成
6 |
7 | - 形参列表。可以自动类型推导,可以省略参数类型。只有一个参数,可以省略形参列表的()
8 | - 箭头(->)
9 | - 代码块{},代码块只有一条语句,可以省略{};代码块只有一条return语句,可以省略return关键字。
10 |
11 | 只有一个抽象方法的接口(函数式接口),都可以使用Lambda表达式的写法。
12 |
13 | ```java
14 | public interface MyListener{
15 | String doSomething(String a, int b);
16 | }
17 | MyListener listener = (String a, int b)->{
18 | String ret = a + b;
19 | return ret;
20 | }
21 | // 自动类型推断
22 | MyListener listener = (a, b)->{
23 | String ret = a + b;
24 | return ret;
25 | }
26 | ```
27 |
28 | ## 函数式接口
29 |
30 | 函数式接口代表只包含一个抽象方法的接口,函数式接口可以包含多个默认方法,类方法,但只能声明一个抽象方法。
31 |
32 | Lambda表达式的结果就是被当成对象。
33 |
34 |
--------------------------------------------------------------------------------
/第11章 新特性/README.md:
--------------------------------------------------------------------------------
1 | ## 第11章 新特性
2 |
3 | - [JDK新特性](第11章 新特性/JDK新特性.md)
4 | - [泛型基础1](第11章 新特性/泛型基础1.md)
5 | - [泛型基础2](第11章 新特性/泛型基础2.md)
6 | - [泛型封装](第11章 新特性/泛型封装.md)
7 | - [你应该更新的Java知识](第11章 新特性/你应该更新的Java知识.md)
8 | - [你应该更新的Java知识之常用程序库1](第11章 新特性/你应该更新的Java知识之常用程序库1.md)
9 | - [你应该更新的Java知识之常用程序库2](第11章 新特性/你应该更新的Java知识之常用程序库2.md)
10 | - [你应该更新的Java知识之Observer](第11章 新特性/你应该更新的Java知识之Observer.md)
11 | - [Google Guava官方教程](第11章 新特性/Google Guava官方教程.md)
12 | - [Java 代码性能优化](第11章 新特性/Java 代码性能优化.md)
--------------------------------------------------------------------------------
/第11章 新特性/你应该更新的Java知识.md:
--------------------------------------------------------------------------------
1 | [你应该更新的Java知识之常用程序库(一)](http://www.blogbus.com/dreamhead-logs/226738702.html)
2 |
3 | [你应该更新的Java知识之常用程序库(二)](http://www.blogbus.com/dreamhead-logs/226738756.html)
4 |
5 | [你应该更新的Java知识之构建工具](http://www.blogbus.com/dreamhead-logs/227427912.html)
6 |
7 | [你应该更新的Java知识之Observer](http://www.blogbus.com/dreamhead-logs/231594181.html)
8 |
9 | [你应该更新的Java知识之集合初始化](http://www.blogbus.com/dreamhead-logs/232899025.html)
10 |
11 | [你应该更新的Java知识之集合操作](http://www.blogbus.com/dreamhead-logs/234113759.html)
12 |
13 | [你应该更新的Java知识之惰性求值](http://www.blogbus.com/dreamhead-logs/234741366.html)
14 |
15 | [你应该更新的Java知识之Optional](http://www.blogbus.com/dreamhead-logs/235329092.html)
16 |
17 | [你应该更新的Java知识之Optional高级用法](http://www.blogbus.com/dreamhead-logs/235334714.html)
18 |
19 | 在传统的Java里,为了表示一个集合,我们常常会写出这样的代码:
20 |
21 | ```java
22 | public class People {
23 | private List people;
24 |
25 | public void setPeople(List people) {
26 | this.people = people;
27 | }
28 |
29 | public List getPeople() {
30 | return this.people;
31 | }
32 | ...
33 | }
34 | ```
35 |
36 | 严格说来,这样的代码存在缺陷。虽然貌似List被封装到People里,但实际上,这个List的引用却暴露在外面,这个类的用户可以轻松地拿到List的引用,随意修改。所以,下面是一种更严谨的写法:
37 |
38 | ```java
39 | public class People {
40 | private List people;
41 |
42 | public void setPeople(List people) {
43 | this.people.addAll(people);
44 | }
45 |
46 | @SuppressWarnings("unchecked")
47 | public List getPeople() {
48 | return (List)this.people.clone();
49 | }
50 |
51 | ...
52 | }
53 | ```
54 |
55 | 这里的做法基本思路是,做一个副本,保证内部引用(这里的people)不会传播到外面。但在实际编写代码的时候,大多数人都不会这么做,能否意识到这样的问题只是一个方面,这样的代码写起来,也要比原来的那种写法麻烦得多。按照许多公司的做法,这种要求只能放到代码规范里,但无论如何,在程序世界里,人为规定永远是最容易忽略的约定。
56 |
57 | 不过,在真实世界中,即便是我们写的只是上面的最简单那种形式,却很少出现问题。原因何在呢?因为大多数情况下,我们编写这样程序的时候,会有一种隐形的约定,这个“List”是不变的。我们设置(set)完这个List之后,基本上不会留着它的引用在做任何操作;而得到(get)它之后,也基本上不会去修改它。
58 |
59 | 在这种情况下,我们使用的实际上是一个不变的List。既然是一个不变的List,那不如就更直接地把它表现出来。
60 |
61 | Guava为我们提供了不变集合的概念,对应着各种具体类型,有ImmutableList、ImmutableSet,还有ImmutableMap。从名字上,我们不难看出它们的用法。
62 |
63 | Guava不变集合的做法并不是另起炉灶,而是遵循了Java已有集合框架的约定。比如,通过查阅文档,我们不难发现,ImmutableList就是一个List,只不过使用这个“List”,只不过,当我们尝试调用诸如add、set之类试图修改集合的方法时,它会抛出异常。正是有了这样的基础,不变集合可以和很多已有的类库、框架配合在一起。
64 |
65 | 有了这个基础,我们把不变集合的概念应用于之前的代码,它就是下面这个样子:
66 |
67 | ```java
68 | public class People {
69 | private ImmutableList people;
70 |
71 | public void setPeople(ImmutableList people) {
72 | this.people = people;
73 | }
74 |
75 | public ImmutableList getPeople() {
76 | return this.people;
77 | }
78 | ...
79 | }
80 | ```
81 |
82 | 这样一来,代码依然很简单,但是,意义却与从前完全不一样了。我们不必再为可能存在的隐忧顾虑了:一旦元素放到集合里,就不可能修改它了,因为它是不可变的。
83 |
84 | 对于使用这段代码的人来说,getter自不必说,如往常一样使用,setter也不费力。只是当做字面量使用的集合,我们已经在《你应该更新的Java知识之集合初始化》中讨论过了。如果要适配于现有程序库,把一个已有的List转成ImmutableList也不复杂,一个简单的copyOf方法就可以实现
85 |
86 | ```java
87 | List existingPeople = ...
88 | ImmutableList immutablePeople = copyOf(existingPeople);
89 | ```
90 |
91 | 为了让讨论更完整,这里不得不提到另外一个不变接口的选择:Iterable。它是从Java 5开始进入JDK的一个接口:
92 |
93 | ```java
94 | public interface Iterable {
95 | Iterator iterator();
96 | }
97 | ```
98 |
99 | 作为一个Java程序员,我们对Iterator简直再熟悉不过了,有了Iterator,我们就可以遍历一个集合。所以,在一些情况下,我们也可以使用Iterable表示一个不变集合。大多数Java已有的集合类都实现了这个接口。
100 |
101 | 既然它是JDK里的东西,为什么不把它优先推荐呢?原因有几个。最重要的一个原因在于我们熟知的Iterator,它有一个方法叫做remove,可能大多数Java程序员已经习惯性地忽略了这个方法,但它就在哪里,它是一个可以“改变”集合的方法,所以,从语义上说,它不是一个很好的选择。另外,从已有的代码习惯来说,很多程序员还是很喜欢用List、Set作为接口,所以,ImmutableList从心理上来说,更接近已有的习惯。剩下的一个点似乎不那么重要,有些代码真的需要使用到特定类型的接口。不过,就大多数代码而言,我们只是要得到的一个集合,做一些操作,而这些操作我们在《你应该更新的Java知识之集合操作》中做了一些讨论。
102 |
103 | 在函数式编程中,不变是提升程序稳定性一个很重要的概念。既然我们大多数情况下实际用到的是不变集合,那就不妨直接把它表现出来。
104 |
105 | > 原文链接:http://www.blogbus.com/dreamhead-logs/236028457.html
--------------------------------------------------------------------------------
/第11章 新特性/你应该更新的Java知识之Observer.md:
--------------------------------------------------------------------------------
1 | 作为一个Java程序员,不熟悉设计模式简直不好意思和人打招呼,而Observer模式可以说是位列最常用的设计模式之列,虽然有时候在具体代码里,它不一定叫这个名字,比如改头换面叫个Listener,但模式就是这个模式。
2 |
3 | 手工实现一个Observer也不是多复杂的一件事,只是因为这个设计模式实在太常用了,Java就把它放到了JDK里面:[Observable](http://docs.oracle.com/javase/6/docs/api/java/util/Observable.html)和[Observer](http://docs.oracle.com/javase/6/docs/api/java/util/Observer.html),从JDK 1.0里,它们就一直在那里。从某种程度上说,它简化了Observer模式的开发,至少我们不用再手工维护自己的Observer列表了。
4 |
5 | 不过,如前所述,JDK里的Observer从1.0就在那里了,直到Java 7,它都没有什么改变,就连通知的参数还是Object类型。要知道,Java 5就已经泛型了。Java 5是一次大规模的语法调整,许多程序库从那开始重新设计了API,使其更简洁易用。当然,那些不做应对的程序库,多半也就过时了。这也就是这里要讨论知识更新的原因所在。
6 |
7 | 今天,对于普通的应用,如果要使用Observer模式该如何做呢?答案是[Guava](https://code.google.com/p/guava-libraries/)的[EventBus](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/eventbus/EventBus.html)。如你所见,它的名字并没有直接告诉你它是一个Observer,但这有什么关系呢,Listener不也是这样。
8 |
9 | 首先,我们声明一个Observer:
10 | ```java
11 | public class EventObserver {
12 | @Subscribe public void onMessage(Message message) {
13 | ...
14 | }
15 | }
16 | ```
17 | 你会发现,这个类并没有继承任何接口,只是在用来响应通知的方法上声明了一个@Subscribe。
18 |
19 | 使用EventBus很简单,先声明一个
20 | ```java
21 | EventBus eventBus = new EventBus();
22 | ```
23 | 然后,把我们写好的Observer注册进去:
24 | ```java
25 | eventBus.register(new EventObserver());
26 | ```
27 | 当要通知Observer时,我们只要这样即可:
28 | ```java
29 | eventBus.post(message);
30 | ```
31 | 这里,我们并没有告诉EventBus,我们要处理的是一个Message类型,只是在EventObserver的onMessage方法的接口声明上使用了这个类型而已。但是,当我们把消息发送出去的时候,它会根据类型进行匹配,保证我们的消息正确地发送到对应的地方。
32 |
33 | 相比于JDK原有的实现,这个实现会更简单。EventObserver不再需要存在一个继承体系中,而继承总是一种枷锁,把我们套牢在一个体系之中:
34 |
35 | - 我们不必遵循一个特定的名字,比如Observer的[update](http://docs.oracle.com/javase/6/docs/api/java/util/Observer.html#update(java.util.Observable,%20java.lang.Object)),而这里的名字onMessage是我们自己起的。
36 | - 我们不必遵循特定的类型,比如update方法中作为被观察对象Observable和作为参数的Object,而是根据我们自己的需求选择的类型。
37 |
38 | 这种变换让静态类型的Java语言,有了一些动态类型的特质,也让程序更加灵活。这种灵活性多半要归功于Annotation,它在很大程度上影响了Java的程序设计风格。
39 |
40 | 除了标准的EventBus,Guava还提供了另外一个[AsyncEventBus](http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/eventbus/AsyncEventBus.html),从名字就可以看出,这是一个异步的EventBus,也就是说,消息扔给它之后,会立即返回,至于Observer什么时候处理,那就是它的事情了。
41 |
42 | 如果你想更多地了解EventBus,那Guava的[官方文档](https://code.google.com/p/guava-libraries/wiki/EventBusExplained)是个不错的去处。
--------------------------------------------------------------------------------
/第11章 新特性/你应该更新的Java知识之常用程序库1.md:
--------------------------------------------------------------------------------
1 | 在很多人眼中,Java已经是一门垂垂老矣的语言,但并不妨碍Java世界依然在前进。如果你曾离开Java,云游于其它世界,或是每日只在遗留代码中挣扎,或许是时候抬起头,看看老Java中的新东西。
2 |
3 | **Guava**
4 |
5 | 一句话,只要你做Java项目,就应该用[Guava](https://code.google.com/p/guava-libraries/)。
6 |
7 | guava是Google出品的一套Java核心库,在我看来,它甚至应该是JDK的一部分。作为一个Java程序员,如果你没抱怨过JDK的设计,只能说明一点,你写得程序还是太少。正是JDK设计不彰,才有了一些项目来补充JDK的不足。如果说老Java程序员应该听说过[Apache Commons Lang](http://commons.apache.org/lang/),那新Java程序员该知道的就是Guava了。
8 |
9 | 老Java程序员更多的是知道Google Collections,不妨到[它的主页](http://code.google.com/p/google-collections/)上走一遭,你会看到这个库已经改名为Guava。事实上,Guava并不直接等于Google Collections,Guava是一个超集。Guava实在太强大了,要想展现它的强大,需要专门的介绍,这里就不展开了。
10 |
11 | 下面以一个统计单词出现个数的小程序作为这个段落的结尾,虽然无法与许多其它语言的实现相提并论,但作为一个Java程序员,你不妨想一下按照传统方式,这段代码应该是什么样子。
12 |
13 | ```java
14 | String content = Files.toString(new File(args[0]), Charset.defaultCharset());
15 | Iterable texts = Splitter.on(CharMatcher.WHITESPACE)
16 | .omitEmptyStrings()
17 | .trimResults()
18 | .split(content);
19 | Multiset collection = HashMultiset.create(texts);
20 | ```
21 |
22 | **Joda Time**
23 |
24 | 你觉得一个API设计得差到什么份上,才会把自己差不多的API全部Deprecated掉。java.util.Date便是这样的奇葩。因为它的API几乎都是反直觉的,几乎所有敢于用它的Java程序员都吃过它的亏。想初始化个2013年的第一天,还真不那么容易:
25 |
26 | Date firstDayOf2013 = new Date(113, 0, 1);
27 |
28 | 如果你是个Java新手,你能猜出113是从哪来的吗?(好吧,它是2013-1900,至于为什么是1900,这真得问API的设计者了)。
29 |
30 | [Joda Time](http://joda-time.sourceforge.net/)就是人们实在无法忍受这样东西的产物。同样的代码用Joda Time实现:
31 |
32 | `DateTime firstDayOf2013 = new DateTime().withDate(2013, 1, 1);`
33 |
34 | 无论如何,你知道这能看出这些参数的含义了。不只如此,你还可以计算两天后是什么日子:
35 |
36 | `firstDate.plusDays(2);`
37 |
38 | 日期格式化,也是JDK Date系列API里一大特色,你必须把代码写成下面这样:
39 |
40 | `new SimpleDateFormat("yyyy.MM.dd").format(firstDayOf2013)`
41 |
42 | 作为一个初始化很慢的构造函数,你还必须每次调用,因为它不是线程安全的。同样的代码,在Joda Time里,我们可以用
43 |
44 | ```java
45 | DateTimeFormatter:
46 | DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy.MM.dd");
47 | ...
48 | formatter.print(dateTime);
49 | ```
50 |
51 | 请尽管放心大胆把formatter声明成一个字段,因为它是线程安全的。
52 |
53 | 当然,Joda Time的强大远不止于此。当然,JDK也并不是那么完全的自暴自弃,于是,有了一个JSR 310专门设计新的Date API。JSR 310的spec lead是[Steven Colebourne](http://www.blogger.com/profile/01454237967846880639),此人正是Joda Time的作者。不过,虽然JSR 310为我们描绘了Date的全新景象,但Java 8出来之前就先别打它的主意了,乖乖地用Joda Time吧。
54 |
55 | > 原文链接:http://www.blogbus.com/dreamhead-logs/226738702.html
--------------------------------------------------------------------------------
/第11章 新特性/你应该更新的Java知识之常用程序库2.md:
--------------------------------------------------------------------------------
1 | ## Hamcrest
2 |
3 | 一句话,如果你写单元测试,就应该用[Hamcrest](http://hamcrest.org/)。
4 |
5 | 如今不写单元测试,你都不好意思说自己在做工程项目了。但你一般这么写断言呢?如果你还写成下面这样,我只能说你落伍了:
6 |
7 | ```
8 | assertEquals(a, b);
9 | ```
10 |
11 | 请告诉我,哪个是执行结果,哪个是预期结果,不管你是怎样,反正大多数情况下,我是记不住的。所以,这个在只重功能不重可读性年代产生的API该更新了。于是,Hamcrest就是为了解决这样的问题而生的。
12 | ```
13 | assertThat(a, is(b));
14 | ```
15 | 很明显,前面一个是执行结果,后面一个是预期结果,当然这只是一个简单的例子。由于Hamcrest引入了matcher的概念(就是你看到的is部分),我们可以进行更多的组合:
16 |
17 | ```java
18 | assertThat(number, greaterThan(5));
19 | assertThat(text, startsWith("Hello"));
20 | assertThat(array, hasItem("World"));
21 | ```
22 |
23 | Hamcrest如此好用,以至于JUnit已经将其吸纳进去。如果你现在用的JUnit是4.4之后的版本,那你已经有了Hamcrest。无需额外的配置,就可以拿过来用。
24 |
25 | ## Mockito
26 |
27 | 写单元测试不用Mock框架几乎是一件不可能的事,我是说Mock框架,不是Mock模式哦!对于老Java程序员来说,提起Mock框架,率先在脑海中撞线的多半是[JMock](http://jmock.org/)或[EasyMock](http://www.easymock.org/)。
28 |
29 | 使用[Mockito](http://code.google.com/p/mockito/),只要有一个理由就够了,简单。相比于JMock,它不用写checking,相比于EasyMock,它省去了replay。下面是个例子:
30 |
31 | ```java
32 | List mockedList = mock(List.class);
33 | when(mockedList.get(0)).thenReturn("first");
34 | System.out.println(mockedList.get(0));
35 | ```
36 |
37 | 当然,[Mockito还是非常强大的](http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html)。
38 |
39 | 最后再强调一遍,无论使用哪个框架,请尽量不要使用verify,也就是传说中的Mock模式,那是把代码拉入泥潭的开始。
40 |
41 | ## SLF4J和Logback
42 |
43 | 日志几乎是稍微有点规模的项目躲不开的一个东西,如果你是个老Java程序员,你必然知道[Log4J](http://logging.apache.org/log4j/),多半也知道[Commons Logging](http://commons.apache.org/logging/)。是时候把它们扔掉了,因为有[SLF4J](http://www.slf4j.org/)和[Logback](http://logback.qos.ch/)了。SLF4J要替代Commons Logging,而Logback的目标是Log4J。
44 |
45 | 程序员里愤青多,SLF4J和Logback的作者就是一个,他叫[Ceki Gülcü](http://ceki.blogspot.com/),事实上,他也是Log4J的作者。Log4J的开发状态实在让他太不爽了,于是,他另起炉灶,打造出新的替代品。
46 |
47 | 只凭一点就足以让我们对SLF4J义无反顾了,你还记得用Commons Logging写出这样的代码吗?
48 |
49 | ```java
50 | if (logger.debugEnable()) {
51 |
52 | logger.debug("Hello, ", name);
53 |
54 | }
55 | ```
56 |
57 | 而SLF4J的写法只有一句话:
58 |
59 | ```java
60 | logger.debug("Hello, {}", name);
61 | ```
62 |
63 | 从根源来说,这是时代造成的,Commons Logging是Java 5之前产生的,那时候还没有变参,所以,我们不得不说,它老了。
64 |
65 | 至于Logback,性能是最重要的噱头,当然,还有[一些其它的理由](http://logback.qos.ch/reasonsToSwitch.html)。理由里有一点并未提及,但对于开发人员很贴心的改进,就是日志模式的改进,还记得Log4J那密码一样的日志模式吗?
66 |
67 | ```
68 | %d{dd MMM yyyy HH:mm:ss} [%t] %-5p %m%n
69 | ```
70 |
71 | 下面是Logback的版本,不用查文档,我也看出每段表示的都是什么:
72 |
73 | ```
74 | %d{dd MMM yyyy HH:mm:ss} [%thread] %-5level %msg%n
75 | ```
76 |
77 | 这里介绍的几个程序库都是很通用的,无论是你做怎样的开发,应该都或多或少给你一些帮助。时间未曾停步,Java开发也未曾停留,如果你是个老Java程序员,是时候更新一下自己的知识了。
--------------------------------------------------------------------------------
/第12章 内存管理/README.md:
--------------------------------------------------------------------------------
1 | ## 第12章 内存管理
2 |
3 | * [JVM 内存模型 Stack Heap](JVM 内存模型 Stack Heap.md)
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存10.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存2.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存3.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存4.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存5.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存6.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存7.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存8.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存9.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/jvm内存区域.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/jvm内存区域.png
--------------------------------------------------------------------------------
/第12章 内存管理/images/运行时数据区.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第12章 内存管理/images/运行时数据区.png
--------------------------------------------------------------------------------
/第13章 GUI/README.md:
--------------------------------------------------------------------------------
1 | ## JFrame
2 |
3 | 窗口
4 |
5 | | 方法声明 | 功能描述 |
6 | | -------------------------- | ---------------------------------------- |
7 | | setSize() | |
8 | | setPreferredSize() | |
9 | | setResizable() | |
10 | | setDefaultCloseOperation() | |
11 | | setVisible() | |
12 | | setContentPane() | |
13 | | pack() | 在setResizable(false)后进行pack(),防止在Windows下系统修改frame的尺寸 |
14 | | repaint() | |
15 | | addKeyListener() | |
16 | | addMouseListener() | |
17 |
18 | ## JPanel
19 |
20 | 面板
21 |
22 | | 方法声明 | 功能描述 |
23 | | ------------------ | ---- |
24 | | paintComponent() | |
25 | | getPreferredSize() | |
26 |
27 | ## Graphics
28 |
29 | | 方法声明 | 功能描述 |
30 | | ---------- | ---- |
31 | | drawOval() | |
32 |
33 | ### Graphics2D
34 |
35 | | 方法声明 | 功能描述 |
36 | | ------------------- | ---- |
37 | | setStroke() | |
38 | | setColor() | |
39 | | draw() | |
40 | | fill() | |
41 | | addRenderingHints() | |
42 | | drawImage() | |
43 | | drawString() | |
44 | | getFontMetrics() | |
45 |
46 | - Ellipse2D
47 | - BasicStroke
48 | - RenderingHints 抗锯齿
49 | - put()
50 | - FontMetrics
51 | - ImageIcon
52 |
53 | ## Dimension
54 |
55 | ## KeyAdapter
56 |
57 | 键盘事件监听
58 |
59 | | 方法声明 | 功能描述 |
60 | | ----------- | ---- |
61 | | keyReleased | |
62 |
63 | - KeyEvent
64 |
65 | ## MouseAdapter
66 |
67 | 鼠标事件监听
68 |
69 | ## EventQueue
70 |
71 | - invokeLater()
--------------------------------------------------------------------------------
/第1章 Java开发入门/JDK、JRE、JVM的区别与联系.md:
--------------------------------------------------------------------------------
1 | # 1. 详细介绍
2 |
3 | ## 1.1 JVM -- java virtual machine
4 |
5 | JVM就是我们常说的java虚拟机,它是整个java实现跨平台的 最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可 以在虚拟机上执行,也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解 释给本地系统执行。
6 |
7 | JVM 是 Java 平台的基础,和实际的机器一样,它也有自己的指令集,并且在运行 时操作不同的内存区域。 JVM 通过抽象操作系统和 CPU 结构,提供了一种与平台无关的代码执行方法,即与特殊的实现方 法、主机硬件、主机操作系统无关。但是在一些小的方面, JVM 的实现也是互不相同的,比如垃圾回收 算法,线程调度算法(可能不同 OS 有不同的实现)。
8 |
9 | JVM 的主要工作是解释自己的指令集(即字节码)到 CPU 的指令集或 OS 的系统调用,保护用户免被恶意程序骚扰。 JVM 对上层的 Java 源文件是不关心的,它关注的只是由源文件生成的类文件( class file )。类文件的 组成包括 JVM 指令集,符号表以及一些补助信息。
10 |
11 | 
12 |
13 | 
14 |
15 | 
16 |
17 | ## 1.2 JRE -- java runtime environment
18 |
19 | JRE是指java运行环境。光有JVM还不能成class的 执行,因为在解释class的时候JVM需要调用解释所需要的类库lib。 在JDK的安装目 录里你可以找到jre目录,里面有两个文件夹bin和lib,在 这里可以认为bin里的就是jvm,lib中则是jvm工 作所需要的类库,而jvm和 lib和起来就称为jre。所以,在你写完java程序编译成.class之后,你可以把这个.class文件 和jre一起打包发给朋友,这样你的朋友就 可以运行你写程序了。(jre里有运行.class的java.exe)
20 |
21 | JRE 是 Sun 公司发布的一个更大的系统,它里面就有一个 JVM 。 JRE 就与具体的 CPU 结构和操作系统有关,我们从 Sun 下载 JRE 的时候就看到了不同的各种版本。同 JVM 一起组成 JRE 的还有一些 API (如 awt , swing 等)。 JRE 是运行 Java 程序必不可少的。
22 |
23 | JRE ( Java Runtime Environment ),是运行 Java 程序必不可少的(除非用其他一些编译环境编译成.exe可执行文件……),JRE的 地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮 我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。
24 |
25 | JRE里面有一个 JVM , JRE 与具体的 CPU 结构和操作系统有关,我们从 Sun 下载 JRE 的时候就看到了不同的各种版本,,同 JVM 一起组成 JRE 的还有 一些 API (如 awt , swing 等), JRE 是 运行 Java 程序必不可少的.
26 |
27 |
28 | ## 1.3 JDK -- java development kit
29 |
30 | JDK是java开发工具包,基本上每个学java的人都会先在机器 上装一个JDK,那他都包含哪几部分呢?让我们看一下JDK的安装目录。在目录下面有 六个文件夹、一个src类库源码压缩包、和其他几个声明文件。其中,真正在运行java时起作用的 是以下四个文件夹:bin、include、lib、 jre。现在我们可以看出这样一个关系,JDK包含JRE,而JRE包 含JVM。
31 |
32 |
33 | - bin:最主要的是编译器(javac.exe)
34 | - include:java和JVM交互用的头文件
35 | - lib:类库
36 | - jre:java运行环境
37 |
38 | 注意:这里的bin、lib文件夹和jre里的bin、lib是 不同的,总的来说JDK是用于java程序的开发,而jre则 是只能运行class而没有编译的功能。eclipse、idea等 其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时你会发现他们只要求你 选中jre路径就ok了。
39 |
40 | # 2. 三者联系
41 |
42 | 
43 |
44 | Java 喊出的带有标志性的口号“ Write Once , Run Anywhere (一次编写,到处运行)”,正是建立在 JRE 的基础之上。何以实现?就是在 Java 应用程序和操作系统之间增加了一虚拟层—— JRE 。
45 |
46 | 程序源代码不是直 接编译、链接成机器代码,而是先转化到字节码( bytecode ) 这种特殊的中间形式,字节码再转换成机器码或系统调用。前者是传统的编译方法,生成的机器代码就不可避免地跟特殊的操作系统和特殊的机器结构相关。
47 |
48 | 而 Java 程序的字节码文件可以放到任意装有 JRE 的计算机运行,再由不同 JRE 的将它们转化成相应的机器代码,这就实现了 Java 程序的可移植性。这样程序员也不用去关心程序运行的具体环境,而可以专心编写软件。这种分层抽象、隐藏细节的思想在计算机科学中处处可见,比如机器组织结构的设计、网络协议的实现等。 Pascal 语言的发明者 Niklaus Wirth ,就富有预见性地指出应该有这样一种可移植的语言,其生成的中间代码可以在一台假想的机器( a hypothetical machine )上运行。
49 |
50 | 而 Java 虚拟机( Java virtual machine 或 JVM )就是这样的一台机器,它模拟实际处理器的结构,解释字节码。 怎么一会说是 JRE ,一会儿又成了 JVM ,两者是否同物不同名? 回答是否定的。
51 |
52 | JRE的地位就象一台PC机一样,我们写好的Win32应用程序需要操作系统帮 我们运行,同样的,我们编写的Java程序也必须要JRE才能运行。
53 |
54 | 要运行Applet,在客户端必须安装有 JRE,即“运行时”,容易一点理解,就象所谓的“插件”,要开发JAVA应用程序\Web应用,就必须在服务器端安装相应的 JVM+JDK 了(开发应用 Java web应用 时,客户端不需要安装任何的JVM)
55 |
56 | 如果你使用JAVA开发应用,就需要安装 JRE+JDK,就是 J2SE
57 | 如果在客户端运行Applet,客户端浏览器必须嵌有JAVA JVM,如果没有,就需要安装,即:在客户端创建JRE(运行时,包含JVM),而客户端是不需要做开发的,所以,JDK就没有必要安装 了
58 |
59 | 不同版本的Applet在不同的JVM下可能无法正常运行,而Microsoft JVM只是Sun JVM的“低版本”,微软在windows xp/2003中干脆将JVM去掉了
--------------------------------------------------------------------------------
/第1章 Java开发入门/README.md:
--------------------------------------------------------------------------------
1 | ## 第1章 Java开发入门
2 |
3 | * [1.1 Java概述](Java概述.md)
4 | * [1.2 JDK、JRE、JVM的区别与联系](JDK、JRE、JVM的区别与联系.md)
5 |
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500701808153.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500701808153.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500701831703.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500701831703.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500701903102.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500701903102.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500701931483.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500701931483.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702002217.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702002217.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702034150.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702034150.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702052622.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702052622.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702103490.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702103490.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702206702.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702206702.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702230275.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702230275.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702273750.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702273750.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/1500702562133.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/1500702562133.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/compiler.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/compiler.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/javac.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/javac.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jdk1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jdk1.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jdk2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jdk2.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jdk3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jdk3.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jdk4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jdk4.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jvm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jvm.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jvm1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jvm1.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jvm2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jvm2.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/jvm3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/jvm3.png
--------------------------------------------------------------------------------
/第1章 Java开发入门/img/詹姆斯·高斯林.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第1章 Java开发入门/img/詹姆斯·高斯林.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/Java与指针.md:
--------------------------------------------------------------------------------
1 | ---
2 | typora-copy-images-to: images
3 | ---
4 |
5 | 尽管在Java中没有显式的使用指针并且也不允许程序员使用指针,而实际上对象的访问就是使用指针来实现的。一个对象会从实际的存储空间的某个位置开始占据一定数量的存储体。该对象的指针就是一个保存了对象的存储地址的变量,并且这个存储地址就是对象在存储空间中的起始地址。在许多高级语言中指针是一种数据类型,而在Java中是使用对象的引用来替代的。
6 |
7 | 考虑前面我们定义的People类,以及下列语句:
8 |
9 | ```java
10 | People p = null; q = new People("Jack","0001");
11 | ```
12 |
13 | 这里创建了两个对于对象引用的变量p和q。变量p初始化为null,null是一个空指针,它不指向任何地方,也就是它不指向任何类的对象,因此null可以赋值给任何类的对象的引用。变量q是一个对于People类的实例的引用,操作符new的作用实际上是为对象开辟足够的内存空间,而引用p是指向这一内存空间地址的指针。
14 |
15 | 为此请读者考虑如下代码的运行结果:
16 |
17 | ```java
18 | People p1 = new People("David","0004");
19 | People p2 = p1;
20 | p2.setName("Denny");
21 | System.out.println(p1.getName());
22 | ```
23 |
24 | 这段代码中对People类的对象引用p2的name成员变量进行了设置,使其值为字符串"Denny"。但是我们会发现在输出p1的成员变量name时并不是输出"David",而是"Denny"。原因是p1与p2均是对对象的引用,在完成赋值语句" People p2 = p1; "后,p2与p1指向同一存储空间,因此对于p2的修改自然会影响到s1。通过图1-4可以清楚说明这段代码运行的情况。
25 |
26 | 
27 |
28 | 请读者继续考虑以下代码的运行结果:
29 |
30 | ```java
31 | People p1 = new People("David","0004");
32 | People p2 = new People("David","0004");
33 | System.out.println(p1= = p2);
34 | ```
35 |
36 | 在这里虽然p1与p2的所有成员变量的内容均相同,但是由于它们指向不同的存储空间,因此,输出语句输出的结果为false。图1-5说明了p1与p2的指向。
37 |
38 | 
39 |
40 | 可见如果我们希望完成对象的拷贝,使用一个简单的赋值语句是无法完成的。要达到这一目的可以通过实现Cloneable接口并重写clone方法来完成。如果我们希望判断两个对象引用是否一致时可以覆盖继承自Object类的equals方法来实现。
--------------------------------------------------------------------------------
/第2章 Java编程基础/README.md:
--------------------------------------------------------------------------------
1 | ## 第2章 Java编程基础
2 |
3 | - [Java语法基础-1](Java语法基础-1.md)
4 | - [Java语法基础-2](Java语法基础-2.md)
5 | - [基本数据类型包装类](基本数据类型包装类.md)
6 | - [阿里巴巴Java开发手册](阿里巴巴Java开发手册.md)
7 | - [阿里 Java 开发手册最新完美版,千锤百炼始出炉](阿里 Java 开发手册最新完美版,千锤百炼始出炉.md)
8 | - [Google Java编程风格指南](Google Java编程风格指南.md)
9 | - [详细介绍JAVA和C++区别](详细介绍JAVA和C++区别.md)
10 | - [什么是堆和栈,它们在哪儿?](什么是堆和栈,它们在哪儿?.md)
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/1502019084540.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/1502019084540.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/1502019174168.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/1502019174168.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/Java开发手册_1.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/Java开发手册_1.webp
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/Java开发手册_2.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/Java开发手册_2.webp
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/Java开发手册_3.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/Java开发手册_3.webp
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/Java开发手册_4.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/Java开发手册_4.webp
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/Java开发手册_5.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/Java开发手册_5.webp
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_01.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_02.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_03.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_04.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_05.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_06.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_07.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_08.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_09.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_10.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_11.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_12.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_13.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_14.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_15.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_16.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_17.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_18.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_19.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_20.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_21.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_22.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_23.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_24.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_25.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_26.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_27.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_28.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_28.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_29.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_29.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_30.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_30.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_31.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_31.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_32.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_33.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_33.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_34.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_35.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_35.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_36.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_36.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_37.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_37.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_38.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_38.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_39.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_39.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_40.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_40.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_41.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_41.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_42.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_42.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_43.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_43.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_44.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_44.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_basic_45.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_basic_45.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_01.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_02.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_03.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_04.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_05.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_06.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_07.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_08.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_09.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_10.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_11.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_12.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_13.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_14.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_15.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_16.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_17.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_18.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_19.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_20.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_21.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_22.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_23.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_23.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_24.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_24.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_25.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_25.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_26.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_26.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/images/java_book_27.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第2章 Java编程基础/images/java_book_27.png
--------------------------------------------------------------------------------
/第2章 Java编程基础/引用、指针和句柄的区别.md:
--------------------------------------------------------------------------------
1 | 句柄是一种特殊的[智能指针](http://baike.baidu.com/item/%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88) 。当一个应用程序要引用其他系统(如数据库、操作系统)所管理的内存块或对象时,就要使用句柄。
2 |
3 | 句柄与普通指针的区别在于,指针包含的是引用对象的内存地址,而句柄则是由系统所管理的引用标识,该标识可以被系统重新定位到一个内存地址上。这种间接访问对象的模式增强了系统对引用对象的控制。
4 |
5 | 句柄就是个数字,一般和当前系统下的整数的位数一样,比如32bit系统下就是4个字节。
6 | 这个数字是一个对象的唯一标示,和对象一一对应。
7 | 这个对象可以是一个块内存,一个资源,或者一个服务的context(如 socket,thread)等等。
8 | 这个数字的来源可以有很多中,只要能保证和它代表的对象保持唯一对应就可以,比如可以用内存地址,也可以用句柄表的序号,或者干脆用一个自增ID,再或者用以上的值去异或一个常数。
9 |
10 | 传统上操作系统内核和系统服务API都是 C 语言接口的,但是其内部设计理念上又是OO的,所以有对象概念却没有对应的语言语法支持。
11 | 句柄的作用就是在 C 语言环境下代替 C++ 的对象指针来用的。
12 | 创建句柄就是构造,销毁句柄就是析构,用句柄调用函数相当于传入this指针。
13 | 如果有系统API是 C++ 接口的,那么就没有句柄了,而是某个接口指针,IXXXPtr之类的,比如Windows的com ptr。
14 |
15 | ### 句柄和指针的区别
16 |
17 | 当把硬盘上的资源调入内存以后,将有一个句柄指向它,但是句柄只能指向一个资源。而且句柄知道所指的内存有多大。还有指针,指针指向地址,它不知道分配的内存有多大。
18 |
19 | 句柄是一个32位的整数,实际上是windows在内存中维护的一个对象(窗口等)内存物理地址列表的整数索引。因为windows的内存管理经常会将当前空闲对象的内存释放掉,当需要时访问再重新提交到物理存储,所以对象的物理地址是变化的,不允许程序直接通过物理地址来访问对象。程序将想访问的对象的句柄传递给系统,系统根据句柄检索自己维护的对象列表就能知道程序想访问的对象及其物理地址了。句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各个对象是驻留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象了。但是,如果真这么认为,那么就大错特错了。我们知道windows是一个虚拟内存为基础的[操作系统](http://lib.csdn.net/base/operatingsystem)。在这种情况下,windows内存管理器经常在内存中来回移动对象,以此来满足各种应用程序的内存需要,对象被移动意味着它的地址变化了。如果地址总是如此的变化,我们应该去那里找对象呢?为了解决这个问题,windows操作系统为各个应用程序腾出一些内存地址,用来专门登记各个应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。windows内存管理器移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需要记住这个句柄地址就可以间接地知道对象具体在内存中哪个位置了。这个地址是在对象装载(load)时由系统分配的,当系统卸载时又释放给系统。句柄地址(稳定)—–>记载着对象在内存中的地址——–>对象在内存中的地址(不稳定)—–>实际对象。但是必须注意,程序每次重新启动,系统不保证分配跟这个程序的句柄还是原来哪个句柄,而绝大多数情况下的确不一样。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院给我们的门票总是不同的座位是一个道理。
20 |
21 | 因此,句柄和指针其实是两个截然不同的概念。windows系统用句柄标记系统资源,用句柄隐藏系统信息。你只需要知道有这个东西,然后去调用它就行了,它是32bit的uint。指针则标记某个物理内存的地址,是不同的概念。
22 |
23 | 指针对应着一个数据在内存中的地址,得到了指针就可以自由地修改该数据。Windows并不希望一般程序修改其内部[数据结构](http://lib.csdn.net/base/datastructure),因为这样太不安全。所以Windows给每个使用GlobalAlloc等函数声明的内存区域指定一个句柄(本质上仍是一个指针,但不要直接操作它),平时你只是在调用API函数时利用这个句柄来说明要操作哪段内存。当你需要对某个内存进行直接操作时,可以使用GlobalLock锁住这段内存并获得指针来直接进行操作。
24 |
25 | 句柄是指针的“指针”,使用句柄主要是为了利于windows在进程内存地址空间移动分配的内存块,以防止进程的内存空间被撕的四分五裂而存在过多的碎片。
26 |
27 | 句柄是一些表的索引也就是指向指针的指针。间接的引用对象,windows可以修改对象的”物理”地址和?描述器的值,但是句柄的值是不变的。
28 |
29 | 句柄可以在获得窗口的时候使用,指针可以进行调用窗口,两个使用的地方不一样.一个括号外,一个括号内.
30 |
31 | ### 隐喻
32 |
33 | CSDN上有人说过:牧童遥指杏花村。
34 | 牧童的手为指针,杏花村的牌子为句柄,杏花村酒店为对象的实例.
35 | 句柄是资源在创建过程中由Windows赋予的,它就是代表这个资源的。
36 |
37 | 而指针实质上是某个变量或者对象所在内存位置的首地址,是指向对象的。
38 |
39 | 一个是指向,一个是代表,二者是不同的。
40 |
41 | 一个是直接找到对象(指针),一个是间接找到对象(句柄)。
42 |
43 | 例如,杏花村可以搬家(实际上程序运行过程中,资源在内存中的地址是变化的),那么牧童的手的指向也就不同(指针)了,然而即使搬了家,“杏花村”这块牌匾是不变的,通过打听“杏花村”这个名称,还是可以间接找到它的(地址)。
44 |
45 | HANDLE的本意是把柄,把手的意思,是你与操作系统打交道的东东。
46 |
47 | ### 指针与引用
48 |
49 | (1) 指针是对象在内存中的地址;
50 |
51 | (2) 引用是对象的别名,其实质就是功能受限但是安全性更高的指针;
52 |
53 | (3) 句柄是指针的指针,句柄实际上是一个数据,是一个Long (整长型)的数据。句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样。Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。
54 |
55 | ### 引用与指针的区别
56 |
57 | 常常有人问引用与指针的区别,可能是指针和引用在功能上的相似,而是他们混淆这两个概念, 现在总结以下二者的区别,希望大家能彻底弄清这两个概念根本性的差别:
58 |
59 | 引用,一个变量的别名,为什么引入别名呢?原因是我们想定义一个变量,他共享另一个变量的 内存空间,使用别名无疑是一个好的选择。变量是什么?是一个内存空间的名字,如果我们给这个 内存空间在起另外一个名字,那就是能够共享这个内存了,引用(别名)的由此而来。
60 |
61 | 指针,指向另一个内存空间的变量,我们可以通过它来索引另一个内存空间的内容,本身有自己的 内存空间。
62 |
63 | 二者区别:
64 |
65 | - 引用访问一个变量是直接访问,而指针是间接访问。
66 | - 引用是一个变量的别名,本身不单独分配自己的内存空间,而指针有自己的内存空间。
67 | - 引用在开始的时候就绑定到了一个内存空间(开始必须赋初值),所以他只能是这个 内存空间的名字,而不能改成其他的,当然可以改变这个内存空间的值.
68 |
69 | http://www.360doc.com/content/14/0120/15/7591436_346648771.shtml
70 |
71 | (1)指针是对象在内存中的地址;
72 |
73 | (2)引用是对象的别名,其实质就是功能受限但是安全性更高的指针;
74 |
75 | (3)句柄是指针的指针,句柄实际上是一个数据,是一个Long (整长型)的数据。句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样。Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。
76 |
77 | Java中有3个数据类型:基本数据类型、引用类型和null类型。其中,引用类型包括类类型(含数组)、接口类型。为了区别引用类型的变量标识符和基本数据类型变量标识符,我们特别的(特意的)使用Handle来称呼引用类型的变量标识符。对象的引用是创建对象时的返回值!引用是new表达式的返回值。new A(); 这里真正创建了一个对象,但我们没有用句柄去持有(hold、拿着、保存)该引用。handle是变量,reference是一种变量值。
--------------------------------------------------------------------------------
/第2章 Java编程基础/详细介绍JAVA和C++区别.md:
--------------------------------------------------------------------------------
1 | Java和C++都是面向对象语言。也就是说,它们都能够实现面向对象思想(封装,继承,多态)。而由于C++为了照顾大量的C语言使用者,而兼容了C,使得自身仅仅成为了带类的C语言,多多少少影响了其面向对象的彻底性!
2 |
3 | Java则是完全的面向对象语言,它句法更清晰,规模更小,更易学。它是在对多种程序设计语言进行了深入细致研究的基础上,据弃了其他语言的不足之处,从根本上解决了C++的固有缺陷。
4 |
5 | Java和C++的相似之处多于不同之处,但两种语言问几处主要的不同使得Java更容易学习,并且编程环境更为简单。
6 |
7 | 我在这里不能完全列出不同之处,仅列出比较显著的区别:
8 |
9 | ## 1. 指针
10 |
11 | Java语言让编程者无法找到指针来直接访问内存,并且增添了自动的内存管理功能,从而有效地防止了C/C++语言中指针操作失误,如野指针所造成的系统崩溃。但也不是说Java没有指针,虚拟机内部还是使用了指针,只是外人不得使用而已。这有利于Java程序的安全。
12 |
13 | 引用(reference)
14 |
15 | ```java
16 | Person p;
17 | ```
18 |
19 | 存储了一个Person对象的地址,而实际上这个对象被存储在内存空间的其他某个地方。这个名称p只是对象的一个引用,它并不是对象本身。在Java中这条语句只是创建了一个放置某个对象的存储地址的空间。可以将引用认为是普通变量语法中的指针。
20 |
21 | C++中也使用了引用,C++中的引用是隐式的指针,使用更方便,阅读性更好
22 |
23 | ## 2. 多重继承
24 |
25 | C++支持多重继承,这是C++的一个特征,它允许多父类派生一个类。尽管多重继承功能很强,但使用复杂,而且会引起许多麻烦,编译程序实现它也很不容易。Java不支持多重继承,但允许一个类继承多个接口(extends+implement),实现了C++多重继承的功能,又避免了C++中的多重继承实现方式带来的诸多不便。
26 |
27 | ## 3. 数据类型及类
28 |
29 | Java是完全面向对象的语言,所有函数和变量部必须是类的一部分。除了基本数据类型之外,其余的都作为类对象,包括数组。对象将数据和方法结合起来,把它们封装在类中,这样每个对象都可实现自己的特点和行为。而C++允许将函数和变量定义为全局的。此外,Java中取消了C/C++中的结构和联合,消除了不必要的麻烦。
30 |
31 | ## 4. 自动内存管理
32 |
33 | Java程序中所有的对象都是用new操作符建立在内存堆栈上,这个操作符类似于C++的new操作符。下面的语句由一个建立了一个类Read的对象,然后调用该对象的work方法:
34 |
35 | ```
36 | Read r=new Read();
37 | r.work();
38 | ```
39 |
40 | 语句Read r=new Read();在堆栈结构上建立了一个Read的实例。Java自动进行无用内存回收操作,不需要程序员进行删除。而C++中必须由程序员释放内存资源,增加了程序设计者的负扔。Java中当一个对象不被再用到时,无用内存回收器将给它加上标签以示删除。Java里无用内存回收程序是以线程方式在后台运行的,利用空闲时间工作。
41 |
42 | C++中释放内存需要手动实现析构函数,通过new动态申请的堆内存空间,需要手动调用delete方法释放
43 |
44 | ## 5. 运算符重载
45 |
46 | Java不支持操作符重载。运算符重载被认为是C++的突出特征,在Java中虽然类大体上可以实现这样的功能,但操作符重载的方便性仍然丢失了不少。Java语言不支持操作符重载是为了保持Java语言尽可能简单。
47 |
48 | ## 6. 预处理功能
49 |
50 | Java不支持预处理功能。C/C++在编译过程中都有一个预编泽阶段,即众所周知的预处理器。预处理器为开发人员提供了方便,但增加了编译的复杂性。Java虚拟机没有预处理器,但它提供的引入语句(import)与C++预处理器的功能类似。
51 |
52 | ## 7. Java不支持缺省函数参数,而C++支持
53 |
54 | 在C中,代码组织在函数中,函数可以访问程序的全局变量。C++增加了类,提供了类算法,该算法是与类相连的函数,C++类方法与Java类方法十分相似,然而,由于C++仍然支持C,所以不能阻止C++开发人员使用函数,结果函数和方法混合使用使得程序比较混乱。
55 |
56 | Java没有函数,作为一个比C++更纯的面向对象的语言,Java强迫开发人员把所有例行程序包括在类中,事实上,用方法实现例行程序可激励开发人员更好地组织编码。
57 |
58 | ## 8. 字符串
59 |
60 | C和C++不支持字符串变量,在C和C++程序中使用Null终止符代表字符串的结束,在Java中字符串是用类对象(String和StringBuffer)来实现的,这些类对象是Java语言的核心,用类对象实现字符串有以下几个优点:
61 |
62 | - 在整个系统中建立字符串和访问字符串元素的方法是一致的;
63 | - Java字符串类是作为Java语言的一部分定义的,而不是作为外加的延伸部分;
64 | - Java字符串执行运行时检空,可帮助排除一些运行时发生的错误;
65 | - 可对字符串用“十”进行连接操作。
66 |
67 | ## 9. goto语句
68 |
69 | “可怕”的goto语句是C和C++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句子要用于无条件转移子程序和多结构分支技术。鉴于以广理由,Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。
70 |
71 | ## l0. 类型转换
72 |
73 | 在C和C++中有时出现数据类型的隐含转换,这就涉及了自动强制类型转换问题。例如,在C++中可将一浮点值赋予整型变量,并去掉其尾数。Java不支持C++中的自动强制类型转换,如果需要,必须由程序显式进行强制类型转换。
74 |
75 | ## 11. 异常
76 |
77 | Java中的异常机制用于捕获例外事件,增强系统容错能力
78 |
79 | ```java
80 | try{//可能产生例外的代码
81 | }catch(exceptionType name){
82 | //处理
83 | }
84 | ```
85 |
86 | 其中exceptionType表示异常类型。而C++则没有如此方便的机制。
87 |
88 | ## 12. 模板
89 |
90 | 函数模板,类似于java中的泛型方法,类模板,类似于java中的泛型类
--------------------------------------------------------------------------------
/第2章 Java编程基础/阿里 Java 开发手册最新完美版,千锤百炼始出炉.md:
--------------------------------------------------------------------------------
1 | 今年年初,《阿里巴巴Java开发手册》正式发布,阿里官方Java代码规范标准首次对外公开。手册发布之后在业界、学术界都获得了广泛的关注,仅微博浏览量就突破千万,下载访问量超过40万,多家媒体主动转发,并将其称为「Java工程师必备宝典」。
2 |
3 |
4 |
5 | 业界开发者对手册也做出了高度的评价:
6 |
7 |
8 |
9 | 「这是多年在一线奋斗的阿里工程师宝贵经验和线上事故的总结升华,在规模化生产实践、质量控制中必不可少的方法。它能帮助同行们少走弯路,避免掉在不必要的坑里。」
10 |
11 | ——资深架构师李艳鹏
12 |
13 |
14 |
15 | 「阿里Java编程规约不是约束,而是一种难得的效率规范。有了它,团队协作,代码交接和传递更加容易和便捷。以后看别人的代码再也不用头疼了。」
16 |
17 | ——非著名程序员涩郎
18 |
19 |
20 |
21 | 「比起很多花哨的所谓技术和框架,这东西才是体现‘码农’ 和 ‘工程师’ 本质区别的地方。」
22 |
23 | ——知乎用户胖胖
24 |
25 |
26 |
27 | 同时,也有热心用户对排版布局、部分示例错误、前后矛盾等问题提出了宝贵的建议。在收集外部建议和阿里内部经验更新的基础上,阿里巴巴规约项目组正式推出《阿里巴巴Java开发手册》 1.2.0 升级版,堪称史上最完善版本。
28 |
29 | 
30 |
31 | 《阿里巴巴Java开发手册》目录
32 |
33 | 
34 |
35 | **升级亮点**
36 |
37 |
38 |
39 | 一、排版布局
40 |
41 | 1)页码中的封面、前言、目录并不计入总页码,调整前言到目录之前。
42 |
43 | 2)一级标题统一换页;二级标题统一不换页,并在之前空一行。
44 |
45 | 3)增加附1(版本历史)和附2(专有名词说明)并各自单独成为一页。
46 |
47 |
48 |
49 | 二、示例修正
50 |
51 | 1)关于太阳年龄的示例错误。太阳年龄46亿,超过42亿的表示范围。
52 |
53 | 2)个别示例的代码不符合格式规约,尤其是String args[]的表示方式错误。
54 |
55 |
56 |
57 | 三、修正规则
58 |
59 | 1)修正countdown 描述错误。
60 |
61 | 2)修正final关于效率优化的错误描述。
62 |
63 | 3)修正异常捕捉的描述错误。
64 |
65 |
66 |
67 | 四、内容增加
68 |
69 | 1)增加“指定集合大小”的进一步说明。
70 |
71 | 2)增加卫语句的示例代码。
72 |
73 | 3)明确数据库表示删除概念的字段名为 is_deleted
74 |
75 |
76 |
77 | 下载方式
78 |
79 |
80 |
81 | 识别上方二维码,关注“阿里技术”公众号
82 |
83 | 在阿里技术公众号回复“手册”二字
84 |
85 | 即可免费在线阅读&免费下载。
86 |
87 | 此手册从构思到现在的最新版本,历时两年,历经无数次内部针锋相对的讨论,迭代高达118次。该规约以Java开发者为中心视角,虽然只有短短的 2.2w字,却全面覆盖编程规约、异常日志规约、MySQL规约、工程规约、安全规约五大板块。
88 |
89 |
90 |
91 | 每一条规范几乎都经过千锤百炼实践的考验。从最初的周更新频率,降至现在的月度更新,后续的更新频度会以年为单位。在业界同仁的支持和努力下,规约已经越来越稳定,越来越完善。
92 |
93 |
94 |
95 | 手册愿景:码出高效、码出质量
96 |
97 |
98 |
99 | 阿里技术生态丰富,框架结构成熟,经历了超高并发的多年“双十一”实战考验,积累了丰富的Java实战经验。《阿里巴巴Java开发手册》本身就是阿里巴巴的内部编码规范,从命名到项目拆分,不仅规范了一些开发细节,也提出了很多工程开发的哲学。
100 |
101 | 
102 |
103 | 如阿里巴巴系统软件事业部研究员毕玄所言,一个优秀的工程师和一个普通工程师的区别,不是现在满天飞的架构图,他的功底就是体现在他写的每一行代码上。
104 |
105 |
106 |
107 | 规约的目标是帮助开发者码出高效、码出质量,提升系统的质量、协作的高效性。计算机工程师这个行业很特殊,既像艺术家在创造富有个性的艺术品,又是一个需要团队合作的工作。《阿里巴巴Java开发手册》提倡算法效率和架构扩展的个性化,而不是代码风格随意化,尽量减少没有营养的“圣战”,如:4个空格、单行语句换行等。
108 |
109 |
110 |
111 | 未来展望:国际英文版&IDE智能扫描插件
112 |
113 |
114 |
115 | 这是一个广义的编码规范,一本随时可以查阅的技术参考,你在手册中可以找到很多的技术规范、最佳实践,避坑指南等,它是每一位优秀开发者手里的必备好书。
116 |
117 |
118 |
119 | 未来,阿里巴巴规约项目组将持续更新,推出国际英文版,并预计在今年9月杭州云栖大会发布众所期待的中文GitHub开源版本和IDE智能扫描插件,为开发者提供更多便利的服务,帮助企业和开发者切实提升代码质量、降低代码故障率。
120 |
121 |
122 |
123 | 关于阿里巴巴Java手册的最新进展,请关注“阿里技术”官方公众号,获得更多一手信息。
124 |
125 |
126 |
127 | 关注「阿里技术」
128 |
129 | 把握前沿技术脉搏
--------------------------------------------------------------------------------
/第2章 Java编程基础/阿里《Java开发手册》终极版!.md:
--------------------------------------------------------------------------------
1 | 别人都说我们是码农,但我们知道,自己是个艺术家。也许我们不过多在意自己的外表和穿着,但我们不羁的外表下,骨子里追求着代码的美、质量的美。而代码规约其实就是一个对美的定义。
2 |
3 | 
4 |
5 | 《阿里巴巴Java开发手册》系统性地从编程、数据库、异常日志、工程结构、安全、单元测试六大方面,总结出优秀Java开发者必备的技术素养。时值手册发布一周年之际,阿里官方对外正式公开《阿里巴巴Java开发手册》终!极!版!!!
6 |
7 | 该版本将是阿里官方对外释放的最后一个PDF版本,也是史上内容最全、修正最为彻底的一个版本,并且史无前例地增加了单元测试规约,绝对值得珍藏。
8 |
9 | ## 如何快速下载?
10 |
11 | 关注阿里技术微信公众号,回复“手册”两字即可免费下载。
12 |
13 | 
14 |
15 | ## 单元测试规约,优秀开发者的必备技能
16 |
17 | 单元测试是一件老生常谈,深入人心的事情,但是喜欢写单元测试的开发同学少之又少。单元测试似乎是功不在当下的事情,快速完成需求成为了王道。在工作量评估的时候,如果开发同学说需要花上若干天时间来写单测,产品可能就会磨刀霍霍杀来。
18 |
19 | 尽管如此,单元测试是一件有情怀,有技术素养,有远期收益的工作。它能够有效监测软件模块质量、促进代码深度优化,进而降低线上故障率,长期执行有助于提升项目迭代效率,并增加重构自信,减少重构成本。简直就是bug灭绝器有木有!
20 |
21 | 
22 |
23 | 所以此次在终极版本中,阿里根据内部单元测试的实践经验,详细描述了单元测试的相关原则和重要建议。
24 |
25 | ## AIR原则
26 |
27 | A:Automatic,单元测试需要测试框架自动化执行,才有意义。
28 |
29 | I:Independent,单元测试用例之间互相独立,不存在依赖关系。
30 |
31 | R:Repeatable,单元测试可以被重复执行,且结果一致。
32 |
33 | ## BCDE原则
34 |
35 | B:Border,边界值测试,包括循环边界、特殊取值、特殊时间点等。
36 |
37 | C:Correct,正确的输入,并得到预期的结果。
38 |
39 | D:Design,与设计文档相结合,来编写单元测试。
40 |
41 | E:Error,强制错误信息输入(如:非法数据),并得到预期的结果。
42 |
43 | 更多关于单元测试的内容、优化项目,欢迎查阅《阿里巴巴Java开发手册》终极版。
44 |
45 | 
46 |
47 | ## 一劳永逸:官方自动化IDE检测插件即将问世
48 |
49 | 为了帮助开发者更好提高编码效率,阿里巴巴基于手册内容,独立研发一套自动化IDE检测插件。该插件在扫描代码后,将不符合《手册》的代码按block/critical/major三个等级显示在下方;实时编写代码时,还会给出智能提示,告诉你如何编写可以更优雅;对于历史代码,部分规则实现了批量一键修复的功能。是不是很方便?
50 |
51 | 据悉,10月14日,杭州云栖大会研发效能峰会场,阿里将正式对外开放插件及源码。届时,阿里技术公众号将第一时间公开免费下载地址。
52 |
53 | ## 手册虽有终极版,技术没有终点站
54 |
55 | 编码规范的价值在业内有着广泛的共识,但在现实中却被否定得一塌糊涂。工程师曾经最引以为豪的代码,因为编码规范的缺失、命名的草率而全面地摧毁了彼此的互信,并严重地制约了彼此的高效协同。工程师一边吐槽别人的代码,一边写着可能遭受同样命运的代码,不时的推倒重建或心惊胆战的维护似乎成了工作的主旋律。
56 |
57 | 
58 |
59 | 《阿里巴巴Java开发手册》的使命,在于帮助工程师脱离繁琐,重燃技术激情。业务会变、玩法会变、需求会变,做好代码质量的决心永不会变。
60 |
61 | 手册虽有终极版,技术没有终点站。不断打磨技术,成为更好的自己,我们共勉。
62 |
63 | 你对《阿里巴巴Java开发手册》终极版有哪些想法或建议?欢迎在留言区一起交流讨论哦。
--------------------------------------------------------------------------------
/第2章 Java编程基础/阿里巴巴Java开发手册.md:
--------------------------------------------------------------------------------
1 | 
2 |
3 | 阿里巴巴Java开发手册,首次公开阿里官方Java代码规范标准。这套Java统一规范标准将有助于提高行业编码规范化水平,帮助行业人员提高开发质量和效率、大大降低代码维护成本
4 |
5 | 点击下载《阿里巴巴Java开发手册》:https://yq.aliyun.com/attachment/download/?id=1173
6 |
7 | 你是否曾因Java代码规范版本纷杂而无所适从?
8 |
9 | 你是否想过代码规范能将系统故障率降低20%?
10 |
11 | 你是否曾因团队代码风格迥异而协同困难?
12 |
13 | 你是否正在review一些原本可以避免的故障?
14 |
15 | 你是否无法确定自己的代码足够健壮?
16 |
17 | ## 码出高效,码出质量!
18 |
19 | 相比C++代码规范业界已经达成共识,Java代码规范业界比较混乱,我们期待这次发布的Java代码规范能够给业界带来一个标准,促使整体行业代码规范水平得到提高,最终能够帮助企业和开发者提升代码质量和降低代码故障率。
20 |
21 | ## 阿里出品,质量保证!
22 |
23 | 阿里Java技术团队一手打造出Dubbo、JStorm、Fastjson等诸多流行开源框架,部分已成为Apache基金会孵化项目;
24 |
25 | 阿里在Java后端领域支撑起全球访问量最大的服务器集群;
26 |
27 | Java代码构建的阿里双11业务系统订单处理能力达到17.5万笔/秒;
28 |
29 | 到目前已累计数亿行高并发、高稳定性的最佳Java代码实践;
30 |
31 | ……
32 |
33 | 此次首度公开的Java开发手册正是出自这样的团队,近万名阿里Java技术精英的经验总结,并经历了多次大规模一线实战检验及完善,铸就了这本高含金量的阿里Java开发手册。该手册以Java开发者为中心视角,划分为编程规约、异常日志规约、MYSQL规约、工程规约、安全规约五大块,再根据内容特征,细分成若干二级子目录。根据约束力强弱和故障敏感性,规约依次分为强制、推荐、参考三大类。此套规范不仅能让代码一目了然, 更有助于加强团队分工与合作、真正提升效率。
34 |
35 | ## 无规矩不成方圆 无规范不能协作
36 |
37 | 众所周知,制订交通法规表面上是要限制行车权,实际上是保障公众的人身安全。试想如果没有限速,没有红绿灯,没有规定靠右行驶,谁还敢上路行驶。
38 |
39 | 同理,对软件来说,适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化,以一种普遍认可的方式一起做事,降低故障率,提升协作效率。开发手册详细列举如何开发更加高效,更加容错,更加有协作性,力求知其然,更知其不然,结合正反例,提高代码质量。比如,异常日志处理时的各种不规范行为;集合转换的各种坑;创建线程池出现的等待队列OOM等。
40 |
41 | ## 阿里技术资深大咖联袂推荐
42 |
43 | 阿里高级研究员多隆:工程师对于代码,一定要“精益求精”,不论从性能,还是简洁优雅,都要具备“精益求精”的工匠精神,认真打磨自己的作品。
44 |
45 | 阿里研究员毕玄:一个优秀的工程师和一个普通工程师的区别,不是现在满天飞的架构图,他的功底就是体现在他写的每一行代码上。
46 |
47 | 阿里研究员玄难:代码是软件工程里面的产品设计、系统架构设计等工作的最后承载体,代码的质量决定了一切工作的成败。
48 |
49 | 阿里巴巴B2B事业群CTO李纯:好的软件产品离不开工程师高质量的代码及相互间顺畅的沟通与合作。简单,适用的代码规约背后所传递的是技术上的追求卓越、协同合作的精神,是每个技术团队不可缺失的重要利器。
50 |
51 | 阿里研究员、HipHop作者:赵海平(花名:福贝):程序员是创造个性化作品的艺术家,但同时也是需要团队合作的工种。个性化应尽量表现在代码效率和算法方面,牺牲小我,成就大我。
52 |
53 | ## 拥抱规范,远离伤害!
54 |
55 | 开发的同学们赶紧行动起来,遵守代码规范,你好,我好,大家好!
56 |
57 | > 原文链接:https://yq.aliyun.com/articles/69327?spm=5176.100240.searchblog.7.uLNdlP
--------------------------------------------------------------------------------
/第3章 面向对象/Object类.md:
--------------------------------------------------------------------------------
1 | ---
2 | typora-copy-images-to: img
3 | ---
4 |
5 | ## Object类
6 | 在JDK中提供了一个Object类,它是类层次结构的根类,每个类都直接或间接继承自该类,所有对象(包括数组)
7 |
8 | Object:所有类的根类。Object是不断抽取而来,具备着所有对象都具备的共性内容。
9 |
10 | 
11 |
12 | - getClass().getName()代表返回对象所属类的类名,即Animal。
13 | - hashCode()代表返回该对象的哈希值。
14 | - Integer.toHexString(hashCode())代表将对象的哈希值用16进制表示。
15 |
16 | 其中,hashCode()是Object类中定义的一个方法,这个方法将对象的内存地址进行哈希运算,返回一个int类型的哈希值。
17 |
18 | 示例:
19 |
20 | ```java
21 | class Person{
22 | private int age ;
23 | Person(int age){
24 | this.age = age;
25 | }
26 | }
27 |
28 | class Demo{
29 | }
30 |
31 | class ObjectDemo{
32 | public static void main(String[] args){
33 | Person p1 = new Person(20);
34 | Person p2 = new Person(20);
35 | Person p3 = p1;
36 |
37 | Demo d = new Demo();
38 |
39 | System. out.println(p1 == p2);//false
40 | System. out.println(p1.equals(p2));//false
41 | System. out.println(p1.equals(p3));//true
42 | System. out.println(p1.equals(d));//false
43 | }
44 | }
45 | ```
46 |
47 | 运行结果:
48 |
49 | 
50 |
51 |
52 | ==以及Object类的equals方法默认都是根据对象的哈希值判断两个对象是否相等。可以通过覆盖Object的equals方法来重写比较规则。
53 |
54 | 示例:
55 |
56 | ```java
57 | class Person{
58 | private int age ;
59 | Person( int age){
60 | this.age = age;
61 | }
62 | //比较Person的年龄,是否是同龄人
63 | //一般都会覆盖此方法,根据对象的特有内容,建立判断对象是否相同的依据。
64 | public boolean equals(Object obj){
65 | if(!(obj instanceof Person))
66 | throw new ClassCastException("类型错误");
67 | Person p = (Person)obj;
68 | return this .age == p.age;
69 | }
70 | }
71 |
72 | class ObjectDemo{
73 | public static void main(String[] args){
74 | Person p1 = new Person(20);
75 | Person p2 = new Person(20);
76 |
77 | System. out.println(p1.equals(p2));
78 | }
79 | }
80 | ```
81 |
82 | 运行结果:
83 |
84 | 
85 |
86 | Object类的toString方法默认返回的内容是“对象所属的类名+@+对象的哈希值(十六进制)”。
87 |
88 | 示例:
89 |
90 | ```java
91 | class Person{
92 | private int age ;
93 | Person(int age){
94 | this.age = age;
95 | }
96 | public int hashCode(){
97 | return age ;
98 | }
99 | }
100 |
101 | class ObjectDemo{
102 | public static void main(String[] args){
103 | Person p1 = new Person(20);
104 |
105 | System. out.println(p1);
106 | System. out.println(p1.getClass().getName() + " $ " +
107 | Integer.toHexString(p1.hashCode()));
108 | }
109 | }
110 | ```
111 |
112 | 运行结果:
113 |
114 | 
115 |
116 | ## Java 7 新增的 Objects 类
--------------------------------------------------------------------------------
/第3章 面向对象/README.md:
--------------------------------------------------------------------------------
1 | ## 第3章 面向对象
2 |
3 | - [数组工具类](数组工具类.md)
4 | - [文档注释](文档注释.md)
5 | - [面向对象](面向对象.md)
6 | - [Object类](Object类.md)
7 | - [单例设计模式](单例设计模式.md)
8 | - [封装](封装.md)
9 | - [继承](继承.md)
10 | - [多态](多态.md)
11 | - [抽象类与接口](抽象类与接口.md)
12 | - [接口回调](接口回调.md)
13 | - [内部类](内部类.md)
14 | - [异常](异常.md)
15 |
16 | ## 内容摘要
17 |
18 | - 面向对象思想,面向过程思想
19 |
20 | 面向对象是相对面向过程而言,面向对象和面向过程都是一种思想。
21 |
22 | 面向过程:强调的是功能行为。代表语言:C语言。
23 |
24 | 面向对象:将功能封装进对象,强调具备了功能的对象。代表语言:Java、C++、C#。
25 |
26 | - 类
27 | - 属性:成员变量
28 | - 行为:成员函数
29 | - 构造函数
30 | - 成员变量和局部变量的区别
31 | - 对象内存结构
32 | - 匿名对象
33 | - 静态变量,静态函数
34 | - 静态代码块,构造代码块
35 | - 抽象类,接口
36 | - 内部类,匿名内部类
37 |
38 |
39 | - 面向对象三大特征:封装、继承、多态
40 | - this、super关键字
41 | - 修饰符
42 | - public、private、protect
43 | - static、final、abstract
44 | - 异常
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491240419406.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491240419406.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491240434244.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491240434244.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491240451956.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491240451956.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491276104173.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491276104173.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491276277598.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491276277598.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491276429985.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491276429985.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491276565803.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491276565803.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491276648860.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491276648860.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491276689148.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491276689148.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491277295296.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491277295296.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491283464087.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491283464087.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491283688423.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491283688423.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491283722702.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491283722702.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308047866.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308047866.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308096802.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308096802.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308113418.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308113418.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308129771.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308129771.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308142717.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308142717.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308168245.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308168245.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308191041.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308191041.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308214198.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308214198.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308228930.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308228930.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308244992.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308244992.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308269877.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308269877.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308285140.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308285140.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308317919.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308317919.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308344714.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308344714.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308350957.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308350957.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308364716.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308364716.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308380018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308380018.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308397512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308397512.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308420570.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308420570.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308433699.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308433699.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308448323.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308448323.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308458976.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308458976.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308470712.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308470712.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308482425.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308482425.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308497028.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308497028.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308507996.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308507996.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308522362.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308522362.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308534469.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308534469.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308546397.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308546397.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491308560153.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491308560153.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1491310549430.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1491310549430.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1500704359335.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1500704359335.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1500704447701.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1500704447701.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1500704467099.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1500704467099.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1500704487847.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1500704487847.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1500704901468.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1500704901468.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1500705144464.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1500705144464.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/1500705286982.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/1500705286982.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_01.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_02.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_03.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_04.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_05.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_06.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_07.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_08.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_09.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_10.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_11.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_12.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_13.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_14.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_15.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/OOP_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/OOP_16.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/object.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/object.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/object2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/object2.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/object3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/object3.png
--------------------------------------------------------------------------------
/第3章 面向对象/img/接口回调1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/接口回调1.jpg
--------------------------------------------------------------------------------
/第3章 面向对象/img/接口回调2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/接口回调2.jpg
--------------------------------------------------------------------------------
/第3章 面向对象/img/接口回调3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第3章 面向对象/img/接口回调3.jpg
--------------------------------------------------------------------------------
/第3章 面向对象/java内存模型.md:
--------------------------------------------------------------------------------
1 | ### heap和stack有什么区别
2 |
3 | java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
4 |
5 | 堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。
--------------------------------------------------------------------------------
/第3章 面向对象/单例设计模式.md:
--------------------------------------------------------------------------------
1 | ### 单例设计模式
2 |
3 | 设计模式:对问题行之有效的解决方式,其实,它是一种思想。
4 | 单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
5 | 比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
6 |
7 | 如何保证对象唯一性呢?
8 |
9 | 1. 不允许其他程序用new创建该类对象。
10 | 2. 在该类创建一个本类实例。
11 | 3. 对外提供一个方法让其他程序可以获取该对象。
12 |
13 | 步骤:
14 |
15 | 1. 私有化该类构造函数。
16 | 2. 通过new在本类中创建一个本类对象。
17 | 3. 定义一个公有的方法,将创建的对象返回。
18 |
19 | 示例(饿汉式):
20 |
21 | ```java
22 | class Single{
23 | //类已加载,对象就已经存在了
24 | private static Single s = new Single();
25 | private Single(){}
26 | public static Single getInstance(){
27 | return s ;
28 | }
29 | }
30 |
31 | class SingleDemo{
32 | public static void main(String[] args){
33 | Single s1 = Single.getInstance();
34 | Single s2 = Single. getInstance();
35 | System.out.println(s1 == s2);
36 | }
37 | }
38 | ```
39 | 运行结果:
40 |
41 | 
42 |
43 | **注意事项:**
44 |
45 | 之所以不用Single.s;的方式获取Single对象,而采用getInstance获取是因为在getInstance方法中我们可以做一些判断来决定是否返回Single的对象,也就是实现了对单例对象的可控。所以,给Single的构造方法加上了private限制,禁止使用者直接采用Single.s;的方式获取。
46 |
47 | 示例(懒汉式):
48 |
49 | ```java
50 | class Single{
51 | //类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象
52 | //延迟加载形式
53 | private static Single s = null;
54 | private Single(){}
55 | public static Single getInstance(){
56 | if(s == null)
57 | s = new Single();
58 | return s ;
59 | }
60 | }
61 | class SingleDemo{
62 | public static void main(String[] args){
63 | Single s1 = Single. getInstance();
64 | Single s2 = Single. getInstance();
65 | System.out.println(s1 == s2);
66 | }
67 | }
68 | ```
69 | 运行结果:
70 |
71 | 
72 |
--------------------------------------------------------------------------------
/第3章 面向对象/垃圾回收机制.md:
--------------------------------------------------------------------------------
1 | ## 垃圾回收机制
2 |
3 | 垃圾回收
4 |
5 | - Object的finalize()
6 | - System.gc()
7 | - Runtime.getRuntime().gc()
8 |
9 | 对象在内存中的状态
10 |
11 | - 可达状态
12 | - 可恢复状态
13 | - 不可达状态
14 |
15 | ## 对象的引用
16 |
17 | - 弱引用
18 | - 软引用
19 | - 强引用
20 | - 虚引用
--------------------------------------------------------------------------------
/第3章 面向对象/封装.md:
--------------------------------------------------------------------------------
1 | ## 封装
2 |
3 | 封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式。
4 |
5 | 好处:
6 |
7 | 1. 将变化隔离。
8 | 2. 便于使用。
9 | 3. 提高重用性。
10 | 4. 提高安全性。
11 |
12 | 封装原则:
13 |
14 | 1. 将不需要对外提供的内容都隐藏起来。
15 | 2. 把属性都隐藏,提供公共方法对其访问。如,getXXX,setXXX。
16 |
17 | 示例:
18 |
19 | ```java
20 | /**
21 | 人:
22 | 属性:年龄
23 | 行为:说话
24 | */
25 | class Person{
26 | //private:私有,是一个权限修饰符,用于修饰
27 | //不希望别人直接访问赋值,需要通过私有化把属性进行隐藏
28 | private int age ;
29 |
30 | //通过提供set、get公共方法对其访问
31 | public void setAge( int a){
32 | //在set方法内可以对属性的赋值进行限制
33 | if (a > 0 && a < 130){
34 | age = a;
35 | } else
36 | System.out .println("错误的数据" );
37 | }
38 |
39 | public int getAge(){
40 | return age ;
41 | }
42 |
43 | void speak(){
44 | System.out .println("age = " + age);
45 | }
46 | }
47 |
48 | class PersonDemo{
49 | public static void main(String[] args){
50 | Person p = new Person();
51 | //通过其他方式访问
52 | p.setAge(20);
53 | p.speak();
54 | //赋值不合法,set方法就不允许成功赋值
55 | p.setAge(-20);
56 | }
57 | }
58 | ```
59 |
60 | 运行结果:
61 |
62 | 
63 |
64 | 注意事项:
65 |
66 | - 私有仅仅是封装的一种体现而已。
67 | - private关键字:是一个权限修饰符,用于修饰成员(成员变量和成员函数),被私有化的成员只在本类中有效。
68 | - 常用场景之一:将成员变量私有化,对外提供对应的set、get方法对其进行访问,提高对数据访问的安全性。
69 |
--------------------------------------------------------------------------------
/第3章 面向对象/数组工具类.md:
--------------------------------------------------------------------------------
1 | ---
2 | typora-copy-images-to: img
3 | ---
4 |
5 | ### 数组工具类
6 |
7 | 示例:
8 |
9 | ```java
10 | public class ArrayTool{
11 | //该类中的方法都是静态的,所以该类是不需要创造对象的
12 | //为了保证不让他人创建该类对象,可以将构造函数私有化
13 | private ArrayTool(){}
14 |
15 | //获取整型数组的最大值
16 | public static int getMax(int[] arr){
17 | int maxIndex = 0;
18 | for(int x = 1; x < arr.length; x++){
19 | if(arr[x] > arr[maxIndex])
20 | maxIndex = x;
21 | }
22 | return arr[maxIndex];
23 | }
24 |
25 | //对数组进行选择排序
26 | public static void selectSort(int[] arr){
27 | for(int x = 0; x arr[y])
30 | swap(arr,x,y);
31 | }
32 | }
33 | }
34 |
35 | //用于给数组进行元素的位置置换。
36 | private static void swap(int[] arr, int a,int b){
37 | int temp = arr[a];
38 | arr[a] = arr[b];
39 | arr[b] = temp;
40 | }
41 |
42 | //获取指定的元素在指定数组中的索引
43 | public static int getIndex(int[] arr, int key){
44 | for(int x = 0; x < arr.length; x++){
45 | if(arr[x] == key)
46 | return x;
47 | }
48 | return -1;
49 | }
50 |
51 | //将int 数组转换成字符串,格式是:[e1,e2,...]
52 | public static String arrayToString(int[] arr){
53 | String str = "[";
54 |
55 | for(int x = 0; x < arr.length; x++){
56 | if(x != arr.length - 1)
57 | str = str + arr[x] + ",";
58 | else
59 | str = str + arr[x] + "]";
60 | }
61 | return str;
62 | }
63 | }
64 |
65 | class ArrayToolDemo{
66 | //保证程序的独立运行
67 | public static void main(String[] args){
68 | int[] arr = {4,8,2,9,7,72,6};
69 |
70 | int max = ArrayTool.getMax(arr);
71 | System.out.println("max = " + max);
72 | int index = ArrayTool.getIndex(arr,10);
73 | System.out.println("index = " + index);
74 | }
75 | }
76 | ```
77 | 运行结果:
78 |
79 | 
--------------------------------------------------------------------------------
/第3章 面向对象/文档注释.md:
--------------------------------------------------------------------------------
1 | ### 文档注释
2 |
3 | 示例:
4 |
5 | ```java
6 | /**
7 | * 建立一个用于操作数组的工具类,其中包含着常见的对数组操作的函数,如:最值,排序等。
8 | * @author 张三
9 | * @version v1.0
10 | */
11 | public class ArrayTool{
12 | private ArrayTool(){}
13 |
14 | /**
15 | * 获取整型数组的最大值
16 | * @param arr 接收一个元素为int 类型的数组
17 | * @Return 该数组的最大的元素值
18 | */
19 | public static int getMax(int[] arr){
20 | int maxIndex = 0;
21 | for(int x = 1; x < arr.length; x++){
22 | if(arr[x] > arr[maxIndex])
23 | maxIndex = x;
24 | }
25 | return arr[maxIndex];
26 | }
27 |
28 | /**
29 | * 对数组进行选择排序
30 | * @param arr 接收一个元素为int 的数组
31 | */
32 | public static void selectSort(int[] arr){
33 | for(int x = 0; x arr[y])
36 | swap(arr,x,y);
37 | }
38 | }
39 | }
40 |
41 | //用于给数组进行元素的位置置换。
42 | private static void swap(int[] arr, int a,int b){
43 | int temp = arr[a];
44 | arr[a] = arr[b];
45 | arr[b] = temp;
46 | }
47 |
48 | /**
49 | * 获取指定的元素在指定数组中的索引
50 | * @param arr 接收一个元素为int 类型的数组
51 | * @param key 要找的元素
52 | * @return 返回该元素第一次出现的位置,如果不存在则返回 -1
53 | */
54 | public static int getIndex(int[] arr, int key){
55 | for(int x = 0; x < arr.length; x++){
56 | if(arr[x] == key)
57 | return x;
58 | }
59 | return -1;
60 | }
61 |
62 | /**
63 | * 将int数组转换成字符串,格式是:[e1,e2,...]
64 | * @param arr 接收一个元素为int类型的数组
65 | * @return 返回该数组的字符串表现形式
66 | */
67 | public static String arrayToString(int[] arr){
68 | String str = "[";
69 |
70 | for(int x = 0; x < arr.length; x++){
71 | if(x != arr.length - 1)
72 | str = str + arr[x] + ",";
73 | else
74 | str = str + arr[x] + "]";
75 | }
76 | return str;
77 | }
78 | }
79 | ```
80 | 运行结果:
81 |
82 | 
83 |
84 | 
85 |
86 | 
87 |
88 | ### 注意事项
89 |
90 | - 如果想把一个类进行文档化,该类必须是public的。
91 | - 私有的方法在文档中不会体现,例如ArrayTool类中的swap方法。
--------------------------------------------------------------------------------
/第3章 面向对象/深度思考Java成员变量的初始化.md:
--------------------------------------------------------------------------------
1 | 写Java代码的时候很少去关注成员变量的声明和初始化顺序,今天借此机会抛出一些问题:语言的设计者们为什么会这样设计?比如说很常见的一个问题:abstract(抽象)类不能用final进行修饰。这个问题比较好理解:因为一个类一旦被修饰成了final,那么意味着这个类是不能被继承的,而abstract(抽象)类又不能被实例化。如果一个抽象类可以是final类型的,那么这个类又不能被继承也不能被实例化,就没有存在的意义。从语言的角度来讲一个类既然是抽象类,那么它就是为了继承,所以给它标识为final是没有意义的。语言的设计者们当然不可能让这么大的一个bug产生。对于开发者而言抽象类不能修饰final可能就是一种约定俗成的规定,并没有特殊意义。我们完全可以往前想一点:为什么这么设计?
2 |
3 | 下面我所展示的一些代码实例也同样会采用我上面的一些思考方法。有一些是一些”契约“,并没有特别的缘由,可能用别的方法也是合理的。下面的代码会讲到初始化的一些策略,从实际的执行结果中得出一些结论。
4 |
5 | ## 代码一
6 | ```java
7 | public class Test1 {
8 | {
9 | a = 1;
10 | //System.out.println(a);//这里会抛错。
11 | }
12 | private int a=2;//这里初始化一次,上面的动态块中也对a进行了赋值,这个时候a=?,为什么可以对a进行赋值,而不可以对a进行输出
13 | public static void main(String[] args){
14 | Test1 test1 = new Test1();
15 | System.out.println(test1.a);
16 | }
17 | }
18 | ```
19 | 看看上面的代码一,第一个问题就是这段代码能否编译通过。结果是能编译通过。这里说明一个问题就是变量的声明和赋值是两步操作?(这句话我先保留一半,在上面
20 | 的代码中有一行代码我注释掉了,这里会抛错,对于这个问题我也没有想明白为什么。)
21 | 第一个问题解决了。那下一个问题很显然最后输出的结果是什么?答案是“2”,这里可能会有些诧异。从直观上来讲就是说明在赋值的过程中是完全按照代码的前后顺序进
22 | 行。
23 |
24 | ## 代码二
25 |
26 | ```java
27 | public class Test2 {
28 |
29 | {
30 | a = 4;
31 | }
32 |
33 | private final int a;//这里我并没有对a做初始化。
34 |
35 | public static void main(String[] args){
36 | Test2 test2 = new Test2();
37 | System.out.println(test2.a);
38 | }
39 | }
40 | ```
41 | “代码二”只是在“代码一”的基础上对成员变量a多修饰了一个final,另外我并没有立即初始化。第一个问题就是这段代码能不能编译通过,答案是能。在这里展示这段代码是为了后面做铺垫,因为这段代码仍然符合上面的“契约”。
42 |
43 | ## 代码三
44 | ```java
45 | public class Test3 {
46 |
47 | {
48 | a = 4;
49 | }
50 |
51 | private static int a;
52 |
53 | public static void main(String[] args){
54 | Test3 test3 = new Test3();//注意:这里开始new了一个对象
55 | System.out.println(test3.a);
56 | }
57 | }
58 | ```
59 | 代码三在代码一的的基础上对于成员变量a多修饰了一个static。这里同样可以编译通过,最后输出的结果也皆大欢喜为4。这里要注意的是我是new了一个对象,而不是直接访问静态变量。
60 |
61 | ## 代码四
62 | ```java
63 | public class Test3 {
64 | {
65 | a = 4;
66 | System.out.println(a);//这里不会报错,但是这条语句并不会执行
67 | }
68 | private static int a;
69 |
70 | public static void main(String[] args){
71 | System.out.println(a);
72 | }
73 | }
74 | ```
75 | 代码四在代码三的基础上把new 对象给去掉了,直接输出静态变量a。这时候就会出现非常诧异的结果0。对,你没有看错,结果是0。如果有兴趣的可以在a=4后面打印一条,会很清晰的发现并没有执行a=4那一条语句。这里先不解释,只看一下现象。
76 |
77 | ## 代码五
78 |
79 | ```java
80 | public class Test3 {
81 | static{
82 | a = 4;
83 | //System.out.println(a);//这里会抛错。
84 | }
85 | private static int a;
86 | public static void main(String[] args){
87 | System.out.println(a);
88 | }
89 | }
90 | ```
91 | 代码五和代码四和不同在于采用了静态初始化,最后的结论很简单,结果为4。这里有一个问题就是如果在a=4之后紧接着使用a就会报错。也就是说定义在声明之前的静态化块只能对声明变量进行赋值,并不能使用该变量。对于这一条规则我也不是特别理解,因为按照常理在赋值之后进行使用是一种再正常不过的事情,在这里只有记住这样一条规则。
92 |
93 | ## 代码六
94 |
95 | ```java
96 | public class Test6 {
97 |
98 | {
99 | a = 4;
100 | }
101 |
102 | private static final int a;
103 |
104 | public static void main(String[] args){
105 | System.out.println(a);
106 | }
107 | }
108 | ```
109 | 代码六是在代码一的基础上增加static final的修饰符。回到我们上面三段代码所问的问题,这次的答案是“否”,也就是说在这里是不能编译通过。在这里我估计有一部分人和我有同样的疑惑:为什么对于成员变量修饰单独修饰final或者static可以进行单独的初始化,而把两个修饰符合起来的时候就不行了呢?我们把这个问题要反过来问:如果可以这样进行初始化会产生什么问题,那么就可以知道为什么需要这样设计?
110 |
111 | 我们看代码三、代码四、代码五和代码六,这里估计会有点绕。上面也说了在代码三中的初始化块是执行了的,而代码四的初始化块没有执行,代码五的静态初始化块也执行了。所以问题归根结底就一条:静态初始化块和普通的初始化块在什么时候执行。结论就是在初始化阶段编译器会收集类中的类变量(区别实例变量)的赋值动作和静态语句块中的语句,而静态的调用并不会触发实例变量的初始化。
112 |
113 | 这里回到代码六,根据上面所得出的结论。变量a被修鉓成了static final,那么意味着有且仅有一次赋值。我们在访问a的同时,域中的a=4并未执行(根据代码四所得出的结论),这样就违背了final类型有且仅有一次赋值的这样一个约定。所以{a=4;}不管是放在声明的代码前还是声明的代码后都无法编译通过。
114 |
115 | ## 代码七
116 |
117 | ```java
118 | public class Test7 {
119 |
120 | static{
121 | a = 5;
122 | }
123 |
124 | private static final int a;
125 |
126 |
127 | public static void main(String[] args){
128 | System.out.println(a);
129 | }
130 | }
131 | ```
132 | 代码七和代码六的不同在于使用静态化的初始化方法,并不会违背final有且仅有一次赋值这样的一个约定。
133 |
134 | ## 总结
135 |
136 | 上面七段代码大概阐述了一下变量的初始化顺序。大部分结果可以通过一些已有的结论推敲出来,也方便我们进行记忆。很多人可能会问:了解这些有用吗?如果只能看到我上面所写的那七段代码,可能意义并不大,在平常的编码过程中也不太可能会去那么写,即使写错了eclipse也会很明显的把错误指出来。而我得出的结论:从语言设计者的角度来思考Java语言为什么这么设计?如果这样去思考,然后再进行深度挖掘,一定可以得出一些不一样的理解,甚至可以找出java语言的设计不好的地方。
--------------------------------------------------------------------------------
/第3章 面向对象/闭包.md:
--------------------------------------------------------------------------------
1 | ## 函数编程之闭包漫谈(Closure)
2 |
3 | ### 函数是什么
4 |
5 | ```python
6 | >>> def ExFunc(n):
7 | sum=n
8 | def InsFunc():
9 | return sum+1
10 | return InsFunc
11 |
12 | >>> myFunc=ExFunc(10)
13 | >>> myFunc()
14 | >>> myAnotherFunc=ExFunc(20)
15 | >>> myAnotherFunc()
16 | >>> myFunc()
17 | >>> myAnotherFunc()
18 | >>>
19 | ```
20 |
21 | 在这段程序中,函数InsFunc是函数ExFunc的内嵌函数,并且是ExFunc函数的返回值。我们注意到一个问题:内嵌函数InsFunc中引用到外层函数中的局部变量sum,IronPython会这么处理这个问题呢?先让我们来看看这段代码的运行结果。当我们调用分别由不同的参数调用ExFunc函数得到的函数时(myFunc(),myAnotherFunc()),得到的结果是隔离的,也就是说每次调用ExFunc函数后都将生成并保存一个新的局部变量sum。其实这里ExFunc函数返回的就是闭包。
22 |
23 | 『纯』的函数是没有状态的,加入了闭包以后就变成有状态的了,相对于一个有成员变量的类实例来说,闭包中的状态值不是自己管理,可以认为是『上帝』在管理。
24 |
25 | - 动态作用域,词法作用域
26 | - 把数据和作用域绑定到一起就是闭包。
27 | - 将一个上下文的私有变量的生命周期延长的机制。
28 | - 调用了**局部变量**的**函数**就是闭包!
29 |
30 | ### 引用环境
31 |
32 | 按照命令式语言的规则,ExFunc函数只是返回了内嵌函数InsFunc的地址,在执行InsFunc函数时将会由于在其作用域内找不到sum变量而出错。而在函数式语言中,当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回。现在给出引用环境的定义就容易理解了:引用环境是指在程序执行中的某个点所有处于活跃状态的约束(一个变量的名字和其所代表的对象之间的联系)所组成的集合。闭包的使用和正常的函数调用没有区别。
33 |
34 | 由于闭包把函数和运行时的引用环境打包成为一个新的整体,所以就解决了函数编程中的嵌套所引发的问题。如上述代码段中,当每次调用ExFunc函数时都将返回一个新的闭包实例,这些实例之间是隔离的,分别包含调用时不同的引用环境现场。不同于函数,闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
--------------------------------------------------------------------------------
/第4章 常见对象/README.md:
--------------------------------------------------------------------------------
1 | ## 第4章 常用对象
2 |
3 | * [String类](String类.md)
4 | * [正则表达式基础](正则表达式基础.md)
5 | * [正则表达式的应用](正则表达式的应用.md)
6 | * [常用正则表达式](常用正则表达式.md)
7 | * [字符串格式化](字符串格式化.md)
8 | * [System类和Runtime类](System类和Runtime类.md)
9 | * [Math类和Random类](Math类和Random类.md)
10 |
11 | API(Application Programming Interface)指的是应用程序编程接口。假设使用Java语言编写一个机器人程序去控制机器人踢足球,程序就需要向机器人发出向前跑、向后跑、射门、抢球等各种命令,没有编过程序的人很难想象这样 的程序如何编写。但是对于有经验的开发人员来说,知道机器人厂商一定会提供一些用于控制机器人的Java类,这些类中定义好了操作机器人各种动作的方法。其实,这些Java类就是机器人厂商提供给应用程序编程的接口,通常把这些类称为Xxx Robot API(意思就是Xxx厂家的机器人API)。
12 |
--------------------------------------------------------------------------------
/第4章 常见对象/System类和Runtime类.md:
--------------------------------------------------------------------------------
1 | ---
2 | typora-copy-images-to: img
3 | ---
4 |
5 | ### System类
6 |
7 | System类对读者来说并不陌生,因为在之前所学知识中,需要打印结果时,使用的都是“System.out.println();”语句,这句代码中就使用了System类。System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,因此,想要引用这些属性和方法,直接使用System类调用即可。System类的常用方法如下表所示。
8 |
9 | 
10 |
11 | **1.getProperties()方法**
12 |
13 | System类的getProperties()方法用于获取当前系统的全部属性,该方法会返回一个Properties对象,其中封装了系统的所有属性,这些属性是以键值对形式存在的。
14 |
15 | ```java
16 | package cn.itcast.chapter05.example09;
17 | import java.util.*;
18 | /**
19 | * System类的getProperties()方法
20 | */
21 | public class Example09 {
22 | public static void main(String[] args) {
23 | // 获取当前系统属性
24 | Properties properties = System.getProperties();
25 | // 获得所有系统属性的key,返回Enumeration对象
26 | Enumeration propertyNames = properties.propertyNames();
27 | while (propertyNames.hasMoreElements()) {
28 | // 获取系统属性的键key
29 | String key = (String) propertyNames.nextElement();
30 | // 获得当前键key对应的值value
31 | String value = System.getProperty(key);
32 | System.out.println(key + "--->" + value);
33 | }
34 | }
35 | }
36 |
37 | ```
38 |
39 | **2.currentTimeMillis()**
40 |
41 | currentTimeMillis()方法返回一个long类型的值,该值表示当前时间与1970年1月1日0点0分0秒之间的时间差,单位是毫秒,通常也将该值称作时间戳。
42 |
43 | ```java
44 | package cn.itcast.chapter05.example10;
45 | /**
46 | * 计算程序在进行求和操作时所消耗的时间
47 | */
48 | public class Example10 {
49 | public static void main(String[] args) {
50 | long startTime = System.currentTimeMillis();// 循环开始时的当前时间
51 | int sum = 0;
52 | for (int i = 0; i < 100000000; i++) {
53 | sum += i;
54 | }
55 | long endTime = System.currentTimeMillis();// 循环结束后的当前时间
56 | System.out.println("程序运行的时间为:" + (endTime - startTime) + "毫秒");
57 | }
58 | }
59 | ```
60 |
61 | **3.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)**
62 |
63 | arraycopy()方法用于将一个数组中的元素快速拷贝到另一个数组。其中的参数具体作用如下:
64 |
65 | - src:表示源数组。
66 | - dest:表示目标数组。
67 | - srcPos:表示源数组中拷贝元素的起始位置。
68 | - destPos:表示拷贝到目标数组的起始位置。
69 | - length:表示拷贝元素的个数。
70 |
71 | ```java
72 | package cn.itcast.chapter05.example11;
73 | /**
74 | * 数组元素的拷贝
75 | */
76 | public class Example11 {
77 | public static void main(String[] args) {
78 | int[] fromArray = { 101, 102, 103, 104, 105, 106 }; // 源数组
79 | int[] toArray = { 201, 202, 203, 204, 205, 206, 207 }; // 目标数组
80 | System.arraycopy(fromArray, 2, toArray, 3, 4); // 拷贝数组元素
81 | // 打印目标数组中的元素
82 | for (int i = 0; i < toArray.length; i++) {
83 | System.out.println(i + ": " + toArray[i]);
84 | }
85 | }
86 | }
87 | ```
88 |
89 | **4.SystemClock.uptimeMillis()**
90 |
91 | ### Runtime类
92 |
93 | Runtime类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例,因此该类采用单例模式进行设计,对象不可以直接实例化。若想在程序中获得一个Runtime实例,只能通过以下方式:
94 |
95 | 
96 |
97 | **案例代码**
98 |
99 | 由于Runtime类封装了虚拟机进程,因此,在程序中通常会通过该类的实例对象来获取当前虚拟机的相关信息。
100 |
101 | ```java
102 | package cn.itcast.chapter05.example12;
103 | /**
104 | * Runtime类的使用
105 | */
106 | public class Example12 {
107 | public static void main(String[] args) {
108 | Runtime rt = Runtime.getRuntime(); // 获取
109 | System.out.println("处理器的个数: " + rt.availableProcessors() + "个");
110 | System.out.println("空闲内存数量: " + rt.freeMemory() / 1024 / 1024 + "M");
111 | System.out.println("最大可用内存数量: " + rt.maxMemory() / 1024 / 1024 + "M");
112 | }
113 | }
114 | ```
115 |
116 | **案例代码**
117 |
118 | Runtime类中提供了一个exec()方法,该方法用于执行一个dos命令,从而实现和在命令行窗口中输入dos命令同样的效果。例如,通过运行“notepad.exe”命令打开一个Windows自带的记事本程序
119 |
120 | ```java
121 | package cn.itcast.chapter05.example13;
122 | import java.io.IOException;
123 | /**
124 | * 使用exec()方法打开记事本
125 | */
126 | public class Example13 {
127 | public static void main(String[] args) throws IOException {
128 | Runtime rt = Runtime.getRuntime(); // 创建Runtime实例对象
129 | rt.exec("notepad.exe"); // 调用exec()方法
130 | }
131 | }
132 | ```
133 |
134 | 打开记事本并在3秒后自动关闭
135 |
136 | ```java
137 | package cn.itcast.chapter05.example14;
138 | /**
139 | * 打开的记事本并在3秒后自动关闭
140 | */
141 | public class Example14 {
142 | public static void main(String[] args) throws Exception {
143 | Runtime rt = Runtime.getRuntime(); // 创建一个Runtime实例对象
144 | Process process = rt.exec("notepad.exe");// 得到表示进程的Process对象
145 | Thread.sleep(3000); // 程序休眠3秒
146 | process.destroy(); // 杀掉进程
147 | }
148 | }
149 | ```
150 |
151 | ```java
152 | Runtime.getRuntime().availableProcessors(); // 获取CPU核心数
153 | Runtime.getRuntime().maxMemory(); // 获取应用被分配的最大内存
154 | ```
--------------------------------------------------------------------------------
/第4章 常见对象/img/1491233180836.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1491233180836.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1491233242191.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1491233242191.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1491233285336.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1491233285336.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1491268860124.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1491268860124.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1491271174524.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1491271174524.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1491271246139.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1491271246139.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1500705653143.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1500705653143.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1500705834086.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1500705834086.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1500705855076.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1500705855076.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1500705950098.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1500705950098.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1500706110171.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1500706110171.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1500707150203.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1500707150203.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/1500707193893.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/1500707193893.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/regex.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/regex.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/regex1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/regex1.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/regex2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/regex2.png
--------------------------------------------------------------------------------
/第4章 常见对象/img/常用正则表达式.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第4章 常见对象/img/常用正则表达式.png
--------------------------------------------------------------------------------
/第4章 常见对象/分组替换.md:
--------------------------------------------------------------------------------
1 | ## 分组替换
2 |
3 | java正则表达式分组替换实现
4 |
5 | java并没有提供类似csharp的正则表达式分组替换机制,要做高级的正则表达式分组替换需要自己实现。
6 |
7 | 所幸的是[Elliott Hughes](http://elliotth.blogspot.com/2004/07/java-implementation-of-rubys-gsub.html)已经实现了java的正则表达是分组替换。
8 |
9 | 下面是它的实现代码:
10 |
11 | ```java
12 | import java.util.regex.*;
13 |
14 | /**
15 | * A Rewriter does a global substitution in the strings passed to its
16 | * 'rewrite' method. It uses the pattern supplied to its constructor, and is
17 | * like 'String.replaceAll' except for the fact that its replacement strings
18 | * are generated by invoking a method you write, rather than from another
19 | * string. This class is supposed to be equivalent to Ruby's 'gsub' when
20 | * given a block. This is the nicest syntax I've managed to come up with in
21 | * Java so far. It's not too bad, and might actually be preferable if you
22 | * want to do the same rewriting to a number of strings in the same method
23 | * or class. See the example 'main' for a sample of how to use this class.
24 | *
25 | * @author Elliott Hughes
26 | */
27 | public abstract class Rewriter
28 | {
29 | private Pattern pattern;
30 | private Matcher matcher;
31 |
32 | /**
33 | * Constructs a rewriter using the given regular expression; the syntax is
34 | * the same as for 'Pattern.compile'.
35 | */
36 | public Rewriter(String regex)
37 | {
38 | this.pattern = Pattern.compile(regex);
39 | }
40 |
41 | /**
42 | * Returns the input subsequence captured by the given group during the
43 | * previous match operation.
44 | */
45 | public String group(int i)
46 | {
47 | return matcher.group(i);
48 | }
49 |
50 | /**
51 | * Overridden to compute a replacement for each match. Use the method
52 | * 'group' to access the captured groups.
53 | */
54 | public abstract String replacement();
55 |
56 | /**
57 | * Returns the result of rewriting 'original' by invoking the method
58 | * 'replacement' for each match of the regular expression supplied to the
59 | * constructor.
60 | */
61 | public String rewrite(CharSequence original)
62 | {
63 | this.matcher = pattern.matcher(original);
64 | StringBuffer result = new StringBuffer(original.length());
65 | while (matcher.find())
66 | {
67 | matcher.appendReplacement(result, "");
68 | result.append(replacement());
69 | }
70 | matcher.appendTail(result);
71 | return result.toString();
72 | }
73 |
74 | public static void main(String... args) throws Exception
75 | {
76 | String str = "12 54 1 65";
77 |
78 | // anonymous subclass
79 | Rewriter tripler = new Rewriter("(\\d{1,2})")
80 | {
81 | public String replacement()
82 | {
83 | int intValue = Integer.valueOf(group(1));
84 | return String.valueOf(intValue * 3);
85 | }
86 | };
87 | System.out.println(tripler.rewrite(str));
88 |
89 | // inline subclass
90 | System.out.println(new Rewriter("(\\d{1,2})")
91 | {
92 | public String replacement()
93 | {
94 | int intValue = Integer.valueOf(group(1));
95 | return String.valueOf(intValue * 3);
96 | }
97 | }.rewrite(str));
98 |
99 | }
100 | }
101 | ```
102 |
103 | Rewriter类是一个抽象类,我们需要根据需要实现`replacement()`方法,该方法会根据正则匹配的分组的结果返回要替换的值。
--------------------------------------------------------------------------------
/第4章 常见对象/常见对象.md:
--------------------------------------------------------------------------------
1 | ## 日期
2 |
3 | 求当前时间100天后的时间日期,格式化为xxxx年xx月xx日
4 |
5 | ### Date
6 |
7 | | 方法声明 | 功能描述 |
8 | | --------- | ---- |
9 | | getTime() | |
10 | | setTime() | |
11 | | | |
12 |
13 | ### SimpleDateFormat:
14 |
15 | | 返回值 | 方法声明 | 功能描述 |
16 | | ------ | -------- | ----- |
17 | | Stirng | format() | 格式化日期 |
18 | | Date | parse() | |
19 |
20 | ### Calendar
21 |
22 | | 方法声明 | 功能描述 |
23 | | -------------------------------- | --------------------------- |
24 | | get(int field) | 返回给定日历字段的值 |
25 | | getInstance() | |
26 | | add(int field,int amount) | 根据给定的日历字段和对应的时间,来对当前的日历进行操作 |
27 | | set(int year,int month,int date) | 设置当前日历的年月日 |
28 |
29 | ```
30 | Calendar rightNow = Calendar.getInstance(); // 子类对象
31 |
32 | publicvoid add(int field,int amount):根据给定的日历字段和对应的时间,来对当前的日历进行操作。
33 |
34 | publicfinal void set(int year,int month,int date):设置当前日历的年月日
35 |
36 | // 三年前的今天
37 |
38 | c.add(Calendar.YEAR, -3);
39 |
40 | ```
41 |
42 |
--------------------------------------------------------------------------------
/第4章 常见对象/格式化.md:
--------------------------------------------------------------------------------
1 | 格式化
--------------------------------------------------------------------------------
/第5章 多线程/README.md:
--------------------------------------------------------------------------------
1 | ## 第5章 多线程
2 |
3 | * [5.1 多线程](多线程.md)
4 | * [5.2 线程池](线程池.md)
5 | * [5.3 volatile关键字解析](volatile关键字解析.md)
6 | * [5.4 HandlerThread](HandlerThread.md)
7 | * [5.5 Callable和Future](Callable和Future.md)
8 | * [5.6 Java程序死锁问题原理及解决方案](Java程序死锁问题原理及解决方案.md)
9 | * [5.7 线程锁技术](线程锁技术.md)
10 | * [5.8 定时器、互斥、同步通信技术](定时器、互斥、同步通信技术.md)
11 | * [5.9 线程范围内共享数据](线程范围内共享数据.md)
12 | * [5.10 多个线程之间共享数据的方式探讨](多个线程之间共享数据的方式探讨.md)
13 | * [5.11 使用JDK5中同步技术的3个面试题](使用JDK5中同步技术的3个面试题.md)
14 | * [5.12 同步工具类](同步工具类.md)
15 | * [5.13 原子类](原子类.md)
16 | * [5.14 集合及concurrent并发包总结](集合及concurrent并发包总结.md)
17 | * [5.15 JDK8对并发的新支持](JDK8对并发的新支持.md)
18 |
--------------------------------------------------------------------------------
/第5章 多线程/img/LongAdder.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/LongAdder.png
--------------------------------------------------------------------------------
/第5章 多线程/img/code.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/code.jpg
--------------------------------------------------------------------------------
/第5章 多线程/img/coding.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/coding.jpg
--------------------------------------------------------------------------------
/第5章 多线程/img/concurrent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/concurrent.png
--------------------------------------------------------------------------------
/第5章 多线程/img/fork_join_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/fork_join_01.png
--------------------------------------------------------------------------------
/第5章 多线程/img/fork_join_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/fork_join_02.png
--------------------------------------------------------------------------------
/第5章 多线程/img/fork_join_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/fork_join_03.png
--------------------------------------------------------------------------------
/第5章 多线程/img/fork_join_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/fork_join_04.png
--------------------------------------------------------------------------------
/第5章 多线程/img/lock.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/lock.jpg
--------------------------------------------------------------------------------
/第5章 多线程/img/thread.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread.jpg
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_01.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_02.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_03.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_04.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_05.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_06.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_07.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_08.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_09.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_10.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_11.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_12.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_13.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_14.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_15.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_16.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_17.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_18.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_20.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_21.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_22.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_pool_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_pool_01.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_pool_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_pool_02.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_pool_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_pool_03.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_pool_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_pool_04.png
--------------------------------------------------------------------------------
/第5章 多线程/img/thread_pool_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/thread_pool_05.png
--------------------------------------------------------------------------------
/第5章 多线程/img/threadlocal.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/threadlocal.png
--------------------------------------------------------------------------------
/第5章 多线程/img/threadpoolexecutor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/threadpoolexecutor.png
--------------------------------------------------------------------------------
/第5章 多线程/img/任务.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/任务.png
--------------------------------------------------------------------------------
/第5章 多线程/img/共享模式.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/共享模式.jpg
--------------------------------------------------------------------------------
/第5章 多线程/img/挂起状态.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/挂起状态.jpg
--------------------------------------------------------------------------------
/第5章 多线程/img/线程运行架构.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第5章 多线程/img/线程运行架构.png
--------------------------------------------------------------------------------
/第6章 集合框架/Collection接口.md:
--------------------------------------------------------------------------------
1 | ## 1. Java类中集合的关系图
2 |
3 | 
4 |
5 | 
6 |
7 | ## 2. 集合类概述
8 |
9 | 在程序中可以通过数组来保存多个对象,但在某些情况下开发人员无法预先确定需要保存对象的个数,此时数组将不再适用,因为数组的长度不可变。例如,要保存一个学校的学生信息,由于不停有新生来报道,同时也有学生毕业离开学校,这时学生的数目就很难确定。为了在程序中可以保存这些数目不确定的对象,JDK中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,在Java中这些类被统称为集合。集合类都位于java.util包中,在使用时一定要注意导包的问题,否则会出现异常。
10 |
11 | ### 2.1 为什么出现集合类?
12 |
13 | 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,Java就提供了集合类。
14 |
15 | ### 2.2 数组和集合类同是容器,有何不同?
16 |
17 | 
18 |
19 | ### 2.3 集合类的特点
20 |
21 | 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象。
22 |
23 | ## 3. Collection接口概述
24 |
25 | Collection:单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两个重要的子接口,分别是List和Set。其中,List的特点是元素有序、元素可重复。Set的特点是元素无序,而且不可重复。List接口的主要实现类有ArrayList和LinkedList,Set接口的主要实现类有HashSet和TreeSet。
26 |
27 | Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。
28 |
29 | 
30 |
31 | ## 4. Collection接口成员方法
32 |
33 | 集合层次结构中的根接口。Collection表示一组对象,这些对象也称为Collection的元素。一些Collection允许有重复的元素,而另一些则不允许。一些Collection是有序的,而另一些则是无序的。
34 |
35 | ### 添加功能
36 |
37 | | 方法声明 | 功能描述 |
38 | | :------- | :-------- |
39 | | add() | 添加元素 |
40 | | addAll() | 添加一个集合的元素 |
41 |
42 | ### 删除功能
43 |
44 | | 方法声明 | 功能描述 |
45 | | ----------- | --------- |
46 | | remove() | 删除元素 |
47 | | removeAll() | 删除一个集合的元素 |
48 | | clear() | 清空集合 |
49 |
50 | ### 判断功能
51 |
52 | | 方法声明 | 功能描述 |
53 | | ------------- | ----------------- |
54 | | contains() | 判断集合是否包含指定的元素 |
55 | | containsAll() | 判断一个集合是否包含一个集合的元素 |
56 | | isEmpty() | 判断集合是否为空 |
57 |
58 | ### 获取功能
59 |
60 | | 方法声明 | 功能描述 |
61 | | ----------- | -------- |
62 | | size() | 获取集合的长度 |
63 | | retainAll() | 取两个集合的交集 |
64 |
65 | ### 其他功能
66 |
67 | | 方法声明 | 功能描述 |
68 | | ---------- | ----------------- |
69 | | toArray() | 把集合转成数组,可以实现集合的遍历 |
70 | | iterator() | 迭代器,集合的专用遍历方式 |
71 |
72 | 
--------------------------------------------------------------------------------
/第6章 集合框架/List接口.md:
--------------------------------------------------------------------------------
1 | ## List接口概述
2 |
3 | 有序的 collection(也称为序列/线性表)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。与 set 不同,列表通常允许重复的元素。
4 |
5 | List接口是Collection接口的一个子接口,List集合的特性是:有序,可重复,元素有索引,List接口有三个实现类
6 |
7 | - ArrayList:底层数据结构是数组,查询快,增删慢,非线程安全,效率高,数据增长为原来的50%
8 | - Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,数据增长为原来的一倍
9 | - LinkedList:底层数据结构是链表,查询慢,增删快,非线程安全,效率高
10 |
11 |
12 | ## Vector
13 |
14 | 底层数据结构是数组,查询快,增删慢,线程安全,效率低。
15 |
16 | Vector类特有功能
17 |
18 | - public void addElement(E obj):添加元素
19 | - public E elementAt(int index):根据索引获取元素
20 | - public Enumeration elements():获取所有的元素
21 |
22 | ## ArrayList
23 |
24 | 底层数据结构是数组,查询快,增删慢,线程不安全,效率高。
25 |
26 | ## LinkedList
27 |
28 | 与ArrayList基于数组结构不同的是,LinkedList是基于链表的结构,因此具有链表特有的功能
29 |
30 | | 方法声明 | 功能描述 |
31 | | :------------ | :------------ |
32 | | addFirst() | 在集合的第0个位置添加元素 |
33 | | addLast() | 在集合的最后位置添加元素 |
34 | | getFirst() | 获取集合的第0个元素 |
35 | | getLast() | 获取集合的最后一个元素 |
36 | | removeFirst() | 删除集合的第0个元素 |
37 | | removeLast() | 删除集合的最后一个元素 |
38 |
39 | 代码示例:使用LinkedList来模拟一个栈数据结构
40 |
41 | ```java
42 | package cn.itcast;
43 |
44 | import java.util.LinkedList;
45 |
46 | /*
47 | *使用LinkedList模拟栈数据结构的集合,并测试
48 | *1、栈的特点先进后出
49 | *2、 LinkedList的特有添加功能addFirst()
50 | */
51 | class MyStack {
52 | private LinkedList link;
53 |
54 | public MyStack() {
55 | link = new LinkedList();
56 | }
57 |
58 | public void add(Object obj) {
59 | // 将指定元素插入此列表的开头
60 | link.addFirst(obj);
61 | }
62 |
63 | public Object get() {
64 | // 移除并返回此列表的第一个元素。
65 | // return link.getFirst();
66 | return link.removeFirst();
67 | }
68 |
69 | public boolean isEmpty() {
70 | return link.isEmpty();
71 | }
72 | }
73 |
74 | /*
75 | * MyStack的测试
76 | */
77 | public class MyStackDemo {
78 | public static void main(String[] args) {
79 | // 创建集合对象
80 | MyStack ms = new MyStack();
81 | // 添加元素
82 | ms.add("hello");
83 | ms.add("world");
84 | ms.add("java");
85 | ms.add("android");
86 | ms.add("javase");
87 | while (!ms.isEmpty()) {
88 | System.out.println(ms.get());
89 | }
90 | }
91 | }
92 | ```
93 | 运行结果:
94 |
95 | 
--------------------------------------------------------------------------------
/第6章 集合框架/Predicate和Stream操作集合.md:
--------------------------------------------------------------------------------
1 | ## Predicate 操作集合
2 |
3 | Predicate 谓词对象,函数式接口,可以使用Lambda表达式作为参数。
4 |
5 | - test()
6 |
7 | Collection的removeIf(Predicate filter)方法,批量删除符合filter条件的元素
8 |
9 | ## Stream 操作集合
10 |
11 | > A sequence of elements supporting sequential and parallel aggregate operations.
12 |
13 | - Stream是元素的集合,这点让Stream看起来用些类似Iterator;
14 | - 可以支持顺序和并行的对原Stream进行汇聚的操作;
15 |
16 | ### Stream是什么?高级迭代器
17 |
18 | - 大家可以把Stream当成一个高级版本的Iterator
19 | - Iterator,用户只能一个一个的遍历元素并对其执行某些操作
20 | - Stream,用户只要给出需要对其包含的元素执行什么操作
21 |
22 | ### 什么是Stream api
23 |
24 | jdk8使用流水线的方法处理数据。一堆操作符的集合。
25 |
26 | dk8 Stream:是一个集合,但是可能接受多个环节的处理。每个环节专门的操作符(处理方法:由于非常简短看起来就像一个符号)
27 |
28 | 流式 API,获取Stream:Collection的stream()方法
29 |
30 | - Stream
31 | - IntStream
32 | - LongStream
33 | - DoubleStream
34 |
35 | 对应的Builder
36 |
37 | - Stream.Builder
38 | - IntStream.Builder
39 | - LongStream.Builder
40 | - DoubleStream.Builder
41 |
42 | ### Stream
43 |
44 | 中间方法
45 |
46 | | 方法声明 | 功能描述 |
47 | | -------------- | ----- |
48 | | filter() | 过滤 |
49 | | map() | 转换 |
50 | | mapToXxx() | 一对一转换 |
51 | | flatMap() | 集合扁平化 |
52 | | flatMapToXxx() | |
53 | | peek() | |
54 | | skip() | |
55 | | distinct() | 去重 |
56 | | sorted() | 排序 |
57 | | limit() | |
58 | | concat() | 合并流 |
59 |
60 | 末端方法
61 |
62 | | 方法声明 | 功能描述 |
63 | | ----------- | ----------- |
64 | | forEach() | 遍历 |
65 | | toArray() | 将流中的元素转换成数组 |
66 | | reduce() | 合并流中的元素 |
67 | | min() | 最小值 |
68 | | max() | 最大值 |
69 | | count() | 获取流中元素的数量 |
70 | | anyMatch() | |
71 | | allMatch() | |
72 | | nonMatch() | |
73 | | findFirst() | 获取流中的第一个元素 |
74 | | findAny() | 获取流中的任意一个元素 |
75 |
76 | ### IntStream
77 |
78 | | 方法声明 | 功能描述 |
79 | | ---------- | ----- |
80 | | builder() | |
81 | | max() | |
82 | | min() | |
83 | | sum() | |
84 | | count() | |
85 | | average() | |
86 | | allMatch() | |
87 | | anyMatch() | |
88 | | map() | 一对一转换 |
89 | | forEach() | 遍历 |
90 |
91 |
--------------------------------------------------------------------------------
/第6章 集合框架/Queue接口.md:
--------------------------------------------------------------------------------
1 | ### 栈
2 |
3 | - LIFO
4 | - Stack
5 | - LinkedList 双向链表,栈的链式实现
6 |
7 | ### 队列
8 |
9 | - Queue接口
10 | - PriorityQueue 优先队列
11 | - ConcurrentLinkedQueue 支持并发访问的基于链表的队列
12 | - 插入
13 | - add()
14 | - offer()
15 | - 删除
16 | - remove()
17 | - poll()
18 | - 检查
19 | - element()
20 | - peek()
21 |
22 | ### 阻塞队列
23 |
24 | BlockingQueue
25 |
26 | - ArrayBlockingQueue 顺序阻塞队列
27 | - LinkedBlockingQueue 链式阻塞队列
28 | - PriorityBlockingQueue 优先阻塞队列
29 | - SynchronousQueue 同步阻塞队列
30 | - DelayQueue
31 | - BlockingDeque 双端阻塞队列
32 | - LinkedBlockingDeque 基于链表的双端阻塞队列
33 |
34 | ### Deque 双端队列
35 |
36 | 可以当成队列和栈使用
37 |
38 | - ArrayDeque
39 | - LinkedBlockingDeque
40 | - LinkedList
41 |
42 |
43 | | 方法说明 | 功能说明 |
44 | | ------------- | --------------------- |
45 | | addFirst() | 队首添加元素 |
46 | | addLast() | 队尾添加元素 |
47 | | offerFirst() | 队首添加元素 |
48 | | offerLast() | 队尾添加元素 |
49 | | removeFirst() | 删除队首元素 |
50 | | removeLast() | 删除队尾元素 |
51 | | pollFirst() | 返回并删除队首元素 |
52 | | pollLast() | 返回并删除队尾元素 |
53 | | getFirst() | 获取队首元素,如果队列为空,则抛异常 |
54 | | getLast() | 获取队尾元素,如果队列为空,则抛异常 |
55 | | peekFirst() | 获取队首元素,如果队列为空,则返回null |
56 | | peekLast() | 获取队尾元素,如果队列为空,则返回null |
57 |
58 |
--------------------------------------------------------------------------------
/第6章 集合框架/README.md:
--------------------------------------------------------------------------------
1 | ## 第6章 集合框架
2 |
3 | * [Collection接口](Collection接口.md)
4 | * [List接口](List接口.md)
5 | * [Set接口](Set接口.md)
6 | * [Queue接口](Queue接口.md)
7 | * [集合的遍历](集合的遍历.md)
8 | * [集合工具类](集合工具类.md)
9 | * [Map接口](Map接口.md)
10 | * [Predicate和Stream操作集合](Predicate和Stream操作集合.md)
11 | * [集合框架的综合应用](集合框架的综合应用.md)
12 | * [Java集合类型详解](Java集合类型详解.md)
13 | * [LinkedList源码剖析](LinkedList源码剖析.md)
14 | * [LinkedHashMap源码剖析](LinkedHashMap源码剖析.md)
15 | * [HashMap、哈希表、哈希函数](HashMap、哈希表、哈希函数.md)
16 | * [HashMap的实现原理](HashMap的实现原理.md)
17 | * [HashMap源码剖析](HashMap源码剖析.md)
18 |
19 | 
20 |
--------------------------------------------------------------------------------
/第6章 集合框架/images/1500707872157.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/1500707872157.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/1500708070711.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/1500708070711.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/6.1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/6.1.jpg
--------------------------------------------------------------------------------
/第6章 集合框架/images/6.2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/6.2.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/6.3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/6.3.jpg
--------------------------------------------------------------------------------
/第6章 集合框架/images/6.4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/6.4.jpg
--------------------------------------------------------------------------------
/第6章 集合框架/images/6.5.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/6.5.jpg
--------------------------------------------------------------------------------
/第6章 集合框架/images/6.6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/6.6.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/ArrayMap_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/ArrayMap_1.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/ArrayMap_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/ArrayMap_2.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/Collection_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/Collection_01.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/Collection_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/Collection_02.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/Collection_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/Collection_03.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/Collection_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/Collection_04.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/Collection_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/Collection_05.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/hashmap实现原理1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/hashmap实现原理1.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/hashmap实现原理2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/hashmap实现原理2.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/hashmap实现原理3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/hashmap实现原理3.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/hashmap实现原理4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/hashmap实现原理4.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/hashmap实现原理5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/hashmap实现原理5.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/hashmap实现原理6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/hashmap实现原理6.png
--------------------------------------------------------------------------------
/第6章 集合框架/images/集合框架.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第6章 集合框架/images/集合框架.png
--------------------------------------------------------------------------------
/第6章 集合框架/线程安全的集合.md:
--------------------------------------------------------------------------------
1 | ## 线程安全的集合
2 |
3 | Collections
4 |
5 | - synchronizedList()
6 | - synchronizedSet()
7 | - synchronizedMap()
8 |
9 | 支持高效并发访问的集合
10 |
11 | - ConcurrentHashMap
12 | - ConcurrentSkipListMap
13 | - ConcurrentSkipListSet
14 | - ConcurrentLinkedQueue
15 | - ConcurrentLinkedDeque
16 |
17 | 采用复制底层数组的方式来实现写操作的集合
18 |
19 | - CopyOnWriteArrayList
20 | - CopyOnWriteArraySet
--------------------------------------------------------------------------------
/第6章 集合框架/集合框架2.md:
--------------------------------------------------------------------------------
1 | # Collection
2 |
3 | 集合层次结构中的根接口。Collection表示一组对象,这些对象也称为Collection的元素。一些Collection允许有重复的元素,而另一些则不允许。一些Collection是有序的,而另一些则是无序的。
4 |
5 | ## 添加功能
6 |
7 | | 方法声明 | 功能描述 |
8 | | :------- | :-------- |
9 | | add() | 添加元素 |
10 | | addAll() | 添加一个集合的元素 |
11 |
12 | ## 删除功能
13 |
14 | | 方法声明 | 功能描述 |
15 | | ----------- | --------- |
16 | | remove() | 删除元素 |
17 | | removeAll() | 删除一个集合的元素 |
18 | | clear() | 清空集合 |
19 |
20 | ## 判断功能
21 |
22 | | 方法声明 | 功能描述 |
23 | | ------------- | ----------------- |
24 | | contains() | 判断集合是否包含指定的元素 |
25 | | containsAll() | 判断一个集合是否包含一个集合的元素 |
26 | | isEmpty() | 判断集合是否为空 |
27 |
28 | ## 获取功能
29 |
30 | | 方法声明 | 功能描述 |
31 | | ----------- | -------- |
32 | | size() | 获取集合的长度 |
33 | | retainAll() | 取两个集合的交集 |
34 |
35 | ## 其他功能
36 |
37 | | 方法声明 | 功能描述 |
38 | | ---------- | ----------------- |
39 | | toArray() | 把集合转成数组,可以实现集合的遍历 |
40 | | iterator() | 迭代器,集合的专用遍历方式 |
41 |
42 | # List
43 |
44 | List接口是Collection接口的一个子接口,List集合的特性是:有序,可重复,元素有索引,List接口有三个实现类
45 |
46 | - ArrayList:底层数据结构是数组,查询快,增删慢,非线程安全,效率高,数据增长为原来的50%
47 | - Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,数据增长为原来的一倍
48 | - LinkedList:底层数据结构是链表,查询慢,增删快,非线程安全,效率高
49 |
50 | List接口新增加的方法
51 |
52 | | 方法声明 | 功能描述 |
53 | | ----------------------------------- | --------------------------- |
54 | | set(int index, E element) | 修改指定位置处的元素 |
55 | | get(int index) | 获取指定位置的元素 |
56 | | indexOf(Object o) | 返回指定元素在集合中第一次出现的索引 |
57 | | lastIndexOf(Object o) | 返回指定元素在集合中最后一次出现的索引 |
58 | | subList(int fromIndex, int toIndex) | 返回fromIndex位置到toIndex位置的子集合 |
59 |
60 | ## ArrayList
61 |
62 | | 方法声明 | 功能描述 |
63 | | ------------------------------ | ------------------- |
64 | | ArrayList(Collection c) | 通过一个集合创建ArrayList对象 |
65 | | ArrayList(int initialCapacity) | 指定集合大小的构造方法 |
66 |
67 | ## LinkedList
68 |
69 | 与ArrayList基于数组结构不同的是,LinkedList是基于链表的结构,因此具有链表特有的功能
70 |
71 | | 方法声明 | 功能描述 |
72 | | :------------ | :------------ |
73 | | addFirst() | 在集合的第0个位置添加元素 |
74 | | addLast() | 在集合的最后位置添加元素 |
75 | | getFirst() | 获取集合的第0个元素 |
76 | | getLast() | 获取集合的最后一个元素 |
77 | | removeFirst() | 删除集合的第0个元素 |
78 | | removeLast() | 删除集合的最后一个元素 |
79 |
80 | ## Vector
81 |
82 | # Set
83 |
84 | Set接口是List接口的另一个子接口,Set集合的元素特点是无序,唯一的。
85 |
86 | - HashSet:底层数据结构是哈希表,由hashCode()和equals()保证元素唯一性
87 | - LinkedHashSet:底层是哈希表和链表,由链表保证元素有序,由哈希表保证元素唯一
88 | - TreeSet:底层数据结构是红黑树(自平衡的二叉树),由自然排序和比较器排序保证元素的排序;根据比较的返回值是否是0来证元素唯一性
89 |
90 | ## HashSet
91 |
92 | HashSet 是一个没有重复元素的集合。 它是由HashMap实现的(HashSet中大量调用了HashMap的方法,其内部封装了一个HashMap ),不保证元素的顺序,而且HashSet允许使用 null 元素。
93 |
94 | ## LinkedHashSet
95 |
96 | ## TreeSet
97 |
98 | 元素是无序(存入和取出的顺序不一定一致),元素不可以重复,因为该集合体系没有索引。Set集合的功能Collection是一致的,取出只有一种方式 就是迭代器
99 |
100 | # Map
101 |
102 | | 方法声明 | 功能描述 |
103 | | :------------------ | :----------- |
104 | | put(K key, V value) | 有添加和替换功能 |
105 | | putAll(Map m) | 添加一个Map的元素 |
106 | | clear() | 清空集合 |
107 | | remove(Object key) | 根据键删除一个元素 |
108 | | containsKey() | 判断集合是否包含指定的键 |
109 | | containsValue() | 判断集合是否包含指定的值 |
110 | | isEmpty() | 判断集合是否为空 |
111 | | get(Object key) | 根据键获取值 |
112 | | keySet() | 获取所有的键 |
113 | | values() | 获取所有的值 |
114 | | entrySet() | 获取所有的Entry |
115 | | size() | 获取集合元素的个数 |
116 |
117 | ## HashMap
118 |
119 | ## LinkedHashMap
120 |
121 | ## TreeMap
122 |
123 | # 集合的遍历
124 |
125 | # 集合的排序
126 |
127 | # Collections
128 |
129 | # Arrays
130 |
131 |
132 |
133 |
--------------------------------------------------------------------------------
/第6章 集合框架/集合框架的综合应用.md:
--------------------------------------------------------------------------------
1 | ## 集合框架的综合应用
2 |
3 | 代码示例:模拟斗地主洗牌和发牌
4 |
5 | ```java
6 | package cn.itcast_04;
7 |
8 | import java.util.ArrayList;
9 | import java.util.Collections;
10 | import java.util.HashMap;
11 | import java.util.TreeSet;
12 |
13 | /*
14 | * 思路:
15 | * A:创建一个HashMap集合
16 | * B:创建一个ArrayList集合
17 | * C:创建花色数组和点数数组
18 | * D:从0开始往HashMap里面存储编号,并存储对应的牌
19 | * 同时往ArrayList里面存储编号即可。
20 | * E:洗牌(洗的是编号)
21 | * F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
22 | * G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
23 | */
24 | public class PokerDemo {
25 | public static void main(String[] args) {
26 | // 创建一个HashMap集合
27 | HashMap hm = new HashMap();
28 |
29 | // 创建一个ArrayList集合
30 | ArrayList array = new ArrayList();
31 |
32 | // 创建花色数组和点数数组
33 | // 定义一个花色数组
34 | String[] colors = { "♠", "♥", "♣", "♦" };
35 | // 定义一个点数数组
36 | String[] numbers = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q",
37 | "K", "A", "2", };
38 |
39 | // 从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。
40 | int index = 0;
41 |
42 | for (String number : numbers) {
43 | for (String color : colors) {
44 | String poker = color.concat(number);
45 | hm.put(index, poker);
46 | array.add(index);
47 | index++;
48 | }
49 | }
50 | hm.put(index, "小王");
51 | array.add(index);
52 | index++;
53 | hm.put(index, "大王");
54 | array.add(index);
55 |
56 | // 洗牌(洗的是编号)
57 | Collections.shuffle(array);
58 |
59 | // 发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
60 | TreeSet fengQingYang = new TreeSet();
61 | TreeSet linQingXia = new TreeSet();
62 | TreeSet liuYi = new TreeSet();
63 | TreeSet diPai = new TreeSet();
64 |
65 | for (int x = 0; x < array.size(); x++) {
66 | if (x >= array.size() - 3) {
67 | diPai.add(array.get(x));
68 | } else if (x % 3 == 0) {
69 | fengQingYang.add(array.get(x));
70 | } else if (x % 3 == 1) {
71 | linQingXia.add(array.get(x));
72 | } else if (x % 3 == 2) {
73 | liuYi.add(array.get(x));
74 | }
75 | }
76 |
77 | // 看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
78 | lookPoker("风清扬", fengQingYang, hm);
79 | lookPoker("林青霞", linQingXia, hm);
80 | lookPoker("刘意", liuYi, hm);
81 | lookPoker("底牌", diPai, hm);
82 | }
83 |
84 | // 写看牌的功能
85 | public static void lookPoker(String name, TreeSet ts,
86 | HashMap hm) {
87 | System.out.print(name + "的牌是:");
88 | for (Integer key : ts) {
89 | String value = hm.get(key);
90 | System.out.print(value + " ");
91 | }
92 | System.out.println();
93 | }
94 | }
95 | ```
96 |
97 | 运行结果:
98 |
99 | 
--------------------------------------------------------------------------------
/第6章 集合框架/集合的遍历.md:
--------------------------------------------------------------------------------
1 | ## 集合的遍历
2 |
3 | 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个接口Iterator。Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代器。
4 |
5 | Iterator迭代器对象在遍历集合时,内部采用指针的方式来跟踪集合中的元素,为了让初学者能更好地理解迭代器的工作原理,接下来通过一个图例来演示Iterator对象迭代元素的过程,如下图所示。
6 |
7 | 
8 |
9 | 图中,在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指向任何元素,当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位,指向第一个元素并将该元素返回,当再次调用next()方法时,迭代器的索引会指向第二个元素并将该元素返回,依此类推,直到hasNext()方法返回false,表示到达了集合的末尾,终止对元素的遍历。
10 |
11 | 需要特别说明的是,当通过迭代器获取ArrayList集合中的元素时,都会将这些元素当做Object类型来看待,如果想得到特定类型的元素,则需要进行强制类型转换。
12 |
13 | 迭代:是取出集合中元素的一种方式。
14 |
15 | 而每一个容器的数据结构不同,所以取出的动作细节也不一样。但是都具有共性内容: 判断和取出。那么就可以将这些共性抽取。那么这些内部类都符合一个规则(或者说都抽取出来一个规则)。该规则就是Iterator。通过一个对外提供的方法:iterator();,来获取集合的取出对象。因为Collection中有iterator方法,所以每一个子类集合对象都具备迭代器。
16 |
17 | 迭代的常见操作
18 |
19 | 
20 |
21 | PS:在迭代时循环中next调用一次,就要hasNext判断一次。
22 |
23 | 并发修改异常,原因:迭代器依赖于集合存在,修改集合元素而迭代器却不知道。
24 |
25 | 解决方法:
26 |
27 | A:迭代器迭代元素,迭代器修改。因为Iterator没有添加功能,所以使用其子接口ListIterator,元素在迭代元素的后面添加。
28 | B:集合遍历元素,集合修改元素(普通for和get(index)结合),元素在最后添加
29 |
30 | ```java
31 | package cn.itcast;
32 |
33 | import java.util.ArrayList;
34 | import java.util.Iterator;
35 | import java.util.List;
36 | import java.util.ListIterator;
37 |
38 | /*
39 | * 问题:有一个集合,如下,请问,我想判断里面有没有"world"这个元素,如果有,我就添加一个"javaee"元素,请写代码实现。
40 | *
41 | * ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
42 | * 产生的原因:
43 | * 迭代器是依赖于集合而存在的,在判断成功后,集合的中新添加了元素,而迭代器却不知道,所以就报错了,这个错叫并发修改异常。
44 | * 其实这个问题描述的是:迭代器遍历元素的时候,通过集合是不能修改元素的。
45 | * 如何解决呢?
46 | * A:迭代器迭代元素,迭代器修改元素,元素是跟在刚才迭代的元素后面的。
47 | * B:集合遍历元素,集合修改元素(普通for),元素在最后添加的。
48 | */
49 | public class ListIteratorDemo {
50 | public static void main(String[] args) {
51 | // 创建List集合对象
52 | List list = new ArrayList();
53 | // 添加元素
54 | list.add("hello");
55 | list.add("world");
56 | list.add("java");
57 |
58 | // 迭代器遍历
59 | // Iterator it = list.iterator();
60 | // while (it.hasNext()) {
61 | // String s = (String) it.next();
62 | // if ("world".equals(s)) {
63 | // list.add("javaee");
64 | // }
65 | // }
66 |
67 | // 方式1:迭代器迭代元素,迭代器修改元素
68 | // 而Iterator迭代器却没有添加功能,所以我们使用其子接口ListIterator
69 | ListIterator lit = list.listIterator();
70 | while (lit.hasNext()) {
71 | String s = (String) lit.next();
72 | if ("world".equals(s)) {
73 | lit.add("javaee");
74 | }
75 | }
76 |
77 | // 方式2:集合遍历元素,集合修改元素(普通for)
78 | for (int x = 0; x < list.size(); x++) {
79 | String s = (String) list.get(x);
80 | if ("world".equals(s)) {
81 | list.add("javaee");
82 | }
83 | }
84 |
85 | System.out.println("list:" + list);
86 | }
87 | }
88 | ```
--------------------------------------------------------------------------------
/第6章 集合框架/高效集合.md:
--------------------------------------------------------------------------------
1 | SparseArray
2 |
3 | ArrayMap
--------------------------------------------------------------------------------
/第7章 IO流/NIO工具类.md:
--------------------------------------------------------------------------------
1 | ## 字符集和CharSet
2 |
3 | ### CharSet
4 |
5 | | 方法说明 | 功能描述 |
6 | | ------------------- | -------------- |
7 | | availableCharsets() | 获取当前JDK所支持的字符集 |
8 | | forName() | 创建CharSet对象 |
9 | | newDecoder() | 创建解码器 |
10 | | newEncoder() | 创建编码器 |
11 | | decode() | 解码 |
12 | | encode() | 编码 |
13 |
14 | ### CharsetDecoder
15 |
16 | | 方法说明 | 功能描述 |
17 | | -------- | ---- |
18 | | decode() | 解码 |
19 |
20 | ### CharsetEncoder
21 |
22 | | 方法说明 | 功能描述 |
23 | | -------- | ---- |
24 | | encode() | 编码 |
25 |
26 | ## 文件锁
27 |
28 | ### FileLock
29 |
30 | | 方法说明 | 功能描述 |
31 | | ---------- | ----------- |
32 | | release() | 释放锁 |
33 | | isShared() | 判断文件锁是否是共享锁 |
34 |
35 | ## IO流工具类
36 |
37 | ### Path
38 |
39 | | 方法说明 | 功能描述 |
40 | | ---------------- | ------------------ |
41 | | getNameCount() | 获取path路径所包含的路径名的数量 |
42 | | getRoot() | 获取path路径的根路径 |
43 | | toAbsolutePath() | 获取path对应的绝对路径 |
44 | | getFileName() | 获取path的文件名 |
45 | | getParent() | 获取path的父路径 |
46 | | startsWith() | |
47 | | subpath() | |
48 | | toFile() | 获取path路径的File对象 |
49 | | toUri() | 返回代表当前路径的uri |
50 | | register() | 监控文件变化 |
51 |
52 | ### Paths
53 |
54 | | 方法说明 | 功能描述 |
55 | | --------------------------------- | ------------- |
56 | | get(String first, String... more) | 获取Path对象 |
57 | | get(Uri uri) | 根据Uri获取Path对象 |
58 |
59 | ### Files
60 |
61 | | 方法说明 | 功能描述 |
62 | | -------------- | ---------------- |
63 | | copy() | 复制文件 |
64 | | isHidden() | 判断文件是否隐藏 |
65 | | size() | 获取文件大小 |
66 | | write() | 将数据写入给定的文件中 |
67 | | readAllLines() | 一次性读取文件的所有行 |
68 | | list() | 列出当前目录下的所有文件和子目录 |
69 | | lines() | 读取文件内容 |
70 | | getFileStore() | 获取FileStore对象 |
71 | | walkFileTree() | 遍历文件和目录 |
72 |
73 | ### FileStore
74 |
75 | | 方法说明 | 功能描述 |
76 | | ---------------- | ------ |
77 | | getTotalSpace() | 获取总大小 |
78 | | getUsableSpace() | 获取可用大小 |
79 | | isReadOnly() | 是否只读 |
80 |
81 | ### FileVisitor 文件访问器
82 |
83 | | 方法说明 | 功能描述 |
84 | | -------------------- | ---------------- |
85 | | postVisitDirectory() | 访问子目录之后触发该方法 |
86 | | preVisitDirectory() | 访问子目录之前触发该方法 |
87 | | visitFile() | 访问File文件时触发该方法 |
88 | | visitFileFailed() | 访问File文件失败时触发该方法 |
89 |
90 | SampleFileVisitor
91 |
92 | ## WatchService
93 |
94 | 监控文件变化
95 |
96 | | 方法说明 | 功能描述 |
97 | | --------------------------------- | --------------------------- |
98 | | poll() | 获取下一个WatchKey |
99 | | poll(long timeout, TimeUnit unit) | 等待 timeout 时间去获取下一个WatchKey |
100 | | take() | 获取下一个WatchKey |
101 |
102 | ```java
103 | WatchService watchService = FileSystems.getDefault().newWatchService();
104 | ```
105 |
106 | ### WatchKey
107 |
108 | | 方法说明 | 功能描述 |
109 | | ------------ | ---- |
110 | | pollEvents() | |
111 | | reset() | 重置 |
112 |
113 | ### WatchEvent
114 |
115 | 文件变化事件
116 |
117 | | 方法说明 | 功能描述 |
118 | | --------- | ---- |
119 | | context() | |
120 | | kind() | 事件类型 |
121 | | count() | |
122 |
123 | ### FileSystems
--------------------------------------------------------------------------------
/第7章 IO流/README.md:
--------------------------------------------------------------------------------
1 | ## 第7章 IO流
2 |
3 | * [7.1 IO流之File类](IO流之File类.md)
4 | * [7.2 IO流之字节流和字符流](IO流之字节流和字符流.md)
5 | * [7.3 常用IO流](常用IO流.md)
6 | * [7.4 NIO](NIO.md)
7 | * [7.5 AIO](AIO.md)
8 | * [7.6 NIO和AIO](NIO和AIO.md)
9 |
10 | 大多数应用程序都需要实现与设备之间的数据传输,例如键盘可以输入数据,显示器可以显示程序的运行结果等。在Java中,将这种通过不同输入输出设备(键盘,内存,显示器,网络等)之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。Java中的“流”都位于java.io包中,称为IO(输入输出)流。
11 |
12 | IO流有很多种,按照操作数据的不同,可以分为字节流和字符流,按照数据传输方向的不同又可分为输入流和输出流,程序从输入流中读取数据,向输出流中写入数据。在IO包中,字节流的输入输出流分别用java.io.InputStream和java.io.OutputStream表示,字符流的输入输出流分别用java.io.Reader和java.io.Writer表示。
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708330117.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708330117.png
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708378450.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708378450.png
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708385651.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708385651.png
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708462472.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708462472.png
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708507437.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708507437.png
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708514090.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708514090.png
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708562018.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708562018.png
--------------------------------------------------------------------------------
/第7章 IO流/img/1500708828607.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/1500708828607.png
--------------------------------------------------------------------------------
/第7章 IO流/img/IO流.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/IO流.png
--------------------------------------------------------------------------------
/第7章 IO流/img/clone1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/clone1.png
--------------------------------------------------------------------------------
/第7章 IO流/img/clone2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/clone2.png
--------------------------------------------------------------------------------
/第7章 IO流/img/clone3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/clone3.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio1.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio10.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio11.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio12.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio13.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio14.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio15.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio16.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio17.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio18.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio19.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio2.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio20.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio21.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio22.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio3.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio4.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio5.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio6.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio7.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio8.png
--------------------------------------------------------------------------------
/第7章 IO流/img/nio9.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/nio9.png
--------------------------------------------------------------------------------
/第7章 IO流/img/selector.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/selector.png
--------------------------------------------------------------------------------
/第7章 IO流/img/多线程服务器.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第7章 IO流/img/多线程服务器.png
--------------------------------------------------------------------------------
/第8章 网络编程/README.md:
--------------------------------------------------------------------------------
1 | ## 第8章 网络编程
2 |
3 | - [网络编程](网络编程.md)
4 | - [写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket](写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket.md)
5 | - [你应该知道的计算机网络知识](你应该知道的计算机网络知识.md)
--------------------------------------------------------------------------------
/第8章 网络编程/img/1491301899020.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1491301899020.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500696169189.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500696169189.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500696433709.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500696433709.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500697304014.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500697304014.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500697450870.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500697450870.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500697479674.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500697479674.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500697742603.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500697742603.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500697917983.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500697917983.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500698079137.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500698079137.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500698230162.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500698230162.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500698398486.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500698398486.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500698550168.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500698550168.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/1500698579414.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/1500698579414.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/http2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/http2.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/http3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/http3.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/http协议.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/http协议.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/osi.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/osi.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/ping.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/ping.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/url.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/url.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/urlconnection.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/urlconnection.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/三次握手.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/三次握手.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/打包与解包.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/打包与解包.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络模型.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络模型.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_01.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_02.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_03.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_04.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_05.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_05.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_06.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_06.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_07.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_07.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_08.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_08.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_09.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_09.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_10.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_10.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_11.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_11.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_12.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_12.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_13.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_13.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_14.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_14.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_15.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_16.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_17.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_17.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_18.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_19.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_20.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_20.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_21.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_21.png
--------------------------------------------------------------------------------
/第8章 网络编程/img/网络编程_22.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第8章 网络编程/img/网络编程_22.png
--------------------------------------------------------------------------------
/第8章 网络编程/写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket.md:
--------------------------------------------------------------------------------
1 | ## 写给那些让我糊里糊涂的HTTP、TCP、UDP、Socket
2 |
3 | 先来一个讲TCP、UDP和HTTP关系的,注意红色mark的部分
4 |
5 | ### 1. TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
6 |
7 | 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。在传输层中有TCP协议与UDP协议。在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。
8 |
9 | ### 2. HTTP协议是建立在请求/响应模型上的。
10 |
11 | 首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息。服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。
12 |
13 | HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。一次TCP链接的建立将需要3次握手。
14 |
15 | 另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。
16 |
17 | ### 3. 结论
18 |
19 | 虽然HTTP本身是一个协议,但其最终还是基于TCP的。不过,目前,有人正在研究基于TCP+UDP混合的HTTP协议。
20 |
21 | ### 4. Socket是什么呢?
22 |
23 | Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
24 |
25 | 
26 |
27 | ## [socket、tcp、udp、http 的认识及区别](http://www.cnblogs.com/chengzhengfu/p/4584510.html)
28 |
29 | ### 1. 先来一个讲TCP、UDP和HTTP关系的
30 |
31 | #### 1.1 TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。
32 |
33 | 在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。 在传输层中有TCP协议与UDP协议。在应用层有FTP、HTTP、TELNET、SMTP、DNS等协议。因此,HTTP本身就是一个协议,是从Web服务器传输超文本到本地浏览器的传送协议。
34 |
35 | #### 1.2 HTTP协议是建立在请求/响应模型上的。
36 |
37 | 首先由客户建立一条与服务器的TCP链接,并发送一个请求到服务器,
38 |
39 | 请求中包含请求方法、URI、协议版本以及相关的MIME样式的消息。
40 |
41 | 服务器响应一个状态行,包含消息的协议版本、一个成功和失败码以及相关的MIME式样的消息。
42 |
43 | HTTP/1.0为每一次HTTP的请求/响应建立一条新的TCP链接,
44 |
45 | 因此一个包含HTML内容和图片的页面将需要建立多次的短期的TCP链接。
46 |
47 | 一次TCP链接的建立将需要3次握手。
48 |
49 | 另外,为了获得适当的传输速度,则需要TCP花费额外的回路链接时间(RTT)。
50 |
51 | 每一次链接的建立需要这种经常性的开销,而其并不带有实际有用的数据,只是保证链接的可靠性,因此HTTP/1.1提出了可持续链接的实现方法。
52 |
53 | HTTP/1.1将只建立一次TCP的链接而重复地使用它传输一系列的请求/响应消息,因此减少了链接建立的次数和经常性的链接开销。
54 |
55 | #### 1.3 结论
56 |
57 | 虽然HTTP本身是一个协议,但其最终还是基于TCP的。不过,目前,有人正在研究基于TCP+UDP混合的HTTP协议。
58 |
59 | Socket是什么呢?Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,
60 |
61 | Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,
62 |
63 | 对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。
64 |
65 | 
66 |
67 | ### 2. TCP、UDP、HTTP、SOCKET之间的区别
68 |
69 | TCP和UDP:传输层协议;HTTP:应用层协议;SOCKET:TCP/IP网络的API。
70 |
71 | TCP/IP代表传输控制协议/网际协议,指的是一系列协议。
72 |
73 | TCP和UDP使用IP协议从一个网络传送数据包到另一个网络。把IP想像成一种高速公路,它允许其它协议在上面行驶并找到到其它电脑的出口。
74 |
75 | TCP和UDP是高速公路上的“卡车”,它们携带的货物就是像HTTP,文件传输协议FTP这样的协议等。
76 |
77 | TCP和UDP是FTP、HTTP和SMTP之类使用的传输层协议。
78 |
79 | 虽然TCP和UDP都是用来传输其他协议的,它们却有一个显著的不同:TCP提供有保证的数据传输,而UDP不提供。
80 |
81 | 这意味着TCP有一个特殊的机制来确保数据安全的不出错的从一个端点传到另一个端点,而UDP不提供任何这样的保证。
82 |
83 | HTTP(超文本传输协议)是利用TCP在两台电脑(通常是Web服务器和客户端)之间传输信息的协议。
84 |
85 | 客户端使用Web浏览器发起HTTP请求给Web服务器,Web服务器发送被请求的信息给客户端。
86 |
87 | 记住,需要IP协议来连接网络;TCP是一种允许我们安全传输数据的机制,使用TCP协议来传输数据的HTTP是Web服务器和客户端使用的特殊协议。
88 |
89 | Socket 接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,用以开发TCP/IP网络上的应用程序。
90 |
91 | ### 3. socket、tcp、udp、http 的认识及区别
92 |
93 | 网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。
94 |
95 | IP 协议对应于网络层,TCP协议对应于传输层,HTTP协议对应于应用层,三者从本质上来说没有可比性,socket则是对TCP/IP协议的封装和应用。
96 |
97 | 可以说,TPC/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据;socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
98 |
99 | 实际上,Socket跟TCP/IP协议没有必然的联系。Socket编程接口在设计的时候,就希望也能适应其他的网络协议。所以说,Socket的出现只是使得程序员更方便地使用TCP/IP协议栈而已,是对TCP/IP协议的抽象,从而形成了我们知道的一些最基本的函数接口,比如create、 listen、connect、accept、send、read和write等等
100 |
101 | 实际上,传输层的TCP是基于网络层的IP协议的,而应用层的HTTP协议又是基于传输层的TCP协议的,而Socket本身不算是协议,就像上面所说,它只是提供了一个针对TCP或者UDP编程的接口
102 |
103 | ### 4. TCP连接的三次握手
104 |
105 | 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
106 |
107 | 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
108 |
109 | 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
110 |
111 | 握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据
112 |
113 | 断开连接时服务器和客户端均可以主动发起断开TCP连接的请求,断开过程需要经过“四次握手”
114 |
115 | TCP是面向链接的,虽然说网络的不安全不稳定特性决定了多少次握手都不能保证连接的可靠性,但TCP的三次握手在最低限度上(实际上也很大程度上保证了)保证了连接的可靠性;
116 |
117 | 而UDP不是面向连接的,UDP传送数据前并不与对方建立连接,对接收到的数据也不发送确认信号, 发送端不知道数据是否会正确接收,当然也不用重发,所以说UDP是无连接的、不可靠的一种数据传输协议
118 |
119 | 也正由于上面的特点,使得UDP的开销更小数据传输速率更高,因为不必进行收发数据的确认,所以UDP的实时性更好。
120 |
121 | 所以采用TCP传输协议的MSN比采用UDP的QQ传输文件慢,但并不能说QQ的通信是不安全的,因为程序员可以手动对UDP的数据收发进行验证,比如发送方对每个数据包进行编号然后由接收方进行验证啊什么的,即使是这样,UDP因为在底层协议的封装上没有采用类似 TCP的“三次握手”而实现了TCP所无法达到的传输效率。
--------------------------------------------------------------------------------
/第9章 安全加密/README.md:
--------------------------------------------------------------------------------
1 | ## 第9章 安全加密
2 |
3 | * [和安全有关的那些事](和安全有关的那些事.md)
4 | * [对称加密](对称加密.md)
5 | * [非对称加密](非对称加密.md)
6 | * [消息摘要MessageDigest](消息摘要MessageDigest.md)
7 | * [数字签名和数字证书](数字签名和数字证书.md)
8 | * [Https扫盲贴](Https扫盲贴.md)
9 | * [Https编程](Https编程.md)
--------------------------------------------------------------------------------
/第9章 安全加密/base64.md:
--------------------------------------------------------------------------------
1 | Base64是一种用64个字符来表示任意二进制数据的方法。
2 |
3 | 用记事本打开`exe`、`jpg`、`pdf`这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符,所以,如果要让记事本这样的文本处理软件能处理二进制数据,就需要一个二进制到字符串的转换方法。Base64是一种最常见的二进制编码方法。
4 |
5 | Base64的原理很简单,首先,准备一个包含64个字符的数组:
6 |
7 | ```
8 | ['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/']
9 | ```
10 |
11 | 
12 |
13 | 然后,对二进制数据进行处理,每3个字节一组,一共是`3x8=24`bit,划为4组,每组正好6个bit:
14 |
15 | 
16 |
17 | 这样我们得到4个数字作为索引,然后查表,获得相应的4个字符,就是编码后的字符串。
18 |
19 | 所以,Base64编码会把3字节的二进制数据编码为4字节的文本数据,长度增加33%,好处是编码后的文本数据可以在邮件正文、网页等直接显示。
20 |
21 | 如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用`\x00`字节在末尾补足后,再在编码的末尾加上1个或2个`=`号,表示补了多少字节,解码的时候,会自动去掉。
22 |
23 | 由于标准的Base64编码后可能出现字符`+`和`/`,在URL中就不能直接作为参数,所以又有一种"url safe"的base64编码,其实就是把字符`+`和`/`分别变成`-`和`_`:
24 |
25 | 还可以自己定义64个字符的排列顺序,这样就可以自定义Base64编码,不过,通常情况下完全没有必要。
26 |
27 | Base64是一种通过查表的编码方法,不能用于加密,即使使用自定义的编码表也不行。
28 |
29 | Base64适用于小段内容的编码,比如数字证书签名、Cookie的内容等。
30 |
31 | 由于`=`字符也可能出现在Base64编码中,但`=`用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把`=`去掉:
32 |
33 | ```
34 | // 标准Base64:
35 | 'abcd' -> 'YWJjZA=='
36 | // 自动去掉=:
37 | 'abcd' -> 'YWJjZA'
38 |
39 | ```
40 |
41 | 去掉`=`后怎么解码呢?因为Base64是把3个字节变为4个字节,所以,Base64编码的长度永远是4的倍数,因此,需要加上`=`把Base64字符串的长度变为4的倍数,就可以正常解码了。
42 |
43 | ### 应用
44 |
45 | 把一些对象转换成string,用处:传输的时候不要明文传输
46 |
47 | - 上传图片,上传语音
48 | - 如何把一个map存到sp-->Base64支持把byte[]-->String,只需把对象先转换成byte[]就可以存到sp中
49 |
50 | ```java
51 | ImageView iv = (ImageView) findViewById(R.id.iv);
52 | //1.得到bitmap
53 | Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
54 | //2.bitmap-->byte[]
55 | ByteArrayOutputStream out = new ByteArrayOutputStream();
56 | bitmap.compress(CompressFormat.PNG, 100, out);
57 | byte[] bitmapByteArr = out.toByteArray();
58 | //3.使用base64 byte[]--String--->上传到服务器
59 | String bitmapBase64String = Base64.encodeToString(bitmapByteArr, Base64.DEFAULT);
60 |
61 | //key-value jsonString
62 |
63 | //4.String-->byte[]
64 | byte[] bitmapByteArr2 = Base64.decode(bitmapBase64String, Base64.DEFAULT);
65 | //5.byte[]-->Bitmap -->完成图片的上传
66 | Bitmap bitmapPassed = BitmapFactory.decodeByteArray(bitmapByteArr2, 0, bitmapByteArr2.length);
67 | //6.设置图片到imageView
68 | iv.setImageBitmap(bitmapPassed);
69 | ```
70 |
71 | ### 小结
72 |
73 | Base64是一种任意二进制到文本字符串的编码方法,常用于在URL、Cookie、网页中传输少量二进制数据。
--------------------------------------------------------------------------------
/第9章 安全加密/img/base64.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第9章 安全加密/img/base64.png
--------------------------------------------------------------------------------
/第9章 安全加密/img/安全加密.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第9章 安全加密/img/安全加密.png
--------------------------------------------------------------------------------
/第9章 安全加密/img/数字证书.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第9章 安全加密/img/数字证书.png
--------------------------------------------------------------------------------
/第9章 安全加密/img/数字证书内容.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/JackChan1999/Java_Basic_Introduction/b810fd08e1eecb9508bb1a3b136e84861633cbca/第9章 安全加密/img/数字证书内容.png
--------------------------------------------------------------------------------
/第9章 安全加密/网络安全.md:
--------------------------------------------------------------------------------
1 | ## 常见的安全误区
2 |
3 | ### 黑客、网络安全只存在于虚拟世界
4 |
5 | 如果我说以后黑客不但可以控制你的汽车开窗、刹车,甚至还能远程“强奸”,你信吗?
6 |
7 | 许多初创公司,有基于互联网的Sex应用。杜蕾斯公司也有一款Sex over Internet产品叫做Fundawear。如果这个产品出了安全问题或者协议缺陷,被黑客劫持了连接,实现中间人攻击,会出现什么样的后果?
8 |
9 | 360公司最近发现了时下最火的电动汽车Tesla Model S的安全漏洞。根据资料,该漏洞存在于汽车的应用程序流程中,黑客利用这个漏洞,可远程控制车辆,实现开锁、鸣笛、闪灯等操作,甚至可以使行驶中的车辆开启天窗。也许在不久的将来,Tesla会被破解得更完全,攻击者可以远程获取到更大的权限,做更多事情。
10 |
11 | 类似的场景会越来越多,把你的热水器远程调到80度,把家中的煤气阀门打开,关掉身上的某些医疗器械。在不久的未来,安全会渗透到生活的各个方面,甚至直接威胁生命,需要引起足够的重视。
12 |
13 | ### 我的程序部署在内网,没事儿
14 |
15 | 有人会说,我这个网站是部署在办公网内部的,完全不提供对Internet的访问,而且在办公网入口还有防火墙,完全不需要对这些系统做保护,也不需要修补漏洞,因为它根本就不会被访问,更不会被入侵。我只能说,太天真——攻击者的猥琐是无法形容的。
16 |
17 | 前不久支付宝举办的“天下无贼”安全大会,著名网络安全研究员superhei做了名为“走向内网的邪恶之路”的主题演讲,直接在外网盲打入侵内网获取权限。基本原理是使用JRE或者WebRTC获取私网IP地址段,然后通过CSRF(跨站请求伪造)让内网的用户在访问网站时遍历内网IP段,发起POST请求,直接入侵反弹出Shell给入侵者。
18 |
19 | 可见,在内网并不足以保证自身的安全。入侵者甚至不需要知道你的应用的具体位置,暴力盲打即可。
20 |
21 | ### 我的系统打上了所有的补丁,不会被入侵
22 |
23 | 这一点是最不可思议的,系统打了所有的补丁,还会被轻易入侵?是的!
24 |
25 | 一般的家庭都使用无线路由器让多个设备共享网络。这些无线路由器,多多少少都有一些安全问题,如弱密码、CSRF漏洞之类,攻击者可以通过这些漏洞修改路由器的DNS设置,让上网的终端在解析域名时访问恶意网站。也许有人会说,恶意网站最多挂马或是钓鱼,我打上了所有的补丁,智商也高,你黑客能奈我何?天真,黑客的智商也很高。
26 |
27 | 有个黑客工具叫EvilGrade。顾名思义,就是一个专门用来欺骗客户端的软件,让人以为自己有新版本或补丁可以升级的框架,它支持自定义插件,以及数百种客户端程序,如VMware、JRE、EditPlus、Flash等。当黑客劫持了DNS,你使用着打全了补丁的[操作系统](http://lib.csdn.net/base/operatingsystem)打开EditPlus准备编码时,它突然提示你有新版本要升级,点一下确定,就开始下载安装木马,再然后……
28 |
29 | ### 密码用MD5加密了,拖了库也没关系
30 |
31 | MD5是最常见的单向Hash算法之一,为了安全起见,某些机密数据,例如用户密码会使用MD5加密后存储。由于MD5算法不可逆,有些人就认为MD5加密后的数据绝对安全。其实完全不是这样。早在几年前,攻击者就通过使用彩虹表的方式,以空间换时间,增加对MD5、SHA之类算法的破解能力。
32 |
33 | 结合GPU运算,对MD5之类Hash算法的破解时间,已缩减到非常短了。大约1000万条MD5加密后的密码,在24小时之内就可以破解90%左右,甚至达到96%以上。为了解决这些问题,一般使用SALT的方式增强安全性。但可惜的是,增强之后的算法依旧风险多多,有攻击者直接使用云计算提供的GPU计算能力,构建集群来破解。
34 |
35 | 另外,撞库的情况越来越多。最近几年非常多的大型网站用户库被黑客窃取,有的黑客拥有几十亿条数据的庞大信息库。他们通过手机号码、邮件地址等信息,直接在这个库中检索,再去其他网站登录。一般的人常用密码就那么几个,这种撞库攻击非常难以防范,加密算法根本无能为力。
36 |
37 | ### 交易使用了短信验证码,绝对可靠
38 |
39 | 在涉及修改密码、金钱交易的场合,大家喜欢使用短信验证码认证身份。其实,这并不是一个非常可靠的方式。
40 |
41 | 首先,现在的智能手机操作系统复杂,本身就存在植入木马的风险。短信等信息,直接就在木马的监控之下,攻击者可以直接完成操作,甚至通过截取的方式让短信只有木马能看到,直接在后台偷偷完成了操作,机主都不知情。其次,有的短信验证码长度不够,只有3、4个数字。攻击者甚至通过暴力破解的方式,尝试1万次,就能成功完成操作。以现在的网速,1万次网络提交根本花不了多少时间。
42 |
43 | 对于类似的系统,一定要有专业的风控手段配合,单一的手机验证码维度不足以保证系统安全。
44 |
45 | ## 主流攻击方式
46 |
47 | 黑客攻击,最开始是单纯地入侵服务器,篡改网页。近些年,攻击目的逐步向偷取数据、抓取信息、敲诈勒索等方面转移,以赚钱为主。攻击的目标也从服务器转移了相当大的一部分到手机等移动设备,或者个人电脑甚至是家用路由器。
48 |
49 | 入侵方面,我们分析了相当多的案例,也对整个互联网做过扫描统计,发现绝大多数的入侵行为还是由非常简单的攻击方式发起的,即系统弱口令和Web攻击。系统弱口令主要是指Linux服务器的SSH弱口令、Windows的终端服务弱口令,还包括一些第三方软件,例如MySQL数据库、SQL Server数据库等。Web攻击则以SQL注入和远程文件包含、任意文件上传漏洞为主。除此之外,攻击者也使用类似CSRF这样的手段,攻击家用无线路由器,篡改DNS信息。攻击者自己实现完整的入侵框架,对互联网做大范围的扫描实现全自动入侵,为后续的劫持流量展示广告、赚取交易佣金做准备。
50 |
51 | 大范围入侵的另一方面是所谓APT(高级持续性威胁)攻击,它与大范围的入侵相反,注重目标的专一性以及隐蔽性。攻击者接到任务后盯住一个目标,尽可能全面地收集所有数据,如系统版本、应用类型、邮件地址等,每爆发一个与目标应用相关的新漏洞时,攻击者马上就会尝试是否可以利用。社会工程学、邮件钓鱼、直接上门攻击无线网络,无所不用其极。
52 |
53 | 在入侵的同时,也有一部分人专注于非入侵式攻击,直接抓取数据就可以卖钱。在这个领域,主要是自动化的爬虫抓取,也有的利用应用的水平权限漏洞获取更多机密资料。随着攻防双方的对抗,爬虫也由简单的Socket、HttpClient库爬虫,逐步进化到WebKit内核爬虫、V8引擎爬虫之类的高端形态,以绕过防御方使用的JavaScript等策略。
54 |
55 | 敲诈勒索方面的攻击,主要是DDoS。攻击者挑选游戏私服、页游、手游等挣钱行业,以DDoS拒绝服务为手段发起要挟。这些攻击,有的是依靠大范围入侵获取的傀儡机,有的是使用NTP反射放大之类灵巧的手段。
--------------------------------------------------------------------------------
/第9章 安全加密/非对称加密.md:
--------------------------------------------------------------------------------
1 | ## Java安全加密专题文章索引
2 |
3 | 1. [Java安全加密:对称加密](http://blog.csdn.net/axi295309066/article/details/52491077)
4 | 2. [Java安全加密:非对称加密](http://blog.csdn.net/axi295309066/article/details/52494640)
5 | 3. [Java安全加密:消息摘要Message Digest](http://blog.csdn.net/axi295309066/article/details/52494725)
6 | 4. [Java安全加密:数字签名和数字证书](http://blog.csdn.net/axi295309066/article/details/52494832)
7 | 5. [Java安全加密:Https编程](http://blog.csdn.net/axi295309066/article/details/52494902)
8 |
9 | ## **1. 介绍**
10 | 与对称加密算法不同,非对称加密算法需要两个密钥:公钥(publickey)和私钥(privatekey)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
11 |
12 | 简单理解为:加密和解密是不同的钥匙
13 |
14 | 
15 |
16 | ## **2. 常见算法**
17 | RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等,其中支付宝使用的就是RSA算法
18 |
19 | ## **3. RSA 算法原理**
20 | 质因数、欧拉函数、模反元素
21 | 原理很复杂,只需要知道内部是基于分解质因数和取模操作即可
22 |
23 | ## **4. 使用步骤**
24 |
25 | ```java
26 | //1,获取cipher 对象
27 | Cipher cipher = Cipher.getInstance("RSA");
28 | //2,通过秘钥对生成器KeyPairGenerator 生成公钥和私钥
29 | KeyPair keyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
30 | //使用公钥进行加密,私钥进行解密(也可以反过来使用)
31 | PublicKey publicKey = keyPair.getPublic();
32 | PrivateKey privateKey = keyPair.getPrivate();
33 | //3,使用公钥初始化密码器
34 | cipher.init(Cipher.ENCRYPT_MODE, publicKey);
35 | //4,执行加密操作
36 | byte[] result = cipher.doFinal(content.getBytes());
37 | //使用私钥初始化密码器
38 | cipher.init(Cipher.DECRYPT_MODE, privateKey);
39 | //执行解密操作
40 | byte[] deResult = cipher.doFinal(result);
41 | ```
42 | ## **5. 注意点**
43 |
44 | ```java
45 | //一次性加密数据的长度不能大于117 字节
46 | private static final int ENCRYPT_BLOCK_MAX = 117;
47 | //一次性解密的数据长度不能大于128 字节
48 | private static final int DECRYPT_BLOCK_MAX = 128;
49 | ```
50 | ## **6. 分批操作**
51 |
52 | ```java
53 | /**
54 | * 分批操作
55 | *
56 | * @param content 需要处理的数据
57 | * @param cipher 密码器(根据cipher 的不同,操作可能是加密或解密)
58 | * @param blockSize 每次操作的块大小,单位为字节
59 | * @return 返回处理完成后的结果
60 | * @throws Exception
61 | */
62 | public static byte[] doFinalWithBatch(byte[] content, Cipher cipher, int blockSize) throws Exception {
63 | int offset = 0;//操作的起始偏移位置
64 | int len = content.length;//数据总长度
65 | byte[] tmp;//临时保存操作结果
66 | ByteArrayOutputStream baos = new ByteArrayOutputStream();
67 | //如果剩下数据
68 | while (len - offset > 0) {
69 | if (len - offset >= blockSize) {
70 | //剩下数据还大于等于一个blockSize
71 | tmp = cipher.doFinal(content, offset, blockSize);
72 | }else {
73 | //剩下数据不足一个blockSize
74 | tmp = cipher.doFinal(content, offset, len - offset);
75 | }
76 | //将临时结果保存到内存缓冲区里
77 | baos.write(tmp);
78 | offset = offset + blockSize;
79 | }
80 | baos.close();
81 | return baos.toByteArray();
82 | }
83 | ```
84 | ## **7. 非对称加密用途**
85 | ### **身份认证**
86 | 一条加密信息若能用A 的公钥能解开,则该信息一定是用A 的私钥加密的,该能确定该用户是A。
87 |
88 | 
89 |
90 | ### **陌生人通信**
91 | A 和B 两个人互不认识,A 把自己的公钥发给B,B 也把自己的公钥发给A,则双方可以通过对方的公钥加密信息通信。C 虽然也能得到A、B 的公钥,但是他解不开密文。
92 |
93 | 
94 |
95 | ### **秘钥交换**
96 | A 先得到B 的公钥,然后A 生成一个随机秘钥,例如13245768,之后A 用B 的公钥加密该秘钥,得到加密后的秘钥,例如dxs#fd@dk,之后将该密文发给B,B 用自己的私钥解密得到13245768,之后双方使用13245768 作为对称加密的秘钥通信。C 就算截获加密后的秘钥dxs#fd@dk,自己也解不开,这样A、B 二人能通过对称加密进行通信。
97 |
98 | 
99 |
100 | ## **8. 总结**
101 | 非对称加密一般不会单独拿来使用,他并不是为了取代对称加密而出现的,非对称加密速度比对称加密慢很多,极端情况下会慢1000 倍,所以一般不会用来加密大量数据,通常我们经常会将对称加密和非对称加密两种技术联合起来使用,例如用非对称加密来给称加密里的秘钥进行加密(即秘钥交换)。
102 |
--------------------------------------------------------------------------------