[关闭]
@act262 2017-08-10T12:54:54.000000Z 字数 1276 阅读 803

Effective Android 一些小细节

Training


在使用集合类时,如果已知需要的大小则可以指定其初始化的大小值,可以减少在容量不够时扩容操作,减少空间占用和扩容时的性能影响。

  1. // 已知需要容量是10
  2. List<String> list = new ArrayList<>(10);

对于一些Map的使用Key 是对象类型的可以考虑使用ArrayMap、SimpleArrayMap来替代,key是int的可以用SparseArray、SparseIntArray、SparseLongArray、SparseBooleanArray替代,可以减少空间占用,在容量较少时,可以忽略其他副作用影响。
具体查看源码集合类初始化容量。

  1. // key是Object类型的
  2. Map<String,String> params = new HashMap<>(2);
  3. // 可以替换为ArrayMap (一般用的是v4 support包下的)
  4. Map<String,String> params = new ArrayMap<>(2);
  1. // key 是int类型的,注意Map的key需要用包装类,使用时会自动拆装箱操作
  2. Map<Integer,View> cacheViews = new HashMap<>();
  3. // SparseArray内置key就是int类型,不会进行拆装箱
  4. SparseArray<View> cacheViews = new SparseArray<>();

在某个Model中定义的字段,为了防止出现npe,往往直接在属性字段上直接赋值一个new出来的,
或者在使用的地方还得加上null判断等。
i.e.

  1. // define here
  2. public class Model{
  3. // 不做初始化赋值,由其他地方赋值
  4. public List<Object> list;
  5. // 简单new一个来赋值,在后面其他地方赋值会覆盖掉,相当于浪费了
  6. public List<Object> list = new ArrayList<>();
  7. }
  8. // use here
  9. if(model.list != null) {
  10. for(Object obj : model.list) {
  11. // iterate operation
  12. }
  13. }

优化方式:
可以使用Collections的一些方法属性替代,在使用时可以不用null判断,从而实现优雅的代码。

  1. // 1. Collections 内置EmptyList,不能修改!
  2. public List<Object> list = Collections.emptyList();
  3. // 2. 指定new出来的大小为0,内部会共享类的EmptyArray.OBJECT,可以修改
  4. public List<Object> list = new ArrayList<>(0);
  5. // 在使用时不需要在判空操作了

同理还有Collections.EMPTY_MAP,Collections.EMPTY_SET etc.
需要注意的是使用Collections内置的EmptyList等时,是不能对这个对象增删改查的;如果是用方式2赋值的则可以正常自由使用。

了解常用的一些类

Collections、Arrays、

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注