List集合浅谈

集合的概念

集合,或者叫容器,是一个包含多个元素的对象;集合可以对数据进行存储,检索,操作;集合类存放于java.util包中。而我们使用的一些集合都是实现的java.util.Collection 这个集合接口。 集合类型主要有3种:set(集)、list(列表)和map(映射),

List集合

Java 集合框架中最常使用的几种 List 实现类是 ArrayList,LinkedList 和 Vector。在各种 List 中,最好的做法是以 ArrayList 作为默认选择。 当插入、删除频繁时,使用 LinkedList,Vector 总是比 ArrayList 慢,所以要尽量避免使用它。List 是一个元素有序的、可以重复、可以为 null 的集合。

List实例化
 List list = new ArrayList(); 
List存储
//存储基本类型的值
List list = new ArrayList();
list.add("1");   => "1"
list.add(1);     => 1
list.add(1.12);  => 1.12
list.add(false); => false

//存储集合
List list1 = new ArrayList();
list1.addAll(list);

List像这样直接实例化使用所存储的类型是Object的,而为了可重用性、类型安全和效率一般都会使用泛型

List泛型使用
List<String> list = new ArrayList<String>();
list.add("123");

注意:这里声明的是一个String类型的List,就只能存储String类型的数据。

List替换
List list = new ArrayList();
list.add("1"); 
list.set(0, "2");  => "2" 

注意:第一个参数是替换的位置,第二个参数是替换的内容,注意:必须是已存在的数据才能替换,位置下标从0开始。

List插入
List<String> list = new ArrayList<String>();
list.add("1"); 
list.add(0, "2"); 
=> "2","1"

注意:第一个参数是插入的位置,第二个参数是插入的内容,注意:数据插入中间不能出现空白(不能越过不存在的数据)。

List倒序
List list = new ArrayList();
list.add(1);
list.add(2);
list => 1  2
Collections.reverse(list);
list => 2  1

注意:Collections.reverse(list);并不是一个新的集合,而是将原本的集合中的存储按照原本的顺序颠倒排序。

List排序
List list = new ArrayList();
list.add(2);
list.add(1);
list.add(3);
list => 2 1 3

Collections.sort(list);
list => 1 2 3

注意:Collections.sort(list);是按自然顺序排序,即升序排序,但是存储的所有数据类型要一直才能使用

List转换数组
List list1 = new ArrayList();
list1.add("1");
String[] arr = (String[])list1.toArray(new String[list1.size()]);

注意:数组的类型要和集合存储的类型一致

###List集合复制

 @Test
    public void listSet() {
        List<testBean> data = new ArrayList<>();
        data.add(new testBean("1"));
        data.add(new testBean("2"));

        testBean testBean = data.get(0);
        testBean.setName("2222222222");
        System.out.print(data.get(0).getName()+"========"+testBean.getName());
        List<testBean> data1 = data;
        data1.get(0).setName("1111111111");
        System.out.print(data.get(0).getName()+"========"+data1.get(0).getName());
    }

    public class testBean implements Serializable {
        private String name;

        public testBean(String name) {
            this.name = name;
        }

        public String getName() {
            return name == null ? "" : name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

打印结果如下:

2222222222========2222222222
1111111111========1111111111

可以看出我们取出一个泛型对象集合其中一个对象,当这个对象的属性发生改变时,集合中该对象也会发生改变,哪怕将该集合再创建一个新的对象出来也是同样的,因为这一个对象所存的物理地址是同一个,这时我们就需要复制集合或者对象了。

####实体复制 实体实现Cloneable接口,重写clone方法

public class TestBean implements Cloneable {

    public Object clone() throws CloneNotSupportedException {
        Object o = null;
        o = super.clone();
        return o;
    }

####集合复制

 public static <T> List<T> deepCopy(List<T> src) {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectInputStream in = null;
        @SuppressWarnings("unchecked")
        List<T> dest = null;
        try {
            ObjectOutputStream out = new ObjectOutputStream(byteOut);
            out.writeObject(src);

            ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
            in = new ObjectInputStream(byteIn);
            dest = (List<T>) in.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                byteOut.close();
                if (in != null)
                    in.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        return dest;
    }

###去重 java8提供了去重的方式,但是Android需要兼容大部分设备因此还得使用通用的方法

 public class testBean implements Serializable {
        private String name;

        public testBean(String name) {
            this.name = name;
        }

        public String getName() {
            return name == null ? "" : name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }

 List<testBean> testBeanArrayList = new ArrayList<>(set);
 Set<testBean> set = new TreeSet<>((o1, o2) -> o1.getName().compareTo(o2.getName()));
 set.addAll(testBeanArrayList);
 List<testBean> driverCarBeanArrayList = new ArrayList<>(set);