1. 可变参数
当一个方法接收参数不固定的时候,这时我们可以采用List或者数组的形式。如下例所示:
public int add(int[] list) {
int sum = 0;
for (int i = 0; i < list.length; i++) {
sum += list[i];
}
return sum;
}
也可以将它实现为几个重载的方法,每个方法接受不同数量的int参数。
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
如果只有少量的值,那么重载方法还是比较方便的,不需要调用代码时创建一个数组。
但是该方法有个很大的缺点:当参数个数随时变化,就要创建很多个重载方法
在Java 5中,可以编写一个方法以使它允许可变数量的参数并让编译器完成将列表包装到一个数组中的操作。虽然内部仍是处理数组,但此时的编译器已隐藏了细节
可变参数的特点
(1)只能出现在参数列表的最后;
(2)...位于变量类型和变量名之间,前后有无空格都可以
(3)调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中一数组的形式访问可变参数。
public static void main(String[] args) {
// 还可以传递一个作为参数的数组(但不允许是List或Collection对象)
System.out.println(add(1, 2, 4, 6, 8, 10));
System.out.println(add(new int[] { 13, 12, 7 }));
}
public static int add(int... list) {
int sum = 0;
for (int item : list) {
sum += item;
}
return sum;
}
总结:在一些情况下,在方法定义中使用
可变参数可以使方法更简便
。
2.
增强for循环
增强for循环,可以用更简单地方式来遍历数组和Collection等类型的对象。
例如:
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
for (int i : list) {
System.out.println(i);
}
如上所诉增强for循环的语法为:for(type 变量名:集合变量名){...}
能够使用加强for循环遍历的可以归纳为两种:
1、数组
2、所有实现了Iterable接口的类
我们一些常用Collection,List,Queue,Set接口也都实现了Iterable接口,同理他们的所有子类都可以利用加强for循环来进行遍历。它们运用加强for循环遍历其实是利用了底层的iterator迭代器。
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
其实这段代码跟之前使用增强for循环的代码是一样的。
增强for的不足:不能在增强循环里动态的删除集合内容;不能获取下标
3. 自动装包/拆包
自动装包/拆包大大方便了基本类型数据和它们包装类地使用。
自动装包:基本类型自动转为包装类.(int >> Integer)
自动拆包:包装类自动转为基本类型.(Integer >> int)
下面这个例子可以很好的说明: int a = 3;
List c = new ArrayList();
c.add(a);// 自动转换成Integer.
Integer b = new Integer(2);
c.add(b + 2);// Integer先自动转换为int进行加法运算,然后int再次转换为Integer
自动装包/拆包解决了:
无需在基本类型(primitive types)(例如double)和包装类型(wrapper types)(例如Double)之间人工地进行转换。