本文主讲介绍几种常用的数据结构,数据结构是一种容器的一个分支,容器时用来装东西的,那么数据结构就是专门用来存储数据的容器。首先我们从数组来给大家渐渐引入数据结构,容器的概念。那么数组是什么呢,数组是一个对象,准确的说我们将对象进行分类,具有特定功能的对象就被成为数据结构或者容器,集合等,数组就是其中之一。有一个人说过程序就是算法与数据结构,这句话大体上能够描述程序。

我们从数组的特性来慢慢延伸到集合。如果面试官要你介绍一下数组该怎么说呢,它的容量是固定的,其中每个元素对应一个唯一的下标,通过下标我们可以找到相应的元素,那么这种通过K找到V的结构我们称为表对吧。

首先从数组的容量来看,它的容量是在一开始被创建就固定了的,如int[] i={1,2,3};或者int[] is=new int[8];那我们如何对数组进行扩容呢,看如下代码

扩容用乘法,缩减用除法,使用原有数组长度作为一个新的标准量来参照扩大或缩小的倍数,那为什么不手动输入一个数字来定义数组大小呢,那样就把代码写死了,实际上应该是原数组长度*n。我们除了会对容量进行操作外,其次就是最重要的增删了,改是非常简单的,直接通过下标取出元素然后赋值即可。那么我该如何向数组中删除一个元素呢

这是我刚刚学习java时写的一小段代码,它用于删除数组指定下标的元素,逻辑就是将要删除的下标置换到数组尾部然后缩减数组长度,添加也是同样的方法,总之是非常的麻烦,那么对数组这种结构可以归纳为数组是一种被创建时长度固定,难增删的数据结构,但是它由于有下标作为索引所以能够快速定位到指定下标的元素,同时java.util.Arrays是JDK提供的对数组操作的工具类,它用于帮助我们更好地使用数组,包括

//Arrays.sort(a, c);//Arrays.binarySearch(a, key) //Arrays.deepEquals(a1, a2) //Arrays.parallelPrefix(array, op); //Arrays.stream(array)

这几种方法,第一个排序,第二个使用二分法搜索,第三个判断两个数组是否每个元素都一致,第四第五都是JDK8提供的,用于函数式编程。其他还有fill填充等,可以自己挨个去看看。

它还有一个很有意思的方法叫做Arrays.asList(),该方法要求传入一个数组变量然后能够将数组转为List,那么List是什么呢?

List是一种非常常用的数据结构,叫做链表。为了避免数组插入和删除对资源的线性开销,就是数组长度越长添加元素耗费的资源就越多,使用不连续存储的链表就能够解决这个问题。链表的思想是每个元素首位相连,因为叫做链表所以它其实还是一种KV结构,第一个元素的V作为第二个元素的K,第二个元素的V作为第三个元素的K,最后一个元素的V为null。如果不明白的话可以想象一下电影人体蜈蚣,这种结构的好处就是我们对其增删只需要断开前一个元素的V和后一个元素的K即可,就像插件一样,是可插拔的。List是一个接口,它有两个子类,ArrayList和LinkedList,看名字就可以看得出一种是基于数组实现另一个是基于链表实现的。LinkedList相比ArrayList而言有更高效的插入和删除执行速度, LinkedList才是真正意义上的链表。链表的特点就是增删快,但是搜索指定元素消耗的资源也是呈现线性增长的。

除了数组和链表之外还有很多很多种延伸出的结构被用作不同的应用场景,如果你理解数组和链表那么遇到新的数据结构也会容易上手,也可以自定义一个自己需要的容器。Set是一种自带去重的容器,它和List一样同属Collection的子类,特点就是不会出现重复元素。有两个常用子类hashSet和linkedHashSet,hashSet的内部是一个hashMap,特点是取出元素的顺序不一定与存入顺序一致,它没有一个专门用于记录顺序的索引, linkedHashSet是一个有序的set,它有专门用于记录顺序的索引。

下一个数据结构就是Map,map是一种特殊的结构,它内部储存的是键值对,与List都是同为表,区别就是map的K是可以被我们使用的,它将K,V封装为一个整体Entry,这里的Entry作为一个元素,相当于List中的一个元素,然后Entry中还有两个元素K和V。Map接口有一个上面提到过的子类HashMap,只要看带有Hash前缀的容器就说明,它的索引是由哈希算法也叫散列算法计算得出的,它是一种摘要算法也就是我们常用的md5,sha256的原型,这种算法计算得出的索引是唯一的,那么map的特点就是Entry中的K唯一,V可以重复。它也提供了很多自己独有的API,所以map的应用面积较广。本次代码较少,接下来将从代码层面深入讲解每个容器的实现。

