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();
   }
}
相关推荐
comedate7 小时前
Windows / Linux GPU 虚拟内存布局差异与 CUDA 越界访问行为
linux·windows·mmu·cuda 越界访问
葡萄成熟时 !8 小时前
JAVA 常用API学习笔记
java·笔记·学习
Rain的Java大神之路9 小时前
介绍一下分布式事务
java·分布式·后端·spring·spring cloud·架构·springcloud
吴声子夜歌9 小时前
Java面试题——基础(一)
java·开发语言
南城以南溫暖如初14710 小时前
外卖CPS实战指南:从技术选型到运营落地全流程解析
java·spring boot·mysql·架构·vue
IT技术分享社区10 小时前
Windows桌面时钟推荐:始终置顶、无级缩放、支持全屏游戏显示时间
windows·微软技术·电脑技巧·桌面美化·电脑干货
傻啦嘿哟10 小时前
英雄联盟皮肤爬虫:爬取全皮肤价格与特效,做比价工具
java·c++·爬虫
码匠许师傅11 小时前
【C++ 面试真题】24. 聊聊 C++ 的时间日期处理
java·c++·面试
mqiqe12 小时前
AgentScope Java 2.0 Agent 状态存储(AgentStateStore)深度解析:构建可恢复、可扩展的智能体运行时
java·运维·网络
zhifou12345612 小时前
java 17升级安装
java·开发语言