Java 集合框架(List篇)

本文涉及的产品
可观测可视化 Grafana 版,10个用户账号 1个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
简介: 当我们需要保存一组数据时,集合框架就是非常常用的工具之一。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();
    }
}
AI 代码解读

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();
    }
}
AI 代码解读

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 + "]";
    }
}
AI 代码解读

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);
AI 代码解读

装箱:值类型到引用类型

2、拆箱

Integer c=new Integer(10);
int d=c.intValue();
AI 代码解读

拆箱:引用类型到值类型

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倍)

希望对你们有用!!!

目录
打赏
0
1
1
0
11
分享
相关文章
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
在Java中实现分布式事务的常用框架和方法
总之,选择合适的分布式事务框架和方法需要综合考虑业务需求、性能、复杂度等因素。不同的框架和方法都有其特点和适用场景,需要根据具体情况进行评估和选择。同时,随着技术的不断发展,分布式事务的解决方案也在不断更新和完善,以更好地满足业务的需求。你还可以进一步深入研究和了解这些框架和方法,以便在实际应用中更好地实现分布式事务管理。
Java 集合框架中的老炮与新秀:HashTable 和 HashMap 谁更胜一筹?
嗨,大家好,我是技术伙伴小米。今天通过讲故事的方式,详细介绍 Java 中 HashMap 和 HashTable 的区别。从版本、线程安全、null 值支持、性能及迭代器行为等方面对比,帮助你轻松应对面试中的经典问题。HashMap 更高效灵活,适合单线程或需手动处理线程安全的场景;HashTable 较古老,线程安全但性能不佳。现代项目推荐使用 ConcurrentHashMap。关注我的公众号“软件求生”,获取更多技术干货!
53 3
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
269 3
|
8天前
|
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
33 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
Java中的Fork/Join框架详解
Fork/Join框架是Java并行计算的强大工具,尤其适用于需要将任务分解为子任务的场景。通过正确使用Fork/Join框架,可以显著提升应用程序的性能和响应速度。在实际应用中,应结合具体需求选择合适的任务拆分策略,以最大化并行计算的效率。
53 23
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
60 5
Java 集合框架优化:从基础到高级应用
《Java集合框架优化:从基础到高级应用》深入解析Java集合框架的核心原理与优化技巧,涵盖列表、集合、映射等常用数据结构,结合实际案例,指导开发者高效使用和优化Java集合。
73 4
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
138 2
你不可不知道的JAVA EE 框架有哪些?
本文介绍了框架的基本概念及其在编程领域的应用,强调了软件框架作为通用、可复用的软件环境的重要性。文章分析了早期Java EE开发中使用JSP+Servlet技术的弊端,包括可维护性差和代码重用性低等问题,并阐述了使用框架的优势,如提高开发效率、增强代码规范性和可维护性及提升软件性能。最后,文中详细描述了几种主流的Java EE框架,包括Spring、Spring MVC、MyBatis、Hibernate和Struts 2,这些框架通过提供强大的功能和支持,显著提升了Java EE应用的开发效率和稳定性。
243 1

云原生

+关注