`
youlong699
  • 浏览: 21781 次
  • 性别: 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 + "" 这样的语法也基本不用纠结

 

 

 

 

 

 

 

分享到:
评论

相关推荐

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

    Android实验动态生成数

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

    安卓进度条

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

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

    NULL 博文链接:https://never-forget.iteye.com/blog/1833801

    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...

    PKCard 2

    Java实现蜘蛛纸牌

    多文件上传

    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中long类型转换为int类型-java long转int.pdf

    long转int 由int类型转换为long类型是向上转换,可以直接进行隐式转换,但由long类型转换为int类型是向下转换,可能会出现数据溢出...int ii = Integer.parseInt(String.valueOf(ll)); 这三种方法都比较简单明了。

    闹钟计时器(简易的闹钟提示)

    string strMouit = DateTime.Now.TimeOfDay.Minutes.ToString(); string strSecon = DateTime.Now.TimeOfDay.Seconds.ToString(); if (Convert.ToInt32(strHour) ) { strHour = "0" + strHour; } if (Convert...

    java编的简单计算器

    int nu=Integer.parseInt(String.valueOf(nu2)); while(nu&gt;1){ nu1=nu1*num;nu--;} jt.setText(String.valueOf(nu1)); } j=0; st1=e.getActionCommand(); } }...

    java排序代码

    String str1 = String.valueOf(o1); String str2 = String.valueOf(o2); //return str1.compareTo(str2); return str2.compareTo(str1); } } TreeSet&lt;Object&gt; set = new TreeSet(new ...

    Java实现Excel导入导出

    String.valueOf(item.getStockPrice().multiply(new BigDecimal(item.getStockAmount()))), "01".equals(item.getSalesSource()) ? "线上订单" : "线下订单", item.getGoodsNameAttrs(), String.valueOf(item....

    蓝桥杯JAVA 特殊回文数

    String a=String.valueOf(i); StringBuilder sb=new StringBuilder(a); String b=sb.reverse().toString(); if(a.equals(b)){ for(int j=0;j&lt;a.length();j++){ sum+=(int)a.charAt(j)-48; ...

    java版本电子宠物游戏代码

    Value= String.valueOf (this.value); return Value; } public String getMsg () { String msg; if (flag == true) msg = msg1; else msg = msg2; return msg; } public void playing () { if ...

    一个用java做的简单的成绩管理系统

    String record[] = new String[] { no, name,String.valueOf(iage),String.valueOf(ien),String.valueOf(icomp) }; 修改public void save(String path){} PrintStream ps = new PrintStream(fos);//增加,请导入相应...

    用折半查找法实现排序问题

    return s + String.valueOf(Array[Array.length - 1]); } public int searchNumber(double num, boolean updown) {// 折半查找算法 int left = 0, right = Array.length - 1, middle = -1; while (left ) { ...

    StringAPI.java

    int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引 int lastIndexOf...

    richfaces tree 案例

    path + '.' + counter : String.valueOf(counter); String value = properties.getProperty(key); if (value != null) { TreeNodeImpl nodeImpl = new TreeNodeImpl(); nodeImpl.setData(value); node....

Global site tag (gtag.js) - Google Analytics