Array 和 ArrayList 中的逗号分隔符混淆

Comma separator confusion in Array and ArrayList

为什么我在初始化带有尾随逗号 (,) 的 ArrayList 时出错,而我通过各种网站了解到 Array 带有尾随逗号会产生漏洞并进行迭代跳过漏洞?

Java:

class ProblemA {
    public static void main(String[] args) {
    //HashMap<Integer,Integer> map=new HashMap<>();
    ArrayList<Integer> map = new ArrayList<>(Arrays.asList(1,2,2,3,2,));
    int[] arr = {1,2,2,3,2,};
    }
}

hereas I understand through various websites that Array with trailing comma(s) will create holes and iterating that will skip the holes

不在 java 中。那指的是您可以使用的各种其他语言,例如输入 [, , ,] ,这会生成一个 4x“无”的列表。但是 java 没有 - java 最接近空的是 null,但您必须将其输入。 List.of(null, null, null, null) 会使 'a list of 4x nothing' 在 java 中尽可能接近。

那么 java 的尾随逗号

根据 java 语言规范,在方法调用中,您不能只是在参数列表的末尾添加一个毫无意义且完全可选的逗号。它根本无效 java。但是,在编写数组初始值设定项时,您可以这样做。为什么?只是因为。 Spec 是这么说的。在某些时候,您的问题归结为:“语言设计者在想什么”——这超出了 Stack Overflow 的范围。你得问问他们。

无论如何,你可以这样做,它什么都不做int[] x = {1,2,};int[] x = {1,2}; 之间的差异为零。两者都生成一个 2 大小的数组,其中包含元素 12。尾随的逗号是完全可选的,绝对没有任何作用。任何。相同的 class 个文件。来吧,试试看,编译它,运行 出来的 class 文件上有一个 byte-differ。相同。

但是……为什么?

尾随逗号有时很方便的原因是因为版本控制系统。暂时不要考虑编写 5 行脚本和你的第一堂编程课 - 想想在一个更大的团队中工作,生产出数十万用户依赖的产品,如果例如,数十亿欧元就会化为乌有。一个安全问题困扰着代码库。

您想能够在团队中一起工作,这意味着您看到的代码不一定都是您编写的。这意味着对于任何给定的行,您可能想要询问系统:嘿,谁最后更改了这一行,您能告诉我他们在那段时间所做的其他事情吗,如果我能看到评论就更好了或者 link 到票务系统中的一张票,解释他们为什么这样做,因为我需要那个上下文来知道发生了什么。

解决方案是版本控制系统,您 'check in' 作为一个工作单元,对现有源文件进行大量修改。 “今天,我在此处添加了这 5 行,在此处删除了这两行,更改了这两行,并添加了这两个全新文件。整个过程包括对票证 12894 中提到的错误的修复”。诸如此类。

一旦你有了它,你就有了一个方便的代码审查途径:你的编辑不仅仅是直接推入什么权力,比如说,google.com,而是其他人首先测试它并看起来根据您的更改;第二双眼睛。他们可以准确查看您所做的更改。

只有现在您才能理解可选尾随逗号的意义。他们绝对什么都不做,但想象一下你有一个列表,比如说,美国已知的州。你可能有:

String[] STATES = {
  "Alabama",
  "Arkansas",
  "New york"
};

然后有人想在列表中添加一个新状态,因此他们编辑了该代码:

String[] STATES = {
  "Alabama",
  "Arkansas",
  "New york",
  "Hawaii"
};

问题是,从技术上讲,他们在那里更改了 2 行。他们通过添加逗号更改了 New York 行。那'noises it all up'.

假设我注意到他们没有拼写它有点奇怪 New York - Y 通常是大写的。可能其他一些系统要求它除了第一个字母外都是小写的。我想查看谁 edited/made 那条纽约线,与之关联的票是什么,以及它发生的时间。所以我问系统,我得到了……你的编辑。增加了夏威夷的那个 - 完全不相关的那个。只是因为那个愚蠢的尾随逗号。代码审阅者还必须审阅该编辑,这似乎也毫无意义。

想象一下,我们的政策是始终使用毫​​无意义的尾随逗号,但我们从以下开始:

String[] STATES = {
  "Alabama",
  "Arkansas",
  "New york",
};

相反。现在我可以添加那条夏威夷线(添加一个毫无意义的尾随逗号),现在我还没有把它搞砸。我的 'commit'(我所做的更改列表,它是版本控制系统世界中的一个艺术术语)只是添加夏威夷的一行,仅此而已。

这就是 唯一 java 或任何其他语言允许 'trailing commas in comma separated lists that do not actually do anything' 这个概念的原因。它们不会产生孔洞或额外的入口。它们的存在只是为了尽可能保持提交的干净。

您可能会正确地得出结论,我不喜欢不能在方法调用中放置尾随逗号这一事实。当 amber-dev 或其他机会出现时,我会特别提到这一点 - 我很确定语言规范的结构可以处理它。