您的当前位置:首页正文

Array数组转List集合会有哪些坑?

2024-11-10 来源:个人技术集锦

1. 固定大小的列表

import java.util.Arrays;  
import java.util.List;  
  
public class FixedSizeListExample {  
    public static void main(String[] args) {  
        List<String> list = Arrays.asList("a", "b", "c");  
          
        // 尝试添加元素会抛出UnsupportedOperationException  
        try {  
            list.add("d");  
        } catch (UnsupportedOperationException e) {  
            e.printStackTrace();  
        }  
          
        // 尝试删除元素同样会抛出UnsupportedOperationException  
        try {  
            list.remove("b");  
        } catch (UnsupportedOperationException e) {  
            e.printStackTrace();  
        }  
    }  
}

2. 修改原始数组影响列表

import java.util.Arrays;  
import java.util.List;  
  
public class ModifyOriginalArrayExample {  
    public static void main(String[] args) {  
        String[] array = {"a", "b", "c"};  
        List<String> list = Arrays.asList(array);  
          
        // 修改数组元素  
        array[1] = "B";  
          
        // 列表中的元素也被修改了  
        System.out.println(list); // 输出 [a, B, c]  
    }  
}

3. 类型擦除问题

import java.util.Arrays;  
import java.util.List;  
  
public class TypeErasureExample {  
    public static void main(String[] args) {  
        // 泛型数组  
        Integer[] integerArray = {1, 2, 3};  
        // 转换为列表,由于类型擦除,实际类型是Object[]  
        List list = Arrays.asList(integerArray);  
  
        // 尝试获取第一个元素作为Integer类型,会失败,因为list的元素是Object类型  
        Integer firstElement = (Integer) list.get(0); // 需要强制类型转换  
        System.out.println(firstElement); // 输出 1  
  
        // 尝试添加元素时,由于list是Object[]的包装,添加的元素会被当作整个数组对象  
        list.add(4); // 这会抛出UnsupportedOperationException  
  
        // 更好的做法是使用泛型来确保类型安全  
        List<Integer> integerList = Arrays.asList(1, 2, 3);  
        // 这样可以直接获取Integer类型的元素,不需要强制类型转换  
        Integer firstIntegerElement = integerList.get(0);  
        System.out.println(firstIntegerElement); // 输出 1  
    }  
}

4. 空指针异常

import java.util.Arrays;  
import java.util.List;  
  
public class NullPointerExceptionExample {  
    public static void main(String[] args) {  
        String[] nullArray = null;  
          
        // 尝试将null数组转换为列表会抛出NullPointerException  
        try {  
            List<String> list = Arrays.asList(nullArray);  
        } catch (NullPointerException e) {  
            e.printStackTrace();  
        }  
    }  
}

5. 自动装箱/拆箱

import java.util.Arrays;  
import java.util.List;  
  
public class AutoBoxingExample {  
    public static void main(String[] args) {  
        int[] primitiveIntArray = {1, 2, 3};  
          
        // 自动装箱为Integer对象数组  
        List<Integer> list = Arrays.asList(primitiveIntArray);  
          
        // list的大小为1,因为整个int数组被当作一个元素  
        System.out.println(list.size()); // 输出 1  
          
        // 正确的转换方式  
        List<Integer> correctList = Arrays.stream(primitiveIntArray).boxed().collect(Collectors.toList());  
    }  
}

7. 不支持null元素

import java.util.Arrays;  
import java.util.HashSet;  
import java.util.List;  
import java.util.Set;  
  
public class NullElementExample {  
    public static void main(String[] args) {  
        List<String> listWithNulls = Arrays.asList("a", null, "c");  
          
        // 尝试将包含null的列表转换为HashSet会抛出NullPointerException  
        try {  
            Set<String> set = new HashSet<>(listWithNulls);  
        } catch (NullPointerException e) {  
            e.printStackTrace();  
        }  
          
        // 正确的做法是先过滤掉null元素  
        Set<String> safeSet = listWithNulls.stream()  
                                            .filter(s -> s != null)  
                                            .collect(Collectors.toSet());  
    }

为了避免这些问题,你应该根据具体需求选择合适的集合类型,并在转换之前对数组进行必要的检查和处理。同时,了解Java集合框架和类型系统的特性也是非常重要的。如果需要动态地添加或删除元素,或者需要处理基本数据类型数组,那么使用ArrayList或其他类型的集合可能是一个更好的选择。 

Top