数组、链表、集合、table、map、二叉树、索引、数据库

server/2024/10/11 13:28:12/

数据结构:帮助数据快速读写的一种结构模型,数据库是 系统文件+索引(索引是各种数据结构提高数据检索以平衡数据读写速度,系统文件是存储用户真正的数据,比如业务表数据、文件、图片等等)

1.数组:再内存上是连续的一组数据,读写快,插入、删除 慢 (arrayList等 是专门封装了数组操作,不过插入等操作可能会有越界等异常。)

比如 int[] k = new int[10];

会在内存中开辟一个连续10个地址的块出来存放数据。k变量指针指向第一个数据

当要读取或者 写入的时候,比如:k[4] = 5;  int j = k[4];  他能直接取数组内的值,根据第一个数据指针位置再去偏移三位就行;

当数组读写满了之后,你要新插入数据或者删除一个数据(改变数组大小)就很慢

比如  要在  k[3]  和 k[4]之间插入N个数据(int[] m = new int[]{1,2,3,4,...,N};),你得重新新建一个数组然后复制原有的数据到新位置,再补充进来新的数据(数组复制可以用循环或者Arrays.copyOf方法) 

注:1.arrays类提供了数组常用操作 ,底层使用了Systm.arraycopy ( nativ方法,直接调用系统底层方法)

2.copyOf是会新建数组、扩容,然后复制数据

3.system.arraycopy 是把源数组第几个开始,复制到新数组第几个开始,复制多少个

k = System.copyOf(k, 10+N);   

system.arraycopy(k,4,k,4+N,6);

// k[3] 和k[4]之间插入数据,那么k[4]要搬到k[4+N]的位置,后面的也要偏移N个搬走,一共有6个要搬走(k[0]到k[3] 四个元素不用动,剩下6个元素偏移搬走)

然后循环插入新来N个元素   

system.arraycopy(m,0,k,4,N);

(ArrayList是每次扩容1.5倍, 他是 size+size>>1   右移是除以2(如果有小数会忽略))

链表:读写慢,插入、新增快,再内存上是不连续的、不用扩容,靠对象指针指向下一个\上一个来移动

单链:将原对象指针、下一个指针封装成一个新的对象

双链:将原对象指针、下一个指针、上一个指针 封装成一个新的对象;目的是更快速的拿到靠队尾的元素

比如当前长度是10,他去拿索引位置为8的元素,他会判断8与5(size>>1)的大小比较,如果如果小,从队前开始往下找,大或等于,从队尾开始往上找。

这时他是大,就从队尾循环 2次;(如果他要 从队前找,需要循环7次)

新增快:比如他要再第8个索引位置与9索引位置加N个

1.把N个对象封装成Node对象,维护好他们彼此间的上下指针

2.他改动8位置的下一个索引指针,指向N的队前,然后改N的队尾的下一个为9位置,改9的上一个为N的队尾

table、map: 

hastable他是字典,key\value都不能为空,碰撞概率小,用单链做存储桶;

hashmap他是数据地图,key\value可以为空,碰撞概率大,用双链做存储桶;

注:hash碰撞是指  两个或多个对象的hashcode与hash桶数组size的&运算的结果一致

用途不一样,table用作系统环境参数存储、少量本地缓存等;map用于用户数据缓存、系统间数据缓存等

由于用途不一样,所以他们的碰撞概率不一样,key\value约束不一样

table由于碰撞概率小,所以用单链做hash桶,减小没必要的内存;map碰撞大,用双链做hash桶,提供检索速度

他两取数逻辑都是通过对象hashCode和tab的大小&运算定位所在存储桶(数组tab中的位置),然后循环存储桶(链表)定位数据

1.他两都是封装了node对象数组(tab),元素size

2.table再new对象的时候初始tab;map再new的时候不会初始tab大小

3.table没有resize  map有resize

4.有初始大小参数的构造方法以及resize 会计算threshold

5.threshold 有参构造方法中,刚开始是下一次tab的大小(tablesizefor 返回initsize-1最近的2的指数次的一个数+1),resize()之后变成tab大小乘以负载因子

6.put的size超过threshold他的时候会触发rsize(他是)

7.resize会重新调整元素位置,所以一般用map要估算用多少,然后使用有参的构造方法,减少resize次数

