这里是修真院后端小课堂,每篇分享文从
八个方面深度解析后端知识/技能,本篇分享的是:
【数据结构-增强数据的功能】
【修真院java小课堂】数据结构-增强数据的功能
大家好,我是IT修真院深圳分院第12期的学员,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务10,拓展的内容-数据结构之增强数组。
(1)背景介绍
程序=数据结构+算法,都说不会数据结构跟算法的软件工程师不是好的程序员,数组作为数据结构中很基础的一种,学习跟跟深入了解非常有必要。今天的小课堂以数组为基础,将数组封装起来,给其添加增删改查和扩容等功能。
(2)知识剖析
a)数组的特点
数组的长度一旦定义则不能改变
数组中的元素都有整数索引
数组只能存储同一类型的元素
数组即可以存储基本数据类型,又可以存储引用数据类型
b)数组的优缺点
由于数组每个元素都是有索引的,所以访问数组的任一元素是非常快的,复杂度为O(1)级别,但是往数组任意一个位置插入数据则不方便,因为每次插入一个元素,后面的元素就要往后挪动一位。时间复杂度为O(n),因此如果需求是频繁地查询比较适合用数组。
c)改进数组
可以给数组加上自动扩容地功能。
(3)常见问题
数组和链表的比较?
(4)解决方案
获取结点:只能遍历链表,然后一个一个查看
添加结点(在结点2后面添加一个结点9):
把结点2的下一个结点地址值修改为新结点9的地址值,把新结点9的下一个地址值改为结点3的地址值
链表特点:查询慢,增删快;
(5)编码实战
5.1将数组封装起来
这里要说明下是使用了泛型,也就是往这个自定义的数组容器中放任何东西。(除了基本类型?)
com.ch0918.arrayArray<> {
[] (capacity) {
= ([])Object[capacity]= }
() {
()}
}
给数组添加新功能,例如得到数组的大小,数组的容量,判断数组是否为空。//得到数组的大小
() {
}
() {
.}
() {
== }
往数组里新增元素,特别注意这里是做了自动扩容处理的,当数组里的元素达到数组的长度是,就将数组的容量扩大到数组原来的两倍。
(e) {
addElement(e)}
(indexe) {
(index < || index > ) {
IllegalArgumentException()}
(== .) {
resize(* .)}
[index] = e++}
(e) {
addElement(e)}
修改数组的某个位置的元素
(indexe) {
(index < || index > ) {
IllegalArgumentException()}
[index] = e}
查找数组
(e) {
(i =i < i++) {
([i] == e) {
System…println([i])}
}
}
(e) {
(i = i < i++) {
([i] == e) {
i}
}
-}
删除数组
(index) {
(index < || index > -) {
IllegalArgumentException()}
(< ./){
resize(./)}
temp = [index](i = indexi < i++) {
[i] = [i+]}
–temp}
() {
removeElementAt()}
() {
removeElementAt(-)}
(e) {
elementIndex = findElementIndex(e)(elementIndex != -){
removeElementAt(elementIndex)}{
IllegalArgumentException()}
}
扩容的方法
(capacity) {
Array<> newArray = Array<>(capacity)System.(newArray.)= newArray.}
(6)拓展思考
(7)参考文献
【参考一】https://blog.csdn.net/boss_way/article/details/78358615
(8)更多讨论
Q1:基于数组的数据结构常见的有哪些?
A1:java中以数组为基础的最常见就是ArrayList了,一般查询操作比较频繁,并且元素可重复,并且不需要以key-value形式存储的,都会选择用ArrayList存储数据。
Q2:什么时候适合用数组
A2:当索引是有意义的,比如一个班的学生,学号是对应一个学生(当然学号不能太大,比如1,2,3…)这时候用数组比较适合。
Q3:除了数组这种线性数据结构,还有哪些线性的数据结构?
A3:另外还有链表,栈,队列。
(9)鸣谢
(10)结束语
今天的分享就到这里啦,欢迎大家点赞、留言、转发、抛砖~