Java共有4类8种基础数据类型:byte(1字节)、short(2字节)、int(4字节)、long(8字节)、float(4字节)、double(8字节)、char(2字节)、boolean(1字节)。
题目1:Java中char能存中文吗?
答:java中的char是unicode存储,unicode编码字符集中包含了汉字,所以可以存储中文;
题目2:Integer的缓存值
当申明一个Integer变量的时候编译器其实会调用Integer.valueOf()方法。valueOf方法在通过valueOf方法创建Integer对象的时候,如果数值在[-128,127]之间,便返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。这样做主要的目的就是为了提高效率(因为一些小值数据经常使用)。
public static Integer valueOf(int i) {
if(i >= -128 && i <= IntegerCache.high)
return IntegerCache.cache[i + 128];
else
return new Integer(i);
}
题目3:为什么两个Integer.MAX_VALUE 相加后为-2
答:那是因为Java的有符号整数遵循两个补码表示。
(1)int整形溢出
在二进制补码表示中,负数表示为其对应正值的N位补码,即它们的模2 n的和为0。
Integer.MAX_VALUE是2147483647(十六进制0x7FFFFFFF)。当相乘时,它会溢出,剩下的是最低的32位(即模2 32):
0x7FFFFFFF * 2 = 0x0FFFFFFFE (mod32 = 0xFFFFFFFE = -2)
(2)自动类型提升的时机
当表达式右侧都是int整形时,会首先取表达式中最大的类型暂存计算结果,这里是int类型的也就是-2再将暂存的结果赋值给Iong类型,此时才做类型提升。
当表达式右侧有long类型变量时,则会在计算时就进行自动类型提升。这时候的值就不会发生溢出了,结果为4294967294
自动类型转换
Java所有的数值型变量可以相互转换,如果系统支持把某种基本类型的值直接赋给另一种基本类型的变量,则这种方式被称为自动类型转换。
当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统将可以进行自动类型转换,否则就需要强制转换。
如果希望把基本类型的值转换为对应的字符串时,可以把基本类型的值和一个空字符串进行连接。
一个基本类型的值和字符串进行连接运算,基本类型的值自动转换成字符串
public static void main(String[] args)
{
int a = 6;
System.out.println(a + ”“);
// 下面的语句输出7LinkinPark
System.out.println(3 + 4 + “LinkinPark”);
// 下面的语句输出LinkinPark34
System.out.println(”LinkinPark” + 3 + 4);
}
强制类型转换
注意:当试图强制把表数范围大的类型转换为表示范围小的类型时,必须格外小心,因为非常容易引起信息丢失。
static void main(String[] args)
{
// 下面3行代码输出-23,典型的溢出
int intValue = 233;
byte byteValue = (byte) intValue;
System.out.println(byteValue);
// 下面3行代码输出3,典型的信息丢失
double doubleValue = 3.14;
int iValue = (int) doubleValue;
System.out.println(iValue);
// 下面2行代码出错,shortValue类型参与运算,类型自动提升到int
// 将一个int类型的值赋给一个short类型的值,编译不过 。除非用强制转化(short)
short shortValue = 5;
shortValue = shortValue - 2;
}