本文共 5361 字,大约阅读时间需要 17 分钟。
本文主要对于Java中List的一些常用方法,以及开发过程中的一些小技巧的整理记录。
扩展Collection接口的接口,是一个有序的集合。
package demo;import java.util.*;import java.util.function.Consumer;/** * @program: * @description: List 常用方法 * * Iterable * Collection * list * CopyOnWriteArrayList * LinkedList * AbstractList * Vector * Stack * ArrayList * * @author: dingwen * @create: 2021/2/3 15:22 **/public class ListDemo { public static void main(String[] args) { /* * 允许添加重复元素 * 元素允许为null * 列表索引从0开始 * 支持泛型 * */ String str = "t a l k i s c h e a p s h o w m e t h e c o d e"; // String -> Array -> List Listlist1 = Arrays.asList(str.split(" ")); System.out.println(list1); //集合中元素数量 System.out.println(list1.size()); //是=是否为空 System.out.println(list1.isEmpty()); //是否包含某一元素 System.out.println(list1.contains("a")); //以适当的顺序返回包含此列表中所有元素的数组 // list1.toArray(); //一下操作必须是实现类 list1 = new ArrayList<>(list1); list1.add("**"); list1.add(6,"dingwen"); //java.lang.UnsupportedOperationException //从此列表中删除指定元素的第一个匹配项 System.out.println(list1.remove("t")); //求两个集合的交集 List list2 = new ArrayList<>(); list2.add("dingwen"); list2.add("t"); list1.retainAll(list2); //删除所有的元素 //list2.clear(); // 以适当的顺序返回此列表中元素的迭代器 Consumer stringConsumer = System.out::print; //返回列表中元素的列表迭代器 迭代元素 list2.listIterator(2).forEachRemaining(stringConsumer); System.out.println(); list2.iterator().forEachRemaining(stringConsumer); //get set list2.set(1,"000"); System.out.println(list2.get(1)); // list1.iterator().forEachRemaining(stringConsumer); //返回指定fromIndex(包含)和toIndex(不包括)之间的此列表部分的视图 list1.subList(1,1).iterator().forEachRemaining(stringConsumer); //两个List合并 可选择从何处开始合并 list1.addAll(2,list2); List list3= new ArrayList<>(); list3.add(1); list3.add(2); list3.add(3); list3.replaceAll(num -> num * 100); //此处演示迭代器使用 Iterator iterator = list3.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } //sort List list5 = new ArrayList<>(); Random random = new Random(); for (int i = 0; i < 10; i++) { list5.add(random.nextInt(1000)); } Consumer integerConsumer = System.out::print; list5.iterator().forEachRemaining(integerConsumer); //升序 list5.sort((a,b) -> a-b); //降序 //list5.sort((a,b) -> b-a); list5.iterator().forEachRemaining(integerConsumer); System.out.println(); list5.forEach(num -> System.out.print(" "+ num)); }}
List 本质是数组,以地址的形式进行存储。浅拷贝是改变地址的引用,这样就导致了改变内容时会相互受到影响。
public static void main(String[] args) { Listlist1 = new ArrayList (); list1.add(1); list1.add(2); list1.add(3); //浅拷贝方式1 List list2 = new ArrayList<>(); list1.set(1,100); Consumer consumer = list2::add; list1.forEach(consumer); Consumer print = System.out::print; list2.forEach(print); //浅拷贝方式2 List list3 = new ArrayList (list1); //浅拷贝方式3 List list4 = new ArrayList<>(); list4.addAll(list1); //浅拷贝方式4 System.arraycopy(list1,0,list2,0,list1.size()); }
在赋值内容的时候同时创建新的地址指向当前的内容,操作之后互不影响,占用独立的内存空间。
public staticList deepCopy(List src) throws IOException, ClassNotFoundException { ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteOut); out.writeObject(src); ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray()); ObjectInputStream in = new ObjectInputStream(byteIn); @SuppressWarnings("unchecked") List dest = (List ) in.readObject(); return dest; }
public class Test implements Cloneable { public String name[]; public Test(){ name=new String[2]; } public Object clone() { Test o = null; try { o = (Test) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return o; } } for(int i=0;i
转载地址:http://exka.baihongyu.com/