皮皮网
皮皮网

【转发阅读平台源码免费】【故事织梦源码】【分时K线图源码】cpr源码分析

来源:360全景拼接源码 发表时间:2024-11-29 20:41:53

1.请问各位大师谁能给我讲一下各种文件的码分后缀是怎么定义的有什么规律没有?
2.突破传统 重新定义:3D医学影像PACS系统源码(包含RIS放射信息)实现三维重建与还原
3.常见的文件格式有哪些
4.简单说说ConcurrentSkipListMap

cpr源码分析

请问各位大师谁能给我讲一下各种文件的后缀是怎么定义的有什么规律没有?

       1. .rar文件是用RAR压缩软件创建的压缩文件格式。

       2. .doc文件是码分用Microsoft Word编辑的文档格式。

       3. .bas文件是码分BASIC语言的源代码文件。

       4. .dbs文件通常用于表示数据库文件。码分

       5. .cpr文件是码分Corel公司提供的软件说明书文件。

       6. .cpt文件是码分转发阅读平台源码免费Corel公司用于存储照片或绘画图像的文件。

       7. .cpx文件是码分Corel公司的演示文稿交换文件。

       8. .crd文件是码分Windows Cardfile文件,用于存储名片信息。码分

       9. .crt文件是码分认证文件,通常用于存储数字证书。码分

       . .css文件是码分用于创建瀑布式表格的文件。

突破传统 重新定义:3D医学影像PACS系统源码(包含RIS放射信息)实现三维重建与还原

       突破传统,码分重新定义:3D医学影像PACS/RIS系统源码的码分三维重建与应用

       新一代PACS/RIS系统以用户需求为导向,采用创新的码分集中+分布式架构,实现了医院影像业务的全面覆盖和未来扩展需求。系统设计强调平台化和模块化,无缝对接第三方服务,故事织梦源码提升工作效率,具备强大的功能和调阅速度。该系统的核心模块包括预约、护士、技师和阅片工作站,覆盖放射、超声等多科室,从预约管理到报告编辑,一站式满足全流程需求。

       预约工作站:提供动态可视化管理,支持一站式预约和多种影像切换,如三维后处理和特殊检查功能。

       护士工作站:大屏队列管理,支持特殊患者优先处理和恢复过号服务。

       技师工作站:自定义页面设置,审核申请单并接收提醒。

       阅片工作站:智能纠错提醒,分时K线图源码历史报告记录,模板多样化,异常数据标记。

       二维图像与三维可视化:支持图像处理和三维重建技术,如MPR、CPR、MIP等。

       PACS系统广泛应用于影像存储、诊断分析、临床决策、远程会诊、数据共享、患者服务提升和临床研究。它不仅节省胶片资源,还优化了医疗流程,提升患者体验。

       RIS系统作为PACS的获取网站后端源码补充,负责放射科的预约、出片、报告等管理流程,与PACS协同工作,构建了完整的医学影像信息化环境。

