java 修改数组最后一个值 java数组调换位置_java 修改数组最后一个值


我想在任何的一种编程语言中都应该存数组这种结构吧...

如何实现随机访问

数组是一种线性表数据结构。它用一组连续内存空间,来存储 一组具有相同类型的数据。

1.线性表:数据就像一条线那样进行排列;

2.连续的内存空间和相同的类型的数据:这两个特性,造就了数组的”随机访问“,但是也给数组的增加,删除等带来了不便,需要进行数据搬移来维护这一特性。

数组是如何根据下标进行随机访问的?

首先记录首位的内存地址:1000,每个数组的数据单元是4个字节(int类型的大小),那么可以表示数组各个数据单元的地址为:

a[i]_address = base_address(首位内存地址) + i*data_size(数据单元的大小);

关于数组与链表的区别有这样的一段话:"链表适合插入,删除,时间复杂度为O(1);数组适合查找,查找的时间复杂度为O(1).";关于这段描述是不准确的,正确的表达应该是根据下标进行查询的时间复杂度为O(1).

数组的增加和删除

数组的增加的复杂度分析:

n/2n = (n+1)/2 = O(n);但是如果是替换到指定下标的数据,那么时间复杂度就是O(1);

数组的删除的复杂度分析:

如果想之前对数组中指定下标进行删除,因为数组是连续空间,如果删除的话,需要进行补位,与上边新增添加复杂度分析类似可以知道,最好情况时间复杂度就是删除队尾的话那么时间复杂度就是O(1),最坏情况复杂度就是O(n);平均时间复杂度就是O(n);

也可以进行一种逻辑删除,当进行删除的时候,先做一个删除标记,等到数组没有空间的时候再进行一次物理空间的清理。这里就类似JVM的清除算法中的标记删除。

“数据结构和算法的魅力就在于此,很多时候我们并不是要记硬背某个数据结构或者算法,而是要学习它背后的思想和处理技巧,这些东西才是最有价值的。”

数组越界的问题

在java会存在数组越界异常:java.lang.ArrayIndexOutOfBoundsException。但是有其他语言中可能不会有这个异常;像c语言对内存操作的'权限'比较高,只要不是访问受限的内存,所有的内存空间都是可以自由访问的,如果出现数组越界的问题,依然可能进行访问,导致代码无限执行.像python这种语言,可以设置下标为负数...


# python数组下标为负数
list = [1,2,3,4,5]
list[-1] = -1
print(list[-1])


趣味思考:

为何大部分数组的下标起始位置是0而不是1呢?

猜测一:效率分析

根绝上边的地址公式:

a[i]_address = base_address(首位内存地址) + i*data_size(数据单元的大小);

如果下标从1开始,那么公式就有变成了:

a[i]_address = base_address(首位内存地址) + (i-1)*data_size(数据单元的大小);

这里cpu计算就会多一次减法运算,数组作为一中非常基础的数据结构,效率的优化尽可能的做到极致,为了减少这一次减法操作,数组选择从0开始编号.

猜测二:

C语言的设计使用了起始位置为0,之后的Java,Javascript等高级语言都效仿了C语言。“天不生仲尼,万古如长夜”,C语言的诞生,给后续的语言照亮了一条路,或是顺从,或是叛逆,都会与这种语言进行比较。

知识的扩展:

一.JVM垃圾回收算法-标记清楚

根据这名字就是这个回收算法分为两个阶段:

1.标记:标记需要清理的内存空间(可达性分析之后可以被回收的内存空间)。

2.删除:删除这些被标记的内存空间;

优势:算法简单;存活对象比较多的情况下效率比较高;

缺点:产生内存碎片;可能效率比较低(垃圾对象比较多的时候)

二.内存寻址公式的计算:


java 修改数组最后一个值 java数组调换位置_数据_02