Java学习笔记一数组

数组简单介绍

数组是一种引用类型的变量,因此使用它定义一个变量时,仅仅表示定义了一个引用变量(也就是定义了一个指针),这个引用变量还未指向任何有效的内存,因此定义数组时不能指定数组长度。由于未指向任何有效的内存空间,所以还没有内存空间来存储数组元素,因此这个数组也不能使用,只有对数组进行初始化后才能使用。

所谓初始化,就是为数组的数组元素分配内存空间,并为每个数组元素赋初始值。
能不能只分配内存空间,不赋值初始值呢?
一旦为数组的每个数组元素分配了内存空间,每个内存空间里存储的内容就是该数组元素的值,即使这个内存空间存储的内容是空,这个空也是一个值(null)。
数组的初始化有如下两种方式:

  • 静态初始化:初始化时由程序员显示指定每个数组元素的初始值,由系统决定数组长度
  • 动态初始化:初始化时由程序员显示指定数组长度,由系统为数组元素分配初始值

静态初始化arrayName = new type[]{element1, element2, element3, element4...}
定义数组同时静态初始化type[] arrayName = {element1, element2, element3, element4...}

// 数组定义和初始化同时完成
int[] a = {5, 6, 7, 9};
// 定义一个int数组类型变量
int[] intArr;
// 使用静态初始化,初始化数组时只指定数组元素的初始值,不指定数组长度
intArr = new int[]{5, 6, 8, 20};
// 定义一个Object数组类型的变量,变量名为objArr
Object[] objArr;
objArr = new Object[]{"Java", "C++"};
// 使用静态初始化,元素类型是定义数组时所指定的数组元素类型的子类
Object[] objArr1; 
objArr1 = new String[]{"Java", "C++"}; // String类型是Object类型的子类

动态初始化arrayName = new type[length]
系统负责为数组元素分配初始值,规则如下:

  • 基本类型中的整数类型(byte、short、int和long),则数组元素的值是0
  • 基本类型中的浮点类型(float、double),则数组元素的值是0.0
  • 基本类型中的字符类型(char),则数组元素的值是’\u0000’
  • 基本类型中的布尔类型(boolean),则数组元素的值是false
  • 引用类型(类、接口和数组),则数组元素的值是null
int[] prices = new int[5];
Object[] books = new String[4];

深入数组

数组引用变量只是一个引用,这个引用变量可以指向任何有效内存,只有当该引用指向有效内存后,才能通过该数组变量来访问数组元素。实际的数组对象被存储在堆内存中,如果引用该数组对象的数组引用变量是一个局部变量,那么它被存储在栈内存中。如果堆内存中数组不再有任何引用变量指向自己,则这个数组将成为垃圾,该数组所占的内存将会被系统的垃圾回收机制回收。只要类型相互兼容,可以让一个数组变量指向另一个实际的数组,这种操作会让人产生数组长度可变的错觉。

public class ArrayInRam
{
	public static void main(String[] args)
	{
		int[] a = {5, 7, 20};
		int[] b = new int[4];
		System.out.println("b数组的长度:"+b.length);  // b数组的长度:4
		for(int i = 0, len =  a.length; i < len; i++)
		{
			System.out.println(a[i]);
		}
		for(int i = 0, len =  b.length; i < len; i++)
		{
			System.out.println(b[i]);
		}
		// 因为a是int[]类型,b也是int[]类型,所以可以将a的值赋给b
		// 也就是让b引用指向a引用指向的数组
		b = a;
		System.out.println("b数组的长度:"+b.length);  // b数组的长度:3
	}
}

引用类型数组的数组元素是引用,即每个数组元素里存储的还是引用,它指向另一块内存,这块内存里存储了有效数据。

Java语言里提供了支持多维数组的语法。但是从数组底层的运行机制上看是没有多维数组的(Java语言里的数组是引用类型,因此数组变量其实是一个引用,这个引用指向真实的数组内存。数组元素的类型也可以是引用,如果数组元素的引用再次指向真实的数组内存,这就是二维数组)。–> 很像套娃

二维数组type[][] arrName; arrName = new type[length][]; 定义了二维数组,实质上还是一维数组,只是其数组元素也是引用,数组元素里保存的引用指向一维数组。上面的初始化语法相当于初始化了一个一维数组,这个一维数组的长度是length。这个一维数组的数组元素是引用类型(数组类型),系统为每个数组元素都分配初始值:null。一维数组的type[]数组元素使用前必须再次初始化这些数组。

// 同时初始化二维数组的两个维度
int[][] b = new int[3][4];
// 使用静态初始化语法来初始化一个二维数组
String[][] str1 = new String[][]{new String[3], new String[]{"hello"}};
// 使用简化的静态初始化语法来初始化二维数组
String[]][] str2 = {new String[3], new String[]{"hello"}};
发布了134 篇原创文章 · 获赞 141 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/asmartkiller/article/details/104750086