Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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 通过添加空字符串将int变量转换为字符串?_Java_Android Studio - Fatal编程技术网

Java 通过添加空字符串将int变量转换为字符串?

Java 通过添加空字符串将int变量转换为字符串?,java,android-studio,Java,Android Studio,addFormDataPart调用的第二个参数应该是字符串 int privacyLevel = 0; builder.addFormDataPart("privacy",privacyLevel); 但是,由于privacyLevel是一个整数,因此需要将其转换为字符串 在本教程中,他通过在privacyLevel末尾添加一个空字符串进行了转换: builder.addFormDataPart("privacy",privacyLevel+""); 我发现这是一种将int转换为str

addFormDataPart调用的第二个参数应该是字符串

 int privacyLevel = 0;
 builder.addFormDataPart("privacy",privacyLevel);
但是,由于privacyLevel是一个整数,因此需要将其转换为字符串

在本教程中,他通过在privacyLevel末尾添加一个空字符串进行了转换:

builder.addFormDataPart("privacy",privacyLevel+"");
我发现这是一种将int转换为string的不同寻常的方式。我所做的所有研究都指向了传统的转化方法。 有人对此有什么解释吗?
这是一个好的做法吗

您还可以使用适当的工具:Integer.toStringint:这可能更容易阅读,因为它清楚地显示了您从int中获取字符串的意图

使用时:

builder.addFormDataPart("privacy", "" + privacyLevel);
您正在从和Integer.ToStringPrivacLevel创建一个新字符串,但在编译时或运行时可能会进行一些优化:

编译器可以检测并直接使用Integer.ToStringPrivacLevel。 编译器可以用String::concat方法替换+操作。该方法可以在自身为空时返回另一个字符串,或者在openjdk 8u232中当另一个字符串为空时返回自身,该方法实际上是在检查另一个字符串的长度,并且始终执行串联。 现在,为了了解编译器的功能,这里有一个简单的代码,它没有什么特别的功能:

class Foobar {
  public static void main(String[] args) {
    int n = 1;
    String s = n + "";
  }
}
如果调用javap-p Foobar.class,您可以看到编译器对Java 11.0.6、Java 8使用StringBuilder所做的操作:

使用Integer.toString仅将InvokedDynamic更改为invokestatic:

在这种情况下,编译器不会尝试智能化,也不会优化+int

如果您阅读java.lang.invoke.StringConcatFactory.makeConcatWithConstantsLookup、String、MethodType、String、Object…的Javadoc,它将引用和

说明了字符串+而非字符串的连接操作:

如果只有一个操作数表达式的类型为String,则为String 对另一个操作数执行§5.1.11转换,以生成 运行时的字符串

说明如何将int转换为字符串:

原始类型T的值x首先转换为参考值 好像通过将其作为参数提供给适当的类实例 创建表达式§15.9:

If T is byte, short, or int, then use new Integer(x).
回答你的问题:

我发现这是一种将int转换为string的不同寻常的方式。所有的研究 我所做的工作为我指明了传统的转换方法。 有人对此有什么解释吗?这是一个好的做法吗

如果字符串在数字之后,而不是在privacyLevel:+privacyLevel中的数字之前,那么在您的情况下有什么不寻常的地方,但是考虑到

我不能说这是一个好的实践,尽管它是相对的,但我要说这是一个遗留实践,因为Integer.toString并不是那么老,我不记得它是在Java 5还是6中添加的,更简单的方法是做n+还是+n

我个人喜欢Integer.toString,因为我觉得n+相当难看。由于转换的复杂性,它的性能可能会更好。幸运的是,不管是你还是我的回答,有人做了一件事

最后但并非最不重要的一点是,如果坚持使用串联,结果将取决于执行实际转换的编译器版本:

您使用的是Android Studio,适用于vanilla Java的内容在这里可能并不完全适用。 Java8使用StringBuilder生成int'字符串。 Java11使用invokedynamic和许多我难以解释的东西,但我认为它完成了它的工作,而且性能也和StringBuilder一样好(如果更好的话)。 Integer.toString似乎在较新的hotspot JVM中得到了优化,它在Java 13中被注释为@hospotintrinsiccandidate。
我不认为这是一个好的做法,但它是有效的,而且很容易理解。你真的需要解释吗?这只是一个字符串连接。您始终使用非空字符串执行此操作。对于空的也一样。我不知道你可以用intWell进行字符串连接,你可以。可以将字符串与任何内容连接起来。连接它的对象将转换为字符串,然后连接。你真的从来没有使用过类似System.out.println的东西吗?我的年龄是:+age@JBNizet好的,谢谢,但我不知道它实际上会将其转换为字符串
  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: (0x0009) ACC_PUBLIC, ACC_STATIC
    Code:
      stack=1, locals=3, args_size=1
         0: iconst_1
         1: istore_1
         2: iload_1
         3: invokedynamic #2,  0              // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;
         8: astore_2
         9: return
      LineNumberTable:
        line 8: 0
        line 9: 2
        line 10: 9
3: invokestatic  #2                  // Method java/lang/Integer.toString:(I)Ljava/lang/String
If T is byte, short, or int, then use new Integer(x).