🌱博主简介:是瑶瑶子啦,一名大一计科生,目前在努力学习JavaSE。热爱写博客~正在努力成为一个厉害的开发程序媛!
📜所属专栏:爪洼岛冒险记【从小白到大佬之路】
✈往期博文回顾: 【爪洼岛冒险记】第4站:Java中如何进行控制台输入&输出?用Java实现猜数字小游戏;超详细讲解Java中的方法:方法的重载,方法的签名
🕵️♂️近期目标:成为千粉小博主。
🙇♀️写博客理念:力求用自己的语言加上自己的理解去阐述知识知识、技术。喜欢画图、思维导图去描述过程和知识之间的联系。
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
🌺:“再牛的程序员也是从小白开始,既然开始了,就全身心投入去学习技术”
爪洼岛冒险记-第4站
- 🧜♀️上一站快速回顾:
- Part1:初识数组(array):
- 1.1:什么是数组?
- Part2:Java中的数组
- 2.1:数组的定义:
- 2.1.1:定义数组并初始化:
- 2.1.2:定义数组,不初始化:
- 2.2:数组的基本使用:
- 2.2.1:获取数组长度(元素个数):
- 2.2.2:访问数组元素:
- 2.2.3:遍历数组:
- 2.3:深入理解Java中数组
- 2.3.1:数组在内存中如何存放?
- 2.3.2:关于“引用”
- Part3:Java中的二维数组:
- 3.1:二维数组的定义&初始化:
- 3.1.1:定义数组并初始化:
- 3.1.2:定义数组不初始化
- 3.2:如何理解Java中的二维数组:
- 3.3:二维数组的遍历:
- Part4:总结:
🧜♀️上一站快速回顾:
🐳上一站中重点:
- Java中如何生成随机数?
- 什么是随机数流?
- 什么是随机数种子?
- Java中的方法
- 什么是方法的重载?
- 重载的规则?
🐱💻尝试用Java写出汉诺塔问题–方法的递归
public static void move(char pos1,char pos2){
System.out.println(pos1+"--->"+pos2);
}
/**
*
* @param n 盘子个数
* @param pos1 盘子所放的起始位置
* @param pos2 盘子移动所借助的中间柱子
* @param pos3 盘子的目标位置
*/
public static void hanoiTower(int n,char pos1,char pos2,char pos3){
if(n==1){
move(pos1,pos3);
}
else{
hanoiTower(n-1,pos1,pos3,pos2);
move(pos1,pos2);
hanoiTower(n-1,pos2,pos1,pos3);
}
}
public static void main(String[] args) {
hanoiTower(3,'a','b','c');
}
😻今天,瑶瑶子将带领大家全面学习Java中第一个数据结构—数组,绝对详细,绝对清晰,一遍学会!那么这就启航~
🌴本站任务:
🙆♀️write int the front:
🥫🎊
- 了解Java中的数组概念
- 学习Java中一维数组
- 学习Java中二维数组
Part1:初识数组(array):
1.1:什么是数组?
- 🍧数组的概念
数组是存储相同类型数据的集合
- 🙇♀️数组的特点:
1.元素在内存中位置相邻,为顺序存储.
2.数组中每一个元素都有对应编号(元素下标)
注意:这里为了方便表示,是把内存单元当作4字节来画的,实际上内存的最小单元是1字节.
Part2:Java中的数组
2.1:数组的定义:
2.1.1:定义数组并初始化:
int[] arr = {1,2,3,4,5};
int[] arr = new int[]{1,2,3,4,5};
2.1.2:定义数组,不初始化:
int[] arr = new int[3];
//定义一个数组,元素个数为3,默认初始化为0
- 注意:
- 定义时:
type+[]
表示Java中的一种数据类型,即数组,表示type类型数据的集合,[]
中不可写入数字哦。 - 数组是一种引用数据类型,数组中的数据存在于堆上。
- 数组在Java中也是一个对象,所以可以用
new
来创建数组–实例化一个对象。
- 定义时:
2.2:数组的基本使用:
2.2.1:获取数组长度(元素个数):
int[] arr = {1,2,3,4,5};
int len = arr.length;//数组名.length 即可获取数组长度(元素个数)
System.out.println(len);
2.2.2:访问数组元素:
- 下标访问:
int[] arr = {1,2,3,4,5};
System.out.println(arr[3]);
//4
注意:下标的有效范围是
[0,arr.length)
,访问时下标一旦越界,编译时直接抛出异常。
2.2.3:遍历数组:
- 普通for循环+数组下标:
int[] arr = {1,2,3,4,5};
for (int i = 0,;i < arr.length;i++){
System.out.print(arr[i]+" ");
}
- 增强for循环(for-each):
int[] arr = {1,2,3,4,5};
for ( int x :arr ){
System.out.print(x+" ");
}
🙋♀️如何理解for each循环?
“:
”左边的变量,负责接收数组中元素的值。随着遍历,x的值也不断发生改变。(左边的相当于一个容器,负责接收for each 循环按顺序遍历出元素的值);
🤷♀️什么时候使用for-each循环?
当你只是想通过遍历来获取数组元素
时,而不牵涉下标,这个时候,可以选择使用for-each循环~
- 借助java.util.Arrays(操作数组的工具类)
import java.util.Arrays;
public class TestDemo {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
String str = Arrays.toString(arr);
System.out.println(str);
}
}
🧘♀️其实String toString(int[] arr)
方法就是用for
循环来实现的
//toString(int[] a)源码:
public static String toString(int[] a) {
if (a == null)
return "null";
int iMax = a.length - 1;
if (iMax == -1)
return "[]";
StringBuilder b = new StringBuilder();
b.append('[');
for (int i = 0; ; i++) {
b.append(a[i]);
if (i == iMax)
return b.append(']').toString();
b.append(", ");
}
}
2.3:深入理解Java中数组
2.3.1:数组在内存中如何存放?
🤸♀️首先,你需要知道:
-
JVM内存分布:
-
Java中的局部变量存放在栈区上
-
Java中的对象存放在堆区上
-
Java中数组类型变量,是引用数据类型
-
Java中数组是一个对象
🐣然后,我们分析这段代码:
int[] arr = {1,2,3,4,5};
- arr 是main函数中的局部变量,存放在堆上
- 数组实体(数组实例,也就是对象),存放在堆上
👯♀️总结: - 数组类型是引用数据类型,数组类型变量存放的是数组实例在堆内存中的地址。
2.3.2:关于“引用”
- 引用其实本质就是对象的地址
- 一个引用类型变量只能储存一个对象的地址(即一个引用只能指向一个对象)
- 引用类型变量置为
null
说明这个引用(引用变量)不指向任何对象 - 引用类型变量不一定都在栈上。(后期讲)
注意:Java中的
null
表示无效引用
,没有规定null表示的是0号内存。(C语言中规定NULL表示的是0号内存,不能被访问)。
Part3:Java中的二维数组:
3.1:二维数组的定义&初始化:
3.1.1:定义数组并初始化:
//eg:一个2行3列的数组
int [][] arr = {{1,2,3},{4,5,6}};
- 注意:外层大括号里表示行的内存花括号不可省略!
int [][] arr = new int [][]{{1,2,3},{4,5,6}};
int [][] arr = new int [][]{{1,2},{4,5,6}};
💁♀️第二行是这样理解的:
🙅♀️也就是说,并不是arr[0][2]没有初始化,而是根本不存在arr[0][2]这个元素!
3.1.2:定义数组不初始化
//每一个元素默认初始化为0
int [][] arr1 = new int[2][3];
//省略列的(不规则二维数组)
int [][] arr2 = new int[2][0];
arr[0] = new int[2];
arr[1] = new int[3];
- 注意:Java中二维数组可以省略列,但不能省略行!
- 省略列时:
3.2:如何理解Java中的二维数组:
-
二维数组其实是一个特殊的一维数组:即元素类型是数组引用的数组(int [ ])。
-
行/列下标对应关系:
-
注意:两个/多个一维数组作为数组元素时,数组实体在堆内存上并没有物理位置上的相邻关系。
比如下图的元素3和元素4在内存中很有可能是不相邻的。
3.3:二维数组的遍历:
- 普通for循环+数组下标遍历:
public static void main(String[] args) {
int[][] arr = {{1,2,3},{4,5,6}};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j]+" ");
}
}
}
- for-each循环:
public static void main(String[] args) {
int[][] arr = {{1,2,3},{4,5,6}};
for (int[] ret:arr) {
for (int x:ret) {
System.out.print(x+" ");
}
}
}
- 使用Arrays.deepToString(Object [ ])
public static void main(String[] args) {
int[][] arr = {{1, 2, 3}, {4, 5, 6}};
String strArr = Arrays.deepToString(arr);
System.out.println(strArr);
}
Part4:总结:
- 一维数组类型是引用数据类型,该类型变量存放的是一维数组实例在堆内存上的地址。
- 二维数组本质是一维数组,二维数组的每一个元素均为一维数组类型(引用数据类型)
🏄♀️下期预告–详细讲解Java中最重要的语法–类&对象
🙆♀️专栏系列文章:
- 【爪洼岛冒险记】第4站:Java中如何进行控制台输入&输出?用Java实现猜数字小游戏;超详细讲解Java中的方法:方法的重载,方法的签名
- 【爪洼岛冒险记】第3站:任务1:学会int和String之间的转换;任务2:将Java运算符全部收入囊中~ 任务3:拿下Java中的类型提升
- 【爪洼岛冒险记】第2站:带你学会:Java中三种输出语句,java中基本数据类型,学会变量,常量,类型转换知识点
- 【爪洼岛冒险记】第1站:Java重要特性,JDK,JRE,JVM区别和联系,环境变量
🙈原创不易,如果对你有所帮助,还请三连+关注!我是瑶瑶子,持续输出优质文章!