在JAVA语言中,数组是一种按照顺序结构存取同一类型数据的的最基本数据结构之一。数组也是我们研究我们所需要的算法中的很重要的一种工具。下面我也来浅谈一下自己的一点体会。
数组中可以存储基本类型数据和存储引用类型数据。
存取基本类型数据的数组声明方式有三种以整形为例:
- int [] a=new int[size];//size为大于0的整数,表示的是数组的长度;
- int [] a={1,2,5,6};//代表整形数组a是长度为4的数组,1,2,5,6为数组的元素值;
- int [] a=new int[4]{1,5,7,8};
存取引用类型数据的数组具体包括三类:
- 类 Class 2. 接口 Interface 3. 数组 Array
对于基本数据类型数组来说,在进行运算的时候一般采用的是传值传递,而引用类型数据的数组采用的是引用传递。传值传递,只是将数据的值进行复制传递,改变复制的这个参数,不会对原来数据进行改变。而引用传递,传递的往往是变量或者对象的地址,由于参数与原值的地址是相同的,所以改变这个地址所指向的数据,相对应的也会将原值指向的数据改变。下面我们通过一个图片来说明一下:
变量x和变量t指向同一个实体,那么我们通过参数t改变这个实体,就会反作用与这个变量x(类似于C/C++里面的指针)。
接下来是要看一看数组的访问:
我们访问数组,实际上是对数组中的元素进行访问,这时候我们通过数组的索引来查找,索引又叫做数组的下标。当然通过for循环的遍历输出,也能够给数组中的每一个元素输出一遍。也可以使用for-each语句。相对于for循环语句更加简洁。两者的形式如下:
for(int i=0;i<array.length;i++)\\for循环
for(type e: array)\\for-each语句
对比一下是不是后者更加简洁
说到了数组,我们很自然而然的也就会想到for循环的使用,这是我们数组中用的最多的逻辑结构了,无论是数组元素的初始化,数组的遍历,元素的查找,排序都离不开for循环。java中有自带的API数组类Arrays(java.util.Arrays)。
以上表中是Arrays类的具体用途,个人借来参考一下。
多维数组的声明也有两种方式:
*直接为每一维分配空间
例如:type arrayName=new type[arraylength1][arraylength2];
我们是将二维数组a可以看出一个两行三列的数组
*从最高维开始,分别为每一维分配空间
String s[][]=new String[2][];
s[0]=new String[2];
s[1]=new String[3];
s[0][0]=new String("I");
s[0][1]=new String("am");
s[1][0]=new String("a");
s[1][1]=new String("good");
s[1][2]=new String("student");
s[0]=new String[2];和s[1]= new String[3];是为最高维分配引用空间,也就是为最高维限制其能保存数据的最大长度,然后再为每个数组元素单独分配空间,即s[0[0]==newString(“I”);等操作。
多维数组的内存分配:
声明的二维数组后,我们需要为二维数组分配内存空间,才可以使用。为二维数组分配内存空间的语法格式如下:
数组类型[][] 数组名=new 数据类型[第一维数][第二维数];
二维数组的长度表示为:二维数组名.length
对于多维数组使用for循环遍历,第一个外循环为数组名.length;第二个循环范围为数组名[第一维数变量].length,依次类推。
数组作为一种顺序结构的数据结构,相较于其他数据结构来说,具有很好的查找效率。
但是又由于其需要在对象创立的时候,通过new关键字已经为数组分配了确定的内存空间,这时候就显得缺乏灵活性,不必要的会出现内存浪费,以及数组越界(一种常见的异常,需要注意)。
我们之所以把数组看作是最基本的数据结构,一个很重要的原因是所有的计算机内存系统,都会跟我们所说的数组进行直接通信。内存中的内容可以看作一个个内存块,访问每一个内存块,都需要提供一个地址。这样,如果我们抽象的把计算机看作是一个大的数组,我们就可以通过下标,很轻松的查找到我们所需要的内存数据。
最后补充一个数组方面的小方法叫做埃拉托色尼筛:
public class Test {
public static void main(String [] args){
int N=Integer.parseInt(args[0]);
boolean [] a=new boolean[N];
for (int i=2;i<N; i++)
a[i]= true;
for(int i=2;i<N ;i++)
if(a[i]!=false)
for(int j=i;j*i <N;j++)
a[i*j] =false;
for(int i=2; i<N; i++)
if(i>N-100)
if(a[i])
System.out.print(" "+i);
System.out.println();
}
}
我输入的参数是args[0]=32 ,输出如下:
关于数组的排序方法在这里就不说了,等下次把排序算法完全弄懂了,在单一写一篇博客出来。