Java数据结构--List、Set和Map

一、概述

 数组

        数组存储区间是连续的,占用内存严重,故空间复杂的很大。但数组的二分查找时间复杂度小,为O(1);数组的特点是:寻址容易,插入和删除困难;

链表

        链表存储区间离散,占用内存比较宽松,故空间复杂度很小,但时间复杂度很大,为O(N);链表的特点是:寻址困难,插入和删除容易。

哈希表

        既满足了数据的查找方便,也不占用太多的内容空间,使用十分方便

Android中常用的数据结构包括List、Set和Map这三大类的集合;

其中List和Set属于Collection,List可以存放重复的数据,Set不可以,Map是key-value键值对。

集合的关系类图:

二、List

特点:

        元素有序,且可重复

扩容

  • 初始容量10,负载因子0.5,扩容增量0.5倍
  • 新容量 = 原容量 + 原容量 * 0.5。如 ArrayList的容量为10,一次扩容后是容量为15

实现:

ArrayList

特点:

  • ​​​​​内部基于数组实现
  • 支持动态扩容,超出容量自动扩容
  • 根据索引随机访问快,随机插入和删除慢
  • 线程不安全

 初始化和赋值:

//方式一:ArrayList<String> list = new ArrayList<String>();String str1 = String("test1");String str2 = String("test2");list.add(str1);list.add(str2);//方式二:ArrayList<String> list = new ArrayList<String>() {{add("test1");add("test2");}};

3.遍历:

        //for循环方式for (String str : list) {}//迭代器方式Iterator<String> iter = list.iterator();while (iter.hasNext()) {String next = iter.next();}

4.常见问题:在遍历的过程中删除Item元素

       如果采用for循环的方式去删除元素,会出现删除的元素并没有完全被删除,或者出现ConcurrentModificationException异常

        解决方案:使用遍历器iterator进行遍历删除

Linked List

特点:

  • 以双向链表实现,链表无容量限制,一个元素中保存了上一个元素和下一个元素的的索引
  • 允许元素为null
  • 线程不安全
  • 元素随机的增删快,只需要调整节点指向即可;随机查找可能会慢,从链头开始寻找,找下一个的引用

使用场景:

        可用作堆栈(stack)、队列(queue)或双向队列(deque)

Vector

特点:

  • 底层由数组实现,主要实现和ArrayList差不多
  • 内部使用了synchronized关键字,实现了线程安全访问但性能有些降低,
  • 线程安全,性能低

CopyOnWriteArrayList

特点:

  • 写时复制
  • 线程安全
  • 适合于读多,写少的场景
  • 写时复制出一个新的数组,完成插入、修改或者移除操作后将新数组赋值给array
  • 比Vector性能高
  • 实现了List接口,使用方式与ArrayList类似

三、Set

特点:

    元素无序,且不可重复

扩容:

    初始容量16,负载因子0.75,扩容增量1倍

实现:

HashSet

特点:

  • 不保持插入顺序
  • 没有重复对象
  • 通过Map实现的,只用到了键,没有用到值。因为Map是通过键值对的形式存在的 ,键不能重复而值可以重复
  • 按照哈希算法来存取集合中的对象
  • 非线程安全

使用场景:

        用HashSet对List中相同的元素进行去重

    private static <T> List<T> removeSame(List<T> list) {Set<T> set = new HashSet<>();set.addAll(list);List<T> listSingle = new ArrayList<>();for (T s : set) {listSingle.add(s);}return listSingle;}

TreeSet

特点:

  • 是一个包含有序的且没有重复元素的集合
  • 作用是提供有序的Set集合,自然排序或者根据提供的Comparator进行排序
  • TreeSet是基于TreeMap实现的

四、Map

特点:

  • 无序,键值对,键不能重复,值可以重复
  • 键重复则覆盖,没有继承Collection接口

扩容:

        初始容量16,负载因子0.75,扩容增量1倍

遍历:

  • 先获取所有键的Set集合,再遍历(通过键获取值)
  • 取出保存所有Entry的Set,再遍历此Set即可

实现:

HashMap

  • 线程不安全,最常用,速度快
  • 内部采用数组来存放数据
  • 可以接受为null的键值(key)和值(value)

 HashTable

  • 线程安全,使用synchronized来保证线程安全,性能差
  • 不可以接受为null的键值(key)和值(value)

ConcurrentHashMap

  • 线程安全,比HashTable性能高、扩展性好,Java 5出来的,用来替代HashTable的
  • 内部采用数组+链表+红黑树实现

TreeMap

  • 内部采用红黑树实现,用于保证key值的顺序,添加或获取元素时性能较HashMap慢
  • key值按一定的顺序排序

LinkedHashMap

  • 继承HashMap
  • LinkedHashMap是有序的,且默认为插入顺序

五、总结

List:有序、可重复。

Set:无序、不可重复的集合。重复元素会覆盖掉。

