├── .idea ├── gradle.xml ├── libraries │ ├── com_android_support_test_espresso_espresso_core_2_2_2.xml │ ├── com_android_support_test_espresso_espresso_idling_resource_2_2_2.xml │ ├── com_android_support_test_exposed_instrumentation_api_publish_0_5.xml │ ├── com_android_support_test_rules_0_5.xml │ ├── com_android_support_test_runner_0_5.xml │ ├── com_google_code_findbugs_jsr305_2_0_1_jar.xml │ ├── com_squareup_javawriter_2_1_1_jar.xml │ ├── javax_annotation_javax_annotation_api_1_2_jar.xml │ ├── javax_inject_javax_inject_1_jar.xml │ ├── junit_junit_4_12_jar.xml │ ├── org_hamcrest_hamcrest_core_1_3_jar.xml │ ├── org_hamcrest_hamcrest_integration_1_3_jar.xml │ └── org_hamcrest_hamcrest_library_1_3_jar.xml └── vcs.xml ├── AndroidBox.iml ├── BookList.md ├── HelloWorld ├── HelloWorld.md ├── LICENSE ├── README.md ├── box ├── .gitignore ├── box.iml ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── cn │ │ └── zengjingfang │ │ └── box │ │ └── ExampleInstrumentedTest.java │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cn │ │ └── zengjingfang │ │ └── box │ │ ├── android │ │ ├── main │ │ │ └── MainActivity.java │ │ └── rxhandler │ │ │ ├── RxJava1.java │ │ │ └── rx │ │ │ ├── Observable.java │ │ │ ├── Producer.java │ │ │ ├── Scheduler.java │ │ │ ├── Subscriber.java │ │ │ ├── Subscription.java │ │ │ ├── functions │ │ │ ├── Action.java │ │ │ ├── Action0.java │ │ │ ├── Action1.java │ │ │ └── Function.java │ │ │ ├── observer │ │ │ └── Observer.java │ │ │ ├── operators │ │ │ └── OperatorSubscribeOn.java │ │ │ ├── readme │ │ │ ├── schedulers │ │ │ ├── AndroidSchedulers.java │ │ │ ├── IOScheduler.java │ │ │ ├── MainScheduler.java │ │ │ ├── SchedulerLifecycle.java │ │ │ └── Schedulers.java │ │ │ └── util │ │ │ └── SubscriptionList.java │ │ └── java │ │ ├── ConcurrentTest.java │ │ ├── IOTest.java │ │ ├── InnerClassTest.java │ │ ├── MathTest.java │ │ ├── ObjectCopyTest.java │ │ ├── PoPoTest.java │ │ └── StringTest.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── mipmap-hdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-mdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ ├── mipmap-xxxhdpi │ ├── ic_launcher.png │ └── ic_launcher_round.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── dependencies.gradle ├── doc ├── Android │ ├── 2018-03-23-2017010890963complete_android_fragment_lifecycle.png │ ├── Fragment使用详解.md │ ├── SDK开发技巧.md │ ├── UI屏幕适配必备的知识点.md │ ├── 浅析Android系统(一):操作系统基础.md │ ├── 浅析Android系统(七):四大组件之Broadcast.md │ ├── 浅析Android系统(三):Binder原理.md │ ├── 浅析Android系统(九):AlarmManagerService.md │ ├── 浅析Android系统(二):Handle机制原理.md │ ├── 浅析Android系统(八):四大组件之ContentProvider.md │ ├── 浅析Android系统(六):四大组件之Service.md │ ├── 浅析Android系统(十):View工作原理.md │ └── 浅析Android系统(四):AMS核心框架.md ├── Column │ ├── Android开发关键问题 │ │ └── Android开发关键问题(一):用Activity+Fragment搭建主框架.md │ ├── Android开发历险记 │ │ ├── Android开发历险记(1):TransationTooLargeException.md │ │ ├── Android开发历险记(2):Unable to start service.md │ │ ├── Android开发历险记(3):ReflectiveOperationException兼容问题.md │ │ └── Android开发历险记(4):Attempt to read from field 'long android.os.Parcel.mNativePtr'.md │ ├── IM即时通讯SDK开发.rar │ ├── IM即时通讯SDK开发 │ │ ├── IM即时通讯SDK开发实践(一):概述篇.md │ │ ├── IM即时通讯SDK开发实践(三):网络篇.md │ │ ├── IM即时通讯SDK开发实践(二):设计篇.md │ │ ├── IM即时通讯SDK开发实践(五):心跳篇.md │ │ ├── IM即时通讯SDK开发实践(六):重连篇.md │ │ ├── IM即时通讯SDK开发实践(四):协议篇.md │ │ ├── im_architecture.png │ │ ├── im_reconnect.jpg │ │ └── im_state.png │ ├── Java集合源码解析 │ │ ├── Java集合源码解析(1):ArrayList.md │ │ ├── Java集合源码解析(2):LinkedList.md │ │ ├── Java集合源码解析(3):CopyOnWriteArrayList.md │ │ └── Java集合源码解析(4):HashMap.md │ ├── 为什么我写的程序有bug │ │ ├── 为什么我写的程序有bug(一):概述篇.md │ │ ├── 为什么我写的程序有bug(三):网络篇.md │ │ ├── 为什么我写的程序有bug(二):系统篇.md │ │ └── 为什么我写的程序有bug(四):逻辑篇.md │ ├── 性能优化 │ │ └── 性能优化学习与实践小结.md │ └── 拆解开源框架 │ │ ├── LeakCanary.md │ │ ├── Retrofit.md │ │ ├── RxJava.md │ │ └── 解密RxJava:线程篇.md ├── Design │ ├── 秒懂设计模式(一): Builder模式.md │ ├── 秒懂设计模式(二): 状态模式.md │ └── 软件架构思考以及Android开发经验总结.md ├── DevMode │ ├── 111.bmp │ └── 从MVC到MVP,记一次代码重构.md ├── Java │ ├── 《Java编程思想》阅读总结 - 副本.md │ ├── 单元测试.md │ ├── 略懂Java编程(一):Java世界里的对象.md │ ├── 略懂Java编程(七):什么是多态.md │ ├── 略懂Java编程(三):操作符.md │ ├── 略懂Java编程(九):什么是内部类.md │ ├── 略懂Java编程(二):简述面向对象的六大原则.md │ ├── 略懂Java编程(五)::初始化与清理.md │ ├── 略懂Java编程(八):什么是接口.md │ ├── 略懂Java编程(六):复用类.md │ ├── 略懂Java编程(十一):字符串.md │ ├── 略懂Java编程(十三):注解.md │ ├── 略懂Java编程(十二):IO系统.md │ ├── 略懂Java编程(十四):并发、线程池知识必备.md │ ├── 略懂Java编程(十):容器和集合.md │ ├── 略懂Java编程(四):流程控制语句.md │ ├── 简述JVM基础(一):走进Java.md │ ├── 简述JVM基础(七):Java内存模型与线程.md │ ├── 简述JVM基础(三):垃圾收集器与内存分配策略.md │ ├── 简述JVM基础(二):Java内存区域与内存溢出异常.md │ ├── 简述JVM基础(五):虚拟机类加载机制.md │ ├── 简述JVM基础(八):线程安全和锁优化.md │ ├── 简述JVM基础(六):虚拟机字节码执行引擎.md │ ├── 简述JVM基础(四):类结构文件.md │ └── 简述JVM基础:目录.md ├── Tools │ ├── AndroidStudio │ │ ├── AndroidStudio使用进阶一:彻底将Eclipse项目转为AS.md │ │ ├── AndroidStudio使用进阶三- 重新认识AndroidStudio&Gradle.md │ │ ├── AndroidStudio使用进阶二:搭建自己的maven私服,并使用Gradle统一依赖管理.md │ │ ├── AndroidStudio快速入门一:将Eclipse项目导入AndroidStudio.md │ │ ├── AndroidStudio快速入门三:aar和jar 生成和导入项目.md │ │ ├── AndroidStudio快速入门二:Gradle快速构建Android项目(多个Module同时构建).md │ │ ├── AndroidStudio快速入门五:常见问题集合.md │ │ └── AndroidStudio快速入门四:打造你的开发工具,settings必备.md │ └── readme.md ├── jvm.vsdx ├── pic │ ├── android-booting.jpg │ ├── android_ams.png │ ├── android_broadcast.png │ ├── android_contentprovider.png │ ├── android_contentprovider.vsdx │ ├── android_handle.png │ ├── android_service.png │ ├── bind_service.jpg │ ├── four_component.jpg │ ├── retrofit.png │ ├── sqlite_query.png │ └── start_app_process.jpg └── visio.vsdx ├── gradle-mvn-push.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── local.properties └── settings.gradle /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 18 | -------------------------------------------------------------------------------- /.idea/libraries/com_android_support_test_espresso_espresso_core_2_2_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/com_android_support_test_espresso_espresso_idling_resource_2_2_2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/com_android_support_test_exposed_instrumentation_api_publish_0_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/com_android_support_test_rules_0_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/com_android_support_test_runner_0_5.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /.idea/libraries/com_google_code_findbugs_jsr305_2_0_1_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/libraries/com_squareup_javawriter_2_1_1_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/javax_annotation_javax_annotation_api_1_2_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/javax_inject_javax_inject_1_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/junit_junit_4_12_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/org_hamcrest_hamcrest_core_1_3_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/org_hamcrest_hamcrest_integration_1_3_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/libraries/org_hamcrest_hamcrest_library_1_3_jar.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /AndroidBox.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /BookList.md: -------------------------------------------------------------------------------- 1 | # Book List 2 | + Java 3 | + [《Java编程思想》]() 4 | + [《Java并发编程实践》]() 5 | + 《Effective Java》 6 | + [《深入理解Java虚拟机》]() 7 | + Android 8 | + [《深入理解Android内核设计思想》]() 9 | + [《Android源码设计模式解析与实践》]() 10 | + 《Android开发艺术探索之旅》 11 | + 《Android高级进阶》 12 | + 架构设计 13 | + [《软件架构设计》]() 14 | + 《企业应用架构模式》 15 | + 程序设计 16 | + [《重构 改善既有代码的设计》]() 17 | + 《代码整洁之道》 18 | + 《大话设计模式》 19 | + 性能调优 20 | + 《移动App测试实践》 21 | + 《Android应用测试与调试实战》 22 | + 《移动App性能评测与优化》 23 | + 计算机基础 24 | + [《深入理解计算机系统》]() 25 | + 《操作系统教程》 26 | + 《鸟哥的Linux私房菜》 27 | + [《算法导论》]() 28 | + [《数据结构(C语言版)》]() 29 | + 网络通信 30 | + [《深入理解计算机网络》]() 31 | + 《图解HTTP》 32 | + [《图解TCP/IP》]() 33 | + 人工智能 34 | + [《统计学习方法》]() 35 | + 《集体智慧编程》 36 | + 《机器学习》 37 | + 软件工程 38 | + 《人件》 39 | + 《人月神话》 40 | + 问题解决 41 | + 《 How to solve it 》 42 | + [《编程珠玑》]() 43 | + 其他 44 | + 《简单法则》 45 | 46 | 47 | # 写作计划 48 | 49 | + 浅析Android系统 50 | + 简述JVM基础 51 | + 略懂Java编程思想 52 | + 为什么我写的程序有bug 53 | + 解密im推送SDK开发 -------------------------------------------------------------------------------- /HelloWorld: -------------------------------------------------------------------------------- 1 | > Home 2 | 3 | | [AndroidDocs](https://developer.android.com/guide/)|[AndroidSource](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android "AndroidSource") |[Gradle](https://docs.gradle.org/current/userguide/userguide.html "Gradle")| [GitHub](https://github.com/ "GitHub")|[stackoverflow](https://stackoverflow.com/ "stackoverflow")|[知乎](https://www.zhihu.com/ "ZhiHu")|[Medium](https://medium.com/ "Medium")|[掘金](https://juejin.im/welcome/android "JueJin")| 4 | | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | 5 | |[maven仓库](https://mvnrepository.com/artifact/com.google.code.gson/gson "mvnrepository") | [androidos源码](https://www.androidos.net.cn/sourcecode "androidos") | [androidxref](http://androidxref.com/ "androidxref") |[InfoQ](https://www.infoq.cn/ "InfoQ") | [极客时间](https://time.geekbang.org/ "极客时间") | [极客公园](https://www.geekpark.net/ "极客公园") | [36Kr](https://36kr.com/ "36Kr") | [LeetCode](https://leetcode.com/ "LeetCode")| | 6 | 7 | 8 | 9 | 10 | > Blog 11 | 12 | | [AndroidBlog](https://android-developers.googleblog.com/) | [Weekly](http://androidweekly.net/) | [codekk](http://p.codekk.com/ "codekk") |[Android周刊](http://www.androidblog.cn/ "Android周刊")| [IBM](https://www.ibm.com/developerworks/cn/java/ "IBM") | [importnew](http://www.importnew.com/ "importnew")|[并发编程网](http://ifeve.com/ "并发编程网") |[Runoob](http://www.runoob.com/ "Runoob")|[美团](https://tech.meituan.com/ "Meituan") | 13 | | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | 14 | |[Jakewharton](https://jakewharton.com/blog/ "jakewharton") | [Trinea](http://www.trinea.cn/ "Trinea")| [Gityuan](http://gityuan.com/ "Gityuan") | [Piasy](https://blog.piasy.com/ "Piasy") |[阮一峰](http://www.ruanyifeng.com/blog/ "阮一峰")|[老罗](https://blog.csdn.net/Luoshengyang "老罗") | [任玉刚](https://blog.csdn.net/singwhatiwanna "任玉刚") | [池建强](http://macshuo.com/ "池建强") | [考拉](https://blog.klmobile.app/ "考拉")| 15 | -------------------------------------------------------------------------------- /HelloWorld.md: -------------------------------------------------------------------------------- 1 | > Home 2 | 3 | | [AndroidDocs](https://developer.android.com/guide/)|[AndroidSource](https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android "AndroidSource") |[Gradle](https://docs.gradle.org/current/userguide/userguide.html "Gradle")| [GitHub](https://github.com/ "GitHub")|[stackoverflow](https://stackoverflow.com/ "stackoverflow")|[知乎](https://www.zhihu.com/ "ZhiHu")|[Medium](https://medium.com/ "Medium")|[掘金](https://juejin.im/welcome/android "JueJin")| 4 | | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | 5 | |[maven仓库](https://mvnrepository.com/artifact/com.google.code.gson/gson "mvnrepository") | [androidos源码](https://www.androidos.net.cn/sourcecode "androidos") | [androidxref](http://androidxref.com/ "androidxref") |[InfoQ](https://www.infoq.cn/ "InfoQ") | [极客时间](https://time.geekbang.org/ "极客时间") | [极客公园](https://www.geekpark.net/ "极客公园") | [36Kr](https://36kr.com/ "36Kr") | [LeetCode](https://leetcode.com/ "LeetCode")| | 6 | 7 | 8 | 9 | 10 | > Blog 11 | 12 | | [AndroidBlog](https://android-developers.googleblog.com/) | [Weekly](http://androidweekly.net/) | [codekk](http://p.codekk.com/ "codekk") |[Android周刊](http://www.androidblog.cn/ "Android周刊")| [IBM](https://www.ibm.com/developerworks/cn/java/ "IBM") | [importnew](http://www.importnew.com/ "importnew")|[并发编程网](http://ifeve.com/ "并发编程网") |[Runoob](http://www.runoob.com/ "Runoob")|[美团](https://tech.meituan.com/ "Meituan") | 13 | | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |------------ | 14 | |[Jakewharton](https://jakewharton.com/blog/ "jakewharton") | [Trinea](http://www.trinea.cn/ "Trinea")| [Gityuan](http://gityuan.com/ "Gityuan") | [Piasy](https://blog.piasy.com/ "Piasy") |[阮一峰](http://www.ruanyifeng.com/blog/ "阮一峰")|[老罗](https://blog.csdn.net/Luoshengyang "老罗") | [任玉刚](https://blog.csdn.net/singwhatiwanna "任玉刚") | [池建强](http://macshuo.com/ "池建强") | [考拉](https://blog.klmobile.app/ "考拉")| 15 | 16 | > Object 17 | 18 | + 组件化 19 | + O 20 | -------------------------------------------------------------------------------- /box/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /box/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | 4 | android { 5 | compileSdkVersion 25 6 | buildToolsVersion '26.0.2' 7 | 8 | 9 | defaultConfig { 10 | applicationId "cn.zengjingfang.box" 11 | minSdkVersion 15 12 | targetSdkVersion 25 13 | versionCode 1 14 | versionName "1.0" 15 | 16 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 17 | 18 | } 19 | buildTypes { 20 | release { 21 | minifyEnabled false 22 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 23 | } 24 | } 25 | } 26 | 27 | dependencies { 28 | compile fileTree(dir: 'libs', include: ['*.jar']) 29 | androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 30 | exclude group: 'com.android.support', module: 'support-annotations' 31 | }) 32 | // compile 'io.reactivex:rxjava:1.2.0' 33 | // compile 'io.reactivex:rxandroid:1.2.1' 34 | } 35 | -------------------------------------------------------------------------------- /box/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in D:\android\sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Uncomment this to preserve the line number information for 20 | # debugging stack traces. 21 | #-keepattributes SourceFile,LineNumberTable 22 | 23 | # If you keep the line number information, uncomment this to 24 | # hide the original source file name. 25 | #-renamesourcefileattribute SourceFile 26 | -------------------------------------------------------------------------------- /box/src/androidTest/java/cn/zengjingfang/box/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumentation test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() throws Exception { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("cn.zengjingfang.box", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /box/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/main/MainActivity.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.main; 2 | 3 | import android.app.Activity; 4 | import android.os.Bundle; 5 | 6 | /** 7 | * Demo主页 8 | * Created by ZengJingFang on 2018/4/5. 9 | */ 10 | 11 | public class MainActivity extends Activity { 12 | 13 | @Override 14 | protected void onCreate(Bundle savedInstanceState) { 15 | super.onCreate(savedInstanceState); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/Observable.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx; 2 | 3 | 4 | import cn.zengjingfang.box.android.rxhandler.rx.functions.Action1; 5 | import cn.zengjingfang.box.android.rxhandler.rx.operators.OperatorSubscribeOn; 6 | 7 | /** 8 | * RxHandle 9 | * Created by ZengJingFang on 2018/4/25. 10 | */ 11 | 12 | public class Observable { 13 | 14 | final Observable.OnSubscribe onSubscribe; 15 | 16 | protected Observable(Observable.OnSubscribe f) { 17 | this.onSubscribe = f; 18 | } 19 | 20 | public static Observable create(Observable.OnSubscribe f) { 21 | return new Observable(f); 22 | } 23 | 24 | public interface OnSubscribe extends Action1> { 25 | // cover for generics insanity 26 | } 27 | 28 | public final Subscription subscribe(Subscriber subscriber) { 29 | return Observable.subscribe(subscriber, this); 30 | } 31 | 32 | public final Observable subscribeOn(Scheduler scheduler) { 33 | 34 | return create(new OperatorSubscribeOn(this, scheduler)); 35 | } 36 | 37 | static Subscription subscribe(Subscriber subscriber, Observable observable) { 38 | // validate and proceed 39 | if (subscriber == null) { 40 | throw new IllegalArgumentException("subscriber can not be null"); 41 | } 42 | if (observable.onSubscribe == null) { 43 | throw new IllegalStateException("onSubscribe function can not be null."); 44 | } 45 | subscriber.onStart(); 46 | 47 | try { 48 | observable.onSubscribe.call(subscriber); 49 | // return RxJavaHooks.onObservableReturn(subscriber); 50 | } catch (Throwable e) { 51 | 52 | subscriber.onError(e); 53 | // return Subscriptions.unsubscribed(); 54 | } 55 | return null;//todo 56 | } 57 | 58 | public final Subscription unsafeSubscribe(Subscriber subscriber) { 59 | try { 60 | // new Subscriber so onStart it 61 | subscriber.onStart(); 62 | // allow the hook to intercept and/or decorate 63 | onSubscribe.call(subscriber); 64 | return subscriber; 65 | } catch (Throwable e) { 66 | try { 67 | subscriber.onError(e); 68 | } catch (Throwable e2) { 69 | throw e2; 70 | } 71 | // return Subscriptions.unsubscribed(); 72 | return null;// TODO: 2018/4/27 73 | } 74 | } 75 | 76 | } 77 | 78 | 79 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/Producer.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx; 2 | 3 | /** 4 | * 5 | * Created by ZengJingFang on 2018/4/27. 6 | */ 7 | 8 | public interface Producer { 9 | void request(long n); 10 | } 11 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/Scheduler.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx; 2 | 3 | import java.util.concurrent.TimeUnit; 4 | 5 | import cn.zengjingfang.box.android.rxhandler.rx.functions.Action0; 6 | 7 | /** 8 | * 9 | * Created by ZengJingFang on 2018/4/26. 10 | */ 11 | 12 | public abstract class Scheduler { 13 | 14 | public abstract Worker createWorker(); 15 | 16 | 17 | public abstract static class Worker implements Subscription { 18 | 19 | public abstract Subscription schedule(Action0 action); 20 | 21 | public abstract Subscription schedule(final Action0 action, final long delayTime, final TimeUnit unit); 22 | 23 | public long now() { 24 | return System.currentTimeMillis(); 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/Subscriber.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx; 2 | 3 | import cn.zengjingfang.box.android.rxhandler.rx.observer.Observer; 4 | import cn.zengjingfang.box.android.rxhandler.rx.util.SubscriptionList; 5 | 6 | /** 7 | * 8 | * Created by ZengJingFang on 2018/4/25. 9 | */ 10 | 11 | public abstract class Subscriber implements Observer, Subscription { 12 | 13 | // represents requested not set yet 14 | private static final long NOT_SET = Long.MIN_VALUE; 15 | 16 | private final SubscriptionList subscriptions; 17 | private final Subscriber subscriber; 18 | /* protected by `this` */ 19 | private Producer producer; 20 | /* protected by `this` */ 21 | private long requested = NOT_SET; // default to not set 22 | 23 | protected Subscriber() { 24 | this(null); 25 | } 26 | 27 | protected Subscriber(Subscriber subscriber) { 28 | this.subscriber = subscriber; 29 | this.subscriptions = subscriber != null ? subscriber.subscriptions : new SubscriptionList(); 30 | } 31 | 32 | 33 | 34 | public final void add(Subscription s) { 35 | subscriptions.add(s); 36 | } 37 | 38 | public void onStart() { 39 | // do nothing by default 40 | } 41 | 42 | @Override 43 | public final void unsubscribe() { 44 | // subscriptions.unsubscribe(); 45 | } 46 | 47 | /** 48 | * Indicates whether this Subscriber has unsubscribed from its list of subscriptions. 49 | * 50 | * @return {@code true} if this Subscriber has unsubscribed from its subscriptions, {@code false} otherwise 51 | */ 52 | @Override 53 | public final boolean isUnsubscribed() { 54 | // return subscriptions.isUnsubscribed(); 55 | return false; 56 | } 57 | public void setProducer(Producer p) { 58 | long toRequest; 59 | boolean passToSubscriber = false; 60 | synchronized (this) { 61 | toRequest = requested; 62 | producer = p; 63 | if (subscriber != null) { 64 | // middle operator ... we pass through unless a request has been made 65 | if (toRequest == NOT_SET) { 66 | // we pass through to the next producer as nothing has been requested 67 | passToSubscriber = true; 68 | } 69 | } 70 | } 71 | // do after releasing lock 72 | if (passToSubscriber) { 73 | subscriber.setProducer(producer); 74 | } else { 75 | // we execute the request with whatever has been requested (or Long.MAX_VALUE) 76 | if (toRequest == NOT_SET) { 77 | producer.request(Long.MAX_VALUE); 78 | } else { 79 | producer.request(toRequest); 80 | } 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/Subscription.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx; 2 | 3 | /** 4 | * Created by ZengJingFang on 2018/4/25. 5 | */ 6 | 7 | public interface Subscription { 8 | /** 9 | * Stops the receipt of notifications on the {@link Subscriber} that was registered when this Subscription 10 | * was received. 11 | *