常见的文件格式有哪些

       常见的文件格式有:

       A

       AAC:MPGE-4高级音频编码

       ACC:苹果设备的专属音乐格式

       ACE:Ace压缩档案格式

       ACT:Microsoft office助手文件

       AIF,AIFF:音频互交换文件,Silicon Graphic and Macintosh应用程序的声音格式

       ANI:Windows系统中的动画光标

       APK:AndroidPackage /Android(安卓)安装包,APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装

       APS:开发环境使用的资源文件,若要修改资源需要修改3个文件,.aps文件.rc文件 Resource.h

       ARC:LH ARC的压缩档案文件

       ARJ:Robert Jung ARJ压缩包文件

       ASD:Microsoft Word的自动保存文件;Microsoft高级流媒体格式(microsoft advanced streaming

       format,ASF)的描述文件;可用NSREX打开 Velvet Studio例子文件

       ASF:Microsoft高级流媒体格式文件

       ASM:汇编语言源文件,Pro/E装配文件

       ASP:动态网页文件;ProComm Plus安装与连接脚本文件;Astound介绍文件

       AST:Astound多媒体文件;ClarisWorks“助手”文件

       avi:Windows视频文件

       Axx:ARJ压缩文件的分包序号文件,用于将一个大文件压至几个小的压缩包中(xx取-的数字)

       A3L:Authorware 3.x库文件

       A4L:Authorware 4.x库文件

       A5L:Authorware 5.x库文件

       A3M,A4M:Authorware Macintosh未打包文件

       A3W,A4W,专柜源码是什么A5W:未打包的Authorware Windows文件

       B

       BAK:备份文件

       BAS:Visual Basic Module VB6模块文件

       BAT:批处理文件

       BDICT:百度输入法词库文件

       BIN:二进制文件,其用途依系统或应用而定

       BINHex:苹果的一种编码格式

       BMP:Windows或OS/2位图文件

       BOOK:Adobe FrameMaker Book文件

       BOX:Lotus Notes的邮箱文件

       BPL:Borlard Delph 4打包库

       BPS:百度输入法皮肤文件

       BSP:Quake图形文件

       BUN:CakeWalk 声音捆绑文件(一种MIDI程序)

       C

       C:C代码文件

       C0l:台风波形文件

       CAB:Microsoft压缩档案文件

       CAD:Softdek的Drafix CAD文件

       CAM:Casio照相机格式

       CAP:压缩音乐文件格式

       CAS:逗号分开的ASCⅡ文件

       CCB:Visual Basic动态按钮配置文件

       CCH:Corel图表文件

       CCO:CyberChat数据文件

       CCT:Macromedia Director Shockwave投影

       CDA:CD音频轨道

       CDF:Microsoft频道定义格式文件

       CDI:Philip的高密盘交互格式

       CDM:Visual dBASE自定义数据模块文件

       CDR:CorelDRAW绘图文件;原始音频CD数据文件

       CDT:CorelDRAW模板

       CDX:CorelDRAW压缩绘图文件;Microsoft Visual FoxPro索引文件

       CFG:配置文件

       CGI:公共网关接口脚本文件

       CGM:计算机图形元文件

       CH:OS/2配置文件

       CHI:.CHM文件的一个索引,用来支持对应的.CHM文件中的搜索功能,要和同名的.CHM文件放到一起用

       CHK:由Windows磁盘碎片整理器或磁盘扫描保存的文件碎片

       CHM:HTML格式的帮助文档

       CHP:Ventura Publisher章节文件

       CHR:字符集(字体文件)

       CHT:ChartViem文件;Harvard Graphics矢量文件

       CIF:Adaptec CD 创建器 CD映像文件

       CIL:Clip Gallery下载包

       CIM:SimCity 文件

       CIN:OS/2改变控制文件用于跟踪INI文件中的变化

       CLASS:Java类文件

       CLP:Windows 剪贴板文件

       CLL:Crick Software Clicker文件

       CLS:Visual Basic类文件

       CMD:Windows NT,OS/2的命令文件;DOS CD/M命令文件;dBASEⅡ程序文件

       COM:操作系统中的二进制可执行文件,可执行文件分两种一种是后辍名为.COM另一种就是.EXE 了,.COM一般用于DOS。

       CPI:Microsoft MS-DOS代码页信息文件

       CPL:控制面板扩展名,Corel颜色板

       CPP:C++代码文件

       CPR:Corel提供说明书文件

       CPT:Corel 照片-绘画图像

       CSS:层叠样式表文档,配合HTML使用,单独专门定义样式表

       CST:Macromedia Director Cast文件

       CSV:Comma Separated Value逗号分隔值,通常都是纯文本文件

       CTL:Visual Basic User Control VB6.0用户自定义控件

       CTX:Visual Basic User Control Binary FileVB6.0用户自定义控件二进制缓存文件

       CUR:Windows光标文件

       D

       DAT:数据流格式,DAT文件也是MPG格式的,是VCD刻录软件将符合VCD标准的MPEG-1文件自动转换生成的。也有数据文件的后缀名为.DAT,文件格式不确定,任何文件的后缀名都可以设为.DAT,因为读取数据不是从后缀名判断的,而是从文件格式判断

       DB:数据库文件,Thumbs.db是缩略图缓存

       DBF:dBASE文件,一种由Ashton-Tate创建的格式,可以被ACT!、Lipper、FoxPro、Arago、Wordtech、Xbase和类似数据库或与数据库有关产品识别;可用数据文件(能被Excel

       打开);Oracle 8.1.x表格空间文件

       DBX:DataBearn图像;Microsoft Visual FoxPro表格文件

       DCF:数码照相机统一记录格式,DCF 也有音频格式

       DCT:Microsoft Visual FoxPro数据库容器

       DCU:Delphi编译单元文件

       DCX:Microsoft Visual FoxPro数据库容器;基于PCX的传真图像;宏

       DIR:MacromediaDirector文件

       DLF:一种INI配置文件格式的语言文件

       DLL:动态链接库

       DOC: Microsoft Word 文档文件

       DOCX:Microsoft Word 文档文件

       Perfect文档、Microsoft:Word文档;DisplayWrite文档

       DOT:Microsoft Word文档模板

       DPL:Borland Delph 3压缩库

       DRV:驱动程序

       DRW:Micrografx Designer/Draw;Pro/E绘画文件

       DSF:Micrografx Designer VFX文件

       DSG:DOOM保存的文件

       DSM:Dynamic Studio音乐模块(MOD)文件

       DSP:Microsoft Developer Studio工程文件

       DSQ:Corel QUERY(查询)文件

       DST:刺绣机图形文件

       DSW:Microsoft Developer Studio工作区文件

       DTA:World Bank(世界银行)的STARS数据文件

       DTD:SGML文档类型定义(DTD)文件

       DTED:地面高度数字数据(图形的数据格式)文件

       DTF:Symantec Q&A相关的数据库数据文件

       DTM:DigiTrakker模块文件

       DUN:Microsoft拔号网络导出文件

       DV:数字视频文件(MIME)

       DWG:AutoCAD工程图文件;AutoCAD或Generic CADD老版本的绘图格式

       DXR:Macromedia Director受保护(不可编辑)**文件

       E

       E:易语言代码源文件

       EC:易语言模块文件

       EDA:Ensoniq ASR磁盘映像

       EDD:元素定义文档(FrameMaker+SGML文档)

       EDE:Ensoniq EPS磁盘映像

       EDK:Ensoniq KT磁盘映像

       EDQ:Ensoniq SQ1/SQ2/Ks磁盘映像

       EDS:Ensoniq SQ磁盘映像

       EDV:Ensoniq VFX-SD磁盘映像

       EFA:Ensoniq ASR文件

       EFE:Ensoniq EPS文件

       EFK:Ensoniq KT文件

       EFQ:Ensoniq SQ1/SQ2/Ks文件

       EFS:Ensoniq SQ文件

       EFV:Ensoniq VFX-SD文件

       EMD:ABT扩展模块

       EMF:Windows增强元文件

       EML:Microsoft Outlook Express邮件消息(MIME RTC)文件

       EOT:是一种压缩字库,目的是解决在网页中嵌入特殊字体的难题,目前只有微软的IE浏览器支持

       EXE:可执行文件(程序)

       F

       FAV:Microsoft Outlook导航条

       FAX:传真类型图像

       FCD:虚拟CD-ROM

       FDF:Adobe Acrobat表单文档文件

       FLA:Macromedia Flash动画源文件

       FLAC:无损音频压缩编码

       FLV:Flash视频文件

       FNE:易语言的其中一种支持库文件,用于在易语言中装载和提供对应的命令和方法,易语言支持库还有FNR格式、NPK格式以及LPK文件包等。

       FND:Microsoft Explorer保存的搜索文件(Find applet)

       FNR:FNR文件是易语言的其中一种支持库文件,用于在易语言中装载和提供对应的命令和方法,但是与FNE格式支持库不同的是,FNR不带编辑信息,有运行支持代码的支持库。

       FON:系统字体

       FRM:Visual Basic Form File VB6.0窗体文件

       FRT:Microsoft FoxPro报表文件

       FRX:Visual Basic表单文本;Microsoft FoxPro报表文件

       FXP:经Microsoft FoxPro编译的源文件

       G

       GDM:铃声、口哨声和声音板模块格式

       GetRight:GetRight未完成的下载文件

       GHO:Norton 克隆磁盘映像

       GID:Windows 全局索引文件(包括帮助状态)

       GiF:动态文件

       GL:动画格式

       GRP:程序管理组

       H

       H:C/C++ Header 头文件

       HEX:Macintosh BinHex2.0文件

       HLP:帮助文件;Date CAD Windows帮助文件

       HPP:C++程序头文件

       HQX:Macintosh BinHex 4.0文件

       HT:HyperTerminal(超级终端)

       HTM,HTML:超文本文档

       HTT:Microsoft超文本模板

       HTX:扩展HTML模板

       I

       ICO:Windows图标

       IDX:Microsoft FoxPro相关数据库索引文件;Symantec Q&A相关数据库索引文件;Microsoft Outlook

       Express文件

       IMG:GEM映像

       INC:Include File 引用文件,ASP中也会用到

       INF:Windows操作系统下用来描述设备或文件等数据信息的文件

       INI:配置文件,ini文件格式适合程序记录一些基本的配置设置

       INP:Oracle 3.0版或早期版本的表单源代码

       INRS:INRS远程通信声频

       INS:InstallShield安装脚本;X-Internet签字文件;Ensoniq EPS字簇设备;Cell/ⅡMAC/PC抽样设备

       INT:中间代码,当一个源程序经过语法检查后编译产生一个可执行代码

       IOF:Findit文档

       IQY:Microsoft Internet查询文件

       ISO:根据ISD 有关CD-ROM文件系统标准列出CD-ROM上的文件

       ISP:X-Internet签字文件

       ISS:Inno Setup 项目脚本文件 (Inno Setup 是一种安装包生成工具)

       IST:数字跟踪设备文件

       ISU:InstallShield卸装脚本

       IT:脉冲跟踪系统音乐模块(MOD)文件

       ITI:脉冲跟踪系统设备

       ITS:脉冲跟踪系统抽样,Internet文档位置

       IV:Open Inventor中使用的文件格式

       IVD:超过/微观数据维数或变量等级文件

       IVP:超过/的用户子集配置文件

       IVT:超过/表或集合数据文件

       IVX:超过/微数据目录文件

       IW:Idlewild屏幕保护程序

       IWC:Install Watch文档

       J

       J:Ricoh照相机格式

       JAR:Java档案文件(一种用于applet和相关文件的压缩文件)

       JAVA:Java源文件

       JAVA:Java源文件

       JFF,JFIF,JIF:JPEG文件

       JPE,JPEG,JPG:JPEG图形文件

       JS:javascript源文件

       JSP:HTML网页,其中包含有对一个Java servlet的参考

       K

       KAR:卡拉OK MIDI文件(文本+MIDI)

       KEY:授权文件

       L

       LAB:Visual dBASE标签文件

       LBT,LBX:Microsoft FoxPro标签文件

       LDB:Microsoft Access加锁文件

       LHA:LZH更换文件后缀

       LIB:Windows系统中的库文件,分为两种,静态库与动态库

       LIC:License 用户许可证书文件

       LNK:快捷方式文件

       LOG:日志文件

       LPK:LPK文件是易语言的其中一种支持库安装包,包含".FNE"、".FNR"、相关例程和文档的全部或部分文件。用于在易语言中装载和提供对应的命令和方法

       LST:列表文件 /MASM Listing

       LUA:LUA脚本语言文件

       LZH:LH ARC压缩档案

       M

       M1V:MPEG相关文件(MIME"mpeg"类型)

       M3D:Corel Motion 3D动画文件

       M3U:MPEG URL(MIME声音文件)

       MAM:Microsoft Access宏

       MAQ:Microsoft Access查询文件

       MAR:Microsoft Access报表文件

       MBX:Microsoft Outlook保存email格式;Eudora邮箱

       MCW:Microsoft Word的Macintosh文档

       MDB:Microsoft Access数据库

       MDN:Microsoft Access空数据库模板

       MDW:Microsoft Access工作组文件

       MID:MIDI音乐

       MKV:视频文件

       MMM:Microsoft多媒体

