Java 连接字符串和整数的目的是什么?
如果传入的数字包含Java 连接字符串和整数的目的是什么?,java,string,Java,String,如果传入的数字包含1,则此方法返回true public boolean hasOne(int n) { return (n + "").contains("1"); } +”部分的目的是什么?这是如何使n成为字符串的?(据我所知,.contains仅适用于字符串)。一个int是一个原语。将原语添加到字符串将执行该原语到字符串的隐式转换,并将两个字符串添加在一起。在这种情况下,将转换int,并添加“”(空字符串) 可以改写为: return Integer.toString(n).cont
1
,则此方法返回true
public boolean hasOne(int n) {
return (n + "").contains("1");
}
+”
部分的目的是什么?这是如何使n
成为字符串的?(据我所知,.contains
仅适用于字符串)。一个int
是一个原语。将原语添加到字符串将执行该原语到字符串的隐式转换,并将两个字符串添加在一起。在这种情况下,将转换int
,并添加“”
(空字符串
)
可以改写为:
return Integer.toString(n).contains("1");
或
或
“contains”方法(请参阅处的javadoc接受“CharSequent”作为参数。“n+”创建一个“String”对象,它是“CharSequence”的子类。“CharSequence”的子类。从技术上讲,Java中的+
运算符意味着当其中一个操作数是字符串时使用对象。Java编译器(不是JVM)将其转换为字节码指令,这些指令调用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+”
构造绝不是将原始整数值转换为字符串的有效方法-使用绝对是推荐的方法
编辑:
而对于官方的Oracle JVM“+n
肯定会慢一些,就像往常一样,我在对我的OpenJDK JVM进行基准测试时遇到过这样的问题。尽管我仍然坚持我的声明,”+n
从性能和清晰性两方面来看都是一种反模式,我在OpenJDK上看到的性能差异非常有趣。您的第二个问题回答了第一个问题。@user2864740:“”但是,+n
将在后台创建至少两个额外的对象,而不是直接生成字符串。仅仅因为它比type短,并不意味着它是正确的…@user2864740:“一个特定的Java编译器”?当整数操作数是一个变量时,即使是Oracle Java 8编译器也会这样工作。我认为,不管我们喜欢与否,这将是Java ATM的最终编译器…@thkala-实际上它将创建3个临时对象,这更糟!@JarrodRoberson:实际上,如果你看一下实现,它可能不是t坏。Integer.toString()
创建一个临时字符数组。“”+n
创建一个StringBuilder
,其中包含一个临时字符数组。区别在于StringBuilder
对象本身,以及字符数组通常没有以正确的大小创建,并且可能没有在堆栈上分配……也就是说,我在JMH-p中看到了一些奇怪的结果很可能是因为运行时很短,不允许额外的垃圾成为问题。。。
return String.format("%d", n).contains("1");
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");
}