十二月份复习部分重要知识点总结

十二月份复习部分重要知识点总结

  • kotlin 中data class只做数据类,不要有封装其他逻辑操作。“null”也可以以有 toString()。
  • Java 内部类的final字段,从反编译结果可知本质上是为了杜绝数据的不一致性。因为传递的实际上是拷贝而不是值或对象本身,如同方法传参无法在方法里面改变原来的值或者对象的引用。如果不为final,在内部类中看似可以成功改变外部的值或引用,但实际上是没有的,为了防止出现这种情况出现,定位final,实际上编译后会生成一个有构造方法的类,传入的是局部方法里面的值或引用(final修饰),还有外部对象的引用。跟方法传参一样,修改传进来的并不会影响原有的值。jdk 1.8以后可以不用在为final,但是原理还是一样的,只不过是jvm修饰。

看一个例子:证明传递给类的引用和方法一样,都只是个名字相同,却分属不同类或者方法的副本,改变它不会影响原来,不管是内部类还是方法,都是一样的道理。


public class TestClass {
    public static void main(String [] args) {
        A a = new A();
        System.out.println("第一个A:"+a.getMsg());
        B b = new B(a);
        System.out.println("第二个A:"+b.getMsg());
        System.out.println("第一个A是否被修改:"+a.getMsg());
    }
}
class A{
    String msg ="AAA";
    String getMsg() {
        return msg;
    }
    void setMsg(String m) {
        this.msg =m;
    }
}
class B{
    A aa;
    public B(A a) {
        a = new A();
        a.setMsg("Anthor A");
        aa = a;
    }
    String msg ="BBB";
    String getMsg() {
        return msg+aa.getMsg();
    }
    void setMsg(String m) {
        this.msg =m;
    }
}


输出第一个A:AAA
第二个A:BBBAnthor A
第一个A是否被修改:AAA
  • Java ThreadLocal对象。使用该类可以在不同线程中引用同一个对象,但却可以有不同的数据存储。通过 get() set()方法。原因是每个线程内部都有一个ThreadLocalMap对象(不是Map,里面维护有一个Entry[],容量为16,名字为table[]),调用set()时,先获得当前线程,再拿到map,如果为空,就实例化map,传入当前sThreadLocal对象,产生特定的数组索引i,然后把sThreadLocal当作key,和value一起放入entry中,再放到特定的数组中去。调用get()时同理通过sThreadLocal获得放入的value。如果没有set()返回null。也就是说一个线程里面可以放16个与不同ThreadLocal对象关联的值。而在Android,不是Map,而是localValues对象,这个对象里面的是一个Object数组,也叫table[],它的储存是在特定索引存入threadLocal,然后在他的下一个索引存值。
  • 在Android中,Looper.prepare()获得Looper实例,Looper里面持有thread和messageQueue字段,初始化时赋值和实例化。Handler里面持有Looper,实例化时传入赋值或者通过sThreaLocal对象获取存储在本线程的Looper,如果没有,则抛出异常。就是说使用子线程handler前必须传入或初始化Looper对象,使其关联当前线程。Message里面还持有没有暴露的target(Handler)和callback(Runable)引用,消息发送之后最终都调用sentMessageAtTime(),在调用消息队列的分发消息方法到队列,再取出根据target处理。更多信息查看相关源码。
  • RecyclerView有新增SnapHelper抽象类,有两个实现类可以实现类似ViewPager的效果。LinearSnapHelper和PageSnapHelper。使用代码类似ItemTouchHelper简单。
  • Camer类相机的编程和基础使用。自定义一个SurfaceView实现SurfaceHolder接口,PreViewCallbak接口。在Activity里面获取相机实例,传入SurfaceView,及时释放camera(先移除所有接口在移除View,最后释放。在View的Surface创建监听里面初始化相机参数Parameter之后设置camera显示到holder后startPreview。还可以视情况设置拍照监听和面部检测监听)。
    -Java多线程并发的生产者消费者问题。为了避免生产者和消费者的不同步而导致的异常,需要对共享对象(也就是生产者消费者之间的缓冲池)加锁,双方调用while()在缓存池不为空或者不为满从缓存池中不断取出或者放入数据 直到条件不成立,调用shareObject.wait(),wait()之前调用shareObject.notifty()唤醒其他线程。注意总是使用whlie()而不是if()
  • Java运行时数据区分为方法区(含常量池)、程序计数器、Java堆、Java栈(Native Stack和JVM Stack)其中方法区和堆Heap是线程共享的,而其他则是线程独立的。每一个线程每个方法的调用都是出栈入栈操作,当动态扩展的栈超过了最大深度则会StackOverflow,如递归次数过多(尾递归避免),当扩展栈时内存不足则会OOM。
  • Glide相关用法,详看郭霖博客。http://blog.csdn.net/guolin_blog/article/details/78582548
  • GPUImage大致用法。gpuImage.setBitmap() gpuImage.setFilter() gpuImage.getBitmapWithFilterApplied()。混合滤镜使用GPUImageGroupFilters 和 updateFilters()再getBitmap()
  • 暂时先寄到这里吧。 = =

猜你喜欢

转载自blog.csdn.net/sinat_33878878/article/details/78945654