在需要将一个数字类型变量转换得到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 + "" 这样的语法也基本不用纠结
相关推荐
Log.i("firstVisibleItem=",String.valueOf(firstVisibleItem)); Log.i("visibleItemCount=",String.valueOf(visibleItemCount)); Log.i("totalItemCount=", String.valueOf(totalItemCount)); //这里要减二,...
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); } });
动态生成数的运用 ... 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”的...
NULL 博文链接:https://never-forget.iteye.com/blog/1833801
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 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...
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...
int nu=Integer.parseInt(String.valueOf(nu2)); while(nu>1){ nu1=nu1*num;nu--;} jt.setText(String.valueOf(nu1)); } j=0; st1=e.getActionCommand(); } }...
String str1 = String.valueOf(o1); String str2 = String.valueOf(o2); //return str1.compareTo(str2); return str2.compareTo(str1); } } TreeSet<Object> set = new TreeSet(new ...
String.valueOf(item.getStockPrice().multiply(new BigDecimal(item.getStockAmount()))), "01".equals(item.getSalesSource()) ? "线上订单" : "线下订单", item.getGoodsNameAttrs(), String.valueOf(item....
String a=String.valueOf(i); StringBuilder sb=new StringBuilder(a); String b=sb.reverse().toString(); if(a.equals(b)){ for(int j=0;j<a.length();j++){ sum+=(int)a.charAt(j)-48; ...
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 ...
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 ) { ...
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引 int lastIndexOf...
path + '.' + counter : String.valueOf(counter); String value = properties.getProperty(key); if (value != null) { TreeNodeImpl nodeImpl = new TreeNodeImpl(); nodeImpl.setData(value); node....