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);