Java List不同实现类的对比

List不同实现类的对比

文章目录

  • java.util.Collection用于存储一个一个数据的框架
  • 子接口:List存储有序的、可重复的数据(相当于动态数组)
    • ArrayList list的主要实现类(线程不安全、效率高) 底层使用Object[]的数组存储。添加数据、查找数据时,效率较高;插入数据、删除数据时,效率较低
    • Vector List的古老实现类 (线程安全、效率低) 底层使用Object[]数组存储
    • LinkedList 底层使用双向链表的方式进行存储。插入数据、删除数据时效率较高;添加数据、查找数据时,效率较低。

实现类之一ArrayList

  • ArrayList 是 List 接口的主要实现类

  • 本质上,ArrayList是对象引用的一个"变长"数组

  • Arrays.asList(...) 方法返回的 List 集合,既不是 ArrayList 实例,也不是 Vector 实例。 Arrays.asList(...) 返回值是一个固定长度的 List 集合

实现类之二 LinkedList

对于频繁的插入或删除元素的操作,建议使用LinkedList类,效率较高。这是由底层采用链表(双向链表)结构存储数据决定的。

特有方法:

  • void addFirst(Object obj)
  • void addLast(Object obj)
  • Object getFirst()
  • Object getLast()
  • Object removeFirst()
  • Object removeLast()

实现类之三 Vector

  • Vector 是一个古老的集合,JDK1.0就有了。大多数操作与ArrayList相同,区别之处在于Vector是线程安全的。
  • 在各种List中,最好把ArrayList作为默认选择。当插入、删除频繁时,使用LinkedList;Vector总是比ArrayList慢,所以尽量避免使用。
  • 特有方法:
    • void addElement(Object obj)
    • void insertElementAt(Object obj,int index)
    • void setElementAt(Object obj,int index)
    • void removeElement(Object obj)
    • void removeAllElements()

练习

键盘录入学生信息,保存到集合List中

  • 定义学生类。存在姓名、年龄的属性
  • 使用ArrayList集合,保存录入的多个学生对象
  • 循环录入方式
  • 录入结束后,用迭代器遍历
java 复制代码
//学生类
public class Student {
   private String name;
   private int age;

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

   }

   public String getName() {
       return name;
   }

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

   public int getAge() {
       return age;
   }

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

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

   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;
       Student student = (Student) o;
       return age == student.age && Objects.equals(name, student.name);
   }

   @Override
   public int hashCode() {
       return Objects.hash(name, age);
   }
}
java 复制代码
//Test类
import java.util.ArrayList;
import java.util.Scanner;

public class StudentTest {
   public static void main(String[] args) {
       Scanner input = new Scanner(System.in);
       ArrayList list = new ArrayList();
       System.out.println("请录入学生信息:");
       while(true){
           System.out.println("1,继续录入  0.结束录入");
           int selection = input.nextInt();
           if(selection == 0){
               break;
           }
           System.out.println("请输入学生的姓名:");
           String name = input.next();
           System.out.println("请输入学生的年龄");
           int age = input.nextInt();
           Student s = new Student(name,age);
           list.add(s);
       }
       //遍历集合中的学生信息
       System.out.println("遍历学生信息");
       for(Object s : list){
           System.out.println(s.toString());
       }
       input.close();
   }
}
相关推荐
华科云商xiao徐5 分钟前
Java HttpClient实现简单网络爬虫
java·爬虫
扎瓦18 分钟前
ThreadLocal 线程变量
java·后端
BillKu37 分钟前
Java后端检查空条件查询
java·开发语言
jackson凌42 分钟前
【Java学习笔记】String类(重点)
java·笔记·学习
刘白Live1 小时前
【Java】谈一谈浅克隆和深克隆
java
一线大码1 小时前
项目中怎么确定线程池的大小
java·后端
要加油哦~1 小时前
vue · 插槽 | $slots:访问所有命名插槽内容 | 插槽的使用:子组件和父组件如何书写?
java·前端·javascript
crud1 小时前
Spring Boot 3 整合 Swagger:打造现代化 API 文档系统(附完整代码 + 高级配置 + 最佳实践)
java·spring boot·swagger
天天摸鱼的java工程师1 小时前
从被测试小姐姐追着怼到运维小哥点赞:我在项目管理系统的 MySQL 优化实战
java·后端·mysql
周某某~1 小时前
四.抽象工厂模式
java·设计模式·抽象工厂模式