由于工作原因,很久没有写一些学习的博客了。
最近抽空在看数据结构和时间复杂度的文章,今天想谈一下数组和链表相关的问题。
目录
1. 数组
1.1 什么是数组
数组就是由相同类型的元素集合组成的固定长度的一种数据结构。在内存中开辟的空间是顺序存储的,因此可以通过下标index计算出某个元素的地址。
需要提前预约空间。
1.2 数据结构
1.2.1 一维数组
int[] arr = {1,2,3,4};
如上图所示,如果我们编写上述代码。那么可视为栈中会出现这一个数据结构。
或者我们这样:
int[] arr = new int[4];
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
arr[3] = 4;
由于我们使用了new关键字,所以会在堆中开辟空间
1.2.2 多维数组
int[][] arr = {
{1,2,3},{4,5,6},{7,8,9}};
1.3 为什么数组下标是从0开始
在我们编程的过程中,可能会很多次用到arr[0],这样的操作。大家有没有想过,为啥下标index是从0开始呢?
数组的寻址公式:
arr[N] = base_address+N*data_type_size;
base_address:基础地址;
data_type_size:每个数组中元素的大小;比如说int类型,那就是4
比如说:我们当前数组的基础地址是从1000开始,base_address=1000,如果我们想得到数组的第一个地址。那么根据公式:arr[0] = base_address+0*data_type_size=base_address=1000,刚好就在我们开始的位置。
但是如果我们下标从1开始计算,那么如果我想得到第一个数据的地址,根据公式,我们应该进行这样的运算:arr[i] = base_address+(i-1)*data_type_size;此时i>0
有人可能会说了,不就多了个1-1嘛。算出来还不是一样的值。有啥影响呢?
但事实上没那么简单~ 对于我们来说,这种计算可能没有任何影响。但是对于cpu来说,相当于至少多了一条减法指令。有的同学应该看过字节码文件编译之后得到的汇编语言,如下图
但