《全民Java》一书

图片 嗨,habrozhiteli! 这本书是为初学者准备的。


多年来,Java语言一直是最受欢迎和最受欢迎的语言之一。 它是美丽,有效的,而且最重要的是非常有生产力。 但是,不幸的是,这不是最简单的。 因此,对Java程序员的需求一直很高。 Java语言是一颗钻石,可以装饰任何程序员的知识包。 正如我希望的那样,本书的读者必须确保学习Java不仅有用而且有趣。 这本书的基础是在不同时间的讲授课程,我为基辅国立大学物理系的硕士们读了这些书,这些书以 塔拉莎·舍甫琴科(Tarasa Shevchenko),乌克兰国立技术大学“基辅理工学院”医学工程系学士,并学习各种编程课程。 本书的材料和演示方式适用于不仅在教育机构而且希望独立学习Java的每个人。 因此,该书可用作教程。


数组


数组表示一组具有相同类型的值(变量),可以通过通用名称进行访问。 本章专门介绍数组。


属于一个数组的变量称为该数组的元素。 为了唯一地标识数组的元素,您需要知道数组的名称以及该元素在数组中的位置(放置)。 数组中元素的位置是使用整数索引确定的。 标识数组元素所需的索引数称为数组的维数。 一维数组是使用单个索引标识元素的数组。


一维数组


可以想象一个有序链或变量序列(相同类型)形式的一维数组。 要声明一维数组,您必须指定数组元素所属的类型,数组名称以及数组中包含的元素数量。 声明一维数组的语法为:


[] =new []; 

首先,指示数组元素的类型,然后在类型标识符后跟空白方括号。 接下来,数组的名称,赋值运算符,新的指令(运算符),数组元素的类型以及方括号中数组的大小(数组中元素的数量)。 例如,int nums = new int [20]命令声明一个包含20个元素的整数nums数组。


严格来说,这里显示的数组声明命令是两个命令的共生:int []命令nums声明类型为“整数数组”(数组变量)的变量nums和新的int [20]指令,该指令实际上创建了数组。 该指令被分配了nums变量的值,并且作为数组引用的结果,它被写入nums变量。 换句话说,可以使用两个命令来执行创建数组的过程:


 int[] nums; nums=new int[20]; 

而且,这些命令可以发布在程序代码中-也就是说,我们可以声明一个数组变量,然后在代码的另一个位置创建一个数组(并在该数组变量中写入指向该数组的链接)。


详细信息以前,我们主要处理基本或原始类型(例如int,char或double)。 基本类型的变量存储该值。 从技术上讲,它看起来像这样:在内存中为变量分配了空间,并将变量的值写入此位置。 但是还有另一种处理数据的方法,其中变量引用数据。 这就是对象发生的事情,因此实现了数组。 实际上存在一个数组,但是我们无法直接访问它,而是借助于中介变量,它是一个数组变量。 数组变量的值不是数组,而是数组的地址。 因此,创建数组变量并不意味着创建数组。 数组是单独创建的。 我们将这种情况描述为其中数组变量引用数组的情况。 每次我们需要访问数组时,我们都将访问引用给定数组的数组变量。
尽管乍一看,这样的方案似乎是多余的,但是它有其优点。 我们将看到这一点。

在没有误会的情况下,我们将使用数组识别数组变量。


声明数组变量时,可以在类型标识符之后或数组名称之后指示方括号。 例如,可以使用int nums []命令代替int [] nums命令。


通过数组名称访问一维数组的元素,并在方括号中指示该元素的索引。 索引数组元素从零开始。 因此,对nums数组的第一个元素的引用将类似于nums [0]。 如果数组中有20个元素,则数组的最后一个元素的索引为19,即访问该元素的指令看起来像nums [19]。


可以使用length属性找到数组的长度:显示数组的名称,并通过点表示length属性。 例如,要找出nums数组的长度,可以使用nums.length语句。 然后,对数组最后一个元素的引用可以写为nums [nums.length-1]。


注意Java使用自动检查来检查它是否超出数组。 因此,如果代码引用了不存在的数组元素,则会发生错误。

声明数组时,将为其分配内存。 在Java中,数组元素会自动使用零值初始化-选定的单元格将被清零,并且这些归零后的单元格的值将根据数组的类型进行解释。 但是您不应该依赖于这种自动初始化。 显式初始化数组的元素是明智的。 为此,请在声明数组时使用循环运算符或指定元素值列表。


要在声明数组变量时使用值列表初始化数组,请在(通过赋值运算符)指示数组变量后,将其括在括号内。 例如:


 int[] data={3,8,1,7}; 

在此,为整数数组声明变量数据,创建一个数组,并将指向该数组的链接写入此变量。 数组的大小和元素的值是根据值列表中元素的数量自动确定的。 在这种情况下,将使用元素3、8、1和7的值创建一个由四个元素组成的整数数组。例如,可以使用以下命令获得相同的结果:


 int[] data; data=new int[]{3,8,1,7}; 

