数组

1、数组声明

/*
	数组的声明
	数组是一种类型,使用[]表示。
	只要存在一种类型,就会存在对应的数组类型。
	int ->  int[]
	String ->  String[]
	
	可以这样声明数组类型:
	int[] a;
	int a[];
	推荐使用第一种方式声明数组,因为第一种方式
	将变量类型与变量名进行有效的分离,而第二种
	没有。

*/
public class ArrayDec {
	public static void main(String[] args) {
		//声明一个int类型的变量
		int x;
		//声明数组类型的变量
		int[] a;
		//也可以这样来声明数组(不建议)
		int a[];
		//int[] a1, a2, a3;	//a1,a2,a3都是数组
		//int a1[], a2, a3;	//a1是数组,a2,a3是int类型。
	}
}

  2、数组初始化

/*
	数组的初始化
	数组的每个数据称为数组的元素。
	数组元素的个数称为数组的长度。

	可以使用三种初始化方式
	int[] a = {1, 2, 3, 4 ,5};
	int[] a2 = new int[] {1, 2, 3, 4, 5};
	int[] a3 = new int[5];
	三种初始化的区别:
	第一种初始化方式,只能在声明的同时,进行赋值。
	第二,三种初始化方式,既可以在声明的同时赋值,
	也可以在声明之后再赋值。

	数组元素的访问
	通过数组名 + [下标(索引值)]
	数组的索引是从0开始的。
	a[0] = 100;

	数据具有一个属性:length
	length可以获得数组的长度(元素的个数)。

	数组越界
	访问数组的元素,如果提供的索引值<0,或者
	>=数组的长度(length),此时,就会发生
	数组越界。
	一旦数组越界,在编译时没有错误,但在运行
	时会产生异常(ArrayIndexOutOfBoundException)。
	
*/
public class ArrayInit {
	public static void main(String[] args) {
		int x = 1;
		int[] a = {1, 2, 3, 4 ,5};
		int[] a2 = new int[] {1, 2, 3, 4, 5};
		int[] a3 = new int[5];
		int y;
		y = 1;
		/*
		错误
		int[] a;
		a = {1, 2, 3, 4, 5};
		正确
		int[] a2;
		a2 = new int[] {1, 2, 3, 4, 5};
		int[] a3;
		a3 = new int[5];
		*/
		//System.out.println(a.length);
		/*
		System.out.println(a[0]);
		System.out.println(a[1]);
		System.out.println(a[2]);
		System.out.println(a[3]);
		System.out.println(a[4]);
		*/
		//遍历数组,局限:耦合性
		for (int i = 0; i < 5; i++) {
			//System.out.println(a[i]);
		}
		//改进:使用length属性	
		for (int i = 0; i < a.length; i++) {
			//System.out.println(a[i]);
		}
		//数组越界
		//a[-1] = 3;
		//a[10] = 3;
	}
}

  3、变量内存分配情况

/*
	变量内存分配情况
	局部变量分配在栈内存当中,而对象分配在堆内存当中。

	栈内存结构会随着方法的调用而创建,随着方法的结束
	而销毁。每个方法都有自己的栈内存结构,彼此之间
	不受干扰。
	堆内存结构是长期存在的。对象存放在堆内存当中,当
	没有任何引用指向一个对象时,该对象就会成为垃圾回收
	器回收的目标,垃圾回收器会在下次启动时将其回收。

	对于基本数据类型,该值直接存放在变量当中,对于引用类型,
	变量没有存放真正的对象(真正的对象存放在堆内存中),
	变量存放的是该对象的起始地址。

	引用类型变量不存放对象,而存放对象起始地址的原因:
	1 栈是一个频繁创建而销毁的结构,意味着栈的空间非常
	有限(否则浪费资源,降低性能),而对象占用的空间
	较大。
	2 栈会随着方法调用结束而销毁,此时栈中所有的变量都将
	不复存在,如果对象分配在栈内存当中,我们就不能在方法
	调用结束后继续使用该对象。
*/
public class Room {
	public static void main(String[] args) {
		
	}
}

  4、增强型for循环

