如果传入的数字包含true
,则此方法返回1
。
public boolean hasOne(int n) {
return (n + "").contains("1");
}
+ ""
部分的目的是什么?这如何使n
成为string
? (据我所知,.contains
仅适用于Strings
。
答案 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>