Java基础深度总结:数据类型

你有信仰就年轻,疑惑就年老;有自信就年轻,畏惧就年老;有希望就年轻,绝望就年老;岁月使你皮肤起皱,但是失去了热忱,就损伤了灵魂。

1.基本数据类型
类型取值范围默认值
byte8-2^7 ~ 2^7-10
char16\u0000 ~ \uffff\u0000(Unicode编码)
short16-2^15 ~ 2^15-10
int32-2^31 ~ 2^31-10
float323.4e-45~1.4e380.0f
long64-2^7 ~ 2^7-10
double644.9e-324~1.8e3080.0d
booleantrue、falsefalse

Tip1:boolean只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。
在JVM中:
boolean被int替代,使用 1 来表示 true,0 表示 false。
boolean数组被byte数组替代。
同样,在JVM中short、char、boolean、byte在内存中都以int形式处理;float则以double形式处理。

Tip2:Java字符采用Unicode编码,因此一个字符占2个字节,即16位,因此char类型可以用来保存一个汉字:char ch = ‘中’;

2.基本数据类型的字面值
class LiteralTest{

    public static void main(String[] args) {

        byte b1 = 127; // ok
        byte b2 = 128; // 编译报错 Incompatible types.

        short s1 = 32767; // ok
        short s2 = 32768; //编译报错 Incompatible types.
        
        float f1 = 1.2; // 编译报错 Incompatible types.
    }
}
  • 对于整数的字面值:若字面量的值超出了变量数据类型所能表示的范围,就会报错。

  • 对于浮点类型的字面值:浮点类型的字面值就是double类型的。

因此,上述报错的代码,都可以通过强制类型转化来解决,但是可能存在精度损失。

 byte b2 = (byte)128;
 short s2 = (short)32768;
 
 // 对于 float,既可以强制类型转化,也可以在数值后加f
 float f1 = (float)1.2;
 float f1 = 1.2f;

大的数据类型(位数多的)向小数据类型(位数少的)进行强制类型转换,存在数据截断。

byte b = (byte)-129; // 原码:1 10000001  求补码==》 1 01111111
System.out.println(b); // 截取 8bit: 0 1111111 ==》 127

由于数据在计算机中都以二进制补码形式存放,因此-129在计算机中的表示为 1 01111111 ,byte只有8bit,因此高位1被丢弃,截取后为:0 1111111,0 作为符号位,数值位1111111,正数原码和补码相同,所以会打印127。

3.数据类型转换

在这里插入图片描述

  • 实线箭头:由低字节向高字节自动转换,无数据丢失
  • 虚线箭头:将容纳的信息多的数据类型转换成更小容量的数据类型,转换可能有精度丢失,需强制类型转换
4.包装类型

byte —> Byte
short —> Short
int —> Integer
long —> Long
float —> Float
double —> Double
boolean —> Boolean
Tip:包装类型被final修饰,不可被继承。

JDK1.5新特性:自动拆装箱,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。

Integer x = 2;     // 装箱 调用了 Integer.valueOf(2)
int y = x;         // 拆箱 调用了 X.intValue()
5.缓存池

Java基本数据类型的包装类型实现了缓存池的有:

  • Boolean :true 和 false
  • Byte : All byte value
  • Short : -128~127
  • Integer : -128~127
  • Character : \u0000 ~ \u007F(0-127)

在valueOf方法中,会先判断值是否在缓存池中存在,若存在则会使用缓存池中的对象,否则才会new一个对象。

Integer x = Integer.valueOf(123);
Integer y = Integer.valueOf(123);
System.out.println(x == y);   // true x和y都是来自缓存池中的对象的引用

Tip: 在JDK1.8中,Integer的缓存池IntegerCache上界默认为127,下界为-128,但是上界是可调的,在启动JVM时,可通过 -XX:AutoBoxCacheMax= < size > 来指定上界大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值