JDK1.7
啊啊啊啊。今天想把int[]转换为String的时候被坑了。一看有个toString().走起。额。“[I@27021e58”转换出来什么鬼。好吧。源码一看。原来是Object类的实现方法。我们都知道Object是所有类的父类或间接父类。本身没有实现肯定会向上调用Object的toString方法。
所以返回值就是这个。好了下面看一下类型转换的几种方式。
用的比较多的就是(Integer或int)与String之间的转换
//1
int a=889343;
String str=String.valueOf(a);
//2
String str1=a+"";
//3
Integer it=234214;
String str2=it.toString();
//4
String str3=it+"";
其实他们都依赖Integer的toString()方法。
public static String valueOf(int i) {
return Integer.toString(i);
}
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
OK。那如何从String转为int。(Integer和int属于java语法糖的内容。在编译期的语义分析和生成字节码阶段将会进行转换也就是自动拆箱与装箱)。
String str4="234";
int z=Integer.valueOf(str4);
int x=Integer.parseInt(str4);
为什么同样的功能要两个函数来实现呢。
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
public static int parseInt(String s) throws NumberFormatException {
return parseInt(s,10);
}
可以发现valueOf其实使用parseInt方法的返回值当作参数进行处理的。
另外两个方法的返回值是不同的。基本数据类型是在栈上分配的。
而Integer面向对象的设计需要他在堆上分配内存。小数值创建和死亡又是非常频繁的行为。
频繁的操作将会使对象在堆上分配和GC造成不必要的资源损耗。所以通过享元模式进行优化。
在常量池中保存对象。当常量池存在此对象时不在创建对象直接把引用指向对象就可以
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
可以看到保存的对象最大到127.这也就是
Integer it=127;
Integer it1=127;
System.out.println(it==it1);
Integer it3=128;
Integer it4=128;
System.out.println(it3==it4);
第一个会成功,第二个失败的原因。额写的可能有点乱。大家见谅吧。