Map:存储的是键值对,键不能重复,值可以重复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285927.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

install cuda cudnn tersorRT

1, dark view 2,470-server cant install 11.4 3,cuda.run and tensorRT.dpkg cant # 安装 $ ubuntu-drivers devices$ sudo apt-get install nvidia-driver-470-server # 推荐是server&#xff0c;都可以。#delelt sudo apt --purge remove nvidia-* CUDA Toolkit Archiv…

测试工具Jmeter:设置中文界面

首先我们打开Jmeter所在的文件&#xff0c;进入bin目录&#xff0c;打开Jmeter.properties&#xff1a; 打开后找到languageen&#xff1a; 改为zh_CN: 保存关闭&#xff0c;然后再打开Jmeter&#xff1a; 英文并不会显得高级&#xff0c;能做到高效的性能测试才是高级的。

ClickHouse Kafka 引擎教程

如果您刚开始并且第一次设置 Kafka 和 ClickHouse 需要帮助怎么办&#xff1f;这篇文章也许会提供下帮助。 我们将通过一个端到端示例&#xff0c;使用 Kafka 引擎将数据从 Kafka 主题加载到 ClickHouse 表中。我们还将展示如何重置偏移量和重新加载数据&#xff0c;以及如何更…

python调用staf自动化框架的方法

1、配置环境 支持python2和python3 On Linux, Solaris, or FreeBSD, add the /usr/local/staf/lib directory to your PYTHONPATH, assuming you installed STAF to directory /usr/local/staf. For example: export PYTHONPATH/usr/local/staf/lib:$PYTHONPATH On Mac OS …

姿态识别、目标检测和跟踪的综合应用

引言&#xff1a; 近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;姿态识别、目标检测和跟踪成为了计算机视觉领域的热门研究方向。这三个技术的综合应用为各个行业带来了巨大的变革和机遇。本文将分别介绍姿态识别、目标检测和跟踪的基本概念和算法&#xff0c;并探…

阿里云k8s安装

文章目录 一、安装前准备1.环境2.k8s集群规划 二、k8s 安装1. centos基础设置2. docker 安装3. k8s安装3.1 添加阿里云 yum 源3.2 安装 kubeadm、kubelet、kubectl3.3 部署 Kubernetes Master3.4 加入 Kubernetes Node3.5 部署 CNI 网络插件3.6 测试 kubernetes 集群 一、安装前…

基于ssm高校宿舍管理系统的设计与开发论文

摘 要 本文是对高校宿舍管理系统的概括总结&#xff0c;主要从开题背景&#xff0c;课题意义&#xff0c;研究内容&#xff0c;开发环境与技术&#xff0c;系统分析&#xff0c;系统设计&#xff0c;系统实现这几个角度来进行本高校宿舍管理系统的阐述。 高校宿舍管理系统运用…

SQL Server 查询处理过程

查询处理--由 SQL Server 中的关系引擎执行&#xff0c;它获取编写的 T-SQL 语句并将其转换为可以向存储引擎发出请求并检索所需结果的过程。 SQL Server 需要四个步骤来处理查询&#xff1a;分析、代化、优化和执行。 前三个步骤都由关系引擎执行&#xff1b;第三步输出的是…

如何安装运行Wagtail并结合cpolar内网穿透实现公网访问网站界面

文章目录 前言1. 安装并运行Wagtail1.1 创建并激活虚拟环境 2. 安装cpolar内网穿透工具3. 实现Wagtail公网访问4. 固定的Wagtail公网地址 前言 Wagtail是一个用Python编写的开源CMS&#xff0c;建立在Django Web框架上。Wagtail 是一个基于 Django 的开源内容管理系统&#xf…

如何开发一个免费的App

开发一个免费App意味着能够在项目启动初期&#xff0c;以更低成本的方式进行业务的迭代和市场化验证。 互联网发展到2023年&#xff0c;尤其在生成式AI及大模型技术“跃进式”增长的背景下&#xff0c;一个创新式商业模式的起步变得异常艰难。但如果用好工具&#xff0c;那么不…

1688图片搜索商品API接口爆品搜索接口API拍立淘接口

一、引言 随着互联网的快速发展&#xff0c;搜索引擎已经成为我们获取信息的主要途径之一。在电商领域&#xff0c;1688作为中国最大的B2B电商平台&#xff0c;其图片搜索功能为商家和消费者提供了便捷的商品查找方式。本文将深入解析1688图片搜索商品API的技术原理&#xff0…

[自动化运维工具]ansible简单介绍和常用模块

ansible 源操作主机功能 自动化运维&#xff08;playbook剧本yaml&#xff09; 是基于python开发的一个配置管理和应用部署工具&#xff0c;在自动化运维中&#xff0c;现在还是异军突起 ansible能批量配置&#xff0c;部署&#xff0c;管理上千台主机&#xff0c;类似于xshell…