Java数组

数组存储

public static void main(String[] args) {
		int n = 5;
		n = 6;
		int [] arr;
		arr = new int[3];// 创建数组
	}

内存图:
创建数组声明的是一个引用类型
栈存放基本数据类型和引用
堆存放对象(数组对象、对象)
所以创建一个数组分配好空间后栈中的数组引用堆中的数组对象,栈中存放数组的地址
在这里插入图片描述

创建和使用数组

动态初始化

我们指定大小,系统赋值。

public static void main(String[] args) {
		int [] arr;// 声明数组
		// int arr [];
		// 初始化:开辟空间赋值
		// 1. 动态初始化方式: 我们指定数组大小,系统指定值。
		arr = new int[3];// 创建数组
		// 使用:
		/*
		 * 初始值:
		 * 整数:  0
		 * 浮点: 0.0
		 * 布尔:false
		 * 字符:‘\u0000’
		 * 字符串:null
		 */
		System.out.println(arr[0]);// 0
		System.out.println(arr[1]);// 0
		System.out.println(arr[2]);// 0
//		System.out.println(arr[3]);// 数组越界异常
		// 修改数组元素的值
		arr[0] = 11;
		arr[1] = 22;
		arr[2] = 33;
		System.out.println(arr[0]);// 11
		System.out.println(arr[1]);// 22
		System.out.println(arr[2]);// 33
	}

静态初始化

我们指定值,系统指定大小。

// 静态初始化的方式:我们指定值,系统指定大小
		int [] arr = {11,22,33};// 一行
		// 获得数组的长度
		System.out.println(arr.length);// 3
		int [] arr1 = new int[]{11,22,33};// 一行
		int [] arr2 ;
		arr2 = new int[]{11,22,33};// 两行

注意事项

1) 存储的是相同数据类型的一组数;
2) 数组的长度是固定的。
3) 数组的元素可以是基本类型 也可以是引用

数组的遍历

public static void main(String[] args) {
	
		int [] arr = {11,22,33};
		// 展示所有元素值
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		// 简化:
		// 1.基本for循环
		for(int i = 0; i < arr.length ; i ++){// 0 ,1 ,2
			System.out.println(arr[i]);// 0,1,2
		}
		System.out.println(arr);// [I@15db9742 输出的是数组地址
		// 2. 增强for(遍历集合和数组)
		/*
		 * for(类型 变量名:遍历的数组的名字){
		 * }
		 */
		for(int a:arr){
			System.out.println(a);
		}
		/*
		 * 增强for:
		 * 优点:语法简洁
		 * 注意:
		 * 1.只能顺序遍历
		 *   逆序遍历用基本for
		 * 2.只能遍历数组的所有元素
		 *   范围访问用基本for
		 * 3.不能修改元素
		 *   修改元素用基本for
		 */
		System.out.println("------逆序--------------");
		// 逆序
		for(int i = arr.length - 1; i >= 0; i --){// 
			System.out.println(arr[i]);
		}
		System.out.println("-------范围--------");
		// 22,33,44
		for(int i = 1; i< 4; i ++){
			System.out.println(arr[i]);
		}
		System.out.println("------修改---------");
		// 每个元素都+2
		for(int a : arr){
			a = a + 2;// 错误,不能修改元素 如果遍历的是对象数组,可以对每个对象的属性进行修改
		}
		for(int i = 0; i < arr.length ; i ++){
			arr[i] = arr[i] + 2;// 修改元素
		}
		for(int a : arr){
			System.out.println(a);
		}
	}

复制数组

public static void main(String[] args) {
		
		int [] arr = {11,22,33,44,55};
		// 方式一:依次将数组元素复制到新数组中
		int [] arr1 = new int[arr.length];
		for(int i = 0; i < arr.length; i ++){
			arr1[i] = arr[i];
		}
		// 方式二:使用java.lang.System提供的arraycopy方法
		int [] arr2 = new int[arr.length];
		/*
		 * 复制数组:
		 * src :源数组
		 * srcPos:源数组的起始位置
		 * dest:目标数组
		 * destPos:目标数组的起始位置
		 * length:复制的个数
		 */
		System.arraycopy(arr, 0, arr2, 0, 5);
		
		// 方式三:java.lang.Object 的clone方法
		int [] arr3 = arr.clone();// Object类 复制克隆
		System.out.println(arr3);
		System.out.println(arr);
		// 方式四:
		int [] arr4 = Arrays.copyOf(arr, 5);
		
		for(int a : arr4){
			System.out.println(a);
		}
	}

Arrays

使用java.util.Arrays类
常用方法
①toString
②Sort
③binarySearch
④equals
⑤fill
⑥copyOf
二分查找的源码:

 private static int binarySearch0(int[] a, int fromIndex, int toIndex,
                                     int key) {
        int low = fromIndex;
        int high = toIndex - 1;

        while (low <= high) {
            int mid = (low + high) >>> 1;
            int midVal = a[mid];

            if (midVal < key)
                low = mid + 1;
            else if (midVal > key)
                high = mid - 1;
            else
                return mid; // key found
        }
        return -(low + 1);  // key not found.
    }

