short s1=1;s1=s1+1;有什么错?short s1=1;s1+=1;有什么错?**
short s1=1;s1=s1+1
这编译时就报错了;因为short,char,byte 在运算时会自动转成int类型; i+1表达式的类型为int,将int赋值给short,会报出丢失精度错误
我们可以强转解决这个问题
short i = 1;
i = (short) (i+1);
short s1=1;s1+=1; 没有错;+=是Java语言规定的运算符,Java会对它进行特殊处理—强制类型转化
byte a = 127; a+=5; System.out.println(a); 请问输出结果是什么?
这个画图比较好解释
128表示-128;而132则表示-124
java 的 Integer 和 int 有什么区别?
- int 是基本数据类型,Interger是int的封装类,提供了一些对整数的操作方法;
- int 修饰 参数,或者是成员变量时,默认值是0;Integer 默认是null;
java 中 3*0.1 == 0.3 将会返回什么?true 还是 false?
false; 浮点数不能完全精确表现出来,一般会损失精度
java 中 float f = 3.4; 是否正确?
错误,3.4 是double,赋值给float会丢失精度,除非强转
能否在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量?
不能,丢失精度。
Integer i1 = 200;
Integer i2 = 200;
System.out.println(i1== i2);
Integer i3 = 100;
Integer i4 = 100;
System.out.println(i3==i4);
答案:false,true ;;这里主要考查自动封装和IntegerCache缓存池;
Integer i1 = 200 它会调用Integer i1 = Integer.valueOf(200)
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
在创建前它会检查参数是否在缓存池范围中,即-128 ~127;如果属于这个方位,那么直接从数组中取,那么就不用new 一个。
private static class IntegerCache {
//最小值
static final int low = -128;
//最大值
static final int high;
//这个缓存池实际上是个Integer数组类型
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
}
high = h;
// 创建缓存池;大小:(high - low) + 1;
// 数组索引是没有负数的, cache[0] = -128
cache = new Integer[(high - low) + 1];
int j = low;
//遍历赋值
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
// range [-128, 127] must be interned (JLS7 5.1.7)
assert IntegerCache.high >= 127;
}
200 超出缓存池范围,所以两次new Integer(200);new 是在内存中开辟新的空间,地址肯定是不相等的。 == 比较引用类型,就是比较引用对象地址是否相同。
100 在缓存池范围内,Intege i3 = IntegerCache.cache[100+128];Intege i4 = IntegerCache.cache[100+128]。引用对象地址相同
来源:CSDN
作者:newheart_2020
链接:https://blog.csdn.net/weixin_42723054/article/details/104723496