第一个int []数据命令声明一个数组变量。 指令new int [] {3,8,1,7}创建一个由四个整数组成的数组,并将对该数组的引用分配给变量数据(这意味着命令数据= new int [] {3,8,1,7}) 。
清单3.1给出了声明,初始化和使用数组的示例。


清单3.1。 引入一维数组


 class Demo{ public static void main(String[] args){ //  : int i,n; //   : int[] data; //  : data=new int[]{3,8,1,7}; //  : n=data.length; //  : int[] nums=new int[n]; //   : for(i=0;i<nums.length;i++){ nums[i]=2*data[i]-3; System.out.println("nums["+i+"]="+nums[i]); } } } 

该程序声明并初始化一个包含四个元素的数据数组。 数组的长度由data.length语句计算。 该值被写入整数变量n(命令n = data.length)。 接下来,int [] nums = new int [n]命令声明另一个整数nums数组。 此数组中的元素数由变量n的值确定,因此,它与数据数组的大小一致。 使用循环语句填充nums数组。 nums数组的元素的值是根据数据数组的元素的值计算的(命令nums [i] = 2 * data [i] -3)。 为了显示nums数组元素的值,使用了System.out.println命令(“ nums [” + i +“] =” + nums [i])。


下面显示了程序执行的结果:
程序的结果(来自清单3.1)


 nums[0]=3 nums[1]=13 nums[2]=-1 nums[3]=11 

再一次,我们注意到数组元素的索引从零开始。 因此,在循环运算符中,将索引变量i初始化为初始零值,并且在测试条件i <nums.length中使用严格的不等式运算符。
同样重要的是,在创建nums数组时,其大小由变量n确定,其值是在程序执行期间计算的。


二维和多维数组


阵列的尺寸可以大于一。 但是实际上,很少使用尺寸大于第二个尺寸的数组。 接下来,我们将研究声明,初始化和使用二维数组的方法,其中使用两个索引执行对数组元素的访问。 如果将二维数组表示为表,则元素的第一个索引确定元素所在的行,第二个索引确定元素所在的列。


详细信息尽管二维数组方便地表示为表格,但是它是以完全不同的方式实现的。 实际上,Java中的二维数组是一维数组,其元素是数组变量。 每个此类变量均指一维数组。 使用这种结构时,会产生一种幻想,即我们正在处理一张桌子。

创建二维数组就像创建一维数组一样简单。 但是,当为二维数组声明变量时,在类型标识符之后会显示两对空方括号,并且在单独的方括号中创建二维数组的指令会指示每个索引的大小(数组中的行数和列数)。 声明二维数组的语法如下:


 [][] =new [][]; 

与一维数组一样,此命令可以分为两部分:


 [][] ; =new [][]; 

第一条命令为二维数组声明一个变量。 第二个命令创建具有指定大小的实际二维数组,并将对该数组的引用分配为数组变量的值。 例如,double [] [] data = new double [3] [4]命令创建一个带有double类型元素的二维数组。 该数组具有3行和4列,并且指向该数组的链接被写入到data变量中。 相同的命令将导致相同的结果:


 double[][] data; data=new double[3][4]; 

以以下格式访问二维数组的元素:表示数组的名称,方括号中是元素的第一个索引,其他方括号中是数组的元素的第二个索引。 从头开始在所有维度上建立索引。 例如,数据[0] [3]链接是对索引为0和3的数据数组元素的调用,并且它是第一行和第四列中的元素。


要初始化二维数组,请使用嵌套循环运算符或由值列表组成的列表。 每个这样的内部列表在字符串中定义数组元素的值。 以下是使用列表初始化二维数组的示例:


 double[][] data={{0.1,0.2,0.3},{0.4,0.5,0.6}}; int nums[][]={{1,2,3},{4,5}}; 

第一条命令创建并初始化一个2 x 3的二维数据数组(两行三列)。 行数由外部列表中的元素数确定。 有两个这样的元素-这些是列表{0.1,0.2,0.3}和{0.4,0.5,0.6}。 这些列表中的每一个都有三个元素。 从这里我们得到一个大小为2 x 3的数组。列表{0.1,0.2,0.3}定义第一行中元素的值,列表{0.4,0.5,0.6}定义第二行中元素的值。 例如,数据[0] [0]元素的值为0.1,数据[0] [2]元素的值为0.3,数据[1] [0]元素的值为0.4,数据[1] [2]元素的值为0.6 。


第二条命令创建一个整数nums数组,该数组由两行组成(因为分配的列表中有两个元素-列表{1,2,3}和{4,5})。 但是,创建的数组的第一行包含三个元素(因为列表{1,2,3}中有三个值),而数组的第二行包含两个元素(因为列表{4,5}中有两个值)。 在创建的数组中,nums [0] [0]元素的值为1,nums [0] [1]元素的值为2,nums [0] [2]元素的值为3,nums [1] [0]元素的值为4元素nums [1] [1]是值5。


细节问题在于,不同行中的nums数组包含不同数量的元素,否。 从技术上讲,所有事情的实现都不仅仅是简单的。 二维数组num的变量实际上是指两个元素的一维数组(二维数组中的行数)。 但是此数组的元素不是整数,而是可以引用一维整数数组的变量(相对而言,元素的类型为int [])。 第一个变量是指三个元素(1、2和3)的一维数组,第二个变量是指三个元素(4和5)的一维数组。 当我们索引(带有一个索引!)nums变量时,我们可以访问此变量引用的一维数组的元素。 例如,nums [0]是数组变量中提到的数组的第一个元素,nums [1]是第二个元素。 这些元素是对数组的引用。 它们可以被索引。 因此,假设nums [0] [1]是nums变量引用的数组中第一个nums [0]元素引用的数组中的第二个元素。 因此,一切真的发生了。 并且我们将nums [0] [1]指令解释为对二维数组第一行和第二列中的元素的吸引力。

清单3.2显示了一个程序示例,该程序创建一个使用嵌套循环语句填充的二维数组。


清单3.2。 创建一个二维数组


 class Demo{ public static void main(String[] args){ int i,j,n=3,val=1; //   : int[][] nums=new int[n-1][n]; //   : for(i=0;i<n-1;i++){ //    for(j=0;j<n;j++){ //    //   : nums[i][j]=val++; //   : System.out.print(nums[i][j]+" "); } //    : System.out.println(); } } } 

int [] [] nums = new int [n-1] [n]命令创建一个具有n-1行和n列的整数nums数组。 变量n预先分配了值3。使用嵌套循环运算符填充数组。 数组元素的值(对于给定的索引i和j)由命令nums [i] [j] = val ++分配。 在此,为nums [i] [j]元素分配了变量val的当前值,并且紧随其后将变量val的值增加了一个。


注意执行val ++指令后,变量val的值将增加1。 但是,由于使用了增量运算符的后缀形式,因此表达式val ++的值是变量val的旧值(之前增加一)。

计算完元素的值后,它会显示在输出区域中。 通过该程序,我们得到:
程序的结果(来自清单3.2)


 1 2 3 4 5 6 

清单3.3显示了一个程序的代码,该程序创建一个具有不同长度的字符串的二维数组。


清单3.3。 具有不同长度的字符串的数组


 class Demo{ public static void main(String[] args){ int i,j,val=1; //   (   ): int[][] nums=new int[4][]; //     : for(i=0;i<nums.length;i++){ //    : nums[i]=new int[i+1]; } //  : for(i=0;i<nums.length;i++){ for(j=0;j<nums[i].length;j++){ //   : nums[i][j]=val++; //   : System.out.print(nums[i][j]+" "); } //    : System.out.println(); } } } 

int [] [] nums = new int [4] []命令创建一个二维整数nums数组。 该数组由四行组成。 但是,未指定行的大小-命令结尾的第二对方括号为空。 更确切地说,还没有行。 它们需要被创建。 在循环语句中创建行。 在此循环语句中,索引变量i贯穿0到nums.length-1(含)之间的值。 nums [i] = new int [i + 1]命令创建一个索引为i的二维数组的行。 这样的字符串包含i +1个元素。


详细信息从技术上讲,所有事情都是这样发生的:新的int [i + 1]指令创建一个一维数组(二维数组的字符串),并将对该数组的引用写入nums [i]变量。 在这种情况下,nums [i]可以解释为指向索引为i的行的链接。 如果您还记得二维数组实际上是一维数组,其元素引用一维数组,则nums.length指令的含义将变得清楚。 在这种情况下,nums.length为nums变量引用的数组中的元素数提供一个值-即,这是二维数组中的行数。

结果,我们得到一个三角形的二维数组:在数组的第一行中有一个元素,在第二行-两个元素,依此类推,直到数组的第四行。
使用嵌套循环运算符填充创建的数组。 外部循环运算符中的索引变量i取值从0到nums.length-1,并在二维nums数组中定义一行。 对于索引变量j,变化范围的上限由nums [i] .length指令确定,该指令返回索引为i的行中的元素数(j变量从0变为nums [i] .length-1(含两端))。


详细信息应该注意,nums [i]实际上是一个变量,它是指构成索引为i的字符串的一维数组。 此数组(字符串)中的元素数由表达式nums [i] .length确定。

数组元素的值由命令nums [i] [j] = val ++分配。 下面显示了程序执行的结果:
程序的结果(来自清单3.3)


 1 2 3 4 5 6 7 8 9 10 

不出所料,我们得到了一个在不同行中具有不同数量元素的数组。


注意以相同的方式创建尺寸大于两个的数组。 在声明多维数组的变量时,在类型标识符之后会显示成对的空括号。 这样的对的数量由阵列的尺寸确定。 在数组创建命令中,每个索引的大小在单独的方括号中指示。

»这本书的更多信息可以在出版商的网站上找到
» 目录
» 摘录


小贩优惠券可享受25%的折扣-Java


支付纸质版本的书后,就会通过电子邮件发送电子书。

Source: https://habr.com/ru/post/zh-CN472076/


All Articles