【问题标题】:What is the purpose of concatenating a string and an integer?连接字符串和整数的目的是什么?
【发布时间】:2014-05-19 22:26:09
【问题描述】:

如果传入的数字包含1,则此方法返回true

public boolean hasOne(int n) {
  return (n + "").contains("1");
}

+ "" 部分的用途是什么?这如何使n 成为string? (据我所知,.contains 仅适用于 Strings)。

【问题讨论】:

  • 你的第二个问题回答了第一个问题。

标签: java string


【解决方案1】:

int 是一个原语。将原语添加到字符串将执行该原语到String 的隐式转换,并将两个字符串相加。在这种情况下,int 被转换并添加了""(空的String),

可以改写为:

return Integer.toString(n).contains("1");

return String.valueOf(n).contains("1");

return String.format("%d", n).contains("1");

【讨论】:

    【解决方案2】:

    从技术上讲,Java 中的+ 运算符意味着当操作数之一是字符串时使用StringBuilder 对象。 Java 编译器(不是 JVM)将此syntactic sugar 转换为调用StringBuilder 对象的方法以执行连接的字节码指令。

    问题中这段代码的确切等价物是:

     public boolean hasOne(int n) {
         StringBuilder sb = new StringBuilder();
    
         sb.append(n); // Which does Integer.getChars(i, spaceNeeded, value);
         sb.append("");
    
         return sb.toString().contains("1");
     }
    

    正如该问题的其他答案所述,n + "" 构造绝不是将原始整数值转换为字符串的有效方法 - 使用 Integer#toString(int) 绝对是推荐的方法。

    编辑:

    虽然对于官方的 Oracle JVM "" + n 肯定会慢一些,但一直如此,我在 OpenJDK JVM 上进行基准测试时遇到了 some confusing results。虽然我仍然坚持我的说法,即出于性能和清晰度的原因,"" + n 是一种反模式,但我在 OpenJDK 上看到的性能差异非常有趣。

    【讨论】:

    • @user2864740: "" + n 但是,将在后台创建至少两个附加对象,而不是直接生成字符串。仅仅因为它更短并不能使它正确......
    • @user2864740:“特定的 Java 编译器”?当整数操作数是一个变量时,即使是 Oracle Java 8 编译器也是如此。我会争辩说,不管我们喜不喜欢,这将是 Java ATM 的最终编译器......
    • @thkala - 实际上它会创建 3 个临时对象,更糟糕的是!
    • @JarrodRoberson:实际上,如果您查看实现,它可能没那么糟糕。 Integer.toString() 创建一个临时字符数组。 "" + n 创建一个 StringBuilder,其中包含一个临时字符数组。不同之处在于StringBuilder 对象本身以及字符数组通常不是以正确的大小创建的事实,并且它可能不会在堆栈上分配......
    • 也就是说,我在 JMH 上看到了一些奇怪的结果 - 可能是由于运行时间短,不允许额外的垃圾成为问题......
    【解决方案3】:

    “contains”方法(参见 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#contains(java.lang.CharSequence) 的 javadoc 接受“CharSequent”作为参数。“n + “”创建一个“String”对象,它是“CharSequence”的子类。

    【讨论】:

      猜你喜欢
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2018-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多