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

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

宰父熙云
2023-03-14

所以出于好奇,我想问为什么我在使用尾随逗号(,)初始化ArrayList时会出错,而我通过各种网站了解到,使用尾随逗号的Array会创建漏洞并迭代以跳过漏洞。ArrayList中的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,};

}

}

共有1个答案

蔚学林
2023-03-14

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

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

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

无论如何,你被允许这样做,但它什么也不做。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"
};

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

比如说,我注意到有点奇怪,他们没有拼写“纽约”——Y通常是大写的。可能其他一些系统要求它除了第一个字母以外都是小写的。我想知道是谁编辑/制作了那条纽约线,什么票与它有关,以及它发生的时间。所以我问系统,我得到。。。。你的编辑。一个增加了夏威夷——一个完全无关的地方。只是因为那个愚蠢的逗号。代码审查员还必须审查该编辑,这似乎也是毫无意义的。

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

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

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

这是java或任何其他语言允许“在逗号分隔的列表中拖尾逗号实际上什么都不做”的概念的唯一原因。它们不会创建漏洞或额外的条目。它们的存在只是为了尽可能保持提交干净。

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

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

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

  • 问题内容: 我有一些特殊字符的字符串。目的是检索每行的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生成:

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

  • 问题内容: 我有这样一个字符串: 我想按逗号分割-但我需要忽略引号中的逗号。我怎样才能做到这一点?似乎正则表达式方法失败了;我想我可以在看到报价时手动扫描并进入其他模式,但是使用预先存在的库会很好。 上面的字符串应分为: 问题答案: 可以使用正则表达式 输出: