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

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

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

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

u=1270734407,3065825153&fm=173&app=25&f=JPEG?w=640&h=137&s=4996ED1ACDA44C11024DD0D60200C0B1

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

a3a68d878cb1e5327dc9596836da9ec2.png

这是我刚刚学习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的应用面积较广。本次代码较少,接下来将从代码层面深入讲解每个容器的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值