java 可变参数,集合与数组的互转,静态导入

可变参数

可变参数是如果类型确定,参数个数不确定,需要用可变参数来定义,参数的具体个数在方法调用时才能确定java把可变参数当做数组处理

可变参数的定义是jdk1.5加入的,比如main方法 public static void main(String [] args)

特点:

  • 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
  • ...(三个点)位于变量类型和变量名之间,前后有无空格都可以;
  • 调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数

可变参数一般用一个数组来包裹要传递的实参,首先,为方法定义一个数组型的参数;然后在调用时,生成一个包含了所有要传递的实参的数组;最后,把这个数组作为一个实参传递过去。

定义方式为

修饰符 返回值类型 方法名(数据类型…  变量名){}

示例:

public class VariableTest {
	public static void main(String[] args) {
		addTest(1, 2, 3, 4, 5);
		addTest("The vars's sum is : ", 1, 2, 3, 4);
	}

	public static void addTest(int... args) {
		// 可变参数 参数类型 ... 多个参数,实际是一个数组
		int sum = 0;
		for (int i = 0; i < args.length; i++) {
			sum += args[i];
		}
		System.out.println(sum);
	}

	public static void addTest(String str, int... args) {
		// 方法有多个参数,有可变参数,可变参数要放在最后
		int sum = 0;
		for (int i = 0; i < args.length; i++) {
			sum += args[i];
		}
		System.out.println(str + sum);
	}
}
out:
15
The vars's sum is : 10

集合与数组的互转

集合转数组

使用集合的toArray方法,toArray()是集合的一个重载的方法,当然也可以遍历每个集合的元素,添加到数组中

如果定义的数组的长度大于集合的size,那么最后的数组的长度就是指定的大小,多出来的位置填充null

如果定义的数组的长度小于等于集合的size,转换后的数组长度等于集合的size

import java.util.ArrayList;
import java.util.List;

public class TransformTste01 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
        //定义的数组的长度比集合size小,转换后的数组长度和集合的size一样
		String[] strs = list.toArray(new String[3]);
      //定义的数组的长度比集合的size大,最后数组多出来的部分补null
		String[] strs1 = list.toArray(new String[6]);
		for (String s : strs) {
			System.out.print(s + "  ");
		}
		System.out.println();
		for (String s : strs1) {
			System.out.print(s + "  ");
		}
	}
}
out:
a  b  c  d  
a  b  c  d  null  null  

数组转集合

调用数组工具类Arrays类的Arrays.asList((T… a)静态方法,asList(T...a)的源码如下:

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
//Arrays类中的内部类
 private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
      //有参构造方法
        ArrayList(E[] array) {
            a = Objects.requireNonNull(array);
        }
//省略其他方法的源码
}

可以看到,返回的ArrayList不是java.util.ArrayList这个类,而是Arrays中自定义的内部类,所以转换出来的集合的操作方式和之前和集合类有所不同,

通过Arrays.asList转换出来的ArrayList不是集合框架中的ArrayList,不支持add()remove()等操作,但可以通过集合框架的ArrayList的有参构造方法,将其转换为集合框架中的ArrayList

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class TransformTest02 {
	public static void main(String[] args) {
		String[] strs = { "a", "b", "c", "d" };
		// asList(T ... a)将数组转换为集合对象
		List<String> list = Arrays.asList(strs);
		System.out.println(list);
		// list.add("d");
		//list.remove(2);// 不能使用add(),remove()等方法,报错UnsupportedOperationException,
		// 因为这时的List是Arrays类中自定义的类ArrayList
		
		// 通过以下方式,将内部类的ArrayList转换为集合框架中的ArrayList
		List<String> list1 = new ArrayList<>(list);
		list1.add("e");
		System.out.println(list1);

	}
}

out:
[a, b, c, d]
[a, b, c, d, e]

注意:将数组转化为集合,数组中的元素必须为引用数据类型,如果数组是基本数据类型,转换时会将整个数组当成一个元素

import java.util.Arrays;
import java.util.List;

public class TransformTest03 {
	public static void main(String[] args) {
		Integer[] inis = { 1, 2, 3, 4, 5 };
		List<Integer> list1 = Arrays.asList(inis);
		System.out.println(list1);//[1, 2, 3, 4, 5]

		int[] ins = { 1, 2, 3, 4, 5, 6 };
		List<int[]> listArr = Arrays.asList(ins);
		System.out.println(listArr);//[[I@512ddf17]
	}

}
out:
[1, 2, 3, 4, 5]
[[I@512ddf17]

静态导入:

导包时,如果想导入一个 (在类中是static修饰的)  方法,可以用直接导入的方式将这个方法导入进来,了解即可

import static java.util.Arrays.asList;//静态导入
import static java.util.Arrays.sort; //静态导入

import java.util.List;

public class StaticImportTest01 {
	public static void main(String[] args) {
		String[] strs = { "a", "b", "c", "d" };
		List<String> list = asList(strs);
		System.out.println(list);//[a, b, c, d]
		int[] arr = { 1, 2, 5, 4 };
		sort(arr);
		
		for (int i : arr) {
			System.out.print(i + " ");
		} 
		//1 2 4 5 
	}

}
out:
[a, b, c, d]
1 2 4 5 

 参考 :http://www.monkey1024.com/javase/565

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84197624
今日推荐