JAVA 语言具有两大数据类型:
内置数据类型(基本数据类型)
引用数据类型
八种基本类型:
一种字符类型 char(2个字节)
一种布尔型 boolean (1个bit) 默认为false
六种数字类型(四个整数型,两个浮点型) byte(1个字节) short(俩个字节) int (四个字节) long(8个字节) 默认为0L float (四个字节) 默认为0.0f double (8个字节) 默认为0.0d
对应的引用数据类型分别为:
char ->character
boolean -> Boolean
byte -> Byte
short->Short
int -> Integer
long -> Long
folat ->Float
double -> Double
所以至此引出java 装箱和拆箱的问题:
基本数据类型不是对象(也就是使用int、double、boolean等定义的变量、常量)。
基本数据类型没有可调用的方法。
注意到Integer的valueOf源代码:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
当调用Integer的静态方法来获取新的对象的时候 如果你的赋值在这个Integer的缓存里面的话,直接指向这个值的地址就可以了,而不需要new一个对象,当不在这个区间的时候才需要new一个对象,这样的话通过Integer来保存一个IntegerCache达到降低内存开销的目的,缓存是通过一个数组(数组的每个值都是通过new的相应类型的对象来实现的)来实现的,这个查看源码就知道了。同样的,byte 和 short都是这样的,缓存大概就是在-127~128之间。
当我们创建一个Integer对象时,却可以这样:
Integer i = 100; //装箱 实际执行了 Integer i = Integer.valueOf(100);
int t = i; //拆箱,实际上执行了 int t = i.intValue();
自动拆箱(unboxing),也就是将对象中的基本数据从对象中自动取出
parse+" ";强制转换
String StringBuffer && StringBuilder
这里看一下String与int之间的转换
int ->String
第一种方法 String str = i+" "; 这样会产生俩个String对象 str && “”
第二种方法 String str = String.valueOf(i); 只产生一个str对象
String ->int
第一种方法: i=Integer.parseInt(s);//直接使用静态方法,不会产生多余的对象,但会抛出异常
第二种方法: i=Integer.valueOf(s).intValue();//Integer.valueOf(s) 相当于有可能new Integer(Integer.parseInt(s))(理由看上面valueOf的源码),也会抛异常,但会多产生一个对象.
String 类一旦初始化创建之后就不可以再次发生变化
例如上面所示:开始String1 = "hello"
String1+=“world”; 这个时候会给world新建一个对象 然后新生成的helloworld会再次新建一个对象
一共生成了三个对象