泛型数组列表

  • ArrayList 是一个采用类型参数(type parameter)的泛型类(generic class)。

    ArrayList<Employee> staff = new ArrayList<Employee>();
    ArrayList<Employee> staff = new ArrayList<>(); // JavaSE 7 之后可以简写
  • JavaSE 5.0 以前的版本没有提供泛型类,而是有一个 ArrayList 类,其中保存类型为 Object 的元素。

  • 如果已经清楚或者能够估计数组可能的存储元素数量,就可以在填充数组之前调用 ensureCapacity 方法

    staff.ensureCapacity(100);
    ArrayList<Employee> staff = new ArrayList<>(100); // 或者在构造时就传入初始容量(超过100个之后自动扩展)

    这样做可以预先分配100个内存空间,而不用在每次 add 的时候再去分配。

  • 一旦可以确认数组列表的大小不再发生变化,就可以调用 trimToSize 方法,其可以将存储区域的大小调整为当前元素数量所需要的存储空间数目,垃圾回收器将回收多余的存储空间。但要注意,在整理了存储空间大小之后,添加新元素就需要再次花费时间移动存储块。

  • 常用方法

    • boolean add(E obj) // 在数组列表尾端添加一个元素,永远返回 true
    • void add(int index, E obj)
    • void set(int index, E obj) // 替换已经存在的元素内容
    • E get(int index)
    • E remove(int index) // 删除一个元素,并返回这个被删除的元素
    • int size() // 返回数组列表中当前元素数量

对象包装器与自动装箱

  • 所有的基本类型都有一个与之对应的类。这些类称为包装器(wrapper)。

    • Integer, Long, Float, Double, Short, Byte, Character, Void, Boolean(前6个类派生于公共的超类Number)
    • 对象包装器类是不可变的(一旦构造了包装器,就不允许更改包装在其中的值)(个人认为类似 String)
    • 对象包装器类是 final。

自动装箱

// 下面这个调用
list.add(3);
// 将自动地变换为
list.add(Integer.valueOf(3));

自动拆箱

// 编译器会将下面这个调用
int n = list.get(i);
// 翻译成
int n = list.get(i).intValue();
  • 注意,对于包装类,不要使用 == ,要使用 equals 进行比较。
  • 如果一个条件表达式中混合使用 Integer 和 Double 类型,Integer 值就会拆箱,提升为 double,然后再装箱为 Double。
    Integer i = 1;
    Double d = 2.0;
    System.out.println(true ? i : x); // 结果是 1.0
  • 装箱和拆箱是编译器认可的,而不是虚拟机。编译器在生成类的字节码时,插入必要的方法调用。而虚拟机只是执行这些字节码。

「JavaSE 重新出发」05.02 泛型数组列表、包装类的更多相关文章

  1. 「JavaSE 重新出发」05.03 反射

    能够分析类能力的程序称为反射(reflection). 反射库(reflection library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵 Java 代码的程序. 反射机制可以用 ...

  2. 「JavaSE 重新出发」05.03.03 使用反射编写泛型数组代码

    Employee[] a = new Employee[100]; // ... // array is full a = Arrays.copyOf(a, 2 * a.length); 如何编写这样 ...

  3. 「JavaSE 重新出发」05.03.02 在运行时使用反射分析对象

    在编写程序时,如果知道想要查看的域名和类型,查看指定的域是一个很容易的事,而利用反射机制可以查看在编译时还不清楚的对象域. java Employee tank = new Employee(&quo ...

  4. 「JavaSE 重新出发」05.01.02 hashCode 方法、toString 方法

    hashCode 方法 散列码(hash code)是由对象导出的一个整形值(可以是负数).其是没有规律的,如果x与y是两个不同的对象,则x.hashCode()与y.hashCode()基本上不会相 ...

  5. 「JavaSE 重新出发」05.03.01 利用反射分析类

    在 java.lang.reflect 包中有三个类 Field, Method 和 Constructor 分别用于描述类的域.方法和构造器. Class 类中的 getFields, getMet ...

  6. 「JavaSE 重新出发」05.01.01 equals 方法

    equals 方法示例 // 代码来自<Java核心技术 卷I>P167 // 父类 public class Employee{ ... public boolean equals(Ob ...

  7. 「JavaSE 重新出发」05.01 继承

    继承 一个对象变量可以指示多种实际类型的现象被称为多态(polymorphism). 在运行时能够自动地选择调用哪个方法的现象称为动态绑定(dynamic binding). 如果是private方法 ...

  8. 「JavaSE 重新出发」02. 数据类型与运算符

    「TOC」 Java 程序基本要求 Java 数据类型 基本数据类型 复合数据类型 运算符 逻辑运算符 位运算符 运算符优先级 Java 程序基本要求 public class : 一个 Java 文 ...

  9. 「JavaSE 重新出发」02.02 引用数据类型

    引用(复合)数据类型 1. 枚举类型 例: 枚举类型 Size 的声明: enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 声明 Size 类型变量: ...

随机推荐

  1. adb使用实践

    目录 1. adb 端口占用 2. 查看包名和MainAcitivity =============================================================== ...

  2. (转)基于MVC4+EasyUI的Web开发框架经验总结(1)-利用jQuery Tags Input 插件显示选择记录

    http://www.cnblogs.com/wuhuacong/p/3667703.html 最近花了不少时间在重构和进一步提炼我的Web开发框架上,力求在用户体验和界面设计方面,和Winform开 ...

  3. 高手的C++学习忠告,虚心学习下~~[转载]

    1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programm ...

  4. 如何在vue里面正确的引用 jquery 和 第三方插件

    vue-cli webpack全局引入jquery(jq通过npm安装的并非本地文件) 1.首先在package.json里加入, dependencies:{ "jquery" ...

  5. sh脚本文件

    echo `date +%F`  打印当前日期  用于写备份脚本按照名字命名

  6. anaconda下安装xgboost

    1.下载whl文件 网址:https://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 选择合适自己的环境的下载,比如python3.6还是3.5的,64位机 ...

  7. win10卸载瑞星

    下载了一个软件,没有注意就不小心装上了瑞星这个流氓软件 百度N种办法并不能解决~ 我试过正常卸载.试过WIN自带卸载.试过重装再卸载 最后采取最傻瓜最暴力的办法 ctrl+alt+delete 打开任 ...

  8. js判断当前移动设备平台

    //js判断当前移动设备平台 var isiOs = false; var isAndroid = false; var isWindowsPhone = false; if(/(iPhone|iPa ...

  9. Python 不同列表时间测试

    import timeit import threading def test1(): l = [] for i in range(1000): l = l + [i] def test2(): l ...

  10. 【codeforces 799A】Carrot Cakes

    [题目链接]:http://codeforces.com/contest/799/problem/A [题意] 你有一个烤炉; 每t秒能同时烤出k个蛋糕; 你可以在第一个烤炉在烤的时候;同时花费d秒建 ...