java数据结构_概述Java中的数据结构是什么及其内部实现原理相关推荐

  1. 数据结构c语言版袁和金答案,_数据结构_课程教学中的案例设计及应用_袁和金.pdf...

    _数据结构_课程教学中的案例设计及应用_袁和金 第 16 期 90 2013 年 8 月 25 日 Computer Education G642 袁和金 (华北电力大学 计算机系,河北 保定 071 ...

  2. java简单数据结构_图解Java常用数据结构

    最近在整理数据结构方面的知识, 系统化看了下 Java 中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于 jdk8, 可能会有些特性与 jdk7 之前不相同, 例如 LinkedList ...

  3. java必学之Redis中的数据结构

    目录 一.String不在适用Redis底层数据结构 1.String类型的内存消耗问题 2:String类型怎么保存数据 2.1RedisObject结构体: 2.2int.embstr和raw这三 ...

  4. 谷歌去水印java实现_在Java中实现Google的“您的意思是”功能

    谷歌去水印java实现 介绍 搜索引擎用户经常因各种原因而拼写错误的搜索词,包括键盘问题(键不起作用),陌生的国际名称(例如Sigmund Freud),意外更改一个字母(Sinpsons)或添加一个 ...

  5. linux java 栈_关于Java中栈与堆的思考

    1. 栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. 2. 栈的优势是,存取速度比堆要快,仅次于直接位于C ...

  6. js 中 java 代码_在js中嵌套java代码

    jsp中有时候在js中操作某些java后台传递过来的数据逻辑比较复杂,比如list内容的遍历,可以直接在页面上添加java脚本来执行内容,代码如下: //在js中插入java代码操作 //取出java ...

  7. java 企业版_下列版本中哪个是Java 企业版

    下列版本中哪个是Java 企业版 2021-02-07 下列版本中哪个是Java 企业版 张爱玲评价自己的服饰:"仿佛穿着博物院的()到处走,遍体森森然飘飘欲仙".转动惯量是刚体转 ...

  8. jython 导入java包_在jython中导入java类

    我用python处理NLP.有一个NLP工具,即Zemberek,用于土耳其语.但它是用java编写的.所以我必须使用jython来导入这些类.我安装了Jython2.7.另外,我安装了eclipse ...

  9. 修改docker内java内存_在docker中使用java的内存情况

    Java和Docker不是天然的朋友. Docker可以设置内存和CPU限制,而Java不能自动检测到.使用Java的Xmx标识(繁琐/重复)或新的实验性JVM标识,我们可以解决这个问题. 虚拟化中的 ...

最新文章

  1. 面试官:说说RabbitMQ 消费端限流、TTL、死信队列
  2. python中类方法与实例方法的区别-Python实例方法、静态方法和类方法详解(包含区别和用法)...
  3. 9.JAVA-抽象类定义
  4. linux 端口打不开,在线等!!为什么telnet的23端口就是打不开啊
  5. VS2010中无法嵌入互操作类型“......”,请改用适用的接口的解决方法
  6. CardLayout使用
  7. Python数据结构与算法(1.7)——算法分析
  8. html th width无效 解决方法
  9. php 数据结构set,ES6的Set数据结构是什么
  10. 两台200smart以太网通讯_S7-200 SMART PLC之间如何实现以太网通信?(附接线图)
  11. 简要罗列通过Allegro绘制的PCB封装步骤
  12. html桌面插件,纯JS和CSS3炫酷桌面便签贴纸特效插件
  13. linux、ubuntu如何查看网速
  14. Docker容器获取宿主机信息
  15. 图计算库 igraph 在 windows 10 上的编译安装
  16. 电脑怎么录制屏幕视频,3种方法,轻松弄懂
  17. 自动驾驶(七十二)---------LQR控制算法
  18. [Python|Clothoid]Clothoid曲线(回旋曲线)与直角坐标求解的python实现
  19. C语言双引号A单引号A,C语言查漏补缺——单引号和双引号
  20. creo 6.0—11:圆角、倒角绘制,文本(文字)创建

热门文章

  1. 巧用TreeSet求解第k小整数(洛谷P1138题题解,Java语言描述)
  2. 【C语言】C语言的数据类型
  3. 修改 gcc 和 g++ 的默认版本
  4. PDF编辑器哪个好,如何在PDF中插入图片背景
  5. 基于.Net + SqlServer的分库分表设计方案
  6. esxi备份,datastore,vmdk
  7. 阿里云经典网络与Rancher VXLAN兼容性问题
  8. 【Unity】UGUI无法修改字体大小
  9. MySQL百万级数据库优化方案
  10. Spring笔记——使用Spring进行面向切面(AOP)编程