当前位置: 首页 > 知识库问答 >
问题:

数组和ArrayList中的逗号分隔符混淆

盖博简
2023-03-14

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

爪哇:

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

共有1个答案

羊舌勇
2023-03-14

在这里,我通过各种网站了解到,带有尾随逗号的数组将创建漏洞,而迭代将跳过这些漏洞

在java中没有。这是指你可以输入[, , ,]的各种其他语言,这就形成了一个4x“无”的列表。但是java没有这个——java最接近无的东西是null,但是你必须把它打出来。List.of(null, null, null, null)将在java中尽可能地形成“4x无”的列表。

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

无论如何,你被允许这样做,但它什么也不做。int[]x={1,2,}之间的差异为零int[]x={1,2} 。两者都产生一个2大小的数组,其中包含12元素。后面的逗号是完全可选的,完全没有效果。不管怎样相同的类文件。继续,试一下,编译一下,在出来的类文件上运行一个字节。完全相同的

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

你希望能够在团队中一起工作,这意味着并非你看到的所有代码都是由你编写的,这是必要的。这意味着你可能想,对于任何给定的行,问系统:嘿,谁最后一次更改了这一行,你能给我看一下他们在那段时间做的其他事情吗,如果我能在票务系统中看到评论或门票链接来解释他们为什么要做这一切,那就更好了,因为我需要那个上下文来知道发生了什么。

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

一旦你有了这个,你就有了一个方便的代码审查途径:你的编辑不仅仅是直接推到什么功能上,比如google.com,而是其他人首先测试并查看你的更改;第二双眼睛。他们可以准确地看到你改变了什么。

直到现在,你才明白可选尾随逗号的意义。它们什么也不做,但是想象一下你有一个已知的美国州的列表。你可能有:

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

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

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

问题是,从技术上讲,他们在那里换了两条线。他们更改了纽约的行,添加了一个逗号。“把一切都搞定了”。

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

想象一下,我们有一个政策,总是使用毫无意义的尾随逗号,而它什么都不做,我们从以下开始:

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

相反现在我可以添加夏威夷线(添加一个无意义的尾随逗号),现在我还没有把它加上噪音。我的“提交”(我所做的更改列表,这是版本控制系统领域的一个术语)只是添加夏威夷的一行,仅此而已。

这是java或任何其他语言允许“在逗号分隔的列表中尾随逗号,实际上什么都不做”这一概念的唯一原因。它们不会产生孔洞或额外的入口。它们的存在只是为了尽可能地保持promise的干净。

您可能会正确地得出这样的结论:我不喜欢在方法调用中不能使用尾随逗号。当amber dev中出现机会时,我会特别提到这一点——我很确定html" target="_blank">语言规范的结构可以处理它。

 类似资料:
  • 所以出于好奇,我想问为什么我在使用尾随逗号(,)初始化ArrayList时会出错,而我通过各种网站了解到,使用尾随逗号的Array会创建漏洞并迭代以跳过漏洞。ArrayList中的Java代码 代码: }

  • 问题内容: 我有一个像 我想把它分成那些字符串 如果我简单地打电话给我,那么在修剪之后我会得到不同的结果,因为在某些字符串中,例如,仍然有一个逗号。但我不想放在方括号中。有解决这个问题的优雅方法吗? 问题答案: 假设和没有嵌套和未转义。您可以使用以下方式进行拆分: 正则演示 如果逗号后面没有非圆括号和,则将匹配逗号,从而忽略和中的逗号。

  • 问题内容: 我有一些特殊字符的字符串。目的是检索每行的String [](分隔)。您可以使用特殊字符“,在其中可以使用/ n和, 您会看到“ /”中有您/ n。 任何可以帮助我解析此。 谢谢 __更多说明 与主刺我需要分开这些 问题是:对于Julie,KameL,Titi ,在KameL和Titi之间存在换行符/ n,或者在Time,tomy,tony,tini之间存在类似的换行问题,或者 在to

  • 问题内容: 我有从.net应用程序A,B,C,D,E,F获取的字符串, 我想写一个SQL选择语句像 这在t-SQL中将不起作用,因为它使用不将值分开的一个字符串。有什么办法可以做到这一点? 问题答案: 它认为最简单的方法是动态SQL生成:

  • 我试图验证数字1-8的逗号分隔列表。

  • 问题内容: 我有一个模糊的字符串,像这样: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。(编辑:我想我的意思是那些已经属于JDK或已经属于诸如Apache Commons之类的常用库的库。) 上面的字符串应分为: 注意:这不是CSV文件,它是文件中包含的单个字符串,具有较大的整体