12 | * This allows deregistering an {@link Subscriber} before it has finished receiving all events (i.e. before 13 | * onCompleted is called). 14 | */ 15 | void unsubscribe(); 16 | 17 | /** 18 | * Indicates whether this {@code Subscription} is currently unsubscribed. 19 | * 20 | * @return {@code true} if this {@code Subscription} is currently unsubscribed, {@code false} otherwise 21 | */ 22 | boolean isUnsubscribed(); 23 | } 24 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/functions/Action.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.functions; 2 | 3 | /** 4 | * 5 | * Created by ZengJingFang on 2018/4/25. 6 | */ 7 | 8 | public interface Action extends Function { 9 | } 10 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/functions/Action0.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.functions; 2 | 3 | /** 4 | * 5 | * Created by ZengJingFang on 2018/4/25. 6 | */ 7 | 8 | public interface Action0 extends Action { 9 | 10 | void call(); 11 | } 12 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/functions/Action1.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.functions; 2 | 3 | /** 4 | * Created by ZengJingFang on 2018/4/27. 5 | */ 6 | 7 | public interface Action1 extends Action { 8 | 9 | void call(T t); 10 | } 11 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/functions/Function.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.functions; 2 | 3 | /** 4 | * Created by ZengJingFang on 2018/4/25. 5 | */ 6 | 7 | public interface Function { 8 | } 9 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/observer/Observer.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.observer; 2 | 3 | 4 | /** 5 | * 6 | * Created by ZengJingFang on 2018/4/25. 7 | */ 8 | 9 | public interface Observer { 10 | 11 | /** 12 | * Notifies the Observer that the {@link Observable} has finished sending push-based notifications. 13 | *

14 | * The {@link Observable} will not call this method if it calls {@link #onError}. 15 | */ 16 | void onCompleted(); 17 | 18 | /** 19 | * Notifies the Observer that the {@link Observable} has experienced an error condition. 20 | *

21 | * If the {@link Observable} calls this method, it will not thereafter call {@link #onNext} or 22 | * {@link #onCompleted}. 23 | * 24 | * @param e 25 | * the exception encountered by the Observable 26 | */ 27 | void onError(Throwable e); 28 | 29 | /** 30 | * Provides the Observer with a new item to observe. 31 | *

32 | * The {@link Observable} may call this method 0 or more times. 33 | *

34 | * The {@code Observable} will not call this method again after it calls either {@link #onCompleted} or 35 | * {@link #onError}. 36 | * 37 | * @param t 38 | * the item emitted by the Observable 39 | */ 40 | void onNext(T t); 41 | } 42 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/operators/OperatorSubscribeOn.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.operators; 2 | 3 | import cn.zengjingfang.box.android.rxhandler.rx.Observable; 4 | import cn.zengjingfang.box.android.rxhandler.rx.Producer; 5 | import cn.zengjingfang.box.android.rxhandler.rx.Scheduler; 6 | import cn.zengjingfang.box.android.rxhandler.rx.Subscriber; 7 | import cn.zengjingfang.box.android.rxhandler.rx.functions.Action0; 8 | 9 | /** 10 | * 11 | * Created by ZengJingFang on 2018/4/27. 12 | */ 13 | 14 | public class OperatorSubscribeOn implements Observable.OnSubscribe { 15 | 16 | final Scheduler scheduler; 17 | final Observable source; 18 | 19 | public OperatorSubscribeOn(Observable source, Scheduler scheduler) { 20 | this.scheduler = scheduler; 21 | this.source = source; 22 | } 23 | 24 | 25 | @Override 26 | public void call(final Subscriber subscriber) { 27 | final Scheduler.Worker inner = scheduler.createWorker(); 28 | subscriber.add(inner); 29 | 30 | inner.schedule(new Action0() { 31 | @Override 32 | public void call() { 33 | final Thread t = Thread.currentThread(); 34 | 35 | Subscriber s = new Subscriber(subscriber) { 36 | @Override 37 | public void onNext(T t) { 38 | subscriber.onNext(t); 39 | } 40 | 41 | @Override 42 | public void onError(Throwable e) { 43 | try { 44 | subscriber.onError(e); 45 | } finally { 46 | inner.unsubscribe(); 47 | } 48 | } 49 | 50 | @Override 51 | public void onCompleted() { 52 | try { 53 | subscriber.onCompleted(); 54 | } finally { 55 | inner.unsubscribe(); 56 | } 57 | } 58 | 59 | @Override 60 | public void setProducer(final Producer p) { 61 | subscriber.setProducer(new Producer() { 62 | @Override 63 | public void request(final long n) { 64 | if (t == Thread.currentThread()) { 65 | p.request(n); 66 | } else { 67 | inner.schedule(new Action0() { 68 | @Override 69 | public void call() { 70 | p.request(n); 71 | } 72 | }); 73 | } 74 | } 75 | }); 76 | } 77 | }; 78 | 79 | source.unsafeSubscribe(s); 80 | } 81 | }); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/readme: -------------------------------------------------------------------------------- 1 | 线程的管理: 2 | 仿照RxJava 3 | 轻量级实现 4 | 5 | 通过Handler底层实现线程 6 | 7 | 8 | 优化 9 | 10 | 线程监控 11 | 12 | 第一步:通过大数据分析 不同的业务合理使用handler线程 13 | 14 | 第二步:通过程序自适应算法 完善handler线程 合理分配线程 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/schedulers/AndroidSchedulers.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.schedulers; 2 | 3 | import cn.zengjingfang.box.android.rxhandler.rx.Scheduler; 4 | 5 | /** 6 | * 7 | * Created by ZengJingFang on 2018/4/27. 8 | */ 9 | 10 | public class AndroidSchedulers { 11 | public static Scheduler mainThread() { 12 | return MainScheduler.getMainScheduler(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/schedulers/IOScheduler.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.schedulers; 2 | 3 | import android.os.Handler; 4 | import android.os.HandlerThread; 5 | 6 | import java.util.concurrent.TimeUnit; 7 | 8 | import cn.zengjingfang.box.android.rxhandler.rx.Scheduler; 9 | import cn.zengjingfang.box.android.rxhandler.rx.Subscription; 10 | import cn.zengjingfang.box.android.rxhandler.rx.functions.Action0; 11 | 12 | /** 13 | * IO 任务 线程 14 | * Created by ZengJingFang on 2018/4/27. 15 | */ 16 | 17 | public class IOScheduler extends Scheduler { 18 | 19 | private static final Scheduler IO_SCHEDULER = new IOScheduler(); 20 | private static Handler ioHandler = null; 21 | 22 | public IOScheduler() { 23 | HandlerThread handlerThread = new HandlerThread("io-handler-thread"); 24 | handlerThread.start(); 25 | ioHandler = new Handler(handlerThread.getLooper()); 26 | } 27 | 28 | public static Scheduler getIoScheduler() { 29 | return IO_SCHEDULER; 30 | } 31 | 32 | @Override 33 | public Worker createWorker() { 34 | return new IOWork(); 35 | } 36 | 37 | static final class IOWork extends Scheduler.Worker implements Action0 { 38 | @Override 39 | public void call() { 40 | 41 | } 42 | 43 | @Override 44 | public Subscription schedule(Action0 action) { 45 | return null; 46 | } 47 | 48 | @Override 49 | public Subscription schedule(Action0 action, long delayTime, TimeUnit unit) { 50 | return null; 51 | } 52 | 53 | @Override 54 | public void unsubscribe() { 55 | 56 | } 57 | 58 | @Override 59 | public boolean isUnsubscribed() { 60 | return false; 61 | } 62 | } 63 | 64 | } 65 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/schedulers/MainScheduler.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.schedulers; 2 | 3 | import cn.zengjingfang.box.android.rxhandler.rx.Scheduler; 4 | 5 | /** 6 | * Android主线程 7 | * 8 | * Created by ZengJingFang on 2018/4/27. 9 | */ 10 | 11 | public class MainScheduler extends Scheduler{ 12 | 13 | private static final Scheduler MAIN_SCHEDULER = new IOScheduler(); 14 | 15 | public static Scheduler getMainScheduler() { 16 | return MAIN_SCHEDULER; 17 | } 18 | 19 | @Override 20 | public Worker createWorker() { 21 | return null; 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/schedulers/SchedulerLifecycle.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.schedulers; 2 | 3 | /** 4 | * 5 | * Created by ZengJingFang on 2018/4/26. 6 | */ 7 | 8 | public interface SchedulerLifecycle { 9 | 10 | void start(); 11 | 12 | void shutdown(); 13 | } 14 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/android/rxhandler/rx/schedulers/Schedulers.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.android.rxhandler.rx.schedulers; 2 | 3 | import cn.zengjingfang.box.android.rxhandler.rx.Scheduler; 4 | 5 | /** 6 | * 7 | * Created by ZengJingFang on 2018/4/26. 8 | */ 9 | 10 | public class Schedulers { 11 | 12 | public static Scheduler io() { 13 | return IOScheduler.getIoScheduler(); 14 | 15 | } 16 | 17 | 18 | } 19 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/java/ConcurrentTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.java; 2 | 3 | /** 4 | * Desc: 并发学习 5 | * Author: ZengJingFang 6 | * Time: 2017/6/23 17:54 7 | * Email: zengjingfang@foxmail.com 8 | */ 9 | public class ConcurrentTest { 10 | 11 | public static void main(String[] args) { 12 | 13 | Thread thread=new Thread(new Runnable() { 14 | @Override 15 | public void run() { 16 | addA(); 17 | addB(); 18 | } 19 | }); 20 | 21 | thread.start(); 22 | 23 | 24 | } 25 | 26 | private static int a = 1; 27 | private static int b = 1; 28 | public static int addA() { 29 | 30 | a++; 31 | return a; 32 | } 33 | 34 | public synchronized static int addB() { 35 | b++; 36 | return b; 37 | } 38 | 39 | private void print(String s) { 40 | System.out.print(" >>> "+s); 41 | } 42 | 43 | } 44 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/java/IOTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.java; 2 | 3 | /** 4 | * Created by ZengJingFang on 2017/10/31 5 | */ 6 | public class IOTest { 7 | public static void main(String[] args) { 8 | test1(); 9 | } 10 | 11 | private static void test1() { 12 | 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/java/InnerClassTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.java; 2 | 3 | /** 4 | * Created by ZengJingFang on 2018/2/27 5 | */ 6 | public class InnerClassTest { 7 | 8 | private static String c; 9 | public String b; 10 | 11 | public void test() { 12 | new A().test1(); 13 | 14 | } 15 | 16 | public static void test0() { 17 | 18 | } 19 | class A { 20 | void test1() { 21 | c = ""; 22 | b =""; 23 | } 24 | 25 | /** 26 | * 非静态内部内不能有静态方法 27 | */ 28 | /*static void test11() { 29 | c = ""; 30 | b =""; 31 | }*/ 32 | 33 | } 34 | public static class B { 35 | private A a; 36 | private InnerClassTest innerClassTest; 37 | 38 | public B() { 39 | } 40 | 41 | public B(A a, InnerClassTest innerClassTest) { 42 | this.a = a; 43 | this.innerClassTest = innerClassTest; 44 | } 45 | 46 | void test2() { 47 | c = ""; 48 | 49 | innerClassTest.b = ""; 50 | } 51 | 52 | static void test22() { 53 | c = ""; 54 | 55 | } 56 | } 57 | } 58 | class OutClassTest{ 59 | 60 | InnerClassTest.A a = new InnerClassTest().new A();// 外围类的实例来New对象 61 | InnerClassTest.B b = new InnerClassTest.B();// 直接New对象 62 | } -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/java/MathTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.java; 2 | 3 | /** 4 | * 5 | * Created by ZengJingFang on 2018/4/18. 6 | */ 7 | 8 | public class MathTest { 9 | 10 | private static final int MODE_SHIFT = 30; 11 | private static final int MODE_MASK = 0x3 << MODE_SHIFT; 12 | /** 13 | * Measure specification mode: The parent has not imposed any constraint 14 | * on the child. It can be whatever size it wants. 15 | */ 16 | public static final int UNSPECIFIED = 0 << MODE_SHIFT; 17 | 18 | /** 19 | * Measure specification mode: The parent has determined an exact size 20 | * for the child. The child is going to be given those bounds regardless 21 | * of how big it wants to be. 22 | */ 23 | public static final int EXACTLY = 1 << MODE_SHIFT; 24 | 25 | /** 26 | * Measure specification mode: The child can be as large as it wants up 27 | * to the specified size. 28 | */ 29 | public static final int AT_MOST = 2 << MODE_SHIFT; 30 | 31 | public static void main(String[] args) { 32 | test2(); 33 | } 34 | 35 | private static void test1() { 36 | // 30 >>> 0000 0000 0001 1110 37 | // 38 | 39 | System.out.print("\n MODE_SHIFT: " + Integer.toBinaryString(MODE_SHIFT));//2+4+8+16 40 | System.out.print("\n 0x3: " + Integer.parseInt("3", 16)); 41 | System.out.print("\n MODE_MASK: " + Integer.toBinaryString(MODE_MASK)); 42 | System.out.print("\n UNSPECIFIED: " + Integer.toBinaryString(UNSPECIFIED)); 43 | System.out.print("\n EXACTLY: " + Integer.toBinaryString(EXACTLY)); 44 | System.out.print("\n AT_MOST: " + Integer.toBinaryString(AT_MOST)); 45 | 46 | System.out.print("\n mode: " + getMode(10)); 47 | 48 | 49 | } 50 | public static int getMode(int measureSpec) { 51 | //noinspection ResourceType 52 | return (measureSpec & MODE_MASK); 53 | } 54 | 55 | public static void test2() { 56 | int a = 60; /* 60 = 0011 1100 */ 57 | int b = 13; /* 13 = 0000 1101 */ 58 | int c = 0; 59 | c = a & b; /* 12 = 0000 1100 */ 60 | System.out.println("a & b = " + c ); 61 | 62 | c = a | b; /* 61 = 0011 1101 */ 63 | System.out.println("a | b = " + c ); 64 | 65 | c = a ^ b; /* 49 = 0011 0001 */ 66 | System.out.println("a ^ b = " + c ); 67 | 68 | c = ~a; /*-61 = 1100 0011 */ 69 | System.out.println("~a = " + c ); 70 | 71 | c = a << 2; /* 240 = 1111 0000 */ 72 | System.out.println("a << 2 = " + c ); 73 | 74 | c = a >> 2; /* 15 = 1111 */ 75 | System.out.println("a >> 2 = " + c ); 76 | 77 | c = a >>> 2; /* 15 = 0000 1111 */ 78 | System.out.println("a >>> 2 = " + c ); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/java/ObjectCopyTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.java; 2 | 3 | import java.lang.reflect.Array; 4 | import java.util.ArrayList; 5 | import java.util.Arrays; 6 | import java.util.Collections; 7 | import java.util.List; 8 | 9 | /** 10 | * 深拷贝:先new出目标对象,再把原始对象的参数一个一个的copy到新的对象中 11 | * 浅拷贝:直接“=”的方式吧原始对象的引用,交给目标对象,此时,这两个对象的引用同时指向同一个对象 12 | * 13 | * Created by ZengJingFang on 2018/4/17. 14 | */ 15 | 16 | public class ObjectCopyTest { 17 | 18 | public static void main(String[] args) { 19 | 20 | shallowCopy(); 21 | deepCopy(); 22 | unModifiableList(); 23 | 24 | } 25 | 26 | private static void unModifiableList() { 27 | List list1 = new ArrayList<>(); 28 | list1.add(0); 29 | list1.add(1); 30 | 31 | List list2 = new ArrayList<>(); 32 | list2 = Collections.unmodifiableList(list1); 33 | 34 | list1.add(2); 35 | // list2.add(3);// 执行这里抛出 UnsupportedOperationException 原因是 list不可变 36 | 37 | System.out.print("\n>>> " + Arrays.toString(list1.toArray())); 38 | 39 | System.out.print("\n>>> " + Arrays.toString(list2.toArray())); 40 | 41 | // >>> [0, 1, 2] 42 | // >>> [0, 1, 2] 43 | // 说明:list2在unmodifiableList之后并没有进行深拷贝,只是不能对list2进行任何的“修改类型的”操作 44 | } 45 | 46 | private static void deepCopy() { 47 | ArrayList list1 = new ArrayList<>(); 48 | list1.add(0); 49 | list1.add(1); 50 | 51 | ArrayList list2 = new ArrayList<>(list1); 52 | list1.add(2); 53 | list2.add(3); 54 | 55 | System.out.print("\n>>> " + Arrays.toString(list1.toArray())); 56 | 57 | System.out.print("\n>>> " + Arrays.toString(list2.toArray())); 58 | 59 | //>>> [0, 1, 2] 60 | //>>> [0, 1, 3] 61 | 62 | } 63 | 64 | private static void shallowCopy() { 65 | ArrayList list1 = new ArrayList<>(); 66 | list1.add(0); 67 | list1.add(1); 68 | 69 | ArrayList list2 = new ArrayList<>(); 70 | list2 = list1; 71 | 72 | list1.add(2); 73 | list2.add(3); 74 | 75 | System.out.print(">>> " + Arrays.toString(list1.toArray())); 76 | 77 | System.out.print("\n>>> " + Arrays.toString(list2.toArray())); 78 | // >>> [0, 1, 2, 3] 79 | // >>> [0, 1, 2, 3] 80 | } 81 | 82 | /** 83 | * ArrayList深拷贝的源码解析 84 | * @param original 原始数据 85 | * @param newLength 原始数据长度 86 | * @param newType 新的数据类型 87 | * @param 新的数据类型 88 | * @param 原始数据类型 89 | * @return 90 | */ 91 | public static T[] copyOf(U[] original, int newLength, Class newType) { 92 | 93 | // 如果是对象类型: new Object[newLength] 94 | // 如果是基本类型: Array.newInstance 95 | T[] copy = ((Object)newType == (Object)Object[].class) 96 | ? (T[]) new Object[newLength] 97 | : (T[]) Array.newInstance(newType.getComponentType(), newLength); 98 | 99 | // 把原数据copy到新的对象中 100 | System.arraycopy(original, 0, copy, 0, 101 | Math.min(original.length, newLength)); 102 | 103 | return copy; 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/java/PoPoTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.java; 2 | 3 | /** 4 | * Created by Administrator on 2018/3/6. 5 | */ 6 | 7 | public class PoPoTest { 8 | 9 | private static final int[] arr = {13, 1, 15, 3, 6, 7, 6, 4, 11}; 10 | 11 | public static void main(String[] args) { 12 | 13 | for (int i = 0; i < arr.length-1; i++) { 14 | 15 | for (int j=0;j b) { 19 | arr[j] = b; 20 | arr[j + 1] = a; 21 | } 22 | } 23 | 24 | } 25 | System.out.print("result: " + arr); 26 | 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /box/src/main/java/cn/zengjingfang/box/java/StringTest.java: -------------------------------------------------------------------------------- 1 | package cn.zengjingfang.box.java; 2 | 3 | /** 4 | * Created by ZengJingFang on 2018/4/12. 5 | */ 6 | 7 | public class StringTest { 8 | public static void main(String[] args) { 9 | test(); 10 | 11 | } 12 | 13 | private static void test() { 14 | String s1 = "hello word"; 15 | String s2 = "hello word"; 16 | String s3 = new String("hello word"); 17 | String s4 = new String("word"); 18 | String s5 = "hello " + "word"; 19 | String s6 = "hello " + s4; 20 | 21 | System.out.print("\n >>> s1: " + s1.hashCode()); 22 | System.out.print("\n >>> s2: " + s2.hashCode()); 23 | System.out.print("\n >>> s3: " + s3.hashCode()); 24 | System.out.print("\n >>> s4: " + s4.hashCode()); 25 | System.out.print("\n >>> s5: " + s5.hashCode()); 26 | System.out.print("\n >>> s6: " + s6.hashCode()); 27 | 28 | System.out.print("\n s1==s2 >>> "+ (s1==s2)); 29 | System.out.print("\n s1==s3 >>> "+ (s1==s3)); 30 | System.out.print("\n s5==s1 >>> "+ (s5==s1)); 31 | System.out.print("\n s5==s6 >>> "+ (s5==s6)); 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /box/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 |