**

       MOV:QuickTime for Windows视频文件

       MP2:第二层MPEG音频文件

       MP3:第三层MPEG音频文件

       MP4:视频或音频文件

       MPA:MPEG相关文件,MIME“mpeg类型”

       MPE,MPEG,MPG:MPEG动画文件

       MPP:Microsoft工程文件;CAD绘图文件格式

       MPR:Microsoft FoxPro菜单(已编译)

       MSI:Windows 安装器包

       MSN:Microsoft 网络文档;Descent Mission文件

       N

       NPK:NPK属于易语言COM包装支持库,该支持库是引用COM包装库生成的,例如WebBrowser、Windows媒体播放器。该扩展名格式支持库可用记事本打开。

       O

       OBD:Microsoft Office活页夹

       OBJ:对象文件

       OBZ:Microsoft Office活页夹向导

       OCX:Microsoft对象链接与嵌入定制控件

       ODS:Microsoft Outlook Express邮箱文件

       OFT:Microsoft Outlook模板

       OPX:OPL扩展DLL(动态链接库)

       OSS:Microsoft Office查找文件

       OST:Microsoft Exchange / Outlook 离线文件

       P

       PAL:压缩文件

       PART:Go!Zilla部分下载文件

       PAS:Pascal源代码

       PCS:PICS动画文件

       PDF:Adobe Acrobat

       可导出文档格式文件(可用Web浏览器显示);Microsoft系统管理服务器包定义文件;NetWare打印机定义文件

       PEM:OpenSSL 使用 PEM 文件格式存储证书和密钥。PEM 实质上是 Base 编码的二进制内容,再加上开始和结束行BEGIN CERTIFICATE、ENDCERTIFICATE,在这些标记外面可以有额外的信息,如编码内容的文字表示。文件是 ASCII 的,可以用任何文本编辑程序打开

       PHP,PHP3:包含有PHP脚本的HTML网页

       PHTML:包含有PHP脚本的HTML网页;由Perl分析解释的HTML

       PM5:Pagemaker 5.0文件

       PM6:Pagemaker 6.0文件

       PNG:可移植图像文件

       PPS:Microsoft Powerpoint幻灯片放映

       PPT:Microsoft Powerpoint演示文稿

       PRF:Windows系统文件,Macromedia导演设置文件

       PSD:Adobe photoshop位图文件

       PSM:Protracker Studio模型格式;Epic游戏的源数据文件

       PST:Microsoft Outlook个人文件夹文件

       PWL:Windows 口令列表文件

       Q

       QIF:QuickTime相关图像(MIME);Quicken导入文件

       QPYD:QQ拼音输入法词库文件

       QPYS:QQ拼音输入法皮肤文件

       QT,QTM:QuickTime

