第一章:语法糖

for-each循环

1、for vs for-each循环
-For-each循环比for循环更加简洁
-For-each从JDK1.5开始引入
-for-each可以避免越界错误
-for可以删除元素,for-each不可以删除/替换元素
-for-each遍历时无法获知当前元素的具体索引位置
-for-each只能正向便利,不能反向遍历,
-for-each不能同时遍历2个集合
-for和for-each性能相近

enum枚举

Java5推出enum类型,

enum关键字声明枚举类,enum类型默认继承Enum,不需要写extends

enum内部有多少个值,就有多少个实例对象,因此enum不能直接new枚举类对象

例如:

枚举类Size只有5个对象。

此外除了枚举对象,还可以添加属性/构造函数/方法

构造函数只能是package-private(default)或者private,默认是private(可以不写)。仅供内部调用

以上

不定项参数

JDK5提供了可变参数,本质上讲就是一个数组;

格式:类型后面加上三个点,

注意:

1,一个方法只能有一个不定向参数,且只能位于列表之后

2,重载优先级,固定参数的方法,可比可变参数的优先级更高

3,重载优先级,同时调用两个带可变参数的方法。会报错

静态导入(1)

Import 导入程序所需要的类

Import static 导入一个类的静态方法和静态变量(JDK5引入)

静态导入可以使得程序中少写类名,比如:Math.sqrt()可以直接写成sqrt();

注意:

1,使用静态导入尽量精确到静态变量名和方法;

2,少用*通配符,不滥用,

3,导入的静态方法需要具有明确特征,如有重名,需要补充类名

4,一般在有大量静态调用的时候使用

自动装箱和拆箱

从jdk5开始加入,可以把箱理解为一个壳、容器。

简化基本类型和对象转换的写法;

基本对象:boolean/byte/char/int/short/long/float/double

包装类对象:Boolean/Byte/Charater/Integer/Short/Long/Float/Double;

代码:

以上第一句是自动装箱,第二句未使用自动装箱

右边的代码,ArrayList的add()方法保存的必须是一个对象,不能保存基本数据类型

如有没有自动装箱,则需要Integer.valueof(Int);

注意:

1、装箱和拆箱是编译器的工作,在class中已经添加转化。虚拟机没有自动装箱和拆箱的语句。

2,a == b,ab比较的有一方是基本类型的时候,是比较内容是否相等,ab都是对象是,是比较指针是否指向同一个区域

3,基本类型没有空值,只有对象会有null,可能触发NullpointException空指针异常。

4,基于第2点,当一个基础数据类型与封装类进行++、==、+、-、/运算时,会将封装类进行拆封,对基础数据进行计算。

示例代码:

以上第12行代码,a1是包装类的对象,a2是基本数据类型。用==进行比较时a1被拆封。结果是true;

equals()比较的两个对象的内存地址是否相同,括号内只能放入对象数值,因此a1+a2在被拆箱计算之后,会被装箱成Integer对象。