首页 > 编程语言 >Java三大集合类 - List

Java三大集合类 - List

时间:2023-03-13 20:33:06浏览次数:39  
标签:aaa List ArrayList list add new Java 三大

List Set Map

一、List

几个小问题: 1、接口可以被继承吗?(可以) 2、接口可以被多个类实现吗?(可以) 3、以下两种写法有什么区别?
//List list1=new List();是错误的因为List()是一个接口,是抽象的不能被实例化
//ArrayList()在源码中是一个类(class),可以new对象
//只能用List接口里的方法,不能使用ArrayList中的方法
List list1=new ArrayList();


//可以使用ArrayList里的所有方法,因为ArrayList实现1ist接口,所以可以调用的方法比第一种要多,还可以使用List接口里面没有的方法
ArrayList list2=new ArrayList();
  • 第一种写法是List接口new的对象,只能用接口中的方法;
  • 第二种是new一个类对象,就像Student stuent=new Student()这样,所以可以使用ArrayList中的方法,又因为ArrayList实现了List接口,所以也能用List中的方法
4、通常List添加元素:
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
  当所添加元素确定时,可以这样写:
List<String> list1 = Arrays.asList("aaa","bbb");
当List内元素确定时,这样写性能较高,没有扩容操作 但是如果想再向list1中添加元素时会报错,原因是上述写法执行时JVM会自动申请两块(只有两块)连续的内存空间,再add会报错。  

List中的api

1、添加元素 add()

List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");

System.out.println(list); //[aaa,bbb,ccc,ddd]

2、获取指定下标元素 get(int index)

String str = list.get(3);
System.out.println(str);//ccc

3、设置指定元素更改为新值 set(int index,E e)

String old = list.set(0, "1");
System.out.println(list);//[1,bbb,ccc,ddd]
System.out.println(old);//aaa

4、指定位置添加新元素 add(int index,E e)

在第index个位置添加新的值e,原来这个位置及其后面的元素都向后移一位。
//list集合为:[aaa,bbb,ccc,ddd]
list.add(1,"2");
System.out.println(list);
//[aaa,2,bbb,ccc,ddd]

5、删除指定位置元素 remove(int index)

删除第index数,返回的是被删除的那个数;每次只能删除一个数
String str = list.remove(1);
System.out.println(list);//[aaa,bbb,ccc,ddd]
System.out.println(str);//2

6、删除全部元素

错误示例:遍历删除
List<String> list = new ArrayList<>();
//这里插入4个aaa
list.add("aaa");
list.add("aaa");
list.add("aaa");
list.add("aaa");

//遍历删除
for(int i=0;i<list.size();i++){
    if("aaa".equals(list.get(i))){
        list.remove(i);
    }
}

System.out.println(list); //[aaa,aaa]
0 发现这样的遍历删除并不能删除干净。  
为什么遍历list删不干净
原因:每当删除一个元素,下一个元素就会向前顶一个位置,会使原本index为1的元素变为为0,且 i 在执行后会自增,导致一半元素无法删除。  
删除的三种方法
  • 倒序删除
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");

        //倒序遍历删除
        for(int i=list.size()-1;i>=0;i--){
            if("aaa".equals(list.get(i))){
                list.remove(i);
            }
        }
        System.out.println(list);
    }
  • 迭代器删除
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");

        // 使用迭代器删除
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()) {
            String s = iterator.next();
            if ("aaa".equals(s)) {
                iterator.remove();
            }
        }
        System.out.println(list);
    }
  • lambada删除
public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");
        list.add("aaa");

        // 使用 jdk8 新方法
        list.removeIf(item -> "aaa".equals(item));
        System.out.println(list);
    }
 

list判空?

List<String> list=new ArrayList<>();
system.out.print(list==null); //false
list数组是new出来的,判断一定为false  

使用 hutool 工具类判空

依赖
<!--hutool工具类-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.11</version>
</dependency>
工具类判空
List<String> list = new ArrayList<>();

//写法错误,当list定义为List<String> list=null;会出现空指针
list.get(1).equals(list.get(2));

//正确写法
boolean equals=StrUtils.equals(list.get(1),list.get(2));
 

list不是线程安全的

  • 创建线程的四种方式
    1)继承Thread类创建线程     2)实现Runnable接口创建线程     3)使用Callable和Future创建线程     4)使用线程池例如用Executor框架
  • 多线程操作List实例
public class ListDemo {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        MyThread m1=new MyThread(list);
        MyThread m2=new MyThread(list);
        new Thread(m1).start();
        new Thread(m2).start();


        System.out.println(list);
    }
}
public class MyThread implements Runnable{
    ArrayList<String> arr;

    public MyThread(ArrayList<String> arr) {
        this.arr = arr;
    }

    @Override
    public void run() {
        for(int i=0;i<100;i++){
            arr.add("arr"+i);
            System.out.println(Thread.currentThread().getName()+"在第"+i+arr.get(i));
        }
    }
}
0两个线程操作同一个List导致线程不安全。  

标签:aaa,List,ArrayList,list,add,new,Java,三大
From: https://www.cnblogs.com/nliu/p/17212777.html

相关文章

  • Java(单元测试,反射)
    单元测试、反射一、单元测试1.1单元测试快速入门所谓单元测试,就是针对最小的功能单元,编写测试代码对其进行正确性测试。我们想想,咱们之前是怎么进行测试的呢?比如说我......
  • java基础-总结案例
    利用java基础,实现如图所示的功能案例涉及要点:#程序基本概念变量数据类型#流程控制顺序选择循环......
  • 使用Java实现BMI指数测试
    前言:使用Java实现BMI指数测试,根据用户提供的身高和体重,调用Scanner方法类,通过类名.的方式进行对象调用,抓取用户数据,再新建一个double函数用来接收用户的数据,使用print函数......
  • el-radio 绑定键值对 keyvalue list
    data(){return{options:{'key1':'value1','key2':'value2','key3':'value3'},selected:'key1'}}<el-radio-group......
  • java基础-一维数组
    1、什么是数组:数组是一个变量,存储是相同数据类型的一组数据,声明数组,就是在内存中划分一串连续的空间注意:数组一经定义,大小就确定了,不可以在此基础上再增加......
  • java基础-排序算法&&二维数组
    1、冒泡排序--升序原理:每次比较相邻两数小的交换到前面每轮结束后最大的数交换到最后口诀:冒泡排序速记口诀(升序)n个数字来排队......
  • JavaScript作用域闭包(你不知道的JavaScript)
    JavaScript闭包,是JS开发工程师必须深入了解的知识。3月份自己曾撰写博客《​​JavaScript闭包​​》,博客中只是简单阐述了闭包的工作过程和列举了几个示例,并没有去刨根问底,......
  • JavaScript词法作用域(你不知道的JavaScript)
    JavaScript并不是传统的块级作用域,而是函数作用域!一、作用域1.JavaScript引擎在代码执行前会对其进行编译,在这个过程中,像vara=2这样的声明会被分解成两个独立的步骤:......
  • JAVA重试机制多种方式深入浅出
    重试机制在分布式系统中,或者调用外部接口中,都是十分重要的。重试机制可以保护系统减少因网络波动、依赖服务短暂性不可用带来的影响,让系统能更稳定的运行的一种保护机制。......
  • 【建造者设计模式详解】Java/JS/Go/Python/TS不同语言实现
    简介建造者模式(BuilderPattern),也叫生成器模式,属于创建型模式。它使用多个简单的对象一步一步构建成一个复杂的对象。它允许你使用相同的创建代码生成不同类型和形式的对......