上篇在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. 历年NOIP选题题解汇总

    联赛前上vijos板刷往年联赛题,使用在线编辑编写代码,祝我rp++. 废话不多说,挑比较有意思的记一下. 题目是按照年份排序的,最早只到了03年. 有些题目因为 我还没写/很早之前写的忘了 所以就没 ...

  2. RabbitMQ 1-入门学习

    环境: 软件环境MacOS ,Homebrew包管理工具 IDE: Eclipse 项目:Maven项目 1.安装RabbitMQ Server: 方式一:通过homebrew :终端执行:brew ...

  3. vue入坑总结

    1.Do not mount Vue to <html> or <body> - mount to normal elements instead. Vue2.x之后不推荐挂载 ...

  4. MVC 框架

    MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码 ...

  5. 由linux命令谈学习操作系统的重要性

    linux命令妙趣横生,喜欢敲命令行的人会深有体会,但是没有系统学习过操作系统的话,很多命令还是难以理解的.讲实在话,大多数linux爱好者常敲的都是这些方面的: 文件系统 磁盘 网络 系统状态 账户 ...

  6. vue常见错误及解决办法

    1.在配置路由并引入组件后,报错: Unknown custom element: <router-link> - did you register the component corre ...

  7. redis实现分布式可重入锁

    利用redis可以实现分布式锁,demo如下: /** * 保存每个线程独有的token */ private static ThreadLocal<String> tokenMap = ...

  8. GIT的使用中的问题处理

    GIT 的常规操作 常规操作也是我自己平时常用的几个命令, 学自于 pro git 这本书中 git 配置文件 git的配置文件位置针对所有用户:/etc/gitconfig针对当前用户: -/.gi ...

  9. volatile关键字的特性总结

    当一个变量定义为volatile后,它将具备两个特性: 1.保证此变量对所有线程的可见性,所谓"可见性",,是指当一个线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的. ...

  10. 可视化编程开发板TurnipBit支持LED亮度可调功能

    微软的makecode编辑器更新至版本v0.12.64.新增LED的可调亮度功能.而作为中文版可视化编程的口袋计算机TurnipBit完全兼容micro:bit,同样支持LED的亮度可调功能. 该项功 ...