Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连接字符串和整数的目的是什么?_Java_String - Fatal编程技术网

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");
 }