/*
	增强型for循环
	优势:
	对于操作数组与集合,增强型for循环具有一定的方便性。
	局限性:
	1 逆序遍历数组
	2 访问数组的部分元素
	3 在循环中改变数组元素的值
*/

public class ForEach {
	public static void main(String[] args) {
		int[] x = {1, 2, 3, 4, 5};
		//传统for循环
		for (int i = 0; i < x.length; i++) {
			//System.out.println(x[i]);
		}
		//增强for循环
		//意思:数组x里面的每一个元素会依次赋值给i一次,
		//然后执行一次循环体。
		for (int i : x) {
			//System.out.println(i);
		}
		//逆序遍历数组
		for (int i = x.length -1; i >= 0; i--) {
			//System.out.println(x[i]);	
		}

		//访问数组的部分元素
		for (int i = 2; i < x.length - 1; i++) {
			
		}

		//在循环中改变数组元素的值
		for (int i = 0; i < x.length - 1; i++) {
			//x[i] = i + 100;
		}

		for (int i : x) {
			i = 100;
		}
		//不能通过i改变数组元素的值。
		for (int i : x) {
			System.out.println(i);
		}
	}
}

  5、多维数组

/*
	多维数组
	Java中实际上不存在多维数组,所谓的多维数组,在Java中
	就是数组的数组。即数组的每一个元素还是数组。
	int[] x;	=>	每一个元素为int类型。
	String[] x; =>  每一个元素为String类型。
	T[] x;		=>	每一个元素为T类型。
	当T是int[]的一维数组时,
	=》	(int[])[] =>	int[][]
	n维数组里面每一个元素是n-1维数组类型。(2 <= n <= 255)

	二维数组初始化的三种方式,与一维数组相同。
	二维数组三种初始化区别与一维数组是相同的。

	在Java中,多维数组不要求是矩阵数组,即每个低维数组
	的长度不要求相同。

*/
public class MultiArray {
	public static void main(String[] args) {
		//二维数组的初始化
		int[][] x = {{1, 2}, {3, 4}, {5, 6}};
		int[][] x2 = new int[][] {
			{1, 2}, {3, 4}, {5, 6}
		};
		int[][] x3 = new int[3][2];

		x[1][0] = 3;
		//非矩阵数组
		int[][] y = {{1}, {2, 3}};
		//可以先分配高维,再分配低维
		int[][] y2 = new int[2][];
		y2[0] = new int[3];
		y2[1] = new int[2];

		//二维数组的遍历
		for (int i = 0; i < x.length; i++) {
			for (int j = 0; j < x[i].length; j++) {
				System.out.println(x[i][j]);
			}
		}

		for (int[] i : x) {
			for (int j : i) {
				System.out.println(j);
			}
		}
	}
}

  6、对数组进行复制

/*
	对数组进行复制
	System.arraycopy
	src	源数组
	srcPos	源数组开始复制的位置
	dest 目标数组
	descPos  目标数组开始复制的位置
	length	复制的长度

	数组的clone方法
*/

public class Copy {
	public static void main(String[] args) {
		int[] x = {1, 2, 3, 4, 5};
		int[] y = new int[x.length];
		System.arraycopy(x, 0, y, 0, x.length);
		for (int i : y) {
			//System.out.print(i + " ");
		}

		int[] z = x.clone();
		for (int i : z) {
			System.out.print(i + " ");
		}
	}
}

  7、Arrays类的使用

/*
	Arrays类的使用。
	Arrays中声明了很多对数组操作的方法。
	Arrays类声明在java.util包中。
*/

import java.util.Arrays;

