在Java中,int... obj
和 Object... params
是两种不同类型的可变参数(Varargs)声明方式,它们各自有着不同的用途和限制。
int… obj
int... obj
是一个可变参数,它表示一个int
类型的数组。这种声明方式允许你在调用方法时传入零个或多个int
类型的参数,这些参数在方法内部被当作一个int
数组来处理。
示例:
public void printNumbers(int... obj) {
for (int num : obj) {
System.out.println(num);
}
}
// 调用
printNumbers(1, 2, 3, 4, 5); // 输出 1 2 3 4 5
限制:
- 只能用于基本数据类型
int
,不能用于其他基本类型(如double...
、char...
等)的数组,除非使用相应的包装类型数组(如Integer...
)。 - 在方法内部,
obj
被当作int[]
类型来处理。
Object… params
Object... params
是一个可变参数,它表示一个Object
类型的数组。由于Object
是Java中所有类的根类,因此Object...
可以接受任何类型的参数(包括基本数据类型的包装类,如Integer
、Double
等)。
示例:
public void printObjects(Object... params) {
for (Object obj : params) {
System.out.println(obj);
}
}
// 调用
printObjects("Hello", 123, 3.14, true); // 输出 Hello 123 3.14 true
优势:
- 灵活性高,可以接受任何类型的参数。
- 在方法内部,
params
被当作Object[]
类型来处理,因此可以使用instanceof
来检查元素的具体类型,并进行相应的处理。
注意:
- 当传入基本数据类型时,它们会自动装箱为对应的包装类型(如
int
变为Integer
)。这可能会引入额外的性能开销,尤其是在处理大量数据时。 - 需要注意类型安全,避免在运行时发生
ClassCastException
等异常。
总结
int... obj
专门用于处理int
类型的数据,性能较高但灵活性较差。Object... params
可以处理任何类型的数据,灵活性高但性能可能略低(尤其是在处理基本数据类型时由于自动装箱导致的开销)。
在选择使用哪种方式时,应根据具体需求来权衡性能与灵活性。
基本类型数组和引用类型数组的注意事项
*
数组继承了Object,可以调用Object里定义的方法
*/
public class BoxDemo4 {
public static void main(String[] args) {
/* Integer i = 2;
Object o = i;*/
/*Object o = 2;
test1(o);*/
// Object arr = new int[]{1, 2, 3};
int[] arr = new int[]{1, 2, 3};
test1(arr); // 会把int类型的数组当做一个整体
// 传入arr, int类型的数组会调用test1
// Integer[] nums = new int[]{1, 2, 3}; 报错,自动装箱只能用在单个值上
// Integer[] nums = new Integer[]{1, 2, 3};
Integer[] nums = {31, 27, 53};
//test2(nums); 11Object类型的数组会调用test2
// Stream.of(arr); // of(T t)
//Stream.of(nums); // of(T...t)
}
public static void test1(int... obj) {
System.out.println("obj作为参数的方法");
}
public static void test2(Object... params) {
System.out.println("obj数组作为参数");
}
}