List接口知识点整理

文章目录

ArrayList

List接口

Vector

LinkedList

ArrayList

概述

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现
List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector类,除了此类是不同步的。)
数据结构: 数据的存储方式
和集合相关的数据结构: 数组 栈 队列 链表 哈希表 二叉树
主要是观察集合的add方法

特点:
  1. 底层数据结构是数组。
  2. 增删效率低,改查效率高。
  3. 能够存储null值。
  4. 线程不安全,效率高可以通过Collection.Collections.synchronizedList();变安全。
  5. 有索引,能够方便检索。
  6. 元素可重复,我们可以通过选择排序去重复(添加一组不重复的元素)。
  7. 不可以排序,但是可以通过Collections.sort();方法排序
Collection.Collections.synchronizedList()方法的使用
List list = Collections.synchronizedList(new ArrayList<>());
list.add(1);
list.add(2);
list.add(3);
synchronized (list){
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
        Object next =  iterator.next();
        System.out.println(next);
    }
}

为什么只锁遍历的代码?经过看源码发现add方法已经锁过了,无需再锁。

Java中Collections.sort()的使用!

在日常开发中,很多时候都需要对一些数据进行排序的操作。然而那些数据一般都是放在一个集合中如:Map ,Set ,List 等集合中。他们都提共了一个排序方法 sort(),要对数据排序直接使用这个方法就行,但是要保证集合中的对象是 可比较的。

怎么让一个对象是 可比较的,那就需要该对象实现 Comparable 接口啦。然后重写里面的。

public class Student implements Comparable<Student>{
    private int age;
    private String name;

    public Student(int age, String name) {
        this.age = age;
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Student{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }

    @Override
    public int compareTo(Student o) {
        //降序
        //return o.age - this.age;
        //升序
        return this.age - o.age;
    }


    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student(1,"25"));
        list.add(new Student(3,"21"));
        list.add(new Student(2,"18"));
        list.add(new Student(4,"32"));
        list.add(new Student(5,"36"));
        list.add(new Student(6,"16"));
        System.out.println("排序前:");
        for (Student student : list) {
            System.out.println(student.toString());
        }
        Collections.sort(list);
        System.out.println("默认排序后:");
        for (Student student : list) {
            System.out.println(student.toString());
        }


    }
    }

这里说一下重写的 public int compareTo(Student o){} 这个方法,它返回三种 int 类型的值: 负整数正整数

返回值含义
负整数当前对象的值 < 比较对象的值 , 位置排在前
当前对象的值 = 比较对象的值 , 位置不变
正整数当前对象的值 > 比较对象的值 , 位置排在后

这个时候需求又来了,默认是用 age 排序,但是有的时候需要用 id 来排序怎么办? 这个时候比较器 :Comparator 就排上用场了。

Comparator 的使用有两种方式:

Collections.sort(list,Comparator<T>);
list.sort(Comparator<T>);

其实主要是看 Comparator 接口的实现,重写里面的 compare 方法。代码如下:

Collections.sort(list, new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
            return o1.getId-o2.getId;
    }
});

compare(Student o1, Student o2) 方法的返回值跟 Comparable<> 接口中的 compareTo(Student o) 方法 返回值意思相同。另一种写法如下:

//自定义排序2

list.sort(new Comparator<Student>() {
    @Override
    public int compare(Student o1, Student o2) {
        return o1.getId() - o2.getId();
    }
});
去重复
  1. 创建一个新集合
List list = new ArrayList();
list.add(2);
list.add(1);
List list2 = new ArrayList();
list2.add(1);
for (Object o : list) { //遍历旧集合,看新集合中是否包含旧集合的内容
    if (!list2.contains(o)){
        list2.add(o);
    }
}
for (Object o : list2) {
    System.out.println(o);//遍历新集合
}
  1. 选择排序思想去重复

Vector

类似于ArrayList,底层数据结构是数组,插入和移除性能较差,线程安全,效率低。

特点:
  1. 底层数据结构是数组
  2. 有索引,能够方便检索
  3. 增加和删除的效率低,查询和修改的效率高
  4. 线程安全,效率低
  5. 能够存储 null 值
  6. 元素可重复【我们自己可以通过选择排序思想去除重复元素】
  7. 不可以排序,但是可以通过 Collections.sort();方法排序
Vector类特有功能

1.public void addElement(E obj) 添加元素 obj 到集合中
2.public E elementAt(int index) 获取指定索引 index 的元素
3.public Enumeration elements() 使用 Enumeration 迭代器遍历集合中的元素

ArrayList和Vector的区别?
  1. Vector的方法都是同步的,线程安全的,但是线程的同步必然会影响到性能,所以ArrayList效率比Vector高
  2. 当两者中的元素超过他们的初始大小时,Vector会以2倍扩容,但是ArrayList以1.5倍扩容,这样ArrayList有利于节约内存空间。

LinkedList

特点:
  1. 底层数据结构是链表。

  2. 链表的特点是有序,查找跟修改的效率低,增加跟删除效率高。

  3. 可以存储null值。

  4. 线程不安全。

  5. 允许重复。

  6. 不可排序

特有方法:
  • void addFirst(E e)
  • void addLast(E e)
  • E getFirst()
  • E getLast()
  • E removeFirst()
  • E removeLast()
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java是一种广泛使用的面向对象编程语言,具有强大的跨平台能力、安全性、可移植性和高度的抽象性。对于Java程序设计的知识点整理,我会提供一个简要概述和关键部分的介绍,但请注意,由于字数限制,这里无法提供完整的2000字详细内容。以下是Java程序设计中的一些核心知识点: 1. **Java概述**: - Java的历史和发展 - Java的特性和优势(如平台无关性、垃圾回收机制) - Java的核心API和类库 2. **Java语法基础**: - 数据类型和变量 - 运算符和表达式 - 控制结构(if-else、switch、循环等) - 数组和集合框架 3. **面向对象编程**: - 抽象类与接口的区别 4. **构造函数和析构器**: - 构造函数的作用和生命周期 - 初始化块和析构器的使用 5. **异常处理**: - 异常的概念和分类 - try-catch-finally语句结构 - 自定义异常和抛出异常 6. **输入输出流**: - 字符流(`System.out.println()`) - 文件I/O操作 - 输入/输出流的缓冲区和关闭资源 7. **类加载器和包**: - 类加载过程 - 包的作用和命名规则 8. **多线程**: - Thread类和Runnable接口 - 互斥量、信号量和条件变量 - 线程池和并发工具类 9. **集合框架**: - 核心类(List, Set, Map) - 集合接口(Iterable, Iterator) - 泛型和集合容器的使用 10. **IO流与网络编程**: - Socket编程 - ServerSocket和ClientSocket - 套接字工厂和NIO(非阻塞I/O) 11. **并发编程工具**: - CompletableFuture - ExecutorService和ThreadFactory - Future和Callable 12. **JVM和内存管理**: - 堆和栈的区别 - Garbage Collection(垃圾回收)机制 13. **数据库访问**: - JDBC连接数据库 - ORM框架(Hibernate, MyBatis) 14. **Spring框架**: - IoC和AOP概念 - Bean容器和配置文件 15. **测试驱动开发(TDD)**: - JUnit单元测试 - Mockito模拟对象 16. **Spring Boot**: - 简化Java应用的初始配置 - RESTful API的创建 相关问题: 1. Java的三大特性是什么? 2. 你能解释一下Java中的封装吗? 3. JUnit在单元测试中的作用是什么? 4. Spring框架如何简化开发流程? 如果想深入了解每个知识点,你可以查阅相关的教程书籍、在线文档或视频课程进行学习。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值