上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的、用一个标识符封装到一起的基本类型数据序列或对象序列。

  数组是具有相同数据类型的一组数据的集合,根据维数不同可以分为一维数组、二维数组和多维数组。大家可以将一维看作直线,二维看作平面、三维看成立体空间。

一、一维数组

  1. 创建一维数组

  数组作为对象允许使用new关键字进行内存分配。在使用数组之前,必须首先定义数组变量所属的类型,即声明数组。

  声明数组有两种形式,在之前的篇章中也有所提及,语法格式如下:

数组元素类型  数组名[];
数据元素类型[] 数组名;

  程序员在编写代码时习惯使用第二种方法,需要注意的声明时是[]中不能添加任何数据。下面是一个声明数组的例子,两种声明方式都正确,不同数据要声明不同类型的数组:

int arr[];                // 声明int型数组,数组中每个元素都是int型数值
String[] str; // 声明String数组,数组中每个元素都是String数组

  声明数组后还不能访问它的任何元素,要想真正使用数组还要为其分配内存空间,且分配内存空间时必须指明数组的长度。语法格式如下:

数组名 = new 数组元素类型[数组元素个数];

  下面举一个例子,为数组分配一个大小为5的内存空间:

arr = new int[5];

  一维数组arr的存储状态如下图:

arr[0] arr[1] arr[2] arr[3] arr[4]

  括号中的0、1、2、3、4表示数组的下标。需要注意的是,下标从0开始,到数组长度-1为止。

  当然也可以直接声明并分配内存,如下:

int[] week = new int[7];

  上述代码创建了一个一维数组week,并指定了数组长度为7。

  还有一点需要注意的是,使用new关键字为数组分配内存时,数组中各个元素的初始化值都为0。比如上述代码使用new关键字创建了长度为7的week数组,那么数组中的元素可以表示为[0, 0, 0, 0, 0, 0, 0],这就是一个一维数组,数组中的每一个元素都初始化为0。

  2. 初始化一维数组

  前面说的初始化是使用new关键字自动初始化,数组也可以与基本数据类型一样由程序员进行初始化操作,可以分别初始化数组中的每个元素。

  数组初始化的方式有两种,下面用一个例子来说明:

int arr1[] = new int[]{1,2,3,4,5,6};        // 第一种
int arr2[] = {10,11,12,13,14}; // 第二种

  数组初始化的方式是:把数据包括在大括号之内,中间用逗号分开数组中的元素的值,系统自动为数组分配一定的空间。上述第一种创建了6个元素的数组,其值依次为1、2、3、4、5、6,第二种创建了5个元素的数组,其值依次为10、11、12、13、14。

  下面我们结合上篇的流程控制来举一个一维数组数组的例子。

  eg:求一维数组中各元素的和

 public class SumNum {

     public static void main(String[] args) {
int[] num = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 创建并初始化数组
int sum = 0; // 存储累加和 for(int i=0; i<num.length; i++) {
if(i == num.length-1) { // 判断下标是否是最后一个
System.out.print(num[i] + "="); // 输出等号
} else {
System.out.print(num[i] + "+"); // 输出加号
}
sum += num[i];
} System.out.print(sum);
} }

  其中,num是数组名,这个数组总长是10,但一般在编程中,可能会出现需要修改数组长度的时候,此时假设for循环中写的是i<10,那么我们在修改代码时可能会忽略这个地方导致出现意想不到的错误,所以我们在编写代码时,要习惯性使用数组名.length来获取数组的长度,如上述代码中的num.length其实就是10。而下一句中的num.length-1是因为数组下标是从0开始的,当我们获取最后一个元素时,数组下标为总长减一,故num.length-1就是最后一个元素10的下标为9。最后的运行结果为:

二、多维数组

  1. 二维数组

  如果一维数组中的各个元素仍是一维数组,那么它就是一个二维数组。二维数组常用于表示表,表中的信息以行和列的形式组织,第一个下标代表元素所在的行,第二个下标代码元素所在的列。或用线性代数的知识来说,二维数组就是一个矩阵,第一个下标代表矩阵的行,第二个下标代表矩阵的列。

  二维数组的声明也有两种方式,语法格式如下:

数组元素类型 数组名[][];
数组元素类型[][] 数组名;

  与一维数组一样,如果声明时没有分配内存空间,同样也要使用关键字new来分配内存。

  二维数组可以看作由多个一维数组组成,在给二维数组分配内存时,可以为这些一维数组同时分配相同的内存。第一个中括号中的数组是一维数组的个数,第二个中括号中是一维数组的长度。

