热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Java中使用'new'表示数组

如何解决《在Java中使用'new'表示数组》经验,为你挑选了5个好方法。

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

Beyonce (f)
David Bowie (m)
Elvis Costello (m)
Madonna (f)
Elton John (m)
Charles Aznavour (m)

写一个程序循环,计算有多少是男歌手,有多少是女性,并在控制台显示我的答案.

我设法完成它,但我设置我的阵列的方式与提供的答案不同.

我的如下:

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)";

我应该创建一个"新"阵列吗?如果是这样,为什么?这两者有什么区别?



1> Smutje..:

你的答案是等同的,但更具可读性且不易出错,因为你不需要为每个数组元素提供任何"魔术数字",因为"担心"从数组定义中访问元素并因此创建一个IndexOutOfBoundsException.



2> Beri..:

两者都在做同样的事情.

第一种方法更具活力.您告诉java编译器这些元素将创建一个数组.编译器在编译时知道它们的长度,因此它创建一个数组以适应它们.

在第二次尝试中,您首先要创建一个长度为6的数组.然后在每个插槽中放入一个对象.

何时使用它们:

如果您从一开始就知道阵列中有哪些元素,请使用第一个方法 - 它更干净,更短

但如果有某种逻辑确定谁应该放在每个槽中,那么第二个会更好.比如,当你想要创建一个10大小的数组时,你会在运行时填充它.

第一个aproach也更安全,因为编译器根据输入长度创建了数组.在代码中添加新元素将改变数组大小.在第二个方法中你必须手动改变大小,否则在添加歌手时会抛出ArrayOutOfBoundException [6].

但是如果你不知道数组的长度(你将在运行时填充列表),那么你必须使用List或其他动态结构(Set,List)



3> Eran..:

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

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

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

提供的答案显式创建一个字符串数组,指定此数组可以存储的字符串数,并将值分配给数组的索引.


我个人认为这是一种糟糕的编码风格,因为你创建了一个状态,你的应用程序对变量`names`有两种不同的设置,具体取决于程序的状态 - 如果变量在第一次变化后没有改变(或应该改变)赋值,我更喜欢最终变量.
至少你不应该用`null`初始化数组,而只是声明它.这样,编译器会告诉您在为其分配"好"值之前是否尝试使用它.

4> Codor..:

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



5> icza..:

可以使用new运算符创建一个新数组,后跟数组元素类型和[ ]字符之间的数组大小- 这称为数组创建表达式.或者当你声明一个变量,你也可以使用文本阵列被称为数组的初始化(但不能用于分配的值到一个数组以后只是当它被声明).

当你写作

String names[] = {"A", "B", "C"};

它只是一个简短的形式,相当于

String[] names = new String[] {"A", "B", "C"};

请注意,要指示要声明指定类型的数组,可以使用它们String[] namesString names[]形式,它们是等效的,尽管如此:

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

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"};

一步创建和初始化阵列的优点

在一个步骤中创建和初始化数组有几个优点:

这样做不太容易出错:编译器将确定数组的长度,编译器也会根据您提供的列表初始化数组的元素.没有使用错误的索引值或得到一个ArrayIndexOutOfBoundsException.

它会更快,因为JVM(Java虚拟机)不会使用null值初始化数组.

它会更快,因为您不必指定显式索引值,并且JVM不必使用它们.此外,JVM不必检查索引是否在有效范围内(即0..length-1).

当您想要在数组中间添加另一个元素时,更少的维护/开销,您只需将其插入所需的位置即可.您是否已经以其他方式初始化了数组,您必须更新所有后续索引.

Java源代码将更短,更紧凑,并且编译的字节代码也将更短.

您可以在Java语言规范中阅读有关数组的更多信息:第10章.数组


推荐阅读
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
author-avatar
郑小蒜9299_941611_G
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有