@act262
2017-08-10T12:54:54.000000Z
字数 1276
阅读 916
Training
在使用集合类时,如果已知需要的大小则可以指定其初始化的大小值,可以减少在容量不够时扩容操作,减少空间占用和扩容时的性能影响。
// 已知需要容量是10
List<String> list = new ArrayList<>(10);
对于一些Map的使用Key 是对象类型的可以考虑使用ArrayMap、SimpleArrayMap来替代,key是int的可以用SparseArray、SparseIntArray、SparseLongArray、SparseBooleanArray替代,可以减少空间占用,在容量较少时,可以忽略其他副作用影响。
具体查看源码集合类初始化容量。
// key是Object类型的
Map<String,String> params = new HashMap<>(2);
// 可以替换为ArrayMap (一般用的是v4 support包下的)
Map<String,String> params = new ArrayMap<>(2);
// key 是int类型的,注意Map的key需要用包装类,使用时会自动拆装箱操作
Map<Integer,View> cacheViews = new HashMap<>();
// SparseArray内置key就是int类型,不会进行拆装箱
SparseArray<View> cacheViews = new SparseArray<>();
在某个Model中定义的字段,为了防止出现npe,往往直接在属性字段上直接赋值一个new出来的,
或者在使用的地方还得加上null判断等。
i.e.
// define here
public class Model{
// 不做初始化赋值,由其他地方赋值
public List<Object> list;
// 简单new一个来赋值,在后面其他地方赋值会覆盖掉,相当于浪费了
public List<Object> list = new ArrayList<>();
}
// use here
if(model.list != null) {
for(Object obj : model.list) {
// iterate operation
}
}
优化方式:
可以使用Collections
的一些方法属性替代,在使用时可以不用null判断,从而实现优雅的代码。
// 1. Collections 内置EmptyList,不能修改!
public List<Object> list = Collections.emptyList();
// 2. 指定new出来的大小为0,内部会共享类的EmptyArray.OBJECT,可以修改
public List<Object> list = new ArrayList<>(0);
// 在使用时不需要在判空操作了
同理还有Collections.EMPTY_MAP
,Collections.EMPTY_SET
etc.
需要注意的是使用Collections内置的EmptyList等时,是不能对这个对象增删改查的;如果是用方式2赋值的则可以正常自由使用。
Collections、Arrays、