Java List 常用整理

本文详细介绍了Java中List接口的基本特性和常用方法,包括添加、删除、修改元素,以及遍历和排序等操作。同时,深入探讨了浅拷贝和深拷贝的概念,并提供了示例代码进行演示,帮助开发者更好地理解和运用List在实际开发中的技巧。
摘要由CSDN通过智能技术生成


前言

本文主要对于Java中List的一些常用方法,以及开发过程中的一些小技巧的整理记录。

一、List

扩展Collection接口的接口,是一个有序的集合。

二、基本特性

  • 允许添加重复的元素
  • 可以添加null元素
  • 索引下标从0开始
  • 支持泛型

三、常用方法

  • int size():获取列表中元素的数量
  • boolean isEmpty():检查列表是否为空
  • boolean contains(Object o):如果此列表包含指定的元素,则返回true
  • Iterator iterator():以适当的顺序返回此列表中元素的迭代器
  • Object [] toArray():以适当的顺序返回包含此列表中所有元素的数组
  • boolean add(E e):将指定的元素追加到此列表的末尾 java.lang.UnsupportedOperationException(具体实现类操作e:ArrayList)
  • boolean retainAll(Collection <?> c): 两个集合的交集
  • void clear():从列表中删除所有元素
  • E get(int index):返回列表中指定位置的元素
  • E set(int index,E element)**:用指定的元素替换列表中指定位置的元素
  • ListIterator listIterator():返回列表中元素的列表迭代器
  • List subList(int fromIndex,int toIndex):返回指定fromIndex(包含)和toIndex(不包括)之间的此列表部分数据
  • addAll([index],Collection<? extends E> c) : 两个List合并
  • replaceAll(UnaryOperator operator) :对List的中每一个元素进行操作 一元运算
  • list5.sort((a,b) -> a-b); //升序 || b-a降序

四、案例代码

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
       List<String> list1 = 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<String> list2 = new ArrayList<>();
        list2.add("dingwen");
        list2.add("t");
        list1.retainAll(list2);

        //删除所有的元素
		//list2.clear();

        // 以适当的顺序返回此列表中元素的迭代器
        Consumer<String> 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<Integer> list3= new ArrayList<>();
        list3.add(1);
        list3.add(2);
        list3.add(3);

        list3.replaceAll(num -> num * 100);

        //此处演示迭代器使用
        Iterator<Integer> iterator = list3.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }


        //sort

        List<Integer> list5 = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 10; i++) {
            list5.add(random.nextInt(1000));
        }
        Consumer<Integer> 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));
    }

}

五、浅拷贝 & 深拷贝

1.浅拷贝

List 本质是数组,以地址的形式进行存储。浅拷贝是改变地址的引用,这样就导致了改变内容时会相互受到影响。

public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<Integer>();
        list1.add(1);
        list1.add(2);
        list1.add(3);

        //浅拷贝方式1
        List<Integer> list2 = new ArrayList<>();
        list1.set(1,100);

        Consumer<Integer> consumer = list2::add;
        list1.forEach(consumer);

        Consumer<Integer> print = System.out::print;

        list2.forEach(print);

        //浅拷贝方式2
        List<Integer> list3 = new ArrayList<Integer>(list1);

        //浅拷贝方式3
        List<Integer> list4 = new ArrayList<>();
        list4.addAll(list1);

        //浅拷贝方式4
        System.arraycopy(list1,0,list2,0,list1.size());
    }

2.深拷贝

在赋值内容的时候同时创建新的地址指向当前的内容,操作之后互不影响,占用独立的内存空间。

  • 使用序列化方法
public static <T> List<T> deepCopy(List<T> 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<T> dest = (List<T>) in.readObject();  
   return dest;  
}  
  • clone方法
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<n;i+=){
   copy.add((Test)src.get(i).clone());
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dingwen_blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值