1、set转成list:(两种方法)
Set<String>set = new HashSet<String>();
set.add("c");
set.add("d");
set.add("a");
set.add("a");
//方法一:
List<String>list = new ArrayList<String>(set);
//方法二:
List<String>list2 = new ArrayList<String>();
list2.addAll(set);
2、list转成set:(两种方法)
List<String>list = new ArrayList<String>();
list.add("c");
list.add("d");
list.add("a");
list.add("a");
//方法一:
Set<String>set = new HashSet<String>(list);
//方法二:
Set<String>set2 = new HashSet<String>();
set2.addAll(list);
注:list转成set后:
- 可能会丢失数据(因为set不允许重复);
- 原先在list中的数据顺序就没了。
3、List转为Array:
String[] arr = {"a","b","c"};
String[] objects = (String[])list.toArray();//有问题
String[] strings = list.toArray(new String[list.size()]);//正确方式
通过list.toArray();的方式返回的是Object[] 类型,即便强转,会出现异常java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
因此采取下面这种方式:
// 使用泛型,无需显式类型转换
list.toArray(new String[list.size()]);
4、Array转为List:
List list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
List list1 = Arrays.asList(arr);//这种方式转为list的话,只能遍历,不能添加或删除元素
list1.add("hh");//当添加新的元素,报异常java.lang.UnsupportedOperationException
//可以采用该方式
ArrayList list3 = new ArrayList<>(Arrays.asList(arr));
通过Arrays.asList(arr);是个坑,得到的list长度是不可变的,当添加新的元素会出现异常java.lang.UnsupportedOperationException
为什么呢? 看 asList()方法,
public static List asList(T... a) {
return new ArrayList<>(a);
}
返回的是ArrayLst对象,它是Arrays类自己定义的一个静态内部类,这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。
private static class ArrayList extends AbstractList
implements RandomAccess, java.io.Serializable
所以,如果你只需要遍历,则可以使用Arrays.asList()方法;否则,可使用以下两种方式
//方式1
ArrayList<String> list2 = new ArrayList<>(arr.length);
Collections.addAll(list2,arr);
//方式2
ArrayList<String> list3 = new ArrayList<>(Arrays.asList(arr));