基础知识 | 基本数据类型和包装数据类型的区别

基本数据类型

基本类型位数字节默认值取值范围
byte810-128 ~ 127
short1620-32768 ~ 32767
int3240-2147483648 ~ 2147483647
long6480L-9223372036854775808 ~ 9223372036854775807
char162‘u0000’0 ~ 65535
float3240f1.4E-45 ~ 3.4028235E38
double6480d4.9E-324 ~ 1.7976931348623157E308
boolean1falsetrue、false

包装数据类型

这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。

包装类型不赋值就是 Null ,而基本类型有默认值且不是 Null。

包装类型的常量缓存池

Byte,Short,Integer,Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。

数值比较的问题

基本数据类型和包装类进行比较规则

1、基本型和包装类进行“ == ”运算符的比较,包装类将会自动拆箱变为基本型后再进行比较,假设Integer(0)与 int a=0 比较,Integer(0)会自动拆箱为 int 类型再进行比较,显然返回 true,因为缓存池的缘故,会直接从缓存中拿出0和0进行比较;
2、两个 Integer 类型进行“= = ”比较, 如果其值在-128 至 127,那么返回true,否则返回 false, 因为值-128 至 127 是直接从高速缓存中拿的值。
3、两个包装类进行 equals()比较,首先 equals()会比较类型,如果类型相同, 则继续比较值,如果值也相同,返回 true。
4、包装类调用 equals(),但是括号中的参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行 3 中的比较。

自动装箱和自动拆箱

装箱:将基本类型用它们对应的引用类型包装起来;
拆箱:将包装类型转换为基本数据类型;

Integer i = 10 等价于 Integer i = Integer.valueOf(10)
int n = i 等价于 int n = i.intValue();

为什么要有包装类型

new对象就会在堆上分配空间,如果我们频繁的使用Integer和Byte对象的时候,这样就会频繁的访问堆空间,对垃圾回收机制会造成一定影响,影响了效率,基本数据类型只在栈上创建、使用以及销毁,提高了效率节省了空间

Java是面向对象的编程语言,为了让基本数据类型具有面向对象的特征,对其进行包装,使其具有面向对象的特征,具有属性和方法;并且在某些情况下,方法的参数必须是对象;其次包装类提供了更强大的方法;而且方便了其他对象与基本数据类型的转换

场景问题

使用交换函数交换两个基本数据类型

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 12;
        swap(num1,num2);
        System.out.println(num1 + " " + num2);
    }
    public static void swap(int a,int b){
        int temp = a;
        a = b;
        b = temp;
        System.out.println(a + " " + b);
    }

结果

12 10
10 12
也就是交换失败

交换包装数据类型

    public static void main(String[] args) {
        int num1 = 10;
        int num2 = 12;
        swap(num1,num2);
        System.out.println(num1 + " " + num2);
    }
    public static void swap(Integer a,Integer b){
        int temp = a;
        a = b;
        b = temp;
        System.out.println(a + " " + b);
    }

结果

12 10
10 12

交换失败

因为仅仅在交换范围内起作用,在主方法中还是没有交换的

    public static void main(String[] args) {
        int num1 = 129;
        int num2 = 130;
        int[] swap = swap(num1, num2);
        num1 = swap[0];
        num2 = swap[1];
        System.out.println(num1 + " " + num2);
    }
    public static int[] swap(Integer a,Integer b){
        int temp = a;
        a = b;
        b = temp;
        System.out.println(a + " " + b);
        return new int[]{a,b};
    }

以返回值的方式进行返回,那么就可以交换成功

130 129
130 129
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小七rrrrr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值