`
youlong699
  • 浏览: 22575 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

String.valueOf(int) vs int + ""

 
阅读更多

在需要将一个数字类型变量转换得到String 时,经常使之与空字符串连接: 

int i = 100 ;

String str = i+"" ;

另外, 还有:

String str1  = String.valueOf(i) ;

String str2 = Integer.toString(i) ;

两种语法。 其中String.valueOf 会调用Integer.toString(i,10)。 因此这里只讨论 i+"" 与 String.valueOf 的差异。

 

首先,

	int i = 223344 ;
	String str = i + "" ;

 

反编译得到的字节码是:

   0:	ldc	#2; //int 223344
   2:	istore_1
   3:	new	#3; //class java/lang/StringBuilder
   6:	dup
   7:	invokespecial	#4; //Method java/lang/StringBuilder."<init>":()V
   10:	iload_1
   11:	invokevirtual	#5; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
   14:	ldc	#6; //String 
   16:	invokevirtual	#7; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
   19:	invokevirtual	#8; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
   22:	astore_2

 而

	int i = 223344 ;
	String str2 = String.valueOf(i);

 得到的是:

   0:	ldc	#2; //int 223344
   2:	istore_1
   3:	iload_1
   4:	invokestatic	#3; //Method java/lang/String.valueOf:(I)Ljava/lang/String;
   7:	astore_2

 

彻底搞清二者的区别势必要进一步最终各自对应方法的具体实现。

 

其中,String.valueOf 会调用Integer.toString() , 后者将数字的每一位拆分开放到[C里,然后构造一个字符串。 这里有两次对象创建,一次 new char[] ,一次new String 。 后者会copy一份[C的内容(这点从api文档可以得知)。

而StringBuilder也是包装了一个[C , sb.toString 也是new String调用,但是包装[C后的sb对象笔[C要大,这样创建对象使用内存上就多了。 并且 i+"" ,是 append(int) 与 append(String)两次调用,前者也是使用了Integer的getChars相关方法得到[C。

 

用段简单的代码测试两种用法: 

public static void main(String [] a){
		int repeate = 100000000 ;
		String str = null;
		long start = System.currentTimeMillis();
		for(int i=0;i<repeate;i++)
			str = i + "" ;
		long t1 = System.currentTimeMillis();
		for(int i=0;i<repeate;i++)
			str = Integer.toString(i);
		System.out.println("t1:" + (t1 - start) +" t2:" + (t2- t1));
	}

 输出:

t1:20811 t2:10124 。

鉴于运算次数如此之大, 差别在同一个量级,还不算大。

另外, 通过观察gc情况, 前者明显比后者要频繁(当然这跟分配内存大小有关),也就是说明其内存消耗更大。

 

结论是, 如果你有代码洁癖,那么使用Integer.toString (或者String.valueOf)吧。

另外,如果习惯了 i + "" 这样的语法也基本不用纠结

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    Java中Integer.valueOf,parsetInt() String.valueOf的区别和结果代码解析

    Java中Integer.valueOf、parsetInt() String.valueOf的区别和结果代码解析 Java中Integer.valueOf、parsetInt()和String.valueOf都是常用的方法,但是它们之间存在着很多的区别,下面我们将通过代码来解释它们之间...

    java中string和int型的相互转换.doc

    通常,为了提高代码的可读性和执行效率,推荐使用`String.valueOf()`进行`int`到`String`的转换,以及使用`Integer.parseInt()`进行`String`到`int`的转换。这些方法不仅简单明了,而且性能优越。

    Springmvc : Failed to convert property value of type 'java.lang.String' to int

    使用Java的`Integer.parseInt()`或`Integer.valueOf()`方法时,可以捕获`NumberFormatException`异常,并给出友好提示。 3. **数据绑定的类型转换**:在Spring MVC中,你可以自定义类型转换器。通过实现`org.spring...

    android之scrollrefresh

    Log.i("firstVisibleItem=",String.valueOf(firstVisibleItem)); Log.i("visibleItemCount=",String.valueOf(visibleItemCount)); Log.i("totalItemCount=", String.valueOf(totalItemCount)); //这里要减二,...

    Android实验4

    public int compare_130(int a,int ... String msg = String.valueOf(a) + " compare with " + String.valueOf(b) + ",the " + String.valueOf(result)+" is bigger"; labelView.setText(msg); } });

    java中int_char_string三种类型的相互转换

    通过 Integer.valueOf() 方法可以将 String 转换成 int。例如: int i = Integer.valueOf(my_str).intValue(); 2. 使用 Integer.parseInt() 方法 使用 Integer.parseInt() 方法也可以将 String 转换成 int。例如...

    Android实验动态生成数

    动态生成数的运用 ... String msg = String.valueOf(a) + " compare with " + String.valueOf(b) + ",the " + String.valueOf(result)+" is bigger"; labelView.setText(msg); } });

    Java中几种常用数据类型之间转换的方法

    在 Java 中,可以使用 String.valueOf() 方法将 int 类型的变量转换为 String 类型的变量。例如: int intvar = 1; String stringvar; stringvar = String.valueOf(intvar); 4. float --&gt; String 转换 在 Java 中...

    安卓进度条

    mTvDef.setText(getResources().getString(R.string.text_def)+" : "+String.valueOf(seekBar.getProgress())); break; } case R.id.seekbar_self: { // 设置“与自定义SeekBar对应的TextView”的...

    java对象转换String类型的三种方法共1页.pdf

    String strI = String.valueOf(i); ``` 对于对象,如果对象非null,`String.valueOf()`实际上就是调用了`toString()`方法。如果对象是null,`String.valueOf()`会返回"null"字符串。 3. **StringBuilder / ...

    Valueof_JAVA源码_java_

    例如,`String.valueOf(int i)`会将一个整数转换为它的字符串表示,而`String.valueOf(char c)`则会将字符转换为它的字符串形式。这种方法在需要将非字符串数据输出或拼接时非常有用。 除了这两个常见的使用场景,`...

    String与int相互转换

    b) 使用String.valueOf():此方法同样适用于所有基本类型,包括int,可以方便地将数值转换为字符串。 c) 运算符+:通过字符串与其他类型的运算符+结合,可以将int转换为字符串。例如: ```java int num = 123;...

    fastjson-1.2.7.jar通用json文本解析实例(轻开IOS和安卓App服务器开发)

    b0.set(key,new StringBuffer(prefix1).append(".").append(String.valueOf(i)).append(".").append(String.valueOf(j)).toString()); } else if(ob1 instanceof JSONObject)//如果下级是json...

    java中String类型转换方法.pdf

    int i = Integer.valueOf(hexstr, 16).intValue();` ASCII 码到字符 将 ASCII 码转换为字符可以使用以下方法: * 使用 `Character` 类:`int i = 64; String aChar = new Character((char)i).toString();` 字符...

    PKCard 2

    Java实现蜘蛛纸牌

    android string转换为int

    int num = Integer.valueOf(str); ``` 三、`TextUtils.parseInt()` 如果你在使用Android SDK,`TextUtils` 类提供了一个静态方法 `parseInt()`,它可以更安全地处理转换失败的情况。如果字符串无法转换为整数,该...

    多文件上传

    String fileName = String.valueOf(cd.get(Calendar.YEAR))+String.valueOf(cd.get(Calendar.MONTH)+1)+String.valueOf(cd.get(Calendar.DATE))+ String.valueOf(cd.get(Calendar.MINUTE))+String.valueOf(cd.get...

    常见java中数据类型之间的转换.txt

    **解释**:与 `int` 类型到 `String` 类型的转换类似,这里使用了 `String.valueOf()` 方法来将 `float` 类型转换为 `String` 类型。 #### 5. `double` 到 `String` **示例代码**: ```java double doubleVar = ...

Global site tag (gtag.js) - Google Analytics