8.put的key对象的hashCode方法返回的值尽量不要重复,根据业务,复写hashCode,根据属性参数自定义hashCode (Objects.hash方法)

9.resize每次都是tab两倍递增(左移)、元素重新hash定位

10.如果要提高空间利用率,可以提高负载因子,但是会一定程度上减慢查询速度。

11.  负载因子 <1 的时候    空间利用率<负载因子       负载因子 >1 的时候 空间利用率 <=100%

二叉树见 https://mp.csdn.net/mp_blog/creation/editor/88776485
hashmap当存储桶超过8的时候,链表会转为二叉树中的一种(treeifyBin方法)
索引类似map,不过他的负载因子很大,根节点没几个,数据库是系统文件+索引(根据需要查找的字段建立索引),然后快速读取、写入文件资源,

数据库:分为关系型数据库、非关系型数据库(redis是非关系型数据库)
常用的数据库是mysql、oracle、redis,这些是内部维护了索引与资源数据的关系逻辑;

关系型数据库是通过sql维护数据


ES服务是搜索引擎,存了资源的信息json, 通过restful api维护 然后根据信息字段建立索引,


http://www.ppmy.cn/server/16233.html

相关文章

eNSP学习——静态路由及默认路由基本配置

目录 知识背景 实验目的 实验步骤 实验内容 实验拓扑 实验编址 实验前期准备 实验步骤 1、基本配置&#xff08;按照实验编址设置好对应的IP地址&#xff09; 2、是实现主机之间的通信 3、实现全网全通来增强网络的可靠性 4、使用默认路由实现简单的网络优化 需要各…

第六章 字符串及正则表达式

第六章 字符串及正则表达式 字符串的常用方法 字符串是Python中的不可变数据类型&#xff0c;在Python中一切皆对象&#xff0c;字符串对象本身就有一些常用的方法。 字符串的常用操作&#xff1a; 方法名描述说明str.lower()将str字符串全部转成小写字母&#xff0c;结果为…

【网络编程】网络编程概念 | TCP和UDP的区别 | UDP数据报套接字编程 | Socket

文章目录 网络编程一、什么是网络编程1.TCP和UDP的区别 二、UDP数据报套接字编程DatagramSocketDatagramPacket回显服务器&#xff08;echo server&#xff09; 网络编程 一、什么是网络编程 通过网络&#xff0c;让两个主机之间能够进行通信。基于通信来完成一定的功能。 ​…

Cjson 库使用

1. JSON简介 JSON全称 JavaScript Object Notation&#xff0c;即 JS对象简谱&#xff0c;是一种轻量级的数据格式。 它采用完全独立于编程语言的文本格式来存储和表示数据&#xff0c;语法简洁、层次结构清晰&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成…

2000-2022年各区县农产品产量数据

2000-2022年县域农产品产量数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;统计年度、县域名称、所属地级市、所属省份、地区编码ID、县域代码、产品种类或名称、单位、产量、 3、来源&#xff1a;统计局、县域统计年鉴、各区县政府官网 4、范围&#xff1a;具体…

雅特力AT32F435学习——1.搭建环境

AT32F435开发环境搭建 整体开发环境我们首选使用KEILL MDKAT32F4芯片Pack包的方式进行&#xff0c;因为国产MCU厂商自己的开发IDE虽然便捷但是成熟度不高&#xff0c;潜在的坑比较多&#xff0c;使用界面还需要重新熟悉所以我们还是选择我们最擅长的KEILL下手&#xff0c;本次…

2024/4/25 C++day3

#include <iostream> using namespace std; class Person //Person类 {string name; //两个私有属性变量name&#xff0c;ageint age;public: //一个公有属性指针变量&#xff0c;一个无参构造函数&#xff0c;一个有参构造函数&#xff0c;一个sho…

使用 Flask 和 WTForms 构建一个用户注册表单

在这篇技术博客中&#xff0c;我们将使用 Flask 和 WTForms 库来构建一个用户注册表单。我们将创建一个简单的 Flask 应用&#xff0c;并使用 WTForms 定义一个注册表单&#xff0c;包括用户名、密码、确认密码、邮箱、性别、城市和爱好等字段。我们还将为表单添加验证规则&…