Java 集合框架(List篇)

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 当我们需要保存一组数据时,集合框架就是非常常用的工具之一。Java语言提供了许多不同类型的集合框架。其中最常用的是List集合框架。List接口是Java集合框架中最基本的一种形式,它允许存储重复元素,并可以按照索引访问集合中的元素。List集合的实现类有和Vector等。是基于动态数组实现的List集合。动态数组指的是在数组声明时无需给出数组大小,在运行时动态扩展。ArrayList支持常见的集合操作,如。

1、List集合

当我们需要保存一组数据时,集合框架就是非常常用的工具之一。Java语言提供了许多不同类型的集合框架。其中最常用的是List集合框架。

List接口是Java集合框架中最基本的一种形式,它允许存储重复元素,并可以按照索引访问集合中的元素。List集合的实现类有ArrayList、LinkedListVector等。

ArrayList是基于动态数组实现的List集合。动态数组指的是在数组声明时无需给出数组大小,在运行时动态扩展。ArrayList支持常见的集合操作,如添加、获取、删除、清空和遍历等操作。由于ArrayList是基于动态数组实现的,所以随机访问元素的速度很快,但是插入和删除元素会导致数据移动,因此效率相对较低。

LinkedList是基于双向链表实现的List集合,它也支持常见的集合操作。由于LinkedList是基于链表实现的,所以插入和删除元素的效率很快,但是随机访问元素的效率相对较低。

Vector也是基于动态数组实现的List集合,但是它是线程安全的。Vector支持与ArrayList相同的操作,但是由于是线程安全的,所以在并发环境下效率相对较低。

总的来说,List集合框架是一个非常常用且重要的部分。选择不同的实现类可以根据需求来平衡不同的集合操作的效率。

在这里插入图片描述

1、list的特点

list集合有两个特点:
|特点| 描述|代码|
|--|--|--|
| 有序| List集合数据存进去的顺序和取出来的顺序一致 |在这里插入图片描述
|
|不唯一|List集合数据允许添加重复数据|在这里插入图片描述
|

2、遍历方式

1、foreach

在这里插入图片描述

2、迭代器(Iterator )

在这里插入图片描述

3、for循环

根据下标获取
在这里插入图片描述

3、删除

删除有三种方式:

  1. 正向删除
  2. 逆向删除
  3. 迭代器删除

其实前两种方式都是差不多的,List集合删除推荐使用迭代器

1、正向删除

在这里插入图片描述

2、逆向删除

在这里插入图片描述

3、迭代器删除

在这里插入图片描述

先移动下标,在删除元素。

4.增长因子论证

概念:初始化大小10、负载因子1.5、向下取整
公式:容器大小*1.5倍
例如:10*1.5=15、15*1.5=22、22*1.5=33 ...

在这里插入图片描述

List集合优化目的在于利用合理的存储空间存下所有元素数据,不多不少,不造成空间浪费。

如果定义成一定的数,只要在这个数内都会是你定义的这个数,超过了才会增加。
在这里插入图片描述
在这里插入图片描述

5、ArrayList的数据结构

1、堆栈

堆栈的特点:先进后出

public class Demo {
   
   
    public static void main(String[] args) {
   
   
        LinkedList ll = new LinkedList();
        ll.add("lisi");
        ll.add("zs");
        ll.add("ww");
        DuiZhan duizhan= new DuiZhan(ll);
        System.out.println(duizhan.pop());
        System.out.println(duizhan.pop());
        System.out.println(duizhan.pop());
    }
}
class DuiZhan{
   
   
    LinkedList ll = null;
    public DuiZhan(LinkedList ll){
   
   
        this.ll = ll;
    }

    public void add(String a){
   
   
        ll.add(a);
    }

    public String pop(){
   
   
        return (String) ll.removeLast();
    }
}

2、队列

队列的特点:先进先出

