黑马程序员技术交流社区

标题: 教你如何一句代码将数组转为可变长度的集合 [打印本页]

作者: as604049322    时间: 2015-5-21 16:43
标题: 教你如何一句代码将数组转为可变长度的集合
creatArrayList2方法,只用了一行代码。。
如果你反射牛逼,可以参考creatArrayList方法


  1. package test;

  2. import java.lang.reflect.Field;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.LinkedList;
  6. import java.util.List;

  7. import org.junit.runners.model.InitializationError;


  8. public class ArrayToListFactory {
  9.         public static String className;
  10.         public static Class clazz;
  11.         static{
  12.                 try {
  13.                         className="java.util.ArrayList";
  14.                         clazz=Class.forName(className);
  15.                 } catch (ClassNotFoundException e) {
  16.                         throw new RuntimeException(e);
  17.                 }
  18.         }
  19.         public static void main(String[] args) {
  20.                 Integer[] arr=new Integer[]{1,2,3};
  21.                 List<Integer> list=creatArrayList(arr);
  22.                 for(int i=5;i<50;i++)
  23.                         list.add(i);
  24.                 System.out.println(list);
  25.         }

  26.         public static <T> List<T> creatArrayList(T[] arr) {
  27.                 final Object[] EMPTY_ELEMENTDATA = {};
  28.                 List<T> list=null;
  29.                         try {
  30.                                 list=(List<T>) clazz.newInstance();
  31.                                 Field sizeField= clazz.getDeclaredField("size");
  32.                                 Field elementDataField= clazz.getDeclaredField("elementData");
  33.                                 sizeField.setAccessible(true);
  34.                                 elementDataField.setAccessible(true);
  35.                                
  36.                                 Object[] arr2=null;
  37.                                 int len=0;
  38.                                 if ((len = arr.length) != 0) {
  39.                             if (arr.getClass() != Object[].class)
  40.                                     arr2 = Arrays.copyOf(arr, len, Object[].class);
  41.                         } else {
  42.                             arr2 = EMPTY_ELEMENTDATA;
  43.                         }
  44.                                 elementDataField.set(list, arr2);
  45.                                 sizeField.set(list, len);
  46.                         } catch (Exception e) {
  47.                                 throw new RuntimeException(e);
  48.                         }
  49.                 return list;
  50.         }
  51.         public static <T> List<T> creatArrayList2(T[] arr) {
  52.                 return new ArrayList<T>(Arrays.asList(arr));
  53.         }
  54. }


复制代码


作者: 董小姐    时间: 2015-5-21 19:53
赞一个     
作者: lanbo    时间: 2015-5-21 20:39
厉害,赞一个
作者: 守株人    时间: 2015-5-21 20:46
赞一个,学习了
作者: 星辉祝愿    时间: 2015-5-21 23:41
赞一个,学习了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2