数组

声明: 本文主要作为作者的复习笔记,由于作者水平有限,难免有错误和不准确之处,欢迎读者批评指正.

数组的定义

数组:相同数据类型的集合;Java中,数组是引用数据类型,在堆中存储.

  1. 数组中存放的元素类型是相同的;
  2. 数组在内存中的空间是连续的,一个元素和一个元素之间紧挨的;
  3. 每个数组元素都有编号,第一个位置编号从0开始,即数组的下标从0开始;

数组的创建以及初始化

数组的长度一旦定义之后就是固定的(数组定长).

  1. 静态初始化: 定义数组时,随即将每个元素的值也初始化好;
    语法: 数据类型[ ] 数组名称 = {元素值1,元素值2,元素值3…元素值N};
    例: int [ ] num1 = {1,3,5,7,9};
    数组长度编译器会根据元素的个数来自动计算并定长.

  2. 动态初始化: 定义数组时,不给元素具体赋值,定义之后再赋值,数组中每个元素都是其数据类型的默认值;
    **语法:**数据类型[ ] 数组名称 = new 数据类型[数组长度];
    例: int [ ] num2 = new int[5];
    num2采用动态初始化定义,长度为5,其中每个元素都是int的默认值0.

数组的基本使用

  1. 数组中元素的访问: 由于数组在内存中是一块连续的内存空间,且每个数组元素都有编号;第一个元素的编号为0,程序只需要记录第一个元素的地址(数组的首地址)即可;无须保存每个元素的内存地址,根据首地址以及元素编号就可以立即取得任意一个元素的地址(元素的编号称为数组的偏移量);

  2. 数组的随机访问特性: 可以立即取得数组中任何一个元素;

  3. 数组中元素的下标为[0…N),N就是数组的长度,数组中最后一个元素的下标为N-1;

  4. 访问数组中任意一个元素,只需要根据数组名称 + 下标即可立即取得;一定要注意下标的合法性问题(不能超过N-1);

数组空间地址
第四个元素的地址 = 首地址 + 3 * 数据类型大小 = 首地址 + 3 * 4 = 112
数组下标其实就是该数组元素相对于第一个元素的偏移量(即相对于第一个元素的距离单位);
假设数组是宿舍,一层楼有10间宿舍,宿管阿姨只需要知道第一个宿舍的位置,其他宿舍只需要知道相对于第一个宿舍的距离即可;

可以通过(数组名称.length)属性取得数组的长度,然后根据数组长度进行循环遍历数组的每一个元素;
例: System.out.println(num1.length);

若此时只需要取得数组元素,并不修改,用for-each循环来遍历;
例: int[ ] num1 = {1,3,5,7,9};
for (int i : num1){
System.out.print(i + “、”);
}
此处的i不再是下标而是局部变量,依次将数组中每个元素的值拷贝一份赋值给i; 这种循环无法修改数组元素,修改的是局部变量i本身,对原数组不产生任何影响;

引用数据类型

数组、类、接口都属于引用数据类型;

  1. 所有的引用数据类型的变量,保存的都是一块堆内存的地址,不是具体数值;
  2. 所谓的引用只不过是给对象起了个别名而已;
  3. 引用类型的变量就是保存对象的地址;
  4. 当引用数据类型保存的值为null,表示该引用不指向任何堆内存空间,无法通过该引用进行任何具体的操作,取值,取长度都不行,一旦操作就是空指针异常;

数组转为字符串操作

一般工具类都是使用s结尾:

  1. 数组的工具类Arrays;
  2. 集合框架的工具类Collections;
  3. 线程池的工具类Executors;

public static void main(String[ ] args){
int[ ] arr = {1,3,5,7,9};
//默认输出的是该引用的类型@加密后的地址,不会输出该引用的对象内容;
System.out.println(arr); #输出结果: I@1b6d3586(I是指整型数组)
//要想输出内容,最常用的操作是将引用转为字符串处理;
String ret = Arrays.toString(arr);
System.out.println(ret); #输出结果: [1,3,5,7,9]
}

数组拷贝

public static void main(String[ ] args){
int [ ] arr = {1,3,5,7,9};
//这不算拷贝
int[ ] newArr = arr;
//所谓的拷贝,创建一个新的数组对象,新的数组对象的内容和原数组完全一致
System.out.println(arr2Str(newArr));
//修改newArr的内容,对原来的数组arr产生了影响,原数组的元素发生了改变
newArr[1] = 30;
System.out.println(arr2Str(arr)); #输出结果: [1,30,5,7,9]
}
数组arr的值发生了改变
int[ ] arr = {1,3,5,7,9};
//调用JDK的Arrays中的copyOf方法拷贝数组
//原数组名称,新数组的长度
//全拷贝,将原数组每个元素都拷贝过来,新数组长度和原数组保持一致
int [ ] newArr = Arrays.copyOf(arr, arr.length);
System.out.println(arr2Str(newArr));
newArr[1] = 30;
System.out.println(arr2Str(arr));

Arrays.copyOf(原数组名称,新数组长度)

  1. 新数组长度和原数组保持一致,全拷贝,新数组的内容和原数组完全一致,长度也一致;
  2. 新数组的长度 > 原数组长度,原数组的所有内容新数组都有,超出原数组长度的部分,使用数据类型的默认值填充(动态数组的核心实现方法);
  3. 新数组的长度 < 原数组长度,默认从原数组的第一个元素开始拷贝,拷贝到新数组的长度为止;

数组的部分拷贝,不想从第一个元素开始,自定义开始和终止位置;
copyOfRange(原数组名称, 起始位置索引, 终止位置索引)

int [ ] arr = {1,3,5,7,9};
//从数组的第二个元素开始,到第四个位置结束
//[3,5,7]
//Java的区间基本上都是左闭右开区间[1,4)
int [ ] newArr = Arrays.copyOfRange(arr, from:1, to:4);
System.out.println(arr2Str(newArr));

二维数组

可以当做一个具有行和列的表格;
声明一个二维数组的语法:
数据类型[ ][ ] 数组名称 = new 数据类型[行数][列数] {可选的初始化数据}
二维数组
表格

内存的栈区和堆区

  1. 栈区保存的是方法的栈帧,每个方法的调用以及结束,就对应一个方法栈帧的入栈以及出栈过程;
  2. 方法中的所有局部变量都保存在栈帧中;
  3. Java中的new, new出来的内容都保存在堆中,所有对象都保存在堆结构中(看到关键字new就在堆中开辟新空间);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值