泛型数组列表与包装器
2018-10-19 本文已影响0人
爱做梦的严重精神病患者
1.ArrayList泛型数组列表
ArrayList使用起来有点像数组,但在添加或删除元素时,具有自动调节数组容量的功能。
ArrayList是一个采用类型参数的泛型类。为了指定数组列表保存的元素对象类型,需要一对尖括号将类名括起来加在后面。
数组列表管理着对象引用的一个内部数组。最终,数组的全部空间有可能被用尽。如果调用add且内部数组已经满了,数组列表就将自动地创建一个更大的数组,并将所有的对象拷贝进去。
一旦能够确认数组列表的大小不再发生变化,就可以调用trimToSize方法。这个方法将存储区域的大小调整为当前元素数量所需要的存储空间数目。垃圾回收器将回收多余的存储空间。
2.对象包装器
有时候需要将int这样的基本类型转换为对象。所有的基本类型都有一个与之对应的类。通常,这些类称为包装器。Integer、Long、Float、Double、Short、Byte、Character、Void、Boolean。
假设定义一个整型数组列表,尖括号中的参数类型不允许是基本类型,这就用到了包装器类。
ArrayList<Integer> list = ArrayList<> ();
由于每个值分别包装在对象中,所以ArrayList<Integer>的效率远远低于int []数组。
当添加int类型的元素到ArrayList<Integer>中,发生自动装箱:
list.add(3);
自动地变换成:
list.add(Integer.valueOf(3));
相反地,当将一个Integer对象赋给一个int变量时,将会自动地拆箱:
int n = list.get(i);
自动地变换成:
int n = list.get(i).intValue();
关于自动装箱的总结:
- 两个包装器对象比较时调用equals方法,而不使用"=="。
- 包装器类引用可以为null,所以自动装箱有可能抛出空指针异常。
- 如果在一个表达式中混合使用Integer和Double类型,Integer值会拆箱,提升为double,再装箱为Double。
- 装箱和拆箱是编译器认可的,而不是虚拟机。
- 某些基本方法放置在包装器类中。