泛型数组列表

  • 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. python与图灵机器人交互(WXPY版本)

    开发者账号:wujunfeng , 开发者key:官网申请  #!/usr/bin/env python#-*- coding:utf-8 -*- @Author : wujf @Time:2018/ ...

  2. 强大的JQuery链式操作风格

    实例代码 <style type="text/css"> #menu {width: 300px;} .has_children {background:#555;co ...

  3. kernel相关前沿技术了解

    Intel MPX https://en.wikipedia.org/wiki/Intel_MPX SPDK http://aidaiz.com/spdk/ TCMalloc http://goog- ...

  4. 洛谷P1914 小书童——密码

    题目背景 某蒟蒻迷上了"小书童",有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你. 题目描述 蒟蒻虽然忘记密码,但他还记得密码是由一串字母组成.且密码是由 ...

  5. [2018.8.12]模拟赛B组

    T1 打表出奇迹,发现结论为\(E(a_n)=n+1\)即可. #include <iostream> #include <cstdio> #include <cctyp ...

  6. [tyvj-2054][Nescafé29]四叶草魔杖 费用流

    lyd讲的最小生成树的题. 道理我都懂,费用流多好写,又好调.但和一般费用流不一样的就是它走过一次后费用需调成0,但是再等回流,就恢复原状即可. #include <queue> #inc ...

  7. 警告: The APR based Apache Tomcat Native library failed to load.

    警告: The APR based Apache Tomcat Native library failed to load. The error reported was [C:\apache-tom ...

  8. js cookie 设置

    (function () { function getCookie(name) { var start = document.cookie.indexOf(name + "="); ...

  9. POJ 2191

    只会打表 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring ...

  10. 11 个 Visual Studio 代码性能分析工具

    软件开发中的性能优化对程序员来说是一个非常重要的问题.一个小问题可能成为一个大的系统的瓶颈.但是对于程序员来说,通过自身去优化代码是十分困难的.幸运的是,有一些非常棒的工具可以帮助程序员进行代码分析和 ...