**

       QTI,QTIF:QuickTime相关图像

       QTP:QuickTime优先文件

       QTS:Mac PICT图像文件;QuickTime相关图像

       QTX:QuickTime相关图像

       R

       RA:RealAudio声音文件

       RAM:RealAudio元文件

       RAR:Windows RAR压缩文件

       RC:Resource Script开发环境使用的资源文件,若要修改资源需要修改3个文件,.aps文件.rc文件 Resource.h

       REC:录音机宏;RapidComm声音文件

       REG:注册表文件

       REP:Visual dBASE报表文件

       RES:Microsoft Visual Studio资源文件

       RM:RealAudio视频文件

       RMF:Rich Map格式(3D游戏编辑器使用它来保存图)

       ROM:基于盒式磁带的家庭游戏仿真器文件(来自Atari 、Colecovision、Sega、Nintendo等盒式磁带里的ROM完全拷贝,在两个仿真器之间不可互修改)

       RTF:Rich Text Format 富文本格式(也有称为多文本格式)

       Rxx:多卷档案上的RAR压缩文件(xx=1~间的一个数字)

       S

       SAV:游戏保存文件

       SB:原始带符号字节(8位)数据

       SBK:Creative Labs的Soundfont 1.0 Bank文件;(Soundb laster)/EMU SonndFont v1.x Bank文件

       SBL:Shockwave Flash对象文件

       SCC:Microsoft SourceSafe Status 在VB6.0中是管理记录文件

       SCF:Windows Explorer命令文件

       SCH:Microsoft Schedule+1

       SCP:拨号网络脚本文件

       SCR:Windows屏幕保护;传真图像;脚本文件

       SFX:RAR自解压档案

       SHTML:含有服务器端包括(SSI)的HTML文件

       SKN:皮肤文件,QQ拼音输入法的皮肤源文件也是.skn

       SLN:Microsoft Visual Studio Solution VS开发环境的解决方案文件

       SPL:Shockwave Flash对象;DigiTrakker抽样

       SQL:Informix SQL查询;通常被数据库产品用于SQL查询(脚本、文本、二进制)的文件扩展名

       STF:Microsoft 安装文件

       STM:.shtml的短后缀形式,含有一个服务端包括(SSI)的HTML文件;Scream Tracker V2音乐模块(MOD)文件

       STR:屏幕保护文件

       SVG:一种用XML定义的语言,用来描述二维矢量及矢量/栅格图形

       SWA:在Macromedia导演文件(MP3文件)中的Shockwave声音文件

       SWF:Flash动画文件

       SYS:系统文件

       T

       T:Commodore 仿真器磁带映像文件

       TDF:Text Design File 是一个文字格式,或者是一个字幕文件格式

       THEME:Windows 桌面主题文件

       TIF,TIFF:标签图像文件格式(TIFF)位图

       TLB:类似于.ocx,是一种ActiveX文件

       TMP:Windows临时文件

       TORRENT:BT种子文件

       TRM:终端文件

       TTF:TrueTypeFont是Apple公司和Microsoft公司共同推出的字体文件格式

       TXT:Windows文本文档

       TZ:老的压缩格式文件

       V

       VBA:VBase文件

       VBP:Microsoft Visual Basic工程文件

       VBW:Microsoft Visual Basic工作区文件

       VBX:Microsoft Visual Basic用户定制控件

       VCXPROJ:VC++ Project / C++ 工程文件

       VCXPROJ.FILTERS:VC++ Project Filters File / C++项目文件虚拟目录

       VCXPROJ.USER:Visual Studio Project User Options file / 项目用户配置

       VOB:DVD视频文件

       VQE,VQL:Yamaha Sound-VQ定位器文件

       VQF:Yamaha Sound-VQ文件(可能出现标准)

       VRF:Oracle 7配置文件

       VSL:下载列表文件(GetRight)

       W

       WAB:Microsoft Outlook文件

       WAD:包含有视频、玩家水平和其他信息的DOOM游戏的大文件

       WAL:Quake 2正文文件

       WAV:Windows波形声形

       WBK:Microsoft Word备份文件

       WFM:Visual dBASE Windows表单

       WFN:在CorelDRAW中使用的符号

       WIZ:Microsoft Word向导

       WOFF:Web Open Font Format Web开放字体格式,是一种网页所采用的字体格式标准

       WRL:虚拟现实模型

       WWL:Microsoft Word内插器文件

       X

       XLK:Microsoft Excel备份

       XLL:Microsoft Excel内插器文件

       XLM:Microsoft Excel宏

       XLS:Microsoft Excel 电子表格

       XLSB:Microsoft Excel 二进制电子表格

       XLSX:Microsoft Excel 电子表格

       XLT:Microsoft Excel模板

       XLV:Microsoft Excel VBA模块

       XLW:Microsoft Excel工作簿/工作区

       XML:可扩展标记语言

       Z

       ZAP:Windows软件安装配置文件

       zip:Windows RAR 压缩文件

       -:用于为老版本(或备份)文件编号(比如:被安装程序改变的CONFIG.SYS文件);又可用于为小范围的PC应用程序的多个用户相关数据文件编号

       M:Lotus 1-2-3 SmartMaster文件

       :Lotus 1-2-3 文件

       2D:VersaCAD的2维绘画文件

       2GR,3GR:在Windows之下的VGA图形驱动程序/配置文件

       :在或更高级处理器上使用的文件

       3D:VersaCAD的3维绘画文件

       3DM:3D NURBS建模器,Rhino

       3DS:3D Studio(DOS下)格式文件

       4GE:Informix 4GL编译后代码

       4GL:Informix 4GL源代码

