问题引入:
写int数据求和:
两个int进行求和要写一个方法,三个int进行求和要写一个方法,……太麻烦了
有没有一个方法可以实现求任意个数据的和呢
可变参数:
又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了
格式:
修饰符 返回值类型 方法名(数据类型… 变量名){ }
例子:
public static int sum(int… a){}
public class FieldTest {
public static void main(String[] args) {
System.out.println(add(1,2));//3
System.out.println(add(1,2,3));//6
System.out.println(add(1,2,3,4));//0
}
public static int add(int a,int b){
return a+b;
}
public static int add(int a,int b,int c){
return a+b+c;
}
public static int add(int... a){
return 0;
}
}
问:可变参数的a是什么东西?
public class FieldTest {
public static void main(String[] args) {
System.out.println(add(1,2));
System.out.println(add(1,2,3));
System.out.println(add(1,2,3,4));
}
public static int add(int a,int b){
return a+b;
}
public static int add(int a,int b,int c){
return a+b+c;
}
public static int add(int... a){
System.out.println(a);
return 0;
}
}
输出结果为:
3
6
[I@6d6f6e28
0
第1,2并没有执行可变参数的那个方法
输出结果[I@6d6f6e28中的[表明a是一个数组,I表示int类型,即int类型的数组
由此可见可变参数把传入的数据封装到数组中了,a其实是数组,在上面的程序中即为int数组
因为a是int数组,所以可以把元素拿出来进行求和
public static int add(int... a){
int sum=0;
for(int i:a){
sum+=i;
}
return sum;
}
输出结果为:
3
6
10
注意:
写成这样会报错
public static int add(int... a,int b){
return 0;
}
因为a可以把所有的数据都存储到数组中,b就没有对应的数据了,所以报错
如果一定要把数据传给可变参数之外的参数,一定要把可变参数放到参数列表的最后面
public static int add(int b,int... a){
return 0;
}
这样第一个数据会给b,后面的数据会封装到数组当中
总结:如果一个方法有多个参数,并且包括可变参数,可变参数一定要放在最后
可变参数的使用
Arrays中的asList(T… a)方法,返回由指定数组支持的固定大小的列表。static < T> List< T>
返回的集合不可以做增删操作,可以做修改操作
public class FieldTest {
public static void main(String[] args) {
List<String> list = Arrays.asList("hello", "world", "java");
System.out.println(list);//[hello, world, java]
//list.add("javaee");//编译过但报异常UnsupportedOperationException
//把这个异常名字输入API文档,表示抛出以表示不支持请求的操作,所以不能add
//list.remove("world");编译过但报异常UnsupportedOperationException
list.set(1,"javaee");
System.out.println(list);//[hello, javaee, java]
//不能用add和remove但能使用set的原因:add和remove会修改集合的大小,而set不改变集合大小
}
}
List中的of(E… element)返回包含任意数量的不可变列表,List< E>
返回的集合不能做增删改操作
public class FieldTest {
public static void main(String[] args) {
List<String> list=List.of("hello","world","java","world");
System.out.println(list);//[hello, world, java,world],因为List可以有重复元素,所以world出现两次没有关系
//list.add("javaee");编译过但报异常UnsupportedOperationException,所以不支持这个操作
//list.remove("java");编译过但报异常UnsupportedOperationException,所以不支持这个操作
//list.set(1,"javaee");//编译过但报异常UnsupportedOperationException,所以不支持这个操作
//通过of得到的List集合,增删改都不可以
}
}
Set中的of(E… element)返回包含任意数量的不可变列表,Set< E>
返回的集合不能做增删操作,没有修改的操作(因为是Set,没有索引)
public class FieldTest {
public static void main(String[] args) {
Set<String> set=Set.of("hello","world","java");
System.out.println(set);//[world, java, hello]
Set<String> set1=Set.of("hello","world","java","world");
//System.out.println(set1);//编译过但报异常IllegalArgumentException,抛出表示一种方法已经通过了非法或不正确的参数。 因为Set集合不能有重复的元素
//set1.add("javaee");编译过但报异常UnsupportedOperationException,所以不支持这个操作
//set1.remove("world");编译过但报异常UnsupportedOperationException,所以不支持这个操作
}
}
这两个of都是接口中的静态方法,接口中也是可以有静态方法的,通过接口名.静态方法名进行调用