public class ArraysTest {
	public static void main(String[] args) {
		int[] x = {5, 4, 3, 2, 1};
		//对进组进行排序
		//Arrays.sort(x);
		for (int i : x) {
			//System.out.print(i + " ");
		}
		//对数组进行排序(并行排序),在对CPU,多核心
		//环境下,性能可能会得到提升。
		//Arrays.parallelSort(x);
		for (int i : x) {
			//System.out.print(i + " ");
		}
		//对数组的指定区间进行排序
		//第1个参数为待排序的数组,第2个参数执行开始
		//区间(包括),第3个参数指定结束区间(不包括)。
		//Arrays.sort(x, 1, 4);
		//Arrays.parallelSort(x, 1, 4);
		for (int i : x) {
			//System.out.print(i + " ");
		}
		//对指定的关键字进行查找。要求数组
		//元素必须是升序排列的,否则返回的结果是不确定的。
		//如果找到,会返回数组元素的索引。
		//如果未找到,返回负值。(-插入点-1)
		//插入点就是我们要查找关键字放在数组当中的索引。
		//Arrays.sort(x);
		//System.out.println(Arrays.binarySearch(x, 4));
		x = new int[] {1, 3, 5, 7, 9};
		//System.out.println(Arrays.binarySearch(x, 6));
		int[] y = new int[] {1, 3, 5, 7, 9, 11};
		//判断两个数组是否相等(原则:长度相应,对应的元素
		//也相等),如果相等,返回true,否则返回false。
		//System.out.println(Arrays.equals(x, y));
		int[] z = new int[5];
		//对数组使用指定的值进行填充
		//Arrays.fill(z, 100);
		//对数组指定的区间,使用指定的值进行填充。
		//第1个参数:待填充的数组
		//第2个参数:填充的开始点(索引),包含。
		//第3个参数:填充的结束点(索引),不包含
		//第4个参数:填充的值
		Arrays.fill(z, 2, 4, 100);
		for (int i : z) {
			//System.out.print(i + " ");
		}
		//对数组进行复制,返回复制后的数组。
		//第1个参数:源数组
		//第2个参数:复制的长度。如果长度小于
		//源数组的长度,则源数组被截断。如果长度
		//大于源数组的长度,则多余的元素取默认值。
		int[] w = {1, 2, 3, 4, 5};
		//int[] wCopy = Arrays.copyOf(w, w.length);
		//int[] wCopy = Arrays.copyOf(w, w.length - 2);
		int[] wCopy = Arrays.copyOf(w, w.length + 2);
		for (int i : wCopy) {
			//System.out.print(i + " ");
		}
		//对数组指定区间进行复制。返回复制的数组。
		//参数1:源数组
		//参数2:开始点,包含
		//参数3:结束点,不包含。该值可以大于源数组的
		//长度,此时,多余的元素取默认值。
		int[] k = new int[]{1, 2, 3, 4, 5};
		//int[] kCopy = Arrays.copyOfRange(k, 1, 4);
		int[] kCopy = Arrays.copyOfRange(k, 1, 10);
		for (int i : kCopy) {
			//System.out.print(i + " ");
		}
		//将数组转换成String。(将数组的每个元素进行拼接,
		//使用,进行分隔。)
		String s = Arrays.toString(k);
		System.out.println(s);
	}
}

  8、命令行参数

/*
	命令行参数
	我们在java运行程序时,可以在后面传递相应的参数,
	参数会依次称为args数组的元素。
	参数使用空格进行分隔,如果参数本身含有空格,
	那么可以使用""进行引用。
	如果参数本身还有",可以使用\"进行转义。
*/

public class Args {
	public static void main(String[] args) {
		//System.out.println(args.length);
		for (String s : args) {
			//System.out.println(s);
		}
		//int limit = 100;
		//int limit = (int)args[0];
		int limit = Integer.parseInt(args[0]);
		int sum = 0;
		for (int i = 1; i <= limit; i++) {
			//sum = sum + i;
			sum += i;
		}
		System.out.println(sum);
	}
}

  

posted @ 2017-03-17 21:26  凌-风  阅读(210)  评论(0编辑  收藏  举报