【Java篇】备战面试——你真的了解“数组”的吗?
创始人
2024-01-31 04:40:14
0

目录

数组概念

声明数组

数组默认值     

数组拷贝及数组类型VS基本类型

Arrays类

二维数组


数组概念

        在JAVA语言中数组是一种数据结构,是用来存储同一类型数据的集合或者序列,我们可以通过整型下标(index,异或索引)去访问或遍历数组中的任意值。例如a是一个整型数组,a[i]就是访问树祖宗下标为i的元素;

声明数组

        我们想要使用数组这一数据结构就需要提前声明数组,在Java中声明数组有三种方式(以整型数组为例);

/*方式一*/
int[] arr = {1,2,3,4,5};
/*方式二*/
int[] arr = new int[]{1,2,3,4,5};
/*方式三*/
int[] arr = new int[5];arr[0]=1; arr[1]=2; arr[2]=3; arr[3]=4; arr[4]=5;

        其中第一、二种,是你预先知道数组的内容,而第三种都是你先创建爱你长度为5的数组,然后逐一复制;这里有一个小细节,不能在给定初始值的同时设置长度,即一下格式不允许:

数组默认值     

        在不同类型的数组在没有为元素赋值之前,数组中的元素都是由默认值的,整型数组默认值为0、boolean类型数组默认值为false、对象类型数组默认值为null;

数组拷贝及数组类型VS基本类型

        在内存层面数组类型和基本类型有所不同,基本类型在内存中只对应一块空间,但是数组有两块:一块用来存储数组内容本身,另一块用来存储内容的位置也就是地址值(首元素arr[0]的地址值),为什么会这样呢?我们看如下代码:(这串代码是可运行的)

int[] arrA = {1,2,3};
int[] arrB = {1,2,3,4};
arrA = arrB;

        这段代码中,arrA初始的长度是3,arrB的长度是4,将arrB的值赋给了arrA。如果arrA对应的内存空间是直接存储的数组内容,那么它将没有足够的空间去容纳arrB的所有元素。
        用两块空间存储就简单得多,arrA存储的值就变成了和arrB的一样,存储的都是数组内容(4,5,6,7)的地址,此后访问arrA就和arrB是一样的了,而arrA (1,2,3)的内存空间由于不再被引用会进行垃圾回收;
        由此可以看出,给数组变量赋值和给数组中元素赋值是两回事,给数组中元素赋值是改变数组内容,而给数组变量赋值则会让变量指向一个不同的位置(指向首元素的地址)。
        上面我们说数组的长度是不可以变的,不可变指的是数组的内容空间,一经分配,长度就不能再变了,但可以改变数组变量的值,让它指向一个长度不同的空间,就像上例中arrA后来指向子arrB一样。

Arrays类

        对数组进行操作的辅助类,实现了对数组的常用操作。

sort 方法:可以对数组排序,默认数组数值从小到大排列,用户可以自定义排列顺序,

Arrays.sort(arr);                                    

copyOf/copyOfRange 方法:复制数组。底层调用 System.arrayCopy 的本地方法实现,常用于数组扩容。

int[] arr1 = Arrays.copyOf(arr, 10);                  // 复制数组:前 10 个单位
int[] arr2 = Arrays.copyOf(arr, 0, arr.length);       // 复制数组:从 0 到 arr.length - 1

asList 方法:将数组转化为列表(List 类),但数组数据必须是包装类型。

调用该方法将数组转换为列表后,在内存中实际还是以数组形式存储。这可能会导致以下两个问题:

  1. 调用 List 类的 add 方法向列表中插入数据,会导致异常;
  2. 对原数组进行更改,也会导致列表中的数据发生变化。
arr[] = new Integer[]{1, 2, 3, 4};                    // 数组必须是包装数据类型
List list = Arrays.asList(arr);                       // 将数组转换为集合(有问题)               
List list = new ArrayList<>(Arrays.asList(arr));      // 将数组转换为集合(推荐) 

二维数组

         Java中其实是没有二维数组的,只不过java的一维数组可以看成是一个对象,那么这样我们就可以将几个一维数组当做元素(对象)存储到另一个一维数组中就得到了我们要的二维数组。

        二维数组的元素个数 = 二维数组中一维数组(元素)的个数 = arr.length;
        二维数组的每个元素是一维数组, 所以如果需要得到每个一维数组中的元素,还需要再次遍历;因为第一次我们得到的只是一个对象,想要具体值还要继续遍历;

语法格式

int[][]  名称 = new int[行数][列数];

示例: 以下三种方式都正确;

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



 

相关内容

热门资讯

向上·2025湖湘经济关键词盘... 三湘都市报·新湖南客户端 全媒体记者 龙思言 “守住消费券发放时间,买了就是省钱!”近日,已有身孕的...
宁波这类车淘汰更新,补贴政策调... 此前 宁波市生态环境局等5部门联合印发了 《宁波市国四排放标准 非营运中、重型货车提前淘汰 及新能源...
成都警方通报:男子因纠纷引燃易... 12月28日,成都市公安局高新区分局发布警情通报: 12月28日下午,高新区南三环路四段一汽车销售服...
爱奇艺回应“男子充25年会员退... 近日,河南许昌黄先生充了25年爱奇艺会员后遭遇退费难一事受到关注,相关词条登上微博热搜。 据河南广播...
成都警方:一男子因纠纷引发燃爆... 12月28日,成都市公安局高新区分局发布警情通报: 12月28日下午,我区南三环路四段一汽车销售服务...
成都高新警方通报:男子因纠纷在... 本文转自【成都高新公安】; 12月28日,成都市公安局高新区分局发布警情通报:
青海一人在出租屋内遇害!犯罪嫌... 关于规范非机动车停放秩序的通告 2000年2月2日,同仁县(现同仁市)发生一起恶性刑事案件,受害人马...
成都警方:男子因纠纷于4S店外... 新京报讯 12月28日,成都警方发布警情通报,内容如下: 编辑 李忆林子
原创 被... 被苹果起诉还敢爆料?Jon Prosser这次直接甩出王炸,iPhone首款折叠屏渲染图全网刷屏!书...
财政政策如何继续“更加积极”—... 新华社北京12月28日电 题:财政政策如何继续“更加积极”——解读2026年财政工作新看点 新华社记...