int arr = new int[2][4];

  上述代码就是一个典型的声明一个二维数组arr并为其分配内存空间,分配后arr拥有两个长度为4的一维数组,内存分配如下图:

arr[0][0] arr[0][1] arr[0][2] arr[0][3]
arr[1][0] arr[1][1] arr[1][2] arr[1][3]

  我们也可以为每一维单独分配内存。如下:

int[][] a = new int[2][];
a[0] = new int[2];
a[1] = new int[3];

  这样我们就可以得到一个二维数组,第一个一维数组长度为2,第二个一维数组长度为3。

  二维数组的初始化与一维数组类似,同样可以使用大括号完成二维数组的初始化。如下:

int arr[][] = {{3,0},{5,7},{6,9}};

  这就是一个arr[3][2]的数组,有三个一维数组,每个一维数组的长度都为2。但要明确下标是从开始的,比如arr[1][0]=5,指的是第二个一维数组的第一个元素为5。故我们也可以直接给arr[x][y]赋值,如给arr[1]的第二个元素赋值:

arr[1][1] = 50;

  那么上述数组就变成了如下形式:

int arr[][] = {{3,0},{5,50},{6,9}};

  2. 三维数组

  对于三维数组,想必各位已经能推算出来了,一维用一个括号,二维用两个括号,那么三维就用三个括号。

int arr[][][] = new int[][][]{
{{1,2,3},{4,5,6}},
{{7,8,9},{10,11,12}},
{{13,14,15},{16,17,18}}
};

三、数组的基本操作

  1. 遍历数组

  遍历数组就是获取数组中的每个元素,通常遍历数组都是用for循环实现的。

  遍历一维数组只需用一个for循环即可实现,如下例:

int[] week = {1,2,3,4,5,6,7}

for(int i=0; i<7; i++) {
System.out.println(week[i]);
}

  还有另一种遍历方法就是使用foreach语句,这个在上一篇最后已经提到了,这里就不再过多赘述了,直接上代码:

for(int arr : week) {
System.out.println(arr);
}

  遍历二维数组比一维稍微麻烦一点,需使用双层循环,如下例:

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

for(int i=0; i<a.length; i++) {
for(int j=0; j<a[i].length; j++) {
System.out.print(a[i][j] + " "); // 输出
}
System.out.println(); // 换行
}

  需要注意的是,第一个for循环是遍历行的,所以是长度是a.length,而第二个for循环是遍历列的,长度是a[i].length。

  再强调一次print和println的区别,print是输出但不换行,println是输出并换行,所以输出结果如下:

  

  2. 对数组进行排序

  数组可以通过使用java.util包中的Arrays类来实现排序,sort()方法提供了许多重载形式,可对任意类型数组进行升序排序。语法格式为 Arrays.sort(object);

  eg:创建一数组,排序后输出。

 public class Taxis {

     public static void main(String[] args) {
int[] arr = new int[] {17, 21, 6, 59, 31, 13, 3}; System.out.println("原始数组:");
for(int i=0; i<arr.length; i++) {
System.out.print(arr[i] + " ");
} Arrays.sort(arr); // 按字典顺序排序 System.out.println("\n排序后的数组:");
for(int i=0 ; i<arr.length; i++) {
System.out.print(arr[i] + " ");
}
} }

  Java语言中的String类型数组排序算法是根据字典编排顺序排序的,因此数字排在字母前面,大写字母排在小写字母前面。运行结果如下:

  

  3. 其它操作

  数组还有许多操作,比如填充替换数组元素的fill方法、复制数组的copyOf方法等等,包括Arrays类也还提供了其它操作数组的方法,大家可以通过查阅资料或API来学习它们的使用方法。

  还有一个很重要的知识点就是排序算法,上面已经出现了多重循环,那么就可以由此引出诸如冒泡排序、选择排序等等的许多排序算法,如果以后有时间我可能会总结一下各类排序算法,常见的有冒泡、选择、直接插入、快速、归并、希尔、堆排序等等,这是学习编程语言必须掌握的知识点之一,网上也有许多资料,大家可自行查阅学习了解。

