数组
先说一个比较高大上的定义
数组是一个简单的复合数据类型,它是一系列有序数据的集合,它当中的每一个数据都具有相同的数据类型,我们通过数组名加上一个不会越界下标值来唯一确定数组中的元素。
上述定义其实已经足够清晰明了,只是对于初学者而言可能还是不知道什么是数组。一般情况下这种时候会列举一堆的相关示例来说明。当然我也无法免俗,现在有这么一个问题,以代码的形式描述 5 个成绩,那么可能使用的代码就会是下面的样子
public class Main {
public static void main(String[] args) {
// 5位同学的成绩:
int n1 = 68;
int n2 = 79;
int n3 = 91;
int n4 = 85;
int n5 = 62;
}
}
2
3
4
5
6
7
8
9
10
但是它可以吗?如果我们的需求发生了变化,描述 5 个成绩同时给成绩按照从小到达的顺序进行排列。这个时候虽然我们通过 if 语句来实现变量交换重新赋值可以实现,但是太麻烦了,因为当成绩的个数增加到5-60甚至更高的时候这种排序会让我们崩溃掉
怎么办?解决办法也不是没有,正如我们显示生活中的例子一样,比如你去买10袋方便面,如果直接拿虽然可以拿的动但是比较费劲,如果我们使用一个更大的袋子装这些方便面就会显得很轻松。在前面的描述中,5 个变量相当于一袋袋的方便面而数组就相当于最大的那个袋子
# 定义
数组的定义其实并不难,只有两个重点关注的地方,一是长度(大小)二是存放的内容(元素)
public class Demo1{
public static void main(String args[]){
//第一种方式只声明长度不声明具体内容,相当于只有一个指定大小的空袋子
int scops01[]=new int[5];
//第二种方式即有长度也有具体元素,相当于有一个放满方便的袋子
int scops02[]={100,60,80,90};
//第三种方式,其实是前面两种的综合属于扩展写法
int scops03[]=new int[]{80,60,90};
}
}
2
3
4
5
6
7
8
9
10
11
12
13
上面的代码片段中出现了一个关键字 new ,这个关键字很重要,同时也是我们第一次见到。它的主要作用如下(个人理解)
分配内存:无论是只指定数组的成员数量还是直接声明其具体成员,无形中都定义了数组的长度,而数组的长度决定了在内存中的大小,例如:我们声明一个 int 类型长度为 5 的数组,那它的内存空间需要 5*4 。new 就可以理解为申请了 20 字节的连续空间
初始化:所谓初始化就是当某一个变量在一开始的时候的值(需要注意的是这个值并不一定是 0),例如我们定义数组的同时也定义了数组成员的具体值
其实这里我用了一个术语去解释了另一个术语这在我的认知里是犯忌讳的
# 内存结构
Java 的代码是运行在虚拟机(JVM)中的,这也意味着它没有办法像 C 语言 直接去操作内存。而这里讨论的数组的内存结构更多的是以理解为主,了解数组中的数据在内存中是以什么样的形式存在
上面这张图中涉及到了几个概念,这也是我想表达的东西
索引:这个词听过很多次,在初次学习编程的时候很容易迷惑(至少我是),它其实就是一种编号,类似于字典的页码,当我们把所有的字和与之对应的页码串联在一起的时候就形成了索引。数组中以数组名[索引值]的方式指定对应的空间,需要注意的是索引值是从 0 开始计算
数组长度:这个称呼其实有很多别名,例如:数组元素、元素总数、最大可用下标。但是无论如何称呼,它表述的东西都是同一个就是数组中的元素总个数,同时需要注意它是从 1 开始计算
# 应用
数组的应用场景很多,但是归总分类一下的就那么几种,先是基础的遍历也就是获取数组中的元素
public class Demo1{
public static void main(String args[]){
int arr[]={100,60,80,90};
//方式一:通过索引+循环的形式,在不停的改变索引值的同时获取数组元素
for(int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
//方式二:需要注意的是num的类型需要和数组中元素的类型一致
for(int num :arr){
System.out.println(num);
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
其次就是排序了,数组的排序方式有 N 多,如果你乐意的话真的可以玩出花儿。我这里只列一种排序
public class Demo1{
public static void main(String args[]){
int arr[]={100,60,80,90};
for(int i=0;i<arr.length;i++){
//从数组中挨个取出的元素
int temp=arr[i];
//每取一个对比一遍数组中的所有元素
for(int x=0;x<arr.length;x++){
//条件成立则进行元素呼唤
if(temp<arr[x]){
int tnum=arr[i];
arr[i]=arry[x]
arr[x]=tnum;
}
}
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
这种排序方式并不好,只是抛砖引玉。大概知道怎么实现的所谓排序即可
# 二维及多维
二维数组可以理解为数组中的数组,比较常见的可能就是游戏中的坐标系。至于再叠加三维也不是没有,当然三维再上就称为多维了。
至于如何理解二维数组,我想用一张图来说明
多维数组的应用其实并不多见,至少我见到的不多
二维数组是在一维的基础上在多一个中括号或者大括号,至于多维的话你想搞几维就加几个括号
public class Demo1{
public static void main(String args[]){
//具体元素
int numbers[]={{100},{60,80},{90}};
//只定义个数
int arr[]=new int[5][5];
}
}
2
3
4
5
6
7
8
9
10
11
12
至此数组相关内容结束