Java常用数据结构与集合

news2024/11/27 17:52:23

数据结构

数组:

  • 内存地址连续
  • 检索效率高(可以通过下标访问成员)
  • 增删操作效率低(保证数据越界的问题,需动态扩容)
  • 长度固定,扩容的需要新的数组复制或者Arrays类的copyOf方法

链表

  • 内存地址不连续
  • 查询快删除慢,因为需要移动指针
  • 又分双向链表和单向链表,单向链表有下一个元素的指针,双向有指向上一个,下一个两个指针

双向链表的结构

    static final class Node {
       // 前一个节点
        volatile Node prev;
        // 后一个节点
        volatile Node next;
		// 链表节点存储的具体数据
        volatile Thread thread;
    }

队列

  • 尾插头删
  • 管状结构,先进先出

  • 尾插尾删
  • 杯状结构,先进后出

集合框架

HashMap

  • 底层是数组+链表的结构,hash值相同的会形成链表,jdk1.8之后当相同hash值超过8个之后会变为红黑树
  • 并不是线程安全的,如果想要一个安全的collections.synchronizedMap返回一个线程安全的。或者使用concurrentHashMap
  • 允许一个key为null,多个value为null

HashTable

  • 是一个古老的Map实现类,它不允许使用null作为键和值。Hashtable的性能略低于HashMap,多线程安全。

LinkedHashMap

  • 底层是数组+链表+双向链表,根据添加顺序排序;线程不安全。
  • 数组和链表的作用和HashMap的作用一样,双向链表是来记录键值对的插入顺序或访问顺序

TreeMap

  • 底层是红黑树,默认是根据键值字典排序就是无序,也可以自己排序。compareable接口或者Comparator
  • 线程安全。

ConcurrentHashMap

  • ConcurrentHashMap底层采用分段的数组+链表实现,线程安全。通过分段锁的方式保证线程安全,默认性能提高16倍。超过75%时扩容,仅扩容当前分段数组
  • 1.7的实现是使用Segment数组,每个Segment就是一个分段锁,对应了一个HashEntry数组。每个HashEntry对应着一个node数组。get()时需要计算两次Hash,第一次拿到Segment,第二次拿到对应的hashEntry。1.8后只需要一次了。1.8之后去掉了Sement分段锁,直接以HashEntry为锁,这样减少了锁的粒度,也减少了冲突的概率。除了去掉Segment外,把node数组更换为红黑树,空间复杂度也从O(n)变为O(logn)
     

HashSet

  • 不重复且无序,允许有一个null
  • 因为源自hashmap所以hash冲突时解决方法一样

LinkedHashSet

  • 不重复且有序
  • 添加的双向链表定义了迭代顺序,即按照将元素插入到集合中的顺序(插入顺序)进行迭代

TreeSet

  • 底层是红黑树,默认是根据键值字典排序就是无序,也可以自己排序。compareable接口或者Comparator
  • 查询和删除都很快
  • 线程不安全

ArrayList

  • 存取有序、可重复
  • 添加第一个元素时,底层会创建一个新的长度为10的数组。扩容1.5倍
  • 大量数据的查询、 少量数据的增删

LinkedList

  • 双链表 、查询慢、增删快
  • 线程不安全


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【LAMMPS学习】八、基础知识(2.6)Lammps中的Walls墙

8. 基础知识 此部分描述了如何使用 LAMMPS 为用户和开发人员执行各种任务。术语表页面还列出了 MD 术语,以及相应 LAMMPS 手册页的链接。 LAMMPS 源代码分发的 examples 目录中包含的示例输入脚本以及示例脚本页面上突出显示的示例输入脚本还展示了如何设置和运行各…

【opencv】示例-neural_network.cpp 使用机器学习模块创建并训练一个简单的多层感知机(神经网络)模型...

#include <opencv2/ml/ml.hpp> // 引入OpenCV的机器学习模块using namespace std; // 使用标准命名空间 using namespace cv; // 使用OpenCV命名空间 using namespace cv::ml; // 使用OpenCV机器学习命名空间int main() {//创建随机训练数据Mat_<float> data(100, …

密码学 | 椭圆曲线 ECC 密码学入门(二)

目录 4 椭圆曲线&#xff1a;更好的陷门函数 5 奇异的对称性 6 让我们变得奇特 ⚠️ 原文地址&#xff1a;A (Relatively Easy To Understand) Primer on Elliptic Curve Cryptography ⚠️ 写在前面&#xff1a;本文属搬运博客&#xff0c;自己留着学习。如果你和我一样…

TDengine taosAdapter启用HTTPS

HTTPS &#xff08;Hypertext Transfer Protocol Secure &#xff09;&#xff0c;是以安全为目标的 HTTP 通道&#xff0c;在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性 。HTTPS 在HTTP 的基础下加入SSL&#xff0c;HTTPS 的安全基础是 SSL&#xff0c;因此加…

LinkedList部分底层源码分析

JDK版本为1.8.0_271&#xff0c;以插入和删除元素为例&#xff0c;LinkedList部分源码如下&#xff1a; //属性&#xff0c;底层结构为双向链表 transient Node<E> first; //记录第一个结点的位置 transient Node<E> last; //记录最后一个结点的尾元素 transient …

Testng测试框架(2)-测试用例@Test

