一.不可修改的集合
二.懒加载
A类中有一个属性b,这个属性b是B类的一个对象。也就是说A类中持有了B对象。如果是不同的加载方式。在A中持有的B对象会在A创建的时候同时被创建。例如
public class A{
B b
public A(){
b=new B();
}
public B getB(){
return b;
}
}
使用懒加载的方式可以在b被使用的时候才去创建。在没有被使用之前b是一个没有实际意义的代理对象。
public class A{
B b;
public A(){
}
public synchronized B executeB(){
if(b=null){
b=new B();
}
return b;
}
}
//只有该方法被创建时,B对象才被创建。
public B getB(){
return executeB();
}
在OkHttp的Dispatcher类中
三.Foreach的等价代码
String[] strings = {"A", "B", "C", "D"};
Collection stringList = java.util.Arrays.asList(strings);
/* 开始遍历 */
//获取数组的迭代器
for (Iterator itr = stringList.iterator(); itr.hasNext();) {
Object str = itr.next();//获取当前遍历的元素
itr.remove();//从集合中移除该元素
System.out.println(str);
}
foreach
for(String s:stringList){
Object str = itr.next();
System.out.println(str);
}
3.Deck队列 Deque
/** 准备好的异步请求他们将顺序的执行。FIFO 先进先出 * 队列的
种实现,通常读作deck,双端队列,支持在两端插入和移除数据,
它不仅可以实现先进先出的队列,也可以实现后进先出的堆栈。 */
private final Deque<AsyncCall> readyAsyncCalls =
new ArrayDeque<>();//等待队列
具备队列的特性
同时具备堆栈的特性
用作 LIFO(后进先出)堆栈。应优先使用此接口而不是遗留 Stack 类。在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。
如何确保返回一个维护的原始对象
//BigInteger在创建时维护了一个bigInt对象。
public BigInteger(byte[] value) {
BigInt bigInt = new BigInt();
bigInt.putBigEndianTwosComplement(value);
setBigInt(bigInt);
}
private void setBigInt(BigInt bigInt) {
this.bigInt = bigInt;
this.nativeIsValid = true;
}
BigInt getBigInt() {
if (nativeIsValid) {
return bigInt;
}
synchronized (this) {
if (nativeIsValid) {
return bigInt;
}
BigInt bigInt = new BigInt();
//重新维护这个对象
setBigInt(bigInt);
return bigInt;
}
}
//如果这个BigInt对象没有修改过,那么直接使用它
public BigInteger negate() {
BigInt bigInt = getBigInt();
BigInt a = bigInt.copy();
...
return new BigInteger(a);
}
确保当前是UI线程
public static boolean isOnMainThread() {
return Looper.myLooper() == Looper.getMainLooper();
}
定义更全面的错误信息
TreeMap中定义了更全面的异常信息,以便更精确的定位错误
throw outOfBounds(to, this.fromBound, toBoundToCheck);
private IllegalArgumentException outOfBounds(Object value, Bound fromBound, Bound toBound) {
return new IllegalArgumentException(value + " not in range "
+ fromBound.leftCap(from) + ".." + toBound.rightCap(to));
}