基础查漏补缺

自动拆箱与自动装箱
拆箱:包装类转换为基本数据类型,通过Integer.intValue()实现
装箱:基本数据类型转换为包装类,通过Integer.valueOf();实现
        Integer num = 10; //自动装箱
        int numInt = num; //自动拆箱


包装类的缓存
        Integer i1 = 100;
        Integer i2 = 100;
        Integer i3 = 200;
        Integer i4 = 200;
        System.out.println(i1 == i2);
        System.out.println(i3 == i4);
比较结果是?

true
false

为什么会一个对一个错?

Integer i1 = 100;自动装箱,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);
    }

根据代码可知,如果 i  >= IntegerCache.low并且 i  <=  IntegerCache.high , 则取缓存,否则创建新对象

 

 IntegerCache.low = -128、IntegerCache.high = 127,

因为100小于-128并且大于127,取的是缓存的数据  i1和i2引用指向的内存地址是一样的,故返回true

而200大于127,需要new一个Integer对象, i3 和 i4 指向的内存地址不同,故返回false


b += a;与b = a + b;的区别

        byte a = 127;
        byte b = 127;
        b = a + b;   //报错
b += a;

1. 为什么b = a + b;会报错?

     byte和short进行四则运算时,会转换为int进行计算,而b是byte故报错。

2. 为什么b += a;不报错?

  +=会进行隐式类型转换,转换成目标类型。

3. 为什么b最终的结果等于-2 ? 

       127 + 127 = 254,其二进制为1111 1110,取反再加1为0000 0010,因为为负数,所以结果为-2


Arrays.asList(numArr) 数组转换为集合,numArr定义应该用包装类而不是基本数据类型。

        //错误
        int[] numArr = {3, 6, 5};
        Arrays.asList(numArr).forEach(num -> {
            System.out.println("num: " + num);
        });
        
        //正确
        Integer[] numArr = {3, 6, 5};
        Arrays.asList(numArr).forEach(num -> {
            System.out.println("num: " + num);
        });

 

MessageFormat.format使用方法

public static void main(String[] args) {
    String a= "aaa";
    String b= "bb";
    String c= "c";
    StringBuilder sb = new StringBuilder();
    sb.append(a).append(b).append(c);
    System.out.println(MessageFormat.format(" {0} {1} {2} {3}", a, b,"",sb));
    System.out.println(MessageFormat.format(" ''{0}'' '{1}' {2} {3}", a, b,"",sb.toString()));
}

执行结果

 aaa bb  aaabbc
 'aaa' {1}  aaabbc

MessageFormat.format是根据顺序和占位符来对应插入的,所以第一行a,b都替换输出了本身的值,第三个是个空白替换为空白不显示。sb是StringBuilder拼接后的结果
第二行如果替换后需要加上单引号,'aaa'这样的,就需要在占位符上面对应加上两个单引号,这样才能准确转化为相应。

如果加上一个单引号,结果就不会替换,最后输出是占位符本身{1},第三个还是空白。StringBuilder .toString后输出和不toString结果一样

 

posted on 2022-02-11 09:39  周公  阅读(38)  评论(0编辑  收藏  举报

导航