【问题标题】:Initializing multiple variables to the same value in Java在Java中将多个变量初始化为相同的值
【发布时间】:2011-09-06 08:46:20
【问题描述】:

我正在寻找一种简洁有效的方法来声明多个相同类型和相同值的变量。现在我有:

String one = "", two = "", three = "" etc...

但我正在寻找类似的东西:

String one,two,three = ""

这是可以在java中做的事情吗?牢记效率。

【问题讨论】:

  • 牢记效率效率何在?
  • 代码长度,输入时间,视觉上很简单。那就是我的意思。我知道保留记忆就是保留记忆,这个问题与事物的“人”方面有关。
  • 我想说这通常违反公认的 Java 约定,它会让读者感到惊讶,恕我直言,比在单独的行中声明它们更难阅读。
  • 我检查了性能(在 java 8 上)a = b =c = d =e = true 比 a = true 需要 2 倍以上; b = 真;等等。
  • @AmitKumarGupta 我在 JDK16 上对其进行了测试,我发现使用 JMH 没有明显的区别。你是怎么测试的?同样,一旦您分配了除常数以外的一、二、三项,它就会变得相同(多重分配)。事实上,由于 DUP 使用堆栈,因此在处理多线程代码时可以利用多个变量赋值。

标签: java variables initialization declaration


【解决方案1】:

编辑:正如 Zeeen 指出的那样,这在 Java 中不起作用。我打算回答的问题也在 Groovy 中,这是错误提交的。


太晚了,但我发现最简单的方法是:

String foo = bar = baz = "hello"
println(foo)
println(bar)
println(baz)

输出:

hello
hello
hello

【讨论】:

  • @Zeeen 在你的 Groovy 解释器中试试看!
  • 这很时髦,而不是普通的旧 Java。它也不适用于普通的java,我只是测试了它。
  • 啊是的,看看那个,当我提交这个答案时,一定把一些标签弄混了。至少看起来它帮助了其他一些困惑的人¯\_(ツ)_/¯
【解决方案2】:

可以声明多个变量,也可以初始化多个变量,但不能同时进行:

 String one,two,three;
 one = two = three = "";

然而,这种事情(尤其是多重赋值)会被大多数 Java 开发人员所反对,他们会认为它与“视觉上简单”相反

【讨论】:

  • +1 指出他试图做的事情不是规范。
  • 这是针对字符串的,但是对于整数呢? int 日、月、年、小时、分钟 = 日 = 月 = 年 = 小时 = 0;对吗??
【解决方案3】:

适用于基本类型和不可变类,例如 String、包装类 Character、Byte。

int i=0,j=2   
String s1,s2  
s1 = s2 = "java rocks"

对于可变类

Reference r1 = Reference r2 = Reference r3 = new Object();`  

创建了三个引用 + 一个对象。所有引用都指向同一个对象,您的程序将出现异常。

【讨论】:

  • 我不同意“所有引用都指向同一个对象,你的程序会出现异常。”唯一的问题是一个引用的对象发生的事情发生在另一个引用的对象上——因为它是同一个对象。这不是不当行为;这就是 Java 的工作原理。
  • “行为不端”是什么意思?它的行为与 3 个单独初始化的对象不同,但这真的取决于你想要什么..
【解决方案4】:
String one, two, three;
one = two = three = "";

这应该适用于不可变对象。例如,对于可变对象没有任何意义:

Person firstPerson, secondPerson, thirdPerson;
firstPerson = secondPerson = thirdPerson = new Person();

所有变量都指向同一个实例。在这种情况下,您可能需要的是:

Person firstPerson = new Person();
Person secondPerson = new Person();
Person thirdPerson = new Person();

或者更好的是使用数组或Collection

【讨论】:

  • 在某些情况下,这对可变对象也有意义。例如,在链表实现的构造函数中,最初是:head = tail = new Node(value)。所以 head 和 tail 都应该指向同一个引用。
  • 这些是同一个对象吗?如果我稍后再做one = "cat"two.equals("cat") 会返回 true 吗?
  • 唯一需要注意的是,这不适用于静态变量。
  • 整数声明怎么样?
  • 为什么这不适用于日历?如果你这样做,当你操纵其中一个变量时,每个变量的行为都是一样的
【解决方案5】:

你可以这样做:

String one, two, three = two = one = "";

但是这些都指向同一个实例。它不会导致最终变量或原始类型出现问题。这样,您可以在一行中完成所有操作。

【讨论】:

    【解决方案6】:

    不,这在 java 中是不可能的。

    你可以这样做..但是尽量避免它。

    String one, two, three;
    one = two = three = "";
    

    【讨论】:

    • 您能解释一下为什么要避免这种情况吗?
    • @Lonely Neuron 我觉得这样用很容易出错。
    • @YuhangLin 我只是希望得到更好的答案
    • @AlexanderHeim 感谢您的解释。但我问的原因是因为它应该是答案的一部分。
    • @AlexanderHeim 为什么慢?
    【解决方案7】:

    我认为您不必单独设置所有值(就像您提供的第一个示例一样。)

    您给出的第二个示例只会将最后一个变量初始化为 "" 而不会初始化其他变量。

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      相关资源
      最近更新 更多