java—数组的定义与使用

数组的基本概念:

数组指的就是一组相关变量的集合。

² 声明并开辟数组:数据类型  数组名称[]=new 数据类型[长度];

² 分布完成:

l 声明数组:数据类型    数组名称[] = null;

l 开辟数组:数组名称 = new  数组类型[长度];

当数组开辟空间之后,那么可以采用“数组名称[下标|索引]”的形式进行访问,但是所有数组的下标都是从零开始的,即:如果是3个长度的数组,那么下标的范围是0~2,一共是三个内容。如果访问的时候超过了数组的允许下标长度,那么会出现数组越界的异常信息,ArrayIndexOutOfBoundsException

以上给出的数组定义结构使用的是动态初始化的方式,即:数组会首先开辟内存空间,但是其数组中的内容都是其对应数据类型的默认值。

由于数组是一种顺序的结构,并且数组的长度都是固定的,那么可以使用循环的方式输出数组里的内容,而且在Java里面为了方便数组的输出提供有一个“数组名称.length”的属性,可以取得数组的长度。

 数组麻烦之处在于,它也属于引用数据类型,所以以上的代码依然需要牵扯到内存分配,与对象保存的区别在于:对象中的堆内存保存的是属性,而数组中的堆内存保存的是一组信息。

 java—数组的定义与使用

既然数组属于引用数据类型,那么数组一定可以发生引用传递(不同栈内存,不同地址,指向同一堆内存)。

public class ArrayDemo {

 

public static void main(String[] args) {

int[] data = new int[3];//声明并开辟一个长度为3的数组

data[0]=10;

data[1]=20;

data[2]=30;

int[] temp = data;  //data为地址,意为将data的地址赋给temp数组

temp[2]=50;

for(int i=0;i<data.length;i++){

System.out.println(data[i]);

}

}

 

}

 

 java—数组的定义与使用

以上数组的定义格式严格来说是属于动态初始化,它的操作特点:先开辟好数组空间,再进行赋值。还有静态初始化的操作,即:数组定义的同时就设置好了相应的数据内容。

l 格式一:数据类型    数组名称[]= {值,值,值……};

l 格式二:数据类型    数组名称[]= new int[]{值,值,值………};

public class ArrayDemo {

 

public static void main(String[] args) {

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

for(int i=0;i<data.length;i++){

System.out.println(data[i]);

}

}

}

 

二维数组:

二维数组就是后面有两个“[]”,一维数组严格来讲就是一行,类似于如下的形式:

索引

0

1

2

3

4

5

数据

10

 20

30

40

50

60

如果在一维数组里面找到一个数据,只需要确定一个索引就够了.

二维数组就是一张数据表,有行有列,类似于:

索引

0

1

2

3

4

5

0

12

89

03

98

45

89

1

52

56

13

56

23

46

2

23

28

34

23

48

66

二维数组则需要行和列同时定位,例如数字13:行1列2,[1][2].

二维数组定义语法如下:

l 动态初始化:数据类型[][] 数组名称 = new 数据类型[行数][列数];

l 静态初始化:

数据类型[][] 数字名称 = new 数据类型[][]{{值,值},{值,值}};

package MianXiangDuiXiang;

 

public class Arraydemo1 {

public static void main(String args[]){

/*int[][] arr = new int[][]{

{1,2,3},

{4,5,6},

{7,8,9}

};*/

//外层循环控制行

for(int i=1;i<=9;i++){

//内层循环控制列

for(int j=1;j<=10-i;j++){

System.out.print(i+"*"+j+"="+(i*j)+"\t");

}

System.out.println();

}

}

}

 java—数组的定义与使用

数组与方法参数的传递(难点):

public class arrayDemo {

public static void change(int temp[]){

for(int i=0;i<temp.length;i++){

temp[i]*=2; //原数组乘2并保存

}

}

}

public static void main(String args[]){

int[] data = new int[]{2,3,6};

change(data);

for(int j=0;j<data.length;j++){

System.out.println(data[j]);

}

}

}

 

public class arrayDemo {

public static void main(String args[]){

int[] data = new int[]{2,3,6};

int[] temp = data;    //数据传递

for(int i=0;i<temp.length;i++){

temp[i]*=2;    //原数组乘2并保存

}

for(int j=0;j<temp.length;j++){

System.out.println(temp[j]);

}

}

}

 

上面两种程序结果一致,实现方法不一样,第二种使用引用传递的方法实现。

在进行数组的引用传递的过程当中,方法对数组的修改会影响数据的原始数据,

Eg:数组的排序:

冒泡排序基本原理:

² 原始数据:  2,1,9,0,5,3,7,6,8

² 第一次排序:1,2,0,5,3,7,6,8,9

² 第二次排序:1,0,2,3,5,6,7,8,9

² 第三次排序:0,1,2,3,5,6,7,8,9.

public class arrayDemo {

public static void print(int temp[]){

for(int x=0;x<temp.length;x++){

System.out.print(temp[x]+"、");

}

System.out.println();

}

public static void sort(int[] arr){

//外层循环控制循环次数

for(int i=0;i<arr.length;i++){

for(int j=0;j<arr.length-1;j++){

if(arr[j]>arr[j+1]){

int q = arr[j];

arr[j]= arr[j+1];

arr[j+1]=q;

}

}

}

}

public static void main(String args[]){

int[] data = new int[]{2,1,9,0,5,3,7,6,8};

print(data);

sort(data);

print(data);

}

}

 

Eg:数组的转置:

转置的概念:

² 原始数组: 1,2,3,4,5,6,7,8,

² 转置后的数组: 8,7,6,5,4,3,2,1.

操作有两个思路:

l 重新定义一个新的数组,而后将原始数组按照倒序的方式插入到新的数组当中,随后改变原始数组的引用.

import java.util.Arrays;

 

public class Reverse {

public void reverse(int[] arr){

int i = arr.length;

//创建新的数组接收原数组的倒序插入

int[] arr1 = new int[i];

int b=0;

for(int a=arr.length-1;a>=0;a--){

arr1[b]=arr[a];

    b++;

}

 System.out.println(Arrays.toString(arr1)+"\t");

}

 

public static void main(String[] args) {

int[] data={1,2,3,4,5,6,7,8};

Reverse re = new Reverse();

re.reverse(data);

}

 

}