public class Demo {
   
   
    public static void main(String[] args) {
   
   
        LinkedList ll = new LinkedList();
        ll.add("lisi");
        ll.add("zs");
        ll.add("ww");
        Duilie duilie = new Duilie(ll);
        System.out.println(duilie.pop());
        System.out.println(duilie.pop());
        System.out.println(duilie.pop());
    }
}
class Duilie{
   
   
    LinkedList ll = null;
    public Duilie(LinkedList ll){
   
   
        this.ll = ll;
    }

    public void add(String a){
   
   
        ll.add(a);
    }

    public String pop(){
   
   
        return (String) ll.remove();
    }
}

3、集合框架ArrayList中的重复元素去重及其底层原理(去重)

public class Demo5 {
   
   
        public static void main2(String[] args) {
   
   
        List list = new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println("目前集合容器中的元素:" + list);
        if (!list.contains("b")) {
   
   
            list.add("b");
        }
        System.out.println("目前集合容器中的元素:" + list);
    }

    public static void main(String[] args) {
   
   
        List list = new ArrayList();
        list.add(new Student("zs", 16));
        list.add(new Student("ls", 17));
        list.add(new Student("ww", 18));
        System.out.println("目前集合容器中的元素:" + list);
        if (!list.contains(new Student("ls", 17))) {
   
   
            list.add(new Student("ls", 17));
        }
        System.out.println("目前集合容器中的元素:" + list);
        if (list.contains(new Student("ls", 17))) {
   
   
            list.remove(new Student("ls", 17));
        }
        System.out.println("目前集合容器中的元素:" + list);
    }
}

class Student {
   
   
    private String name;
    private int age;

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

    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 int hashCode() {
   
   
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
   
   
        System.out.println("调用了equals方法。。。");
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (age != other.age)
            return false;
        if (name == null) {
   
   
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }

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

ArrayList中可能有重复元素,用Stream API去重底层实现是将ArrayList转化为HashSet集合,重复元素会被自动去除。ArrayList底层是数组结构,在扩容时会创建新数组,重复元素虽然存在但无法被访问。

很简单的理解就是重写equals()方法

2、迭代器原理

在这里插入图片描述

3、泛型

JDK1.5以上才有。
1)以类型为参数的类叫做泛型
2)泛型的默认类型为Object
3)作用:提高程序的健壮性、简化代码

4、装拆箱

1、装箱

int a=10;
Integer b=new Integer(a);

装箱:值类型到引用类型

2、拆箱

Integer c=new Integer(10);
int d=c.intValue();

拆箱:引用类型到值类型

5、ArrayList、LinkedList和Vector的区别

1、ArrayList和LinkedList的区别

  • 相同点

1、LinkedeList和ArrayList都实现了List接口。

2、ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。

  • 不同点

1、ArrayList底层实现是数组,而LinkedList是双向链表。

2、ArrayList查询快(下标)、增删改慢、LinkedList是查询慢,但是在插入删除时效率比较高。

2、ArrayList和Vector的区别

  • 相同点

1、ArrayList和Vector都是用数组实现的

2、默认初始化大小都是10

  • 不同点

1、Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

2、两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)

希望对你们有用!!!

相关文章
|
27天前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
27天前
|
消息中间件 Java Kafka
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
|
1月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
135 3
|
10天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
32 5
|
23天前
|
存储 缓存 安全
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
34 4
|
1月前
|
人工智能 前端开发 Java
基于开源框架Spring AI Alibaba快速构建Java应用
本文旨在帮助开发者快速掌握并应用 Spring AI Alibaba,提升基于 Java 的大模型应用开发效率和安全性。
基于开源框架Spring AI Alibaba快速构建Java应用
|
1月前
|
消息中间件 Java 数据库连接
Java 反射最全详解 ,框架设计必掌握!
本文详细解析Java反射机制,包括反射的概念、用途、实现原理及应用场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
Java 反射最全详解 ,框架设计必掌握!
|
1月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
43 2
|
1月前
|
前端开发 Java 数据库连接
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
60 1
|
1月前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
31 2