泛型数组列表

  • 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. form表单提交三种方式,demo实例详解

    第一种:使用type=submit  可以直接提交 <html> <head> <title>submit直接提交</title> </head& ...

  2. codevs 2800 送外卖 floyd + Tsp

    简单的状压动归 #include<cstdio> #include<algorithm> using namespace std; const int N=17; const ...

  3. 动态规划——独立任务最优调度(Independent Task Scheduling)

    题目链接 题目描述 用2 台处理机A 和B 处理n 个作业.设第i 个作业交给机器A 处理时需要时间i a ,若由机器B 来处理,则需要时间i b .由于各作业的特点和机器的性能关系,很可能对于某些i ...

  4. HDU-1695 GCD(求一个区间内与一个数互质的个数)

    题意: 给你一个T,是样例的个数,接下来是五个数l1,r1,l2,r2,k  前四个数代表两个区间(l1,r1),(l2,r2)这个题l1=1,l2=1; 取x1属于(1,r1),x2属于(1,r2) ...

  5. [网络流24题] 最长k可重区间集问题 (费用流)

    洛谷传送门 LOJ传送门 很巧妙的建图啊...刚了$1h$也没想出来,最后看的题解 发现这道题并不类似于我们平时做的网络流题,它是在序列上的,且很难建出来二分图的形. 那就让它在序列上待着吧= = 对 ...

  6. 4.1、Ansible模块

    ansible-doc -l    列出所有模块 ansible-doc 模块名    查看模块的help说明 ansible-doc -s  module_name:获取指定模块的使用信息 ***文 ...

  7. win10 1809磁盘占用总是100%

    快过年了,提前请假回家,装几台电脑公司备用.有个电脑装完系统开机很慢,开机完成之后电脑响应也很慢,于是打开任务管理器发现磁盘中用率一直是100%,然而程序读取数据的速度并不高. 解决思路: 关闭win ...

  8. android生成sdk.jar 小工具

    net.sf.fjep.fatjar_0.0.31.jar 生成jar的工具 把这个net.sf.fjep.fatjar_0.0.31.jar到Eclipse的plugins中,从启Eclipse.点 ...

  9. IAR for MSP430 关于添加自定义头文件的两种方法【转】

    前言:第一次接触这个软件,编译一个例程一直出现没有包含头文件的错误,在网上找了好几个方法都没什么效果,看到了篇文章,利用里面的方法1解决了,特此复制下来保存学习用. 原文链接:https://blog ...

  10. jQuery练习总结(一)

    第一个jQuery程序: 注意:使用jQuery时候定义单击事件使用的方法是click(function(){处理单击事件产生时所要执行的代码}) , 而JavaScript定义的单击事件则是 xx. ...