JAVA数组,几个需要注意的小点(数组内存结构、数组交换值的最简方法)

一、数组的初始化

静态初始化:

静态初始化数组需要定义时给出元素内容。

1、数据类型[] 变量名=new 数据类型[]{ value  };

举例:

int[] array=new int[]{1,2,3,4,5}

2、数据类型[] 变量名 ={ value}

举例:

int[] array={1,2,3,4,5}

3、

int[] array;
array=new int[]{1,2,3,4,5}

注意,如果像第三种方法这样定义数组,则一定要写等号左边的 new int[].

动态初始化

数据类型[] 数组名=new 数据类型[数组长度]

举例:

int array=new int[10];

这里只定义了数组长度,并且数组长度一旦定义就不能再更改。

可以通过多种方式为数组赋初值。

如果数组内的值有规律的话,最常用的方法就是用for循环赋值。

for(int i=0;i<array.length;i++)
{
    array[i]=i;

    //array[i]=i*2-1;等等
}

如果没有规律,或者只需要对某个特定的位置赋值的话,采用下面的方式

array[index]=value;//index是你需要插入数据的位置,value是需要插入的值

array[0]=1;//给数组的第一个位置赋值为1;

注意:数组的序号(下标)从0开始。

二、数组的遍历(输出)

数组的输出,还是采用for循环的方式

for(int i=0;i<array.length;i++)
{
    System.out.println(array[i]);
 }

但是这种方式需要写循环条件,且需要知道数组长度。为了简化数组的输出,介绍一下加强for。

加强for循环

在JDK1.5版本之后,for循环出现了新的特性,叫加强for循环(forEach)

格式:for(  :  ) ,用冒号隔开两个参数

第一个参数是自己定义的用来接收数组中值的变量,第二个参数是需要遍历的数组名

例:

for(int v:array)
{
    System.out.print(v);//此时输出V就可以了
}

虽然加强for循环简化了输出数组的代码,方便了我们编码。但是其也有相应的缺点

1、没有index,无法确定具体某一个位置的元素,或者找不到元素的位置

2、只能用来从数组中取出数据,不能用来往数组中存数据

3、不能取某一个具体位置的数据

因此在使用for和加强for时,要考虑清楚情况使用。

 

三、基本数据类型和引用数据类型在内存结构上的区别

平时我们使用的int,double ,char,......,这些数据类型叫作基本数据类型。

而数组则是属于引用数据类型,也是我们第一个接触到的引用数据类型。基本数据类型和引用数据类型在平时使用时看起来好像没什么区别,但是在内存结构上,却有着巨大的差异。下面我们就来说说他们之间的差异。

    首先,基本数据类型的变量空间内存储的就是变量的值,变量之间传递的也是值;而引用数据类型变量空间内存的却是数据的引用(通俗来讲就是数据存储的地址),变量之间传递的也是引用(地址),因此当把一个引用数据类型的变量x赋给另一个引用数据类型变量y时,实际上是将x中存储的地址传递给了y,此时原本只有x能访问到的数据y也能通过寻址访问到了。

下面通过例子和内存变换示意图来展现这两者之间的差异:

        int a=10;
	int b=a;
	b=100;
	System.out.println(a);//a=10;

        
	int[] x={10,20,30};
	int[] y=x;//在这一步,x传递给y的是 存放在x中的数据在内存中的地址
	y[0]=100;//所以当b在这里改动值时,实际上改动的也是x中地址所指向的那个数组的值
	System.out.println(x[0]);//x[0]=100;

       看下图中的内存变换示意图。数组声明的变量x放在栈内存中,即变量空间在栈内存里,而当要存储数据时则是在堆内存中开辟了连续的三个空间,这三个空间的首地址存放在x变量中。因此当声明一个新的数组y,并且直接将x赋值给y时,实际上是将x中的地址赋值给了y。也就是说,现在x和y这两个变量都能访问堆内存中的这个数组(在这里y并没有新建一个堆内存空间)。因此,其中一个对这个数组值进行了改变,另一个变量也会跟着改变。

 

由此,也引出了一个题目:交换两个数组的值

正如题目中所示,当已知两个数组中元素的个数,并且个数相同时,我们可以选择通过循环的方式进行交换值。但是一旦当两个数组的长度不一样,或者我们不知道两个数组的具体情况时,再使用这种方法就容易出问题。

因此我们可以采用交换两个数组变量中地址的形式来进行数组元素的交换。即原来a中存储的地址交给b,而将b中的地址交给a,这样两个数组变量就可以访问到对方的元素了。这种方法避免了数组长度不一带来的影响,并且相较于第一种方式,时间复杂度大大降低了。极大的优化了代码。

发布了47 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/monologuezjp/article/details/92018227