Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用';新';用于Java中的数组_Java_Arrays - Fatal编程技术网

使用';新';用于Java中的数组

使用';新';用于Java中的数组,java,arrays,Java,Arrays,我一直在做一些基础教程。其中一个要求我设置一个数组来保存以下字符串值: 碧昂丝(f) 大卫·鲍伊(男) 埃尔维斯·科斯特洛(男) 麦当娜(女) 埃尔顿·约翰(男) 查尔斯·阿兹纳沃(男) 编写一个程序来循环,数一数有多少男歌手和有多少女歌手,并在控制台中显示我的答案 我设法完成了它,但我设置数组的方式与提供的答案不同 我的发言如下: String names[] = {"Beyonce (f)", "David Bowie (m)", "Elvis Costello (m)", "Madonn

我一直在做一些基础教程。其中一个要求我设置一个数组来保存以下字符串值:

碧昂丝(f) 大卫·鲍伊(男) 埃尔维斯·科斯特洛(男) 麦当娜(女) 埃尔顿·约翰(男) 查尔斯·阿兹纳沃(男) 编写一个程序来循环,数一数有多少男歌手和有多少女歌手,并在控制台中显示我的答案

我设法完成了它,但我设置数组的方式与提供的答案不同

我的发言如下:

String names[] = {"Beyonce (f)", "David Bowie (m)", "Elvis Costello (m)", "Madonna (f)", "Elton John (m)", "Charles Aznavour (m)"};
所提供的答案如下:

String[] singers = new String[6];
singers[0] = "Beyonce (f)";
singers[1] = "David Bowie (m)";
singers[2] = "Elvis Costello (m)";
singers[3] = "Madonna (f)";
singers[4] = "Elton John (m)";
singers[5] = "Charles Aznavour (m)";

我应该创建一个“新”数组吗?若然,原因为何?这两者的区别是什么?

您的答案是等效的,但可读性更强,更不容易出错,因为您不需要对每个带有“恐惧”的数组元素使用任何“幻数”从数组定义中访问元素并因此创建
索引AutofBoundsException

都是初始化数组的有效方法

初始化数组的方式只能在定义数组变量的同一个表达式中完成,尽管以后可以用类似的方式完成:

String[] names = null;
names = new String[] {"Beyonce (f)", "David Bowie (m)", "Elvis Costello (m)", "Madonna (f)", "Elton John (m)", "Charles Aznavour (m)"};

提供的答案显式创建字符串数组,指定此数组可以存储的字符串数,并为数组的索引赋值。

两种解决方案都是正确的。第一个使用数组初始值设定项,第二个先实例化数组,然后用值填充它。有人可能会说,第一种解决方案更稳健,因为在第二种解决方案中,必须在提供条目之前明确给出数组的长度,并且可以使用数组容量的索引,只有在运行时才会被检测到。

java中的“new”操作符负责创建新对象,或者我们可以说是类的实例。
实际上,它使用我们从堆栈中定义的引用在堆中动态分配内存。

两者都在做相同的事情

第一种方法更具动态性。您告诉java编译器这些元素将创建一个数组。编译器在编译时知道它们的长度,所以它会创建一个数组来适应它们

在第二个attepmt中,首先创建一个长度为6的数组。然后在每个插槽中放入一个对象

何时使用它们:

  • 如果您从一开始就知道数组中将包含哪些元素,请首先使用aproach-它更干净、更短
  • 但如果有某种逻辑来决定每个插槽中应该放谁,那么第二个更好。例如,当您想要创建一个10大小的数组,但您将在运行时填充它时
  • 第一个aproach也更安全,因为编译器根据输入长度创建数组。在代码中添加新元素将更改数组大小。在第二种方法中,您必须手动更改大小,否则在添加歌手时将抛出ArrayOutOfBoundException[6]
  • 但如果您不知道数组的长度(您将在运行时填充列表),则必须使用列表或其他动态结构(Set、list)

可以使用
new
操作符创建一个新数组,后跟
[
]
字符之间的数组元素类型和数组大小-这称为。或者,在声明变量时,还可以使用调用的数组文字(但不能在以后声明数组时使用该文字为数组赋值)

当你写作时

String names[] = {"A", "B", "C"};
它只是一个简短的形式,相当于

String[] names = new String[] {"A", "B", "C"};
请注意,为了指示要声明指定类型的数组,可以使用
String[]names
String names[]

String names[], names2; // Only names is an array, names2 is just a String

如果以后向声明中添加更多变量名,建议使用第二种形式以避免混淆和事故

让我们仔细看看这2种情况会发生什么: 一步创建和初始化阵列的优点 一步创建和初始化阵列有几个优点:

  • 这样做不太容易出错:编译器将确定数组的长度,并且编译器将根据您提供的列表初始化数组的元素。没有使用错误的索引值或获取
    ArrayIndexOutOfBoundsException
    之类的内容
  • 它会更快,因为JVM(Java虚拟机)不会使用
    null
    值初始化数组
  • 它会更快,因为您不必指定显式索引值,JVM也不必使用它们。此外,JVM不必检查索引是否在有效范围内(即
    0..length-1
  • 较少的维护/开销,稍后当您想在数组的中间添加另一个元素时,只需在需要的地方插入它即可。如果以另一种方式初始化数组,则必须更新所有后续索引
  • Java源代码将更短、更紧凑,编译的字节代码也将更短

您可以在

中阅读有关数组的更多信息,基本上没有区别。一个是速记,另一个不是。它们是可交换的,但长版本有可能创建一个包含6个以上字符串的数组。我更喜欢您的解决方案,尽管两者都是正确的,并产生完全相同的结果。显然,您知道一些您当时不应该知道的事情,两者都是正确的,结果将是相同的:)两者都是正确的,但是@javapalava的答案比官方的要好。做得好!带着我的两分钱说歌手不是弦。您需要一个带有姓名字段和性别字段的singer类。或者你也可以用匈牙利符号的可怕用法来调用数组sSingers;请看:好的命名也是可读性的一个重要部分:))我个人认为这是糟糕的编码
String[] names, names2; // Both names and names2 are arrays!
// "Slow" filling
String[] names = new String[3]; // Filled with null values by default
names[0] = "A"; // Explicit index, index range check!
names[1] = "B"; // Explicit index, index range check!
names[2] = "C"; // Explicit index, index range check!

// "Fast" filling at creation time, implicit indices and array length,
// No index checks!
String[] names = {"A", "B", "C"};