简单说说ConcurrentSkipListMap

       åŸºæœ¬ä»‹ç»

       è·³è·ƒè¡¨çš„性质如下:

       æœ€åº•å±‚的数据节点按照关键字key升序排列;

       åŒ…含多级索引,每个级别的索引节点按照其关联的数据节点的关键字key升序排列;

       é«˜çº§åˆ«ç´¢å¼•æ˜¯å…¶ä½Žçº§åˆ«ç´¢å¼•çš„子集;

       å¦‚果关键字key在级别level=i的索引中出现,则级别level<=i的所有索引都包含该key。

       è·³è·ƒè¡¨ConcurrentSkipListMap的数据结构如下图所示,下图一共有三层索引,最底下为数据节点,同一层索引中,索引节点之间使用right指针相连,上层索引节点的down指针指向下层的索引节点。

源码分析核心字段分析

       head 指向 node(BASE_HEADER) 的顶层索引。

/***Thetopmostheadindexoftheskiplist.*/privatetransientvolatileHeadIndex<K,V>head;

       BASE_HEADER 头结点,即最顶层索引的头节点的value值

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()

       Node 静态内部类,即数据节点

/***数据节点*/staticfinalclassNode<K,V>{ finalKkey;//数据节点的keyvolatileObjectvalue;//数据节点的valuevolatileNode<K,V>next;//指向下一个数据节点/***Createsanewregularnode.*/Node(Kkey,Objectvalue,Node<K,V>next){ this.key=key;this.value=value;this.next=next;}}

       Index 静态内部类,即普通索引节点

/***普通索引节点*/staticclassIndex<K,V>{ finalNode<K,V>node;//索引节点指向的数据节点finalIndex<K,V>down;//当前索引节点的正下方索引节点volatileIndex<K,V>right;//当前索引节点的右索引节点/***Createsindexnodewithgivenvalues.*/Index(Node<K,V>node,Index<K,V>down,Index<K,V>right){ this.node=node;this.down=down;this.right=right;}}

       HeadIndex 静态内部类,即当前级别索引的头节点

/***当前级别索引的头节点*/staticfinalclassHeadIndex<K,V>extendsIndex<K,V>{ finalintlevel;//所处索引级别/***node:当前索引指向的数据节点*down:当前索引节点的正下方索引节点*right:当前索引节点的右索引节点*level:当前索引头节点所处的索引级别*/HeadIndex(Node<K,V>node,Index<K,V>down,Index<K,V>right,intlevel){ super(node,down,right);this.level=level;}}查询

       æ ¹æ®æŒ‡å®šçš„key查询节点,源码如下:

publicVget(Objectkey){ //调用doGet方法returndoGet(key);}/***真正实现查询方法*/privateVdoGet(Objectkey){ if(key==null)thrownewNullPointerException();Comparator<?superK>cmp=comparator;outer:for(;;){ for(Node<K,V>b=findPredecessor(key,cmp),n=b.next;;){ Objectv;intc;if(n==null)breakouter;Node<K,V>f=n.next;if(n!=b.next)//inconsistentreadbreak;if((v=n.value)==null){ //nisdeletedn.helpDelete(b,f);break;}if(b.value==null||v==n)//bisdeletedbreak;if((c=cpr(cmp,key,n.key))==0){ @SuppressWarnings("unchecked")Vvv=(V)v;returnvv;}if(c<0)breakouter;b=n;n=f;}}returnnull;}

       åœ¨ä¸Šè¿°ä»£ç ä¸­ï¼Œouter处的for自旋中,首先查看findPredecessor:查询指定key节点的前驱节点。该方法在下面的好多地方会调用,例如插入元素,删除元素以及删除元素对应的索引时都会调用。

       findPredecessor方法源码如下:

/***作用1:找到key对应节点的前驱节点,不一定的真的前驱节点,也可能是前驱结点的前驱节点*作用2:删除无效的索引,即要删除节点时,将节点的索引也删除掉*/privateNode<K,V>findPredecessor(Objectkey,Comparator<?superK>cmp){ if(key==null)thrownewNullPointerException();//don'tpostponeerrorsfor(;;){ //r为q节点的右指针指向的节点,r为当前比较节点,每次都比较r节点的key跟查找的key的大小关系for(Index<K,V>q=head,r=q.right,d;;){ if(r!=null){ Node<K,V>n=r.node;Kk=n.key;//该节点已经删除,需要删除其对应的索引if(n.value==null){ //该节点已经删除,需要删除其对应的索引if(!q.unlink(r))break;//restartr=q.right;//rereadrcontinue;}//当前查找的key比r节点的key大,所以r、q节点都向右移动if(cpr(cmp,key,k)>0){ q=r;r=r.right;continue;}}//当q的下方索引节点为空,则说明已经到数据节点层了,需要退出进行后续查找处理if((d=q.down)==null)returnq.node;/***此时当前查找的key小于r节点的key,需要往下一级索引查找*d节点赋值为为q节点为正下方节点,即下一级索引的正下方节点*/q=d;r=d.right;}}}

       findPredecessor方法的查找过程图示如下:假设要查找节点6

       ç”±äºŽå½“前r节点的key比查询的key小,所以,r、q节点都向右移动,即执行如下代码:

//当前查找的key比r节点的key大,所以r、q节点都向右移动if(cpr(cmp,key,k)>0){ q=r;r=r.right;continue;}

       æ­¤æ—¶r节点指向的数据节点为,节点的key比6节点的key大,此时需要执行如下代码:

/***此时当前查找的key小于r节点的key,需要往下一级索引查找*d节点赋值为为q节点为正下方节点,即下一级索引的正下方节点*/q=d;r=d.right;

       æ­¤æ—¶r节点指向的数据节点为5,5节点的key比6节点的key小,q、r节点向右移动,如下图所示

       æ­¤æ—¶r节点指向的数据节点为,节点的key比6节点的key大,同理需要往下级索引走,如下图所示:

       æ­¤æ—¶r节点指向的数据节点为,节点的key比6节点的key大,同理需要往下级索引走,但是此时下一级索引为空了,即(d = q.down) == null了,此时执行的代码如下, 返回q索引指向的节点,即返回节点5.

//当q的下方索引节点为空,则说明已经到数据节点层了,需要退出进行后续查找处理if((d=q.down)==null)returnq.node;

       ä»¥ä¸Šå°±æ˜¯æ–¹æ³•findPredecessor的查找流程,咱们接着继续看上面的doGet方法

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()0

       é¦–先初始化b、n、f三个节点,如下图所示

        发现此时n节点指向的节点就是要查询的节点,于是执行如下代码:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()1

       ç›´æŽ¥è¿”回n节点的value值。查询操作完成。

插入

       è·³è·ƒè¡¨çš„插入操作分以下四种情况:

       æƒ…况1:跳跃表内存在key一致元素,做替换

       æƒ…况2:插入新元素,无须给新元素生成索引节点

       æƒ…况3:插入新元素,需要给新元素生成索引节点,且索引高度 < maxLevel

       æƒ…况4:插入新元素,需要给新元素生成索引节点,且索引高度 > maxLevel

       æºç å¦‚下:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()2

       é¦–先还是跟查询操作类似,调用findPredecessor方法先查找到待插入key的前驱节点,举个例子,例如我们想要插入节点7,如下图所示:

       æŽ¥ç€è·ŸæŸ¥è¯¢æ“ä½œä¸€æ ·çš„步骤如下,直接看图:

        此时r节点指向数据节点1,节点1的key小于待插入的节点7的key,于是节点q、r同时向右移动。

       æ­¤æ—¶r节点指向数据节点,节点的key大于待插入节点7的key,于是往下一层索引继续查找,执行的代码如下:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()3

       åŽé¢çš„操作类似

       æ­¤æ—¶r节点的key大于待插入的节点6的key,但是q节点的down指针已为空,此时直接返回q节点指向的节点5。

       æŽ¥ç€å›žåˆ°doPut方法,先来查看outer循环,如下:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()4

       é¦–先初始化三个节点b、n、f,n节点为b节点的下一个节点,而f节点为n节点的下一个节点,如下图所示

       æŽ¥ç€æ¯”较节点n与待插入的key的大小,此时n节点的key小于待插入节点的key,于是b、n、f三个节点均向下移动如下图所示

       æ­¤æ—¶n节点的key大于待插入的key,此时执行如下代码,通过cas方式修改b节点的下一个节点为z节点,接着跳出outer循环。

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()5

       ç„¶åŽæˆ‘们知道doPut剩下的代码无非就是判断是否给新插入的节点z创建索引,如果需要创建对应的索引。

       é¦–先通过int rnd = ThreadLocalRandom.nextSecondarySeed();计算出一个随机数,接着进行如下判断:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()6

       å¦‚æžœrnd & 0x) == 0就给新插入的z节点创建索引,我们知道0x = 即最高位和最后一位为1,其余全部是0,

       æ¡ä»¶ï¼š(rnd & 0x) == 0什么时候成立?

       rnd这个随机数最低位和最高位同时是0的时候,条件成立,概率是1/4

       ä¸¾ä¸ªä¾‹å­ï¼šä¾‹å¦‚rnd = = 3条件就成立。

       å¦‚果条件成立的话,接着计算到底给z节点创建几级索引,代码如下:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()7

       é€šè¿‡while条件((rnd >>>= 1) & 1) != 0满足几次就创建几级索引。例如:

       rnd = 计算出来的level => 3

       rnd = 计算出来的level => 8

       ç„¶åŽæŽ¥ç€æ¯”较计算出来的z节点的索引跟现有的跳跃表的索引级别大小。

       æƒ…况一:z节点计算出来的索引level比跳跃表的level小

       æƒ…况二:z节点计算处理的索引level比跳跃表的level大。此时会选择最终的level为原来的调表的level + 1

       æƒ…况一

       ç»™z节点创建索引的步骤如下图所示,此时z节点的索引还没有加入跳跃表现有的索引队列中

       æŽ¥ç€ç»§ç»­æ‰§è¡Œsplice循环,代码如下:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()8

       åˆå§‹åŒ–q、r节点如下图所示

       æ­¤æ—¶r节点的key比新插入z节点,即7节点小,于是两个节点q、t都向右移动如下图所示

       æ­¤æ—¶r节点的key比新插入z节点,即7节点大,执行如下代码:

/***Specialvalueusedtoidentifybase-levelheader*/privatestaticfinalObjectBASE_HEADER=newObject()9

       æ­¤æ—¶r节点的key比新插入z节点,即7节点小,于是两个节点q、t都向右移动如下图所示

       æ­¤æ—¶r节点的key比新插入z节点,即7节点大,同理,直接看图

       æƒ…况二

       è·Ÿæƒ…况一类似,这里就不一一画图了

删除

       åˆ é™¤æ–¹æ³•å®Œæˆçš„任务如下:

       è®¾ç½®æŒ‡å®šå…ƒç´ value为null

       å°†æŒ‡å®šnode从node链表移除

       å°†æŒ‡å®šnode的index节点 从 对应的 index 链表移除

/***数据节点*/staticfinalclassNode<K,V>{ finalKkey;//数据节点的keyvolatileObjectvalue;//数据节点的valuevolatileNode<K,V>next;//指向下一个数据节点/***Createsanewregularnode.*/Node(Kkey,Objectvalue,Node<K,V>next){ this.key=key;this.value=value;this.next=next;}}0

       åŒæ ·ï¼Œé¦–先通过findPredecessor方法查找到要删除key的前驱节点,就不一一画图了,直接看找到的前驱节点的图,如下:

       æŽ¥æ¯”较n节点的key与待删除的key的大小,此时n节点的key小于待删除的key,即7节点的key,于是将b、n、f三个节点都向右移动,如下图:

       æ­¤æ—¶n节点的key跟待删除的key一样,于是执行如下代码:

/***数据节点*/staticfinalclassNode<K,V>{ finalKkey;//数据节点的keyvolatileObjectvalue;//数据节点的valuevolatileNode<K,V>next;//指向下一个数据节点/***Createsanewregularnode.*/Node(Kkey,Objectvalue,Node<K,V>next){ this.key=key;this.value=value;this.next=next;}}1

       æœ€åŽå†è°ƒç”¨findPredecessor清楚无效的索引,即上面删除的节点的索引。

/***数据节点*/staticfinalclassNode<K,V>{ finalKkey;//数据节点的keyvolatileObjectvalue;//数据节点的valuevolatileNode<K,V>next;//指向下一个数据节点/***Createsanewregularnode.*/Node(Kkey,Objectvalue,Node<K,V>next){ this.key=key;this.value=value;this.next=next;}}2

       é‡ç‚¹é å¦‚下代码块删除索引的:

/***数据节点*/staticfinalclassNode<K,V>{ finalKkey;//数据节点的keyvolatileObjectvalue;//数据节点的valuevolatileNode<K,V>next;//指向下一个数据节点/***Createsanewregularnode.*/Node(Kkey,Objectvalue,Node<K,V>next){ this.key=key;this.value=value;this.next=next;}}3

       æˆ‘们知道在上面已经将待删除的7节点的value置为null了,直接看图:

       æ­¤æ—¶r节点的key小于待删除节点的key,于是r、q节点都向右移动。

       æ­¤æ—¶r,n节点指向的数据节点的value值为null于是执行上面的q.unlink(r)代码,将q的右指针指向r的右指针指向的节点,即就是删除了该level上的7节点的索引节点,如下图所示

       æ­¤æ—¶r节点的key大于待删除节点的key,于是往下一索引走,如下图所示

       æ­¤æ—¶r节点的key小于待删除节点的key,于是r、q节点都向右移动。

       æ­¤æ—¶r,n节点指向的数据节点的value值为null于是执行上面的q.unlink(r)代码,将q的右指针指向r的右指针指向的节点,即就是删除了该level上的7节点的索引节点,如下图所示

       åŽç»­æ“ä½œåŒç†ï¼Œæœ€ç»ˆå°†7节点的索引一一删除完,最终的图下所示

相关栏目:探索