java8大数据类型_重温Java八大基本数据类型

dc2baddc564380bb485b88b1048ce0f1.png

1、介绍

Java语言提供了8种基本数据类型。分别是 byte、short、int、long、float、double、boolean、char。

String 是对象,不属于基本数据类型

8种基本数据按类型分可以分为

4个 整数型:byte、short、int、long

2个浮点型:float、double

1个字符类型:char

1个布尔型:boolean

4f27887600a426a45821e5e7b67ce8ce.png

基本数据类型 "==" 比较都是值。

Boolean 《Java虚拟机规范》给出了4个字节,但还要看虚拟机实现是否按照规范来,所以1个字节、4个字节都是有可能的。

2、拆箱和装箱问题

拆箱和装箱

装箱就是自动将基本数据类型转换为包装器类型;使用Integer.valueOf方法。

拆箱就是自动将包装器类型转换为基本数据类型;使用Integer.intValue方法。

Integer total = 99;

//执行上面那句代码的时候,系统为我们执行了,即自动装箱

Integer total = Integer.valueOf(99);

int totalprim = total;

//执行上面那句代码的时候,系统为我们执行了,即自动拆箱

int totalprim = total.intValue();

范围问题

通过一个问题去引申,面试经常被问的:

Integer i = 400;

Integer j = 400;

System.out.println(i==j);  //false

Integer o = 12;

Integer k = 12;

System.out.println(o==12);  //true

上面提到,使用 Integer去创建数据,其实是一个Integer.valueOf 过程,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);

}

如果值的范围在-128到127之间,它就从高速缓存返回实例。

否则 new 一个Integer对象。new Integer 就是一个装箱的过程了,装箱的过程会创建对应的对象,这个会消耗内存,所以装箱的过程会增加内存的消耗,影响性能。

所以说最后是i 和 j 两个对象比较,内存地址不一样,结果就是false了。

==的值比较问题

int a =200;

Integer b = new Integer(200);

Integer c = 200;

System.out.println(a==b); //true

System.out.println(a==c); //true

System.out.println(b==c); //false

这也是面试经常问到的,在代码中我们经常也会用到这种判断。

a==b,a==c,只要和基本数据类型(即 int)比较,Integer就会调用value.intValue()拆箱成基本数据类型,你也可以理解为:当有基本数据类型,只比较值

b==c,这两个是永远不会相等的,拆箱装箱只是针对基本数据类型的比较才有,Integer并不是基本数据类型,b、c两者存放的内存地址不一样,所以不相等。

总结:

①、无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。

②、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。

③、两个都是new出来的,即两个new Integer比较,则为false。

④、int与Integer、new Integer()进行==比较时,结果永远为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。

3、int 和 Integer

Integer 继承了Object类,是对象类型,有自己的属性和方法,是 int 的包装类。int是java基本数据类型。

Integer默认值null,int默认值 0。

int 可以直接做运算,Integer 不能直接运算,拆箱转化为int才能进行运算。

4、默认值问题

Java中:

整数的默认类型是 int。

浮点数默认类型是 double,否则需要 在后面加f、d

a5bb364c01633961e43c1b7cf887b199.png

浮点数如果不加f,默认就是double类型的,前面再用 float修饰,就会报错。可以使用两种方法解决:

结尾加上 f

使用(float) 强转

5、Integer.parseInt()和Integer.valueOf()的区别

parseInt() 和 valueOf() 都是Integer 对象的方法。入参都是一个String字符串。

parseInt

public static int parseInt(String s) throws NumberFormatException

将字符串参数作为带符号十进制整数来转换。如果无法转换,抛出 NumberFormatException。

valueOf

public static Integer valueOf(String s) throws NumberFormatException

返回初始化为指定 String 值的新的 Integer 对象,如果无法转换,抛出 NumberFormatException。

String str = "-12";

int  num = Integer.parseInt(str);

System.out.println(num); // -12

Integer  num2 = Integer.valueOf(str);

System.out.println(num2); // -12

int num3 =Integer.parseInt("HaC"); //java.lang.NumberFormatException

int 与 Integer转换:

int a=A.intValue();

Integer A=Integer.valueOf(a);

Integer派别:Integer、Short、Byte、Character、Long这几个类的valueOf方法的实现是类似的。

Double派别:Double、Float的valueOf方法的实现是类似的。每次都返回不同的对象。

6、精度丢失问题

byte a = 5;

int b =2;

float c  = 6f;

double d =0.03;

double d2 =300.03;

System.out.println(a/b); // 2  a会转化为int 类型

System.out.println(b/c); // 0.33333334 b会转化为float类型

System.out.println(a+d+d2); // 301.05999999999995 a会转化为double类型,但是结果理应是  301.06

不同类型的数据在运算的时候,会向高精度的数据类型转换。

a5384b2c53de8d7ba5b93011c798d920.png

其实double类型数值的计算经常会出现这种精度丢失的问题,尤其是有小数点的情况下,常常会因为精度丢失而导致程序出错。因为计算机是通过二进制进行运算的,而计算机在表示小数的二进制是会有精度问题的。

所以我们在运算高精度的数据的时候,可以使用 java.math.BigDecimal 类

7、字符串与整数拼接问题

String a = "1";

int b = 1;

int c = 2;

System.out.println(a + b + c); //112

System.out.println(b + c + a); //31

a + b + c  从左到右按顺序运算,a+b 的结果是 12 ,是一个String,然后再拼接 c,最后是 String

b + c + a  从左到右按顺序运算,b + c 的结果是 3,是一个int ,然后拼接a,变成 String。

8、留几个问题瞅瞅

1) 设有下面两个赋值语句:

a = Integer.parseInt("1024");

b = Integer.valueOf("1024").intValue();

下述说法正确的是()

A    a是整数类型变量,b是整数类对象。

B    a是整数类对象,b是整数类型变量。

C    a和b都是整数类对象并且它们的值相等。

D    a和b都是整数类型变量并且它们的值相等。

答案是 D,intValue()是把Integer对象类型变成int的基础数据类型;

2)表达式(short)10/10.2*2运算后结果是什么类型?

A    short

B    int

C    double

D    float

答案是 C,Java中,你如果 没有在数字后面声明,浮点数默认为double。

要注意是(short)10/10.2*2,而不是(short) (10/10.2 *2),前者只是把10强转为short,又由于式子中存在浮点数,所以会对结果值进行一个自动类型的提升,浮点数默认为double,所以答案是double;后者是把计算完之后值强转short。

干货分享

最近将个人学习笔记整理成册,使用PDF分享。关注我,回复如下代码,即可获得百度盘地址,无套路领取!

•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes开源书》•006:《DDD速成(领域驱动设计速成)》•007:全部•008:加技术群讨论

近期热文

关注我

喜欢就点个"在看"呗^_^

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值