Java学习总结-数组【JavaSE】


前言

目前在学习JavaSE过程中,在这里总结一下数组的知识。


一、一维数组

1、数组的初始化

动态初始化:在创建数组时,直接指定数组中元素的个数。

int[] array = new int[10];

静态初始化:在创建数组时不直接指定数据元素个数,而直接将具体的数据内容进行指定。

int[] array1 = new int[]{0,1,2,3,4,5,6,7,8,9};`

可以将new int[]省略掉。

int[] array1 = {0,1,2,3,4,5,6,7,8,9};

静态和动态初始化也可以分为两步,但是不能省略格式。

int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10, 20, 30};
//下面省略格式是错误的
// int[] array3;
// array3 = {1, 2, 3};

如果没有对数组进行初始化,数组中元素有其默认值,不同数据类型有不同的默认值。
在这里插入图片描述
数据类型为引用类型的话,默认值为null。

2、数组的遍历

可以通过length获取数组的长度,使用for循环遍历数组。

for(int i = 0; i < array.length; i++){
System.out.println(array[i]);
}

也可以通过for-each来遍历数组。

int[] array = {1, 2, 3};
for (int x : array) {
System.out.println(x);
}

还可以使用以下语句来直接打印数组。

int[] arr={1,2,3};
System.out.println(Arrays.toString(arr));

打印结果如下:
[1, 2, 3]

3、数组是引用类型

(1)初始JVM的内存分布

因为数组是引用类型,所以这里介绍一下初始JVM的内存分布方便后续理解,现在学习的知识有限,目前只总结对每个内存分区的理解。

程序计数器 (PC Register): 只是一个很小的空间, 保存下一条执行的指令的地址。
虚拟机栈(JVM Stack): 就是用来保存执行的函数以及局部变量信息的地方,也就是栈帧。
本地方法栈(Native Method Stack): 本地方法栈与虚拟机栈的作用类似。只不过保存的内容是Native方法的信息。因为JVM是使用C/C++语言编写的,Native方法指的就是这些方法。
堆(Heap): JVM所管理的最大内存区域. 使用 new 创建的对象都是在堆上保存。
方法区(Method Area): 用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法编译出的的字节码就是保存在这个区域。

(2)基本类型变量与引用类型变量的区别

基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值;
而引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。

引用变量通过存储的对象在堆中空间的起始地址便可以去操作对象,数组便是如此。

(3)认识 null

null 在 Java 中表示 “空引用” , 也就是一个不指向对象的引用。null 的作用类似于 C 语言中的 NULL (空指针), 都是表示一个无效的内存位置。 因此不能对这个内存进行任何读写操作. 一旦尝试读写, 就会抛出 NullPointerException的错误。
注意: Java 中并没有约定 null 和 0 号地址的内存有任何关联。

(4)数组练习题小结

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

思路:遇到这种题目直接异或即可。

调整数组顺序使得奇数位于偶数之前。调整之后,不关心大小顺序。

思路:分别定义索引从头尾出发,头部开始遇到偶数停止,尾部开始遇到奇数停止,然后交换两数,在索引增加或减少的过程中要注意可能会发生的越界问题。

    public static int[] oddNextEven(int[] arr) {
        int i = 0;
        int j = arr.length - 1;
        while (i < j) {
            while (i < j && arr[i] % 2 != 0) {
                i++;
            }

            while (i < j && arr[j] % 2 == 0) {
                j--;
            }

            int temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;

        }
        return arr;
    }

给你一个整数数组 arr,请你判断数组中是否存在连续三个元素都是奇数的情况:如果存在,请返回 true ;否则,返回 false 。

思路:定义一个变量记录奇数数量,利用一个循环顺序遍历,如果记录奇数数达到3立马返回true跳出循环,如果遇到偶数则将记录的奇数数置为0,继续按循环顺序累计,能够成功遍历完就说明没有连续奇数数没有达到过3,返回false。

二、二维数组

二维数组本质上也就是一维数组, 只不过每个元素又是一个一维数组。

1、基本语法

数据类型[][] 数组名称 = new 数据类型 [行数][列数] { 初始化数据 };

int[][] arr = {{1,2,3},{4,5,6}};
int[][] array2 = new int[][]{{1,2,3},{4,5,6}};
int[][] array3 = new int[2][3];

//二维数组可以不定义列数
int[][] array = new int[2][];//不规则数组
//可以定义不规则的二维数组
int[][] array = {{1,2,3,4,5,6,7,8,9,},{4,5,6}};

2、数组打印

因为二维数组保存的是一维数组的地址,所以使用以下代码打印,不能正常打印。

 int[][] arr = {{1,2,3},{4,5,6}};
 System.out.println(Arrays.toString(arr));

结果如下:
[[I@1b6d3586, [I@4554617c]
这时候要想打印数组就需要别的方法。

int[][] arr = {{1,2,3},{4,5,6}};
System.out.println(Arrays.deepToString(arr));

结果如下:
[[1, 2, 3], [4, 5, 6]]

这里还是补充一下二维数组for循环的遍历。

for (int i = 0; i < array.length; i++) {
   for (int j = 0; j < array[i].length; j++) {
       System.out.print(array[i][j] + " ");
   }
   System.out.println();
}

还有for-each的遍历。

for (int[] tmpArray : array) {
    for (int x : tmpArray) {
        System.out.print(x + " ");
    }
    System.out.println();
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值