Java基础-数组

数组

概念:

  • 数组是存储同一种数据类型多个元素的容器。
  • 数组既可以存储基本数据类型,也可以存储引用数据类型(引用类型:类,接口,数组);

定义格式:

  • 数据类型[] 数组名;
    eg:int[] arr;
  • 数据类型 数组名[];
    eg:int arr[];

数组的初始化
Java中的数组必须先初始化,然后才能使用。
所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

  • 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
    数据类型[] 数组名 = new 数据类型[数组长度];
    (数组长度其实就是数组中元素的个数。)
eg:int[] arr=new int[3];
解释:定义了一个int类型的数组,这个数组中可以存放3个int类型的值。
  • 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
    数据类型[] 数组名 = {元素1,元素2,…};
int[] arr = {1,2,3};

数组的内存分配
- JVM内存分配

  • 栈 存储局部变量
  • 堆 存储new出来的东西
  • 方法区
  • 本地方法区
  • 寄存器 (给CPU使用)
/*
 - 需求:定义一个数组,输出数组名及元素。然后给数组中的元素赋值,再次输出数组名及元素。
 */
public class ArrayTest {
	public static void main(String[] args) {
		//定义一个数组
		int[] arr = new int[3];
		//输出数组名及元素
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		//给数组中的元素赋值
		arr[0] = 100;
		arr[2] = 200;
		//再次输出数组名及元素
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
	}
}

代码内存图解:
代码内存图解:
两个数组指向同一个地址的内存图

/*
 - 需求:定义两个数组,先定义一个数组,赋值,输出。然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组。
 - 然后给第二个数组赋值,再次输出两个数组的名及元素。
 */
public class ArrayTest3 {
	public static void main(String[] args) {
		// 先定义一个数组,赋值,输出
		int[] arr = new int[3];
		arr[0] = 100;
		arr[1] = 200;
		arr[2] = 300;
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);

		// 然后定义第二个数组的时候把第一个数组的地址赋值给第二个数组
		int[] arr2 = arr;
		// 然后给第二个数组赋值
		arr2[0] = 111;
		arr2[1] = 222;
		arr2[2] = 333;

		// 再次输出两个数组的名及元素
		System.out.println(arr);
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);

		System.out.println(arr2);
		System.out.println(arr2[0]);
		System.out.println(arr2[1]);
		System.out.println(arr2[2]);
	}
}

代码内存图解:
代码内存图解
数组去重

import java.util.Random;

/*
 *    	随机生成10个1-10数字放入数组中 要求:数字不能重复 
 */
public class Demo{
	
	public static void main(String[] args) {
		// 定义数组    (0)-(i-1)
		int[] arr = new int[10];
		Random random = new Random();
		for(int i = 0;i<10;i++) {  //i = 3
			arr[i] = random.nextInt(10)+1;// 2
			// 用当前生成的随机数和数组中其他元素对比 如果相同了就重新生成随机数
			for(int j = 0;j<i;j++) {
				if(arr[j] == arr[i]) {
					// 让上一个生成的数字无效重新生成
					i--;
				}
			}
		}	
		for(int i = 0;i<arr.length;i++) {
			System.out.println(arr[i]);
		}
	}
}

数组使用的两个小问题

  • java.lang.ArrayIndexOutOfBoundsException
    数组越界异常
    产生的原因:就是你访问了不存在的索引元素。

  • java.lang.NullPointerException
    空指针异常
    产生的原因:数组已经不指向堆内存的数据了,你还使用数组名去访问元素。

二维数组:一个元素为一维数组的数组
格式:

  • 动态初始化
    数据类型[ ][ ] 数组名 = new 数据类型[m][n];
    m表示这个二维数组有多少个一维数组
    n表示每一个一维数组的元素有多少个
  • 静态初始化
    数据类型[ ][ ] 变量名 = {{元素…},{元素…},{元素…}};
/*
 * 二维数组遍历
 * 
 * System.out.println():输出内容并换行
 * System.out.print():输出内容
 * System.out.println():换行
 */
public class ArrayArrayTest {
	public static void main(String[] args) {
		// 定义二维数组
		int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

		// 二维数组中的一维数组名称:二维数组名[索引]
		// arr[0] 其实就是二维数组中的第一个一维数组的名称
		// arr[1] 其实就是二维数组中的第二个一维数组的名称
		// arr[2] 其实就是二维数组中的第三个一维数组的名称

		// for (int x = 0; x < arr[0].length; x++) {
		// System.out.println(arr[0][x]);
		// }

		// System.out.println("hello");
		// System.out.println("world");
		// System.out.print("hello");
		// System.out.print("world");

		/*
		// 第一个一维数组的元素
		for (int x = 0; x < arr[0].length; x++) {
			System.out.print(arr[0][x] + "  ");
		}
		System.out.println();

		// 第二个一维数组的元素
		for (int x = 0; x < arr[1].length; x++) {
			System.out.print(arr[1][x] + "  ");
		}
		System.out.println();

		// 第三个一维数组的元素
		for (int x = 0; x < arr[2].length; x++) {
			System.out.print(arr[2][x] + "  ");
		}
		System.out.println();
		*/	
//		for(int y=0; y<3; y++) {
//			for (int x = 0; x < arr[y].length; x++) {
//				System.out.print(arr[y][x] + "  ");
//			}
//			System.out.println();
//		}
		
		for(int y=0; y<arr.length; y++) {
			for (int x = 0; x < arr[y].length; x++) {
				System.out.print(arr[y][x] + "  ");
			}
			System.out.println();
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值