连接字符串和整数的目的是什么?

时间:2014-05-19 22:26:09

标签: java string

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

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

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

3 个答案:

答案 0 :(得分:5)

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

可以改写为:

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

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

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

答案 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上看到的性能差异非常有趣。

答案 2 :(得分:-1)

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