比较两个数组是否相等 equals()

  public static boolean equals(int[] a, int[] a2) {
        if (a==a2)
            return true;
        if (a==null || a2==null)
            return false;

        int length = a.length;
        if (a2.length != length)
            return false;

        for (int i=0; i<length; i++)
            if (a[i] != a2[i])
                return false;

        return true;
    }

方法的使用:

public static void main(String[] args) {

		int [] arr = {11,33,22};
		// 1. 把数组转换成字符串
		String s = Arrays.toString(arr);
		System.out.println(s);// [11, 33, 22]
		// 2. 升序排序
		Arrays.sort(arr);
		System.out.println(Arrays.toString(arr));// [11, 22, 33]
		// 3. 二分查找法(前提:升序排序)
		//  查找元素是否存在,存在范围索引,不存在返回负数 -插入点-1
		System.out.println(Arrays.binarySearch(arr, 22));//1
		System.out.println(Arrays.binarySearch(arr, 55));// -4
		// 4. 判断两个数组是否相等,相等 true (比较的是数组的元素)
		//    只要两个数组对应位置的元素都相等并且长度都相等,那么两个数组相等
		int [] arr1 = {1,2,3};
		int [] arr2 = {1,2,3};
		System.out.println(Arrays.equals(arr1, arr2));// true
		int [] arr3 = {1,2,4};
		int [] arr4 = {1,2,3};
		System.out.println(Arrays.equals(arr3, arr4));// false
		// 5.填充数组
		int [] arr5 = {1,2,3};
		System.out.println(Arrays.toString(arr5));// [1, 2, 3]
		Arrays.fill(arr5, 999);
		System.out.println(Arrays.toString(arr5));// [999, 999, 999]
		// 6. 数组的复制
		int [] arr6 = {1,2,3,4,5};
		int [] arr7 = Arrays.copyOf(arr6, 5);
		System.out.println(Arrays.toString(arr7));// [1, 2, 3, 4, 5]
		System.out.println(arr6);
		System.out.println(arr7);
	}

二维数组

int [] arr = new int[3];//0x12a
int [][] arr1 = new int[2][2];//0x23c
//arr1[0]和arr1[1]各有一个一维数组地址

在这里插入图片描述

	public static void main(String[] args) {
		// 动态初始化
		int [][] arr= new int[3][2];
		// 赋值
		// 控制台输入
		Scanner in= new Scanner(System.in);
		System.out.println("-- 给数组赋值:");
		for(int i = 0; i < arr.length; i ++){
			for(int j = 0; j < arr[i].length; j ++){
				arr[i][j] = in.nextInt();
			}
		}
		// 输出
		for(int i = 0; i < arr.length;  i++){
			for(int j = 0; j < arr[i].length; j ++){
				System.out.print(arr[i][j] + "\t");
			}
			System.out.println();
		}
	}
public static void main(String[] args) {
		// 静态初始化
//		int [][] arr = {{12,2},{5,8},{14,12}};
		int [][] arr = new int[][]{{12,2},{5,8},{14,12}};

		// 输出 基本for
		for(int i = 0; i < arr.length; i ++){
			for(int  j = 0 ; j < arr[i].length; j ++){
				System.out.print(arr[i][j] + "\t");
			}
			System.out.println();
		}
		// 增强for
		for(int [] ar:arr){
			for(int a : ar){
				System.out.print(a + "\t");
			}
			System.out.println();
		}
	}

不规则数组

在这里插入图片描述
在这里插入图片描述
动态初始化:

public static void main(String[] args) {
		int [][] arr = new int[3][];
		// *** 给一维数组分配空间***
		arr[0] = new int[2];
		arr[1] = new int[3];
		arr[2] = new int[4];
		//*********************
		System.out.println(arr[0]);
		System.out.println(arr[1]);
		System.out.println(arr[2]);
		// 控制台输入:
		Scanner superman = new Scanner(System.in);
		System.out.println("-- 赋值:");
		for(int i = 0; i < arr.length; i ++){
			for(int j = 0; j < arr[i].length; j ++){
				arr[i][j] = superman.nextInt();
			}
		}
		// 输出
		for(int [] ar : arr){
			for(int a : ar){
				System.out.print(a + "\t");
			}
			System.out.println();
		}
	}

静态初始化:

	public static void main(String[] args) {
		// TODO Auto-generated method stub
//		int [][] arr = {{12,2},{5,8,6},{14,12,44,3}};
		int[][] arr = new int[][]{{12,2},{5,8,6},{14,12,44,3}};
	}
posted @ 2020-03-24 22:01  我不是忘尘  阅读(113)  评论(0编辑  收藏  举报