1.Integer
Integer是int的包装类,为什么要提供包装类呢?是为了各种类型之间的转换,先看一下Integer的源码
public final class Integer extends Number implements Comparable<Integer> {
/**
* A constant holding the minimum value an {@code int} can
* have, -2<sup>31</sup>.
*/
@Native public static final int MIN_VALUE = 0x80000000;
/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
......
}
最大值是正2亿多,最小值是负2亿多
Integer有一个IntegerCache的内部类,它提供了一个Integer的缓存,会把-128到127暂时存储在一个数组中,需要用到就直接从
数组中拿
看下面一段代码
Integer a1 = new Integer(12);
Integer a2 = new Integer(12);
Integer b1 = -129;
Integer b2 = -129;
Integer c1 = 123;
Integer c2 = 123;
System.out.println(a1.equals(a2)); //false
System.out.println(b1==b2); //false
System.out.println(c1 == c2); //true
等号比较内存地址,equals比较值,所以在-128到127之间的Integer对象指向的内存地址是一样的,不在返回内的地址是不一样的
我们也可以在VM args中改了一下
-Djava.lang.Integer.IntegerCache.high=1250
2.String
stirng并非一个基本数据类型,它是线程不安全的,并且是不可变的.StirngBuffer是线程安全的,StringBuilder也是线程不安全的,但它两都是长度可变的.
今天看一下创建一个String需要创建几个对象
@Test
public void test1(){
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println("s1和时s2引用地址是否相等:"+(s1 == s2));
System.out.println("s1和时s3引用地址是否相等:"+(s1 == s3));
}
通过上面代码可以看到new的String和直接赋值的String指向的地址不一样
通过new String("Hello")对象时,会先先去字符串常量池找"Hello"字符串,如果没有创建字符串常量就先创建,如果已经有,就在堆中创建一个新的String对象,存储"Hello",而s3指向堆中的"Hello"对象地址
那么给一个思考题new String("4"+"3")创建了几个对象呢?