05、数组(一维数组内存图解、length属性、数组静态初始化、例题)

1、一维数组

1、一维数组

1.1、栈、堆

Java虚拟机在执行Java程序时会把它所管理的内存划分为若干个不同的数据区域。

  • 虚拟机栈:存放局部变量;(在方法中定义或者在方法上声明的变量)
  • 方法区:存放字节码文件;
  • 堆Heap: new出来的数据都在堆内存中,并且为元素赋有默认值;
  • 程序计数器
  • 本地方法栈:供本地方法native调用;

1.2、一维数组的内存图解

一个数组的内存图解

//创建一个数组,看他在内存中如何分配
int[] arr=new int[3];
//打印数组的地址值
System.out.println(arr);
//[I@1b6d3586
arr[0]=10;
arr[1]=20;
arr[2]=30;
int one=arr[0];
int two = arr[1];
int three = arr[2];
System.out.println(one);
//10
System.out.println(two);
//20
System.out.println(three);
//30

一个数组的内存图解

两个数组的内存图解

int[] arr1 = new int[3];
System.out.println(arr1);
//[I@1b6d3586
arr1[0]=200;

int[] arr2 = new int[3];
System.out.println(arr2);
//[I@4554617c
arr2[1]=300;

System.out.println(arr1[0]); 
//200
System.out.println(arr1[1]); 
//0
System.out.println(arr1[2]);
//0

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

两个数组的内存图解

两个数组三个引用的内存图解

int[] arr1 = new int[3];
arr1[0]= 10;
arr1[1] = 20;
arr1[2] = 30;
int[] arr2 = new int[3];
arr2[0] = 100;
arr2[1] = 200;
arr2[2] = 300;
int[] arr3 = arr1;
arr3[0]= 60;
arr3[1]= 500;
System.out.println(arr1[0]); //60
System.out.println(arr1[1]); //500
System.out.println(arr1[2]); //30
System.out.println("=============================");
System.out.println(arr2[0]); //100
System.out.println(arr2[1]); //200
System.out.println(arr2[2]); //300
System.out.println("=============================");
System.out.println(arr3[0]); //60
System.out.println(arr3[1]); //500
System.out.println(arr3[2]); //30

System.out.println("====================");
//输出数组的地址值
System.out.println(arr1);
//[I@1b6d3586
System.out.println(arr2);
//[I@4554617c
System.out.println(arr3);
//[I@1b6d3586
//判断两个地址值是否相等
System.out.println(arr1==arr3);
//true

两个数组三个引用的内存图解

1.3、数组的length属性

//数组的一个默认属性 length 可以获取数组长度
int[] arr=new int[3];
arr[arr.length-1]=100;
//length 数组自带的一个属性,可以动态获取数组的长度
int len=arr.length;
System.out.println(len);
//3

//获取数组的最后一个元素
System.out.println(arr[2]);
//100
//数组最后一个元素的索引=数组的长度-1
System.out.println(arr[arr.length-1]);
//100

1.4、一维数组的静态初始化

//静态初始化
int[] array1 = new int[]{10, 20, 30, 40, 50};

//简化方式
int[] array2 = {10, 20, 30, 40, 50};

1.5、数组常见的两个小问题

数组下标越界异常

int[] array = {10, 20, 30, 40, 50};
//数组一旦定义,数组的长度就不可变了
//System.out.println(array[5]);
//Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
//ArrayIndexOutOfBoundsException:数组下标越界异常

空指针异常

int[] array = {10, 20, 30, 40, 50};
       
array = null;
System.out.println(array[0]);
//Exception in thread "main" java.lang.NullPointerException
//NullPointerException:空指针异常

1.6、数组例题

1、数组遍历

int[] array = {10, 20, 30, 40, 50, 60};
for (int value : array) {
    System.out.println(value);
}
/*
for (int i = 0; i < array.length; i++) {
	System.out.println(array[i]);
}
*/
for (int j = array.length - 1; j > 0; j--) {
    System.out.println(array[j]);
}
//反向遍历

2、数组的最值

//数组获取最值
int[] array = {1, 2, 3, 4, 5};
int maxValue, minValue;
maxValue = minValue = array[0];
for (int i = 1; i < array.length; i++) {
    maxValue = maxValue > array[i] ? maxValue : array[i];
    minValue = minValue < array[i] ? minValue : array[i];
}
System.out.println("maxValue = " + maxValue);
//maxValue = 5
System.out.println("minValue = " + minValue);
//minValue = 1

3、数组元素反转

//数组元素反转,首尾元素进行交换
int[] array = {1, 2, 3, 4, 5, 6};
for (int i = 0, j = array.length - 1; i < j; i++, j--) {
    array[i] = array[i] ^ array[j];
    array[j] = array[i] ^ array[j];
    array[i] = array[i] ^ array[j];
}
System.out.println(Arrays.toString(array));
//[6, 5, 4, 3, 2, 1]

4、数组查表法

import java.util.Scanner;

//根据索引查元素
public class MyDemo5 {
    public static void main(String[] args) {
        String[] week = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入索引(0-6):");
        int day = sc.nextInt();
        String str = getElementByIndex(day, week);
        System.out.println(str);
    }

    private static String getElementByIndex(int day, String[] week) {
        if (day >= 0 && day <= 6) {
            return week[day];
        }
        return "你在搞事情?";
    }
}

5、数组元素查找

//查找指定元素第一次在数组中出现的索引
int[] array = {1, 2, 3, 4, 5, 3};
int target = 3;
int index = 0;
while (index < array.length) {
    if (target == array[index]) {
        break;
    }
    index++;
}
System.out.println("第一次出现的索引为" + index);
//第一次出现的索引为2
public class MyDemo6 {
    public static void main(String[] args) {
        String[] week = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"};
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入星期:");
        String s = sc.nextLine();
        //读取字符串
        int index = getIndexByString(s, week);
        System.out.println(index);
    }

    private static int getIndexByString(String str, String[] week) {
        for (int i = 0; i < week.length; i++) {
            if (str.equals(week[i])) {
                return i;
            }
        }
        return -1;
    }
}

猜你喜欢

转载自www.cnblogs.com/shawnyue-08/p/12656049.html