Java入门篇(四)——数组的更多相关文章

  1. Java入门篇(六)——类和对象

    写到这里终于写到了入门篇的最后一个知识点了.类和对象是Java中经常被提到的两个词汇,实际上可以将类看作对象的载体,它定义了对象所具有的功能.Java是面向对象的语言,因此掌握类与对象是学习Java语 ...

  2. 【SSRS】入门篇(四) -- 向报表添加数据

    原文:[SSRS]入门篇(四) -- 向报表添加数据 定义好数据集后 [SSRS]入门篇(三) -- 为报表定义数据集 ,就可以开始设计报表了,将要显示在报表的字段.文本框.图像和其他项从工具箱拖放到 ...

  3. FPGA基础入门篇(四) 边沿检测电路

    FPGA基础入门篇(四)--边沿检测电路 一.边沿检测 边沿检测,就是检测输入信号,或者FPGA内部逻辑信号的跳变,即上升沿或者下降沿的检测.在检测到所需要的边沿后产生一个高电平的脉冲.这在FPGA电 ...

  4. java提高篇(四)-----理解java的三大特性之多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

  5. Java JNI 入门篇——传递数组与修改数组

    这里不在重复JavaJNI 的开发过程了,不熟悉的同学请参考:Java JNI HelloWorld 直接上主要代码: ArrayJNI.Java package com.example.jni; p ...

  6. java菜鸟篇<四> ZTree入门篇

    今天准备入手ZTree,于是在百度上搜了搜,找到了开源网址和一些大神们的教程,于是乎下午开始了组织树(ZTree)的练习 初步完整的作品是这个样子的: 1.咱们要去这个工具的开源网里找下载的东西: ( ...

  7. Java入门篇(三)——Java流程控制

    前两篇已经了解了Java语言基础,本篇开始Java的流程控制.流程控制对任何一门编程语言都是至关重要的,它提供了控制程序步骤的基本手段. 一.复合语句 Java语言的复合语句是以整个块区为单位的语句, ...

  8. Java入门篇(五)——Java的字符串/String类

    前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...

  9. Java入门篇(五)——字符串/String类

    前面在举例时有出现过String的例子,当时肯定有一部分朋友不知道这个是做什么用的.其实String类是Java中一个比较特殊的类,字符串即String类,它不是Java的基本数据类型之一,但可以像基 ...

随机推荐

  1. Java订单号生成,唯一订单号(日均千万级别不重复)

    Java订单号生成,唯一订单号 相信大家都可以搜索到很多的订单的生成方式,不懂的直接百度.. 1.订单号需要具备以下几个特点. 1.1 全站唯一性. 1.2 最好可读性. 1.3 随机性,不能重复,同 ...

  2. git 分支操作

    查看git分支: git fetch刷新git git branch  -a 列出所有的分支 git checkout origin/要切换的分支 git branch -r 查看远程分支 git c ...

  3. mysql 编写存储过程

    先看例子: 1.delimiter $$2.drop procedure if exists`test_procedure` $$3.create procedure test_procedure(I ...

  4. 教育改革——国家认证 “网红” 编程语言 Python

     特大消息!!!  不止是上海计算机二级考试 ,全国计算机考试等级考试也有要求 如果你正打算考计算机等级,那你需要学习以下知识 要求学习的知识太多了,我就不一一在这里展示了! 一.考试改革的目标 据悉 ...

  5. jQuery DOM 元素方法 (十)

    函数 描述 .get() 获得由选择器指定的 DOM 元素. .index() 返回指定元素相对于其他指定元素的 index 位置. .size() 返回被 jQuery 选择器匹配的元素的数量. . ...

  6. Python File flush方法应用

    # flush()使用# #!/usr/bin/python# # -*- coding: UTF-8 -*-## # 打开文件# fo = open("runoob.txt", ...

  7. 一键下载你的youtube视频

    很多人喜欢逛油管看视频,自然就会有一些喜欢的收藏集或者视频作者,有时候想要下载下来保存在本地播放,这样的话就不用每次FQ,毕竟有些代理的速度并不是很理想(如果你的代理速度炒鸡快的话,请忽略这篇文章). ...

  8. 基于springboot微信公众号开发,几分钟学会微信自动回复

    效果图 1.准备工作 申请微信订阅号(个人只能申请订阅号,而且没什么功能,也无法认证),申请完毕,点击 开发=>基本配置,如下图: 服务器配置需要有 域名 80端口,我猜你没有,这里推荐个实用工 ...

  9. 微信小程序——获取openid

    1.在微信小程序后台得到appid.AppSecret 2.在任意小程序界面的[onLoad]中取得code(建议将代码写在index.js中) 3.用取得code换取openid 如后台无法将ope ...

  10. jq龙禧轮播图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...