【本章内容】
1.一维数组
2.数组练习
1.一维数组
1.数组的定义:一个数组是由多个相同的数据类型元素组成的集合,这些元素在内存中顺序排列,是一段连续的空间,空间被所有元素平均分成多个小空间一一占用,每个小空间都有自己的标号(下标),由第一个小空间下标为0开始往后加一。(如图)
形象解释:来到酒店酒店廊道望过去有一排连续并列的房间,每个房间都有对应的门牌号,门牌号从0开始依次递增,每个房间中都有一个客人,当我们要访问指定的客人时,可通过客人所在房间的门牌号找到对应房间从而访问客人。
2.一维数组的3种初始化方式
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
int[] array2 = new int[]{1,2,3,4,5};
int[] array3 = new int[5];
System.out.println(Arrays.toString(array));
System.out.println(Arrays.toString(array2));
System.out.println(Arrays.toString(array3));
将3个数组分别打印观察,发现array与array2有指定的数值,是因为这两种方式对数组进行列初始化,而没有对array3进行初始化,只赋给列array3数组大小,编译器自动将元素数值为0.
如上图,三个数组名前的 int[] 代表数组的数据类型,array的写法是我们之后最常用的方式。array2与array3中都有一个关键字 --> new,new代表着是实例化一个对象,内存在堆上开辟。
(如图)
(变量在栈上,数据在堆上),这里对new先不表,会在之后的博客进行介绍
3.数组的使用
数组访问:数组访问依靠下标,数组在内存空间中是一段连续的空间,下标编号0从第一个元素开始依次递增,我们可以通过下标来访问数组中任意一个元素。
public static void main(String[] args) {
int[] array = {11,22,33,44,55};
System.out.println(array[0]);
System.out.println(array[1]);
System.out.println(array[2]);
System.out.println(array[3]);
System.out.println(array[4]);
}
如图,我们可以通过对应的下标来访问我们想要访问的元素。
但是有一点需要注意,那就是越界访问的问题。如果我们访问的下标超过来数组的最大下标大小,则会出现越界访问的异常
如上图,我们访问了下标5但是实际下标最大为4的数组,超出了访问范围,从而出现异常。
4.遍历数组的方式
/**
* 数组3种遍历
* @param args
*/
public static void main5(String[] args) {
int[] arr = {1,2,3,4,5};
//下标循环遍历
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
//for each遍历
for(int x:arr){
System.out.print(x+" ");
}
System.out.println();
//Arrays:以字符串方式打印
String ret = Arrays.toString(arr);
System.out.println(ret);
}
(1)for遍历
这种遍历方式我们实质是采用下标来访问数组,注意到for循环的表达式2:i < arr.length 由于Java的方便性,java直接给我们提供了确定数组大小的便捷。
(2)for each遍历
观察圆括号()中的两个参数 int x 代表的是这个数组的数据类型,arr代表的是要遍历的数组,之后打印出来即可(注意打印格式)
(3)Arrays工具类之 toString:以字符串方式对数组进行打印
Arrays是Java中的工具类,可以理解为返回值为数组字符串的方法,因此我们要用String数据类型进行接收返回值,之后直接打印返回值即可
以上就是一维数组的3种遍历方式。
5.数组是引用类型
我们考察一下基本类型变量与引用类型变量的区别
在main中我们设置了3个变量,分别是a , b , array,其中a与b是基本类型变量,array是引用类型变量,在内存中,有栈和堆,简单来说栈存变量,堆存数据(对象)(这是个人理解), a 与b 赋值为10与20,是内置类型的变量,因此其空间中保存的就是给该变量初始化的值。
而array是数组类型的引用变量,保存的内容是数据的地址,数据在堆中。与C语言的指针类似
下面来深入理解数组的引用变量
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
int[] array2 = {100,200,300,400,500};
array = array2;//把array2的地址给给array,array此时指向array2的数据
array[0] = 1;
array[1] = 2;
System.out.println(Arrays.toString(array2));
}
如图,我们创建了array与array2两个数组,这两个变量分别存了自身数据的地址,假设array存了0x888的地址,指向了数据{1,2,3,4,5,},同理array2存了0x999地址,指向{100,200,300,400,500},当我们赋值array2给array,此时array与array2共用一个地址,共同指向了数据{100,200,300,400,500},当我们修改array的前两个数据,也相当于修改了array2的前两个数据。打印array2证明思路正确。
6.认识null
7.数组作为函数参数,数组作为函数返回值
数组作为函数参数进行传参,比如说我们写一个打印数组的方法
public static void print(int[] arr){
System.out.println(Arrays.toString(arr));
}
public static void main(String[] args) {
int[] array = {1,2,3,4,5};
print(array);
}
数组作为函数返回值,相当于返回数组的地址,说明可以一次性返回多个值,不像C语言一次只能返回一个值
/**
* 数组作为参数返回,相当于返回数组的地址
* @return
*/
public static int[] test3(){
int[] tmp = {1,2,3,4,5};
return tmp;//返回数组
}
public static void main2(String[] args) {
int[] ret = test3();
System.out.println(Arrays.toString(ret));
}
数组练习放在下一篇博客
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)