测试方法用 Test 进行注释&#xff0c;将类或方法标记为测试的一部分。 Test() public void aFastTest() {System.out.println("Fast test"); }import org.testng.annotations.Test;public class TestExample {Test(description "测试用例1")public void…

日期时间总结 java

日期时间 1 Date基础2 SimpleDateFormat3 currentTimeMillis4 Calendar5 时间转化5.1 date 时间戳5.2 date String5.3 cal date 6 其他7 练习题题1 1 Date基础 .getYear() .getMonth() 1 .getDate() 几号 .toLocaleString() 转换为本地时区 getTime()&#xff1a;返回自1970年…

git am XXX.patch 文件内容解析

git am XXX.patch 文件内容解析 打补丁的两种方式&#xff1a; 1.patch XXX.patch 2.git am XXX.patch 例如&#xff1a; diff --git a/drivers/crypto/se/ce.c b/drivers/crypto/se/ce.c index e6f68286d4ce6..de1bcb46fbe6b 100644 --- a/drivers/crypto/se/ce.cb/drive…

本地部署开源免费文件传输工具LocalSend并实现公网快速传送文件

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-X4xB3gSR3z2VUfmN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

IDEA 设置类注释模板作者、日期、描述等信息(推荐标准!)

idea注释模版配置 idea作为越来越多程序员使用的开发工具&#xff0c;平时的代码注释也非常的关键&#xff0c;类上注释和方法上注释每次换电脑或者新同事入职都要统一修改&#xff0c;找了网上好多教程都写的乱七八糟的啥都有&#xff0c;为方便统一就自己写一个操作方法&…

【word2pdf】Springboot word转pdf(自学使用)

文章目录 概要整体介绍具体实现官网pom文件增加依赖 遇到的问题本地运行OK&#xff0c;发布到Linux报错还是本地OK&#xff0c;但是Linux能运行的&#xff0c;但是中文乱码 小结 概要 Springboot word 转 pdf 整体介绍 搜了一下&#xff0c;发现了能实现功能的方法有四种 U…

ppt技巧:如何将Word文档大纲中导入到幻灯片中?

在PowerPoint中&#xff0c;将Word文档的大纲导入到新的幻灯片是一种非常实用的技巧。以下是详细的步骤&#xff1a; 首先&#xff0c;需要打开PowerPoint软件并打开原始的幻灯片文件。 在PowerPoint的顶部【开始】菜单栏中&#xff0c;找到并点击“新建幻灯片”按钮&#xff0…

《黑马点评》Redis高并发项目实战笔记(上)P1~P43

P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp&#xff0c;然后右键hmdp下的表&#xff0c;选择运行SQL文件&#xff0c;然后指定运行文件hmdp.sql即可&#xff08;建议MySQL的版本在5.7及以上&#xff09;&#xff1a; 下面这…

本科大学生计算机毕业设计案例:遗失物品信息管理系统

设计需求&#xff1a; 客户需求&#xff1a; 项目所用技术&#xff1a; 后端&#xff1a;springBoot,mybatisPlus,springSecurity,Swagger2 前端&#xff1a;vue-element-admin,elementUi 数据库&#xff1a;mysql&#xff0c;redis 数据库表设计&#xff1a; 关键代码展示&a…

使用geneHapR进行基因单倍型分析(以vcf文件为例)

前记 在群体基因组学研究中&#xff0c;我们常常需要知道一些位点的变异情况&#xff0c;以便于根据对应的表型信息估算这些位点的效应&#xff0c;同时了解这些位点在不同亚群之间的变化情况。这个时候我们就需要进行单倍型分析(Haplotype Analysis)&#xff0c;单倍型分析是研…

第07-1章 计算机网络相关概念

7.1 本章目标 了解网络协议的概念了解网络体系结构熟悉ISO/OSI参考模型以及每一层的功能掌握TCP/IP模型各层的主要协议及其功能熟练掌握IP地址、子网规划等相关内容 7.2 网络协议的概念 7.2.1 概念介绍 &#xff08;1&#xff09;网络协议&#xff1a;计算机网络和分布系统中…

AndroidAutomotive模块介绍(三)CarService服务

前言 上一篇文档总结 Android Automotive 框架的 APP 和 API 部分内容&#xff0c;本篇文档将会继续根据 Android Automotive 框架结构&#xff0c;总结 Framework 层 CarService 服务的内容。 本文档对 Android Automotive Framework 层服务将会按照如下顺序展开描述&#x…

4. Django 探究FBV视图

4. 探究FBV视图 视图(Views)是Django的MTV架构模式的V部分, 主要负责处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示. 也可以理解为视图是MVC架构里面的C部分(控制器), 主要处理功能和业务上的逻辑. 我们习惯使用视图函数处理HTTP请求, 即在视图里定义def…

一、flask入门和视图

run启动参数 模板渲染 后端给前端页面传参 前端页面设置css from flask import Flask, render_template,jsonify# 创建flask对象 app Flask(__name__)# 视图函数 路由route app.route("/") def hello_world():# 响应&#xff0c;返回给前端的数据return "h…

将数学表达式对分子分母先因式分解再约分化简simplify()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将数学表达式 对分子分母 先因式分解 再约分化简 simplify() [太阳]选择题 请问以下输出结果正确的是&#xff1a; from sympy import simplify from sympy.abc import x, y A (x**2 2*x 1)…