JavaSE学习笔记-Day6

痴心易碎 提交于 2020-02-07 07:41:37

昨天学完了面向对象的进阶内容,不过对面向对象还是没有什么感觉啊,不敢那么多了,继续往后学!今天我们学习一下数组。

一. 一维数组

数组这个概念就不陌生了,就不做实例来引进概念了。

数组是相同类型数据的有序集合。其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们。

数组的几大特点:

  1. 长度是确定的。数组一旦被创建,它的大小就是不可以改变的。
  2. 其元素必须是相同类型,不允许出现混合类型。
  3. 数组类型可以是任何数据类型,包括基本类型和引用类型。
  4. 数组变量属引用类型,数组就是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组对象本身是在堆中存储的。

接下来就来看看一维数组是如何声明的。一维数组的声明形式有两种:

数据类型[] 数组名; //比方说我们一直在写的:String[] args
数据类型  数组名[];

一般推荐使用上面的那种声明方式,Java要有Java的亚子。

注意事项

  1. 声明的时候就只是声明(在栈帧的局部变量表中有一个新变量),并没有实例化任何对象(堆是没有开辟新内存的),只有在实例化数组对象时,JVM才分配空间,这时才与长度有关。
  2. 声明一个数组的时候并没有数组真正被创建。
  3. 构造一个数组,必须指定长度。

好了,既然声明的时候没有实例化对象,那么将数组实例化对象(初始化)的方法有哪些呢?

  1. 静态初始化
    除了用new关键字来产生数组以外,还可以直接在定义数组的同时就为数组元素分配空间并赋值。举例:
int[] arr = { 1, 2, 3 };// 静态初始化基本类型数组;
Man[] mans = { new Man(1, 1), new Man(2, 2) };// 静态初始化引用类型数组;

注意:在静态初始化中,你写了多少个值或创建了多少对象,那么这个个数将成为数组的长度,并且不再改变!

  1. 动态初始化
    数组定义与为数组元素分配空间并赋值的操作分开进行。举例:
int[] arr = new int[2];//动态初始化数组,先分配空间;
arr[0]=1;//给数组元素赋值;
arr[1]=2;//给数组元素赋值;

动态初始化还可以通过循环赋值的方式实现。如果给的数组长度大于你赋值的长度,那么剩下的元素将会以默认值存储,来看看默认初始化吧。

  1. 数组的默认初始化
    数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。举例:
int[] arr = new int[2]; // 默认值:0,0
boolean[] b = new boolean[2]; // 默认值:false,false
String[] s = new String[2]; // 默认值:null, null

这里的默认值规则和成员变量默认值规则一致!

注意:元素是引用类型的话,默认初始化值为null,当你需要访问元素的属性的时候,必须先对其进行初始化,否则因为是null,会报出空指针异常的错误。

数组的遍历(以代码形式学了):

package cn.zjb.test;
/**
 * 测试数组的运用
 * @author 张坚波
 *
 */
public class TestArrays extends Object{

	public static void main(String[] args) {
		int[] arr=new int[5]; //默认初始化
		//默认值
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]);  //和C语言的printf()一样,不换行的
		System.out.print('\n');
		
		//动态初始化
		for(int i=0;i<arr.length;i++)
			arr[i]=i;
		
		//初始化以后的值
		for(int i=0;i<arr.length;i++)
			System.out.print(arr[i]);
		System.out.print('\n');
		
		/*
		 * 增强for循环for-each是JDK1.5新增加的功能,专门用于读取数组或集合中所有的元素,即对数组进行遍历。
		 *具体格式: for(数组的数据类型  临时变量 : 数组名){...}
		 */
		for(int temp : arr)
			System.out.print(temp);
		System.out.print('\n');
	}
	
}

注意

  1. Java数组中length,一般来说都容易把它看成是数组的一个属性。但是我们却找不到相应的源码或者说明。其实,数组中length并不是一个属性,更不是一个方法。在一个数组对象上调用length,会被Java编译器编译成一条arraylength指令(Java binary code)。也就是说这不是具体Java代码实现的,是编译器底层通过调取指令来获取长度。不过在当前阶段,不必过于纠结,我们都知道定义数组必须要给这个数组一个长度,那么我们就把length当成是自己定义的长度!
  2. 增强for循环for-each 只能用来访问数组的值,不能进行数据的修改或者其他改变原数组的操作!因为在循环过程中不涉及有关索引(下标)的操作,只是增加了一个临时变量来存对应元素值。

数组的拷贝(arraycopy方法的使用):
System类里也包含了一个 static void arraycopy(object src,int srcpos,object dest, int destpos,int length) 方法,该方法可以将src数组里的元素值赋给dest数组的元素,其中srcpos指定从src数组的第几个元素开始赋值,destpos指定赋值到dest数组的某个位置开始,length参数指定将src数组的多少个元素赋给dest数组的元素。(src–source, dest–destination, pos-- position)
我们只需要System.arraycopy 就可以使用了,举个例子:

package cn.zjb.test;
/**
 * 测试System类 写好的 arraycopy方法
 * @author 60507
 *
 */
public class TestArrayCopy {
	public static void main(String[] args) {
		
		int[] arr1= {1,2,3,4};
		int[] arr2=new int[5];
		//一个数组拷贝到另一个数组
		System.arraycopy(arr1, 0, arr2, 0, arr1.length); //将arr1的三个元素拷贝到arr2中,从索引0开始
		for(int temp : arr2)
			System.out.print(temp);
		System.out.print('\n');
		//删除一个数组的某个值,假设删去3
		System.arraycopy(arr1, 3, arr1, 2, 1);
		arr1[3]=0; //赋值
		for(int temp : arr1)
			System.out.print(temp);
		System.out.print('\n');
		
		delArrDatas(arr1,1,3);
		for(int temp : arr1)
			System.out.print(temp);
		System.out.print('\n');
	}
	
	//删去数组中两任意位置之间的值
	static int[] delArrDatas(int[] a,int start,int end) {
		System.arraycopy(a, end+1, a, start, a.length-1-end);
		int i=1;
		do {
			a[a.length-i]=0;
			i++;
		}while(i<=end-start+1);
		return a;
	}
}

二. 多维数组

多维数组可以看成以数组为元素的数组。可以有二维、三维、甚至更多维数组。
我们以二维数组做例子,其他维度的实质是一样的:
二维数组可以看成是一维数组,而这些元素类型又是一维数组。这一点和C语言有点不太一样,C语言的二维数组可以看作是矩阵的形式,但是Java的二维数组不一定是矩阵,它的灵活性会更强。

二维数组的声明及初始化:

    // Java中多维数组的声明和初始化应按从低维到高维的顺序进行  
 	int[][] a1 = new int[3][]; //元素为3个一维数组
    a1[0] = new int[2];
    a1[1] = new int[4];
    a1[2] = new int[3];  
//  int a1[][]=new int[][4];//非法
	
	//静态初始化
	int[][] a = { { 1, 2, 3 }, { 3, 4 }, { 3, 5, 6, 7 } };
	//动态初始化
	int[][] a3 = new int[3][];
 // a3[0] = {1,2,5}; //错误,没有声明类型就初始化
    a3[0] = new int[] { 1, 2 }; 
    a3[1] = new int[] { 2, 2 };
    a3[2] = new int[] { 2, 2, 3, 4 };

这是二位数组a的内存图:
在这里插入图片描述
获取二维数组的长度:

//获取的二维数组第一维数组的长度。
System.out.println(a.length);
//获取第二维第一个数组长度。
System.out.println(a[0].length);

总结:

今天太懒了。。。

第六天
数组
一维数组
多维数组
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!