集合初始化,泛型及相关操做

集合初始化一般进行分配容量,设置特定参数等相关工做,推荐在任何状况下,都须要显式地设定集合容量的初始大小。java

ArrayList 使用无参构造时,默认大小为 10 ,也就是说在第一次add的时候,分配为10的容量,后续的每次扩容都会调用Array.copyOf 方法,建立新数组现复制。能够想像,假如须要将1000个元素放置在ArrayList中采用默认构造器方法,则须要被动扩容13次才能够完成存储。反之,若是在初始化进便指定了容量,newArrayList(1000) ,那么初始化ArrayList 对像的时候就直接分配1000个存储空间,从而避免被动扩容和数组复制的额外开销。数组

HashMap 使用无参构造时,默认大小为16,若是要放置1000个元素,须要被动扩容7次才能够完成存储。扩容时须要重建hash表,很是影响性能。HashMap容量并不会在new的时候分配,而是在第一次put的时候完成建立。网络

泛型性能

List  List<Object> List<?> List<? extends T> List<? super T>code

List: 彻底没有 类型的限制和赋值的限定对象

List<Object> 是一个泛型,只能赋值Object泛型接口

List<Integer> integerList = new ArrayList<>();
List<Object> objectList = integerList;  //编译不经过

List<?> 是一个泛型,能够接受任何类型的集合赋值(不是添加元素),赋值以后就不能随便住里添加元素了。它通常做为参数来接收外部的集合,或者返回一个不知道具体类型的集合rem

List<?> list = new ArrayList<Integer>();
list.add(1);  //编译不能经过

List<? extend T>  能够赋值给任何T及T子类的集合,上界为T 。取出来的类型带有泛型限制,向上强制转型为T,即只能返回T和T的父类。 除了null外,任何元素都不得添加进集合内(没法使用add 方法) ,add 受限get

List<? super T> 能够赋值给任何T及T父类集合,下界为T。能够添加T及T的子类元素,但返回时的元素类型只能是Object,泛型丢失。 get功能受限hash

总结:若是集合属于 get first  应采用<? extend T> ,add first 应采用<? super T>

 

其余

1.Arrays.asList()  转成集合时,是不能进行add/remove/clear 的,会抛出unsuppotedOperationExecption异常

2.list.toArray()   建议不要使用无参调用,将泛型丢失 。

3.list.toArray(array)  参数中数组的大小要与集合类型同样,若是数组长度小于集合元素个数,将复制失败所有输出Null。若是数组的大小与与元素的大小不同还会下降性能

4.对象若是覆写了equal 也要复写hashCode

5.使用ArrayList.subList 方法生成子列表,若是主列表集合的个数增长或删除,会致使子列表的遍历,增长,删除失败,抛出ConcurrrentModificationException。而且子列表是无没有 实现序列化接口没法在网络中传输。

 

 

摘自- 《码出高效》

相关文章
相关标签/搜索