基础查漏补缺
自动拆箱与自动装箱
拆箱:包装类转换为基本数据类型,通过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结果一样
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现