可变参数

问题引入:
写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都是接口中的静态方法,接口中也是可以有静态方法的,通过接口名.静态方法名进行调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值