泛型数组列表

  • 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. linux中errno使用(转)

    当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少 ...

  2. Python基础:条件判断 &&循环

    1:条件判断 2:循环 2.1:for 2.2  while 小结: continue :跳出本次循环 进行下次循环,  break :结束循环体.

  3. git 教程1

    一. git简介 1.1 git是什么? 是一个分布式版本控制软件 1.2 git的作用是什么? 版本控制 ,团队协作 1.3 git的优势在哪里? 同类型的版本控制软件:CVS及SVN,Linus一 ...

  4. flex笔记 - 基础

    flex笔记 - 基础 文章中的所有图示代码都放在了github上: 阮一峰flex博客跟学代码 传统的布局解决方案,基于盒模型, 依赖 display, position, float属性来进行布局 ...

  5. MYSQL数据库常用的LINUX命令

    此为我工作中常用MYSQL数据库命令 LINUX系统中启动 / 重启MYSQL服务:service mysql start  /  service mysql restart(重启服务) LINUX系 ...

  6. django rest-farme-work 的使用(2)

    serialization (序列化) 本测试项目例子地址为: tomchristie/rest-framework-tutorial 开始构建一个新的程序 创建一个新的环境 virtualenv e ...

  7. Linux 文件压缩

    压缩工具   compress/uncompress:对应 .Z 结尾的压缩格式文件  压缩格式:gz.bz2.xz.zip.Z gzip  压缩文件并删除源文件(生成.gz的文件) gunzip 解 ...

  8. Java中发邮件的6种方法

    1.官方标准JavaMail Sun(Oracle)官方标准,功能强大,用起来比较繁琐. 官方资料:http://www.oracle.com/technetwork/java/javamail/in ...

  9. CodeForcesGym 100641E Inspectors

    Inspectors Time Limit: 1000ms Memory Limit: 262144KB This problem will be judged on CodeForcesGym. O ...

  10. rabbitMQ学习笔记(五) 消息路由

    生产者会生产出很多消息 , 但是不同的消费者可能会有不同的需求,只需要接收指定的消息,其他的消息需要被过滤掉. 这时候就可以对消息进行过滤了. 在消费者端设置好需要接收的消息类型. 如果不使用默认的E ...