Earth Guardian

You are not LATE!You are not EARLY!

0%

介绍

JSON

JSON(JavaScript Object Notation):轻量级的数据交换格式,广泛用于服务器和客户端的交互中

Gson

Google 公司发布的一个开放源代码的 Java 库,主要用途为序列化 Java 对象为 JSON 字符串,或反序列化 JSON 字符串成 Java 对象。官方仓库。主要优势有:

  • 允许已经存在的无法改变的对象转换成 Json,或者 Json 转换成已存在的对象,不需要注解就可以直接转换
  • 对泛型提供完全的支持
阅读全文 »

介绍

是一个类型安全的 Http 客户端请求框架,本质是对 OkHttp 的封装

依赖

app/build.gradle 中增加依赖:

1
2
3
4
// Retrofit
compile "com.squareup.retrofit2:retrofit:2.3.0"
compile "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
compile "com.squareup.retrofit2:converter-gson:2.3.0"
阅读全文 »

介绍

ReactiveX

主要是响应式编程(Reactive Program),它集合了观察者模式,迭代器模式,函数式编程的优点,是一种面向集合数据流和变化传播的编程范式,是基于异步数据流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者为新的消费者与另外一条流合并为一条新的流
ReactiveX is a combination of the best ideas from the Observer pattern, the Iterator pattern, and functional programming
It is sometimes called “functional reactive programming” but this is a misnomer. ReactiveX may be functional, and it may be reactive, but “functional reactive programming” is a different animal. One main point of difference is that functional reactive programming operates on values that change continuously over time, while ReactiveX operates on discrete values that are emitted over time.

阅读全文 »

基本概念

Dagger2 依赖注入框架,用来解耦类关系。特别是 MVP 分层结构中,方便解耦和分层测试
A fast dependency injector for Android and Java.
仓库地址:https://github.com/google/dagger

阅读全文 »

23 种设计模式

创建型模式 Creational Patterns

  • 工厂方法模式 Factory Method
    定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法将类的实例化延迟到子类
  • 抽象工厂模式 Abstract Factory
    提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。主要用来创建产品集合
  • 建造者模式 Builder
    将一个复杂对象的构建与它的表示分离,使得同样的构建可以创建不同的表示。隐藏了产品是如何组装的
  • 原型模式 Prototype
    用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新对象
  • 单例模式 Singleton
    保证一个类只产生唯一的一个实例
阅读全文 »

String

字符串常量,字符串内容和长度都是不可变的。定义如下:

1
2
3
4
5
6
7
8
9
10
11
12
/**
* ...
* Strings are constant; their values cannot be changed after they
* are created. String buffers support mutable strings.
* ...
*/
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
...
}

String 的操作都是在堆内存中重新申请一块内存区并赋值,最终返回该存储区首地址给引用变量。所以如果频繁修改 String 会产生堆内存垃圾,直到 java 触发内存管理机制才能释放。所以在形参传递时, String 类似值传递。

StringBuffer

字符串变量,同时也是线程安全的(Synchronized)。

StringBuilder

字符串变量,但不是线程安全的。

使用策略

  • String :操作少量的数据
  • StringBuilder:单线程操作大量数据
  • StringBuffer :多线程操作大量数据

不要使用 String 类进行频繁的字符串拼接或插入删除,因为那样的性能较差,应该使用 StringBufferStringBuilder 类,这在 Java 的优化上是一条比较重要的原则。执行速度上:String < StringBuffer < Stringbuilder

Object 的默认定义

也就是 Java 中所有的对象都会包含这两个方法:

1
2
3
4
public boolean equals(Object obj) {
return (this == obj);
}
public int hashCode() {...}
阅读全文 »

Java 集合(也称为容器),是将多个元素组合成一个单元的对象。分为两大类: CollectionMap,常用集合为 ListSetMap;本文源码分析基于 JDK 1.8

阅读全文 »

背景

大多数并发应用程序都是围绕“任务执行(Task Execution)”来构造的:任务通常是些抽象且离散的工作单元。任务执行时应该选择清晰的任务边界以及明确的任务执行策略。执行策略有如下几种:

  • 串行执行
    在多任务中执行性能太差,只能一个个顺序处理,无法提高吞吐率或快速响应性
  • 显示创建线程
    new Thread(task).start():显示创建。但是大量创建会有如下问题:线程生命周期开销非常高;资源消耗:尤其是内存,当可运行线程数量多于处理器数量时,会出现大量闲置进程,会占用很多内存,线程竞争 CPU 资源时也会产生性能消耗;稳定性;
  • 使用并发框架
    如:Executor 框架
阅读全文 »

在Java程序运行时环境中,JVM需要对两类线程共享的数据进行协调:
1)保存在堆中的实例变量
2)保存在方法区中的类变量

这两类数据是被所有线程共享的。

死锁

产生死锁 4 个必要条件

  • 互斥条件
    一个资源每次只能被一个进程使用
  • 保持和等待条件
    一个进程因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件
    进程已获得的资源,在未使用完之前,不能强行剥夺
  • 环路等待条件
    若干进程之间形成一种头尾相接的循环等待资源关系
阅读全文 »