JavaSE学习笔记之-----数组

一、与C语言数组的区别

    Java的数组和C语言还是很大区别的,我认为两点区别最大:

    1、首先Java的数组都是引用,用C语言的角度来讲就是数组全是指针,举个例子,一维数组:

int[] a = new int[3];
a[0] = 1;
a[1] = 2;
a[2] = 3;

数组经历三个步骤,声明、分配空间、赋值。第一行代码是将声明和分配空间放在一条语句,等同于:

int[] a;//声明
a = new int[3];//分配空间

a是在栈空间上生成的变量,它是一个引用类型,指向堆空间上的3个元素,而这三个元素并不直接保存数组的值,保存的同样是引用,是指向各自数值(实际的1、2、3数值保存在堆空间的另一块地方)的引用,画图表示:


可以看到,a指向数new出来的数组,当代码只声明不赋值的时候数组里面保存的就是NULL,不指向任何东西,当赋值以后,指向具体的数值,由此可见,数组里面存放的是引用而不是数值本身。

    注意:在声明数组的时候是不能指明长度的,例如:

int a[5];

这是非法的。

    2、二维数组的区别

Java的二维数组很好理解,就是以数组为元素的数组,就是每一个一维数组的元素都是另一个一维数组,如下:

int A[][] = {{1,2},{2,3},{3,4,5}};
int B[3][2] = {{1,2},{2,3},{3,5}};//非法,声明的时候不能指明长度
int C[][];
C = new int[3][];
C[0] = new int[2];
C[1] = new int[3];
C[2] = new int[2];
//赋值省略

内存图是:


数组里面全都是存的引用


二、例程

public class arg {
	public static void main(String args[]) {
		int a[] = new int[args.length];
		for(int i=0;i<args.length;i++) {
			a[i] = Integer.parseInt(args[i]);//查api文档,把字符串转成整型
		}
		print(a);	
		select(a);
		print(a);				
	}
	
	private static void select(int a[]) {
		int temp = 0;
		for(int i=0;i<a.length;i++) {
			for(int j=i+1;j<a.length;j++) {
				if(a[i]>a[j]) {
					temp = a[i];
					a[i] = a[j];
					a[j] = temp;
				}
			}
		}
	}
	private static void print(int a[]) {
			for(int i=0;i<a.length;i++) {
				System.out.print(a[i]+" ");
			}
			System.out.println();
	}
}


这个例子是排序,使用了选择排序的算法,当然还不是最优的,有几处可以改进的地方。

二维数组的例子;

public class dou {
	public static void main(String[] args) {
		String[][] s;
		s = new String[3][];
		s[0] = new String[2];
		s[1] = new String[3];
		s[2] = new String[2];
		for(int i=0;i<s.length;i++) {
			for(int j=0;j<s[i].length;j++) {
				s[i][j] = new String("我的位置"+i+","+j); 
			}
		}
		
		for(int i=0;i<s.length;i++) {
			for(int j=0;j<s[i].length;j++) {
				System.out.println(s[i][j]);
			}
		}
	}
}


功能就是显示现在元素的位置,Java的二维数组和C不一样,不一定得是几行几列,Java的二维数组,每一个一维的元素都是一个一维的数组,这样理解就好了。

三、数组的拷贝

    1、使用java.lang.System类的静态方法

一维数组的拷贝:

String[] s = 
            {"Mircosoft","IBM","Sun","Oracle","Apple"};
    String[] sBak = new String[6];
    System.arraycopy(s,0,sBak,0,s.length);

二维数组的拷贝:

int[][] intArray = {{1,2},{1,2,3},{3,4}};
    int[][] intArrayBak = new int[3][];
    System.arraycopy
            (intArray,0,intArrayBak,0,intArray.length);

方法名:System.arraycopy

参数:

    第1个参数:从哪个数组拷贝; 第2个参数:从第几个元素开始拷贝; 第3个参数:往哪里拷贝;

    第4个参数:对于要拷贝进去的数组,从哪里元素开始写入; 第5个参数:拷贝多长。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值