数组是一种有用的数据类型,用于管理在连续内存位置中最好建模的集合元素。以下是如何有效地使用它们。任何使用C或FORTRAN编程的人都会熟悉数组的概念。它们基本上是一个连续的内存块,其中每个位置都是特定的数据类型:整数、浮点数或类似的东西。Java的情况类似,但有一些额外的问题。数组示例让我们在Java中创建一个长度为10的整数数组:int[]ia=newint[10];上面的代码片段发生了什么?从左到右:最左边的int[]将变量的类型声明为int数组(用[]表示)。它的右边是变量的名称,当前是ia。接下来,=告诉我们左边定义的变量被赋值右边的内容。在=的右边我们看到了new,在Java中这意味着一个对象正在被初始化,这意味着已经为它分配了存储空间并调用了它的构造函数(更多信息请参见此处)。然后,我们看到int[10],它告诉我们正在初始化的对象是一个包含10个整数的数组。因为Java是强类型的,所以变量ia的类型必须和=右边的表达式的类型兼容。初始化示例数组让我们将这个简单的数组放入一段代码中并进行尝试。将以下内容保存到名为Test1.java的文件中,用javac编译,用java运行(当然是在终端中):importjava.lang.*;publicclassTest1{publicstaticvoidmain(String[]args){int[]ia=newint[10];//参见下面的注释1System.out.println("iais"+ia.getClass());//请参阅下面的注释2(inti=0;i-1。如上所示,我们可以看到数组ia的每个元素(看似由数组构造函数)设置为零。那么,就这些了吗?声明类型,使用适当的初始值设定项,就大功告成了?好吧,不。在Java中还有许多其他方法来初始化数组。为什么要初始化一个数组,有没有其他办法?像所有好问题一样,这个问题的答案是“视情况而定”。在这种情况下,答案取决于我们想在初始化后对数组做什么。在某些情况下,数组自然地表现为一种累加器。例如,假设我们正在编程计算小型办公室中一组电话分机接收和拨打的电话数量。有8个扩展,编号为1到8,加上运营商的扩展,编号为0。因此,我们可以声明两个数组:int[]callsMade;int[]调用已接收;然后,每当我们开始一个新的累积调用统计数据的循环时,我们将每个数组初始化为:callsMade=newint[9];callsReceived=newint[9];在每个累积的调用统计的最后阶段,我们可以打印出统计数据。粗略地说,我们可能会看到:importjava.lang.*;importjava.io.*;publicclassTest2{publicstaticvoidmain(String[]args){int[]callsMade;int[]调用已接收;//初始化调用计数器callsMade=newint[9];callsReceived=newint[9];//处理调用...//扩展调用:callsMade[ext]++//扩展接收调用:callsReceived[ext]++//调用统计摘要System.out.printf("%3s%25s%25s\n","分机","已拨电话","已接电话");对于(intext=0;extfibos=newArrayList();fibos.add(0);fibos.add(1);对于(inti=2;i<20;i++){fibos.添加(fibos.get(i-1)+fibos.get(i-2));}for(inti=0;istoi=newMap();然后我们可以初始化Map如下:stoi.set("one",1);stoi.set("two",2);stoi.set("three",3);和类似的操作。之后,当我们想知道“三”的值时,我们可以通过以下方式检索它:stoi.get(“三”);在我的理解中,Map对于第三方数据的集中化很有用,将其的字符串转换为我的数据集中一致的代码值非常有用。作为数据转换管道的一部分,我经常构建一个小型独立程序,在处理数据之前清理数据;我几乎总是为此使用一个或多个地图。值得一提的是,ArrayLists的ArrayList和Maps的Map是完全可能的,有时也是合理的。例如,假设我们正在查看树木并且我们有兴趣按物种和年龄范围计算树木的数量。假设年龄范围定义是一组字符串值("young","mid","mature",and"old"),物种是字符串值如"Douglasfir","westernredcedar”等,那么我们可以这样写这个Map,在Map定义为:Map>counter=newMap>();这里要注意一点,以上内容只是针对Maprow创建存储。所以我们的累积代码可能如下所示://假设我们已经知道物种和年龄范围if(!counter.containsKey(species)){counter.put(species,newMap());}if(!counter.get(species).containsKey(ageRange)){counter.get(species).put(ageRange,0);}此时,我们可以像这样开始积累:counter.get(species).put(年龄范围,counter.get(species).get(ageRange)+1);最后,值得一提的是(Java8中的新增功能)Streams还可以用于初始化数组、ArrayList实例和Map实例。可以在此处和此处找到有关此功能的详细讨论。