Java数据结构及原理实现

article/2025/9/19 9:23:19

程序设计主要是数据结构+算法,而数据结构在面向对象思维里是“容器”的意思,数据结构主要负责数据的添加,删除,修改,查找及对数据的其他操作。编程里面对着不同问题场景,选择哪种数据结构进行操作就非常重要。试想:如果谷歌是以数组来存储数据的话,还会有那么快的搜索速度?所以下面就简单介绍java数据结构的体系和部分原理实现

总体思路:

  1. java集合体系结构图
  2. 集合父接口Collection,Map和集合工具类Collections
  3. List(列表)
  4. Set(规则集)
  5. Queue(队列
  6. Map(映射类)

java集合体系结构图

java集合体系结构图


集合父接口Collection,Map和集合工具类Collections

Collection是java集合框架体系的总接口,其他集合框架都是实现Collection,封装了集合框架的公共操作:add(E),addAll(),remove(E),removeAll(),其方法摘要如下:
Collection API

说到集合框架必须提到Collection的工具类Collections,它封装了所有集合的关于算法操作的具体实现静态方法:二分查找,找出集合最大值,集合最小值,打乱集合,以及生成不可修改集合,同步集合(多线程环境下使用),其主要方法API如下:
Collections  API

Collections的synchronizedCollection()主要是在原来的方法外添加一个信号量来进行同步操作,其源码实现如下:

static class SynchronizedCollection<E> implements Collection<E>, Serializable {private static final long serialVersionUID = 3053995032091335093L;final Collection<E> c;  // Backing Collectionfinal Object mutex;     // Object on which to synchronizepublic boolean add(E e) {//锁定信号量才可以对集合进行操作,在多线程环境下来进行同步,调用的还是原来的方法synchronized (mutex) {return c.add(e);}}public boolean remove(Object o) {//锁定信号量才可以对集合进行操作,在多线程环境下来进行同步,调用的还是原来的方法synchronized (mutex) {return c.remove(o);}}}

集合框架Collection的三种主要实现如下:List(列表),Set(散列集,有一个key-value的Map进行维护,其中key值保证Set集合里元素的唯一性),Queue(队列,先进先出,底层实现可以用List列表或者LinkedList链表)

集合框架的另外一种数据类型的总接口是Map,基于Key-Value进行存储数据的,其中Key键值是不可重复的,主要是通过类的hashCode()和equal()进行保证的


List(列表)

List列表允许存储相同元素,插入元素和按照下标获取元素方便,具体实现有ArrayList,LinkedList和Vector,

  1. ArrayList底层基于数组实现的,按顺序存储元素以及快速按照元素下标进行获取元素,不可同步的;

  2. 而Vector底层也是数组,可进行同步操作,在多线程环境下可以使用;

  3. LinkedList链表的具体机制如下图:可以在具体下标位置删除和添加元素,在许多需要根据具体下标添加和删除元素的应用场景下比ArrayList有更好的性能。

LinkedList

ArrayList和Vector的部分源码分析:

//ArrayList的add()方法public boolean add(E e) {ensureCapacityInternal(size + 1);  // Increments modCount!!//在数组结尾下标添加元素elementData[size++] = e;return true;}//ArrayList的remove()方法public E remove(int index) {rangeCheck(index);modCount++;E oldValue = elementData(index);//获取移动的元素的个数int numMoved = size - index - 1;if (numMoved > 0)//将移除元素的下标位置后的数组元素都往前移一位来填补空位,调用System.arraycopy方法调用虚拟机自带的方法进行操作效率更高System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its workreturn oldValue;}//Vector添加了synchronized 进行同步public synchronized void addElement(E obj) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = obj;}

综上:Array List在不需要同步操作及不需要频繁删除任意下标的元素时推荐使用,Vector是在同步场景下使用,LinkedList是在需要频繁删除和添加任意下标的元素时使用

Set(规则集)

散列集,不能保证存储元素的顺序,保证存储元素的不可重复性。具体实现由HashSet,LinkedHashSet,TreeSet,

  1. HashSet是哈希散列集,底层由HashMap支持的,主要使用hashCode()和equal()方法确保Key值不可重复性来保证元素的唯一性

  2. LinkedHashSet底层由LinkedHashMap,则可以保证按照元素插入规则集的顺序进行提取。

  3. TreeSet底层是由TreeMap支持的,可以按照Comparable接口对存储对象排序或者Comparator比较器接口进行存储对象的比较排序

HashSet的具体源码如下所示:

    public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();public boolean contains(Object o) {//判断是否存在元素就在hashMap中查看是否存在键值Key为元素oreturn map.containsKey(o);}public boolean add(E e) {//将要存储的元素当作hashMap的key值进行存储,保证存储元素的唯一性return map.put(e, PRESENT)==null;}}

Queue(队列)

队列是一般按照先进先出First-In-First-Out的规则,元素被追加到队列末尾,在队列头进行删除,底层实现可以是数组,也可以是链表。主要实现有PriorityQueue和LinkedList,

  • 其中PriorityQueue优先队列默认情况下以Comparable按照元素的自然顺序进行排序,最小值的元素优先级最高最先删除,也可以传入指定的比较器Comparator进行元素间的比较。

  • 在java.util.concurrent包里有ArrayBlockingQueue,LinkedBlockingQueue等实现同步机制的队列数据结构,有兴趣可以查看源码进行研究。

##Map(映射类)
Map是按照Key-Value进行存储的数据结构,主要实现有HashMap,LinkedHashMap,TreeMap,

  • 在不需要保证元素的顺序情况下,HashMap是非常高效的,主要是通过hashCode()和equal()方法进行哈希化存储的,所以要求存储的对象要实现hashCode()和equal()方法才能提高性能。HashMap具体的内部机制可以看
    高爽|Coder的HashMap深度解析

  • 而LinkedHashMap可以保证存储元素的顺序;可以按照元素的存储顺序或者元素的访问顺序进行排序存储,它的底层是由HashMap加上循环双向链表实现的。其中LinkedHashMap的具体机制可以看 LinkedHashMap及其源码分析

  • TreeMap在遍历排序好的键值是非常高效率的,默认是按照元素的实现Comprable接口方法进行排序的,也可以传入Comparator比较器接口进行比较排序
    以下是TreeMap的put(K key, V value)源码分析

public V put(K key, V value) {Entry<K,V> t = root;//若集合为空,那么添加的元素成为TreeMap的根结点if (t == null) {compare(key, key); // type (and possibly null) checkroot = new Entry<>(key, value, null);size = 1;modCount++;return null;}int cmp;Entry<K,V> parent;// split comparator and comparable pathsComparator<? super K> cpr = comparator;//当比较器存在时,使用比较器Comparatorif (cpr != null) {do {parent = t;//使用比较器Comparator对元素的Key值进行比较cmp = cpr.compare(key, t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;elsereturn t.setValue(value);} while (t != null);}else {//当比较器不存在时,使用元素实现Comparable接口的方法if (key == null)throw new NullPointerException();@SuppressWarnings("unchecked")Comparable<? super K> k = (Comparable<? super K>) key;do {parent = t;//使用元素实现Comparable接口的方法进行键值Key的比较cmp = k.compareTo(t.key);if (cmp < 0)t = t.left;else if (cmp > 0)t = t.right;elsereturn t.setValue(value);} while (t != null);}Entry<K,V> e = new Entry<>(key, value, parent);if (cmp < 0)parent.left = e;elseparent.right = e;fixAfterInsertion(e);size++;modCount++;return null;}

以上是最近学习整理的数据结构内容,对于数据结构的学习不单单需要知道各种数据结构的优缺点和应用场景,对于数据结构的源码和算法也是蕴含着很多可以学习的东西。数据结构在程序设计中的应用也非常广泛,比如Sturts的值栈机制就是使用List数据实现的,Mybatis的缓存机制就是使用Map机制进行实现的…

未来路还很长,继续前进


http://chatgpt.dhexx.cn/article/GBED41Mm.shtml

相关文章

Java数据集总结

Java数据集关系图&#xff08;来自网上&#xff09; 红色是接口&#xff0c;绿色是实现。其中 HashSet是通过内部持有HashMap实现TreeSet是通过内部持有TreeMap实现 除了上述基础数据集&#xff0c;还有一些其他数据集 LinkedHashMap 继承HashMapLinkedHashSet 继承HashSet&…

Java常见数据集合list、set、map

线性表 由零个或者多个数据元素组成的有限序列。第一个元素无前驱&#xff0c;最后一个元素没有后继&#xff0c;其他元素有且只有一个前驱或者后继 栈、队列 栈Queue队列Stack先进先出先进后出LinkedList&#xff1a;可以用它来实现双向队列。PriorityQueue&#xff1a;基于…

java数据集合

一&#xff09;Collection接口&#xff1a;存储单列数据&#xff1a; (1)List&#xff1a;单列有序集合&#xff08;可以重复&#xff09;&#xff1a; A、ArrayList&#xff1a;底层结构是数组&#xff0c;底层查询快&#xff0c;增删慢&#xff08;非线程安全&#xff09;&am…

windows VM12虚拟机安装苹果系统(Mac OX 10.11)

windows VM12虚拟机安装苹果系统(Mac OX 10.11) 本人最近需要使用苹果电脑生成请求文件&#xff0c;由于没有苹果电脑&#xff0c;只能安装个黑苹果对付一下了&#xff0c;以下是本人的经历。 首先需要工具 1、vm12安装包下载 提取码tcua&#xff1b; 2、unlocker208工具下载 提…

vm16安装macos12的详细配置

文章目录 版本情况macos安装unlock创建虚拟机虚拟机安装配置安装tools 优化部分参考文档部分 版本情况 VM16 macos 12.01 unlocker&#xff08;破解&#xff09; Github上的大佬Dr. Donk分享的Unlocker: https://github.com/DrDonk/unlocker/releases 资源相关链接&#xff1…

FileUtils中writeStringToFile和readFileToString的使用

使用FileUtils的前提必须先导入commons.io   jar包 maven 版本 <!-- https://mvnrepository.com/artifact/commons-io/commons-io --> <dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.…

Java 使用FileUtils.copyFile复制文件

1、FileUtils.copyFile方法 copyFile方法有多种重载形式&#xff0c;下面截图只是其中比较简单的一种&#xff0c;详细见官方文档 2、业务代码&#xff1a; private File copyFile(Long baseTime, int orgId, int typeId, String sourcePath, String fileName) throws IOExce…

【Java基础知识 18】通过FileUtils.copyFile探索IO原理

目录 一、FileUtils.copyFile1、从实例出发2、还是蛮快的&#xff0c;探索源码一番... 二、FileChannel1、读操作2、写操作3、代码实例4、控制台输出 三、如何减少copy和上下文切换的次数&#xff1f;1、为什么不能舍弃内核空间这一步&#xff0c;直接读取到用户空间呢&#xf…

FileUtils工具类常用方法

文件操作工具类&#xff08;FileUtils&#xff09; 使用 apache 的commons-io包下的FileUtils&#xff0c;import org.apache.commons.io.FileUtils; 下载地址&#xff1a;http://commons.apache.org/proper/commons-io/download_io.cgi 官方API文档&#xff1a;http://com…

App分渠道打包工具

渠道包就是要在安装包中添加渠道信息&#xff0c;也就是channel&#xff0c;对应不同的渠道&#xff0c;例如&#xff1a;小米市场、360市场、应用宝市场等。 我们要在安装包中添加不同的标识&#xff0c;应用在请求网络的时候携带渠道信息&#xff0c;方便后台做运营统计&…

H5打包成app的在线工具

H5打包成APP&#xff0c;有两种方式&#xff0c;方式一是直接用网址打包&#xff0c;方式二是将H5文件打包到APP的资源文件里面。第一种方式的用户体验不是很好&#xff0c;因为这种APP在用户没有网络的情况下&#xff0c;打开APP就会变成白屏&#xff0c;因为这种远程网址调用…

网站打包成app,webapp在线打包工具推荐

最近因为需求&#xff0c;需要把移动端网页打包成APP&#xff0c;本人一直是做网站开发的&#xff0c;没想到现在的webapp打包能如此方便了&#xff0c;打包的时候只用提供网站链接就可以了&#xff08;原理应该是做一个app简单浏览器&#xff0c;然后默认打开你网站的链接&…

HTML一键打包IPA(苹果IOS应用)工具 网站打包 APP

工具简介 HTML一键打包IPA&#xff08;苹果应用&#xff09;工具可以把本地HTML项目或者网站打包为一个苹果应用IPA文件&#xff0c;无需编写任何代码&#xff0c;支持在苹果设备上安装运行。 打包工具群&#xff1a;429338543 下载地址&#xff1a; 点击进入下载页面 加群获…

HTML一键打包APK工具_安卓app封装_H5打包安卓APP

随着目前苹果Appstore审核越来越严格&#xff0c;每天平均上架1000个&#xff0c;下架3000个应用&#xff0c;想要上架苹果应用商店已经越来越困难了&#xff0c;反复修改审核上架&#xff0c;短则1-2周&#xff0c;长则几个月&#xff0c;并且游戏类应用上架目前极其困难。 因…

AndroidStudio如何打包APP

首先&#xff0c;点击AS工具栏的Build下面的“Generate Signed Build APK…” 然后在弹出的框内选择APK &#xff08;Android App Bundle&#xff1a;用于通过 Google Play 发布的应用&#xff0c;需要升级到AS 3.2 以上版本才支持App Bundle格式&#xff1b; APK&#xff1a;…

网站项目打包成app

web项目打包app 这次打包app项目&#xff0c;主要用到的软件是HBuilderX&#xff1b; HBuilderX下载网址&#xff1a;https://www.dcloud.io/hbuilderx.html HBuilderX&#xff1a;可直接将网页打包成手机端app&#xff0c;可以有安卓和苹果两种安装包&#xff0c;这次我们主…

Flutter项目打包生成APK

flutter实现安卓打包&#xff1a;&#xff08;以安卓Studio工具为例&#xff09; &#xff08;1&#xff09;创建key.jks文件 在安卓studio中调整至项目路径&#xff0c;例如&#xff1a; 我的项目所在地 E:\Flutter\fluttershuqi>然后输入命令&#xff1a; keytool -ge…

Android App打包流程

简单总结下app打包的流程&#xff1a; 第一步&#xff1a;aapt 为res目录下的资源生成R.java文件&#xff0c;同时为AndroidManinfest.xml生成Manifest.java文件 第二步&#xff1a;aidl 把项目中自定义的aidl文件生成相应的Java代码文件 第三步&#xff1a;javac 把项目中所…

iOS app打包过程

1.点击Product - Archive 2.选择Development 点击Next 3.什么都不选&#xff0c;点击下一步 4.选择第一个&#xff0c;点击next 5.选择Export 6.拿到.ipa文件&#xff0c;导出成功&#xff01; 7.接下来&#xff0c;可以将ipa文件拖到蒲公英进行发布

Flutter 打包APP (Android IOS)

打包Android apk 参考 https://flutter.dev/docs/deployment/android https://flutterchina.club/android-release/ Flutter项目打包成安卓apk详解来了&#xff08;解决安装没网络问题&#xff09; 【Flutter 专题】39 图解 iOS 打包 IPA 文件 Flutter - 打包APK、IPA 及 IOS上…