Java Array、List、Set互相转化

2022-06-24 20:10:55 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

  • Java ArrayListSet互相转化
    • ArrayListSet互转实例
      • 1 ArrayList互转
      • 2 ListSet互转
      • 3 ArraySet互转
    • ArraysasList 和 CollectiontoArray

Java Array、List、Set互相转化

1. Array、List、Set互转实例

1.1 Array、List互转
1.2 List、Set互转

因为ListSet都实现了Collection接口,且addAll(Collection<? extends E> c);方法,因此可以采用addAll()方法将ListSet互相转换;另外,ListSet也提供了Collection<? extends E> c作为参数的构造函数,因此通常采用构造函数的形式完成互相转化。

代码语言:javascript复制
//List转Set
Set<String> set = new HashSet<>(list);
System.out.println("set: "   set);
//Set转List
List<String> list_1 = new ArrayList<>(set);
System.out.println("list_1: "   list_1);

toArray()一样,被转换的List(Set)的修改不会对被转化后的SetList)造成影响。

1.3 Array、Set互转

1.1 1.2可完成Array和Set的互转

代码语言:javascript复制
//array转set
s = new String[]{
  
  "A", "B", "C", "D","E"};
set = new HashSet<>(Arrays.asList(s));
System.out.println("set: "   set);
//set转array
dest = set.toArray(new String[0]);
System.out.println("dest: "   Arrays.toString(dest));

2.Arrays.asList()Collection.toArray()

上述列出的互相转换离不开Arrays.asList()Collection.toArray()两个重要的方法;

This method acts as bridge between array-based and collection-based APIs, in combination with Collection.toArray. The returned list is serializable and implements RandomAccess.

虽然ListSet的具体实现类都对Collection.toArray()方法进行了不同程度的重写,但是大致都差不多。

这里选AbstractCollection.toArray()的实现:

代码语言:javascript复制
public <T> T[] toArray(T[] a) {
        // Estimate size of array; be prepared to see more or fewer elements
        int size = size();
        T[] r = a.length >= size ? a :
                  (T[])java.lang.reflect.Array
                  .newInstance(a.getClass().getComponentType(), size);//如果给定的参数T[] a的长度足够存放当前collection(list or set)的元素,则采用该参数来存放元素;否则则根据参数给定的类型反射生成一个数组;
  //因此这里的参数T[] a有俩作用;第一:可能用作存放元素;第二:为返回数组提供类型
        Iterator<E> it = iterator();
        for (int i = 0; i < r.length; i  ) {
            if (! it.hasNext()) { // fewer elements than expected 集合的size少于给定的参数数组的长度
                if (a == r) {
                    r[i] = null; // null-terminate 最后一个元素被设置为null,表明collection元素结束;
                } else if (a.length < i) {
                    return Arrays.copyOf(r, i);
                } else {
                    System.arraycopy(r, 0, a, 0, i);
                    if (a.length > i) {
                        a[i] = null;
                    }
                }
                return a;
            }
            r[i] = (T)it.next();
        }
        // more elements than expected
        return it.hasNext() ? finishToArray(r, it) : r;
    }

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151887.html原文链接:https://javaforall.cn

0 人点赞