【发布时间】:2014-05-19 22:26:09
【问题描述】:
如果传入的数字包含1,则此方法返回true。
public boolean hasOne(int n) {
return (n + "").contains("1");
}
+ "" 部分的用途是什么?这如何使n 成为string? (据我所知,.contains 仅适用于 Strings)。
【问题讨论】:
-
你的第二个问题回答了第一个问题。
如果传入的数字包含1,则此方法返回true。
public boolean hasOne(int n) {
return (n + "").contains("1");
}
+ "" 部分的用途是什么?这如何使n 成为string? (据我所知,.contains 仅适用于 Strings)。
【问题讨论】:
int 是一个原语。将原语添加到字符串将执行该原语到String 的隐式转换,并将两个字符串相加。在这种情况下,int 被转换并添加了""(空的String),
可以改写为:
return Integer.toString(n).contains("1");
或
return String.valueOf(n).contains("1");
或
return String.format("%d", n).contains("1");
【讨论】:
从技术上讲,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 上看到的性能差异非常有趣。
【讨论】:
"" + n 但是,将在后台创建至少两个附加对象,而不是直接生成字符串。仅仅因为它更短并不能使它正确......
Integer.toString() 创建一个临时字符数组。 "" + n 创建一个 StringBuilder,其中包含一个临时字符数组。不同之处在于StringBuilder 对象本身以及字符数组通常不是以正确的大小创建的事实,并且它可能不会在堆栈上分配......
“contains”方法(参见 http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#contains(java.lang.CharSequence) 的 javadoc 接受“CharSequent”作为参数。“n + “”创建一个“String”对象,它是“CharSequence”的子类。
【讨论】: