什么是primitive主数据类型呢

        primitive就是int,double,boolean这些数据类型,它们不是对象,只是内存里的几个字节空间而已。注意int是primitive,而Integer不是!Integer是一个类。java调用方法的时候参数是"pass by value"的,如果你有一个方法int myMethod(int i),调用者手里的i是10,调用myMethod(10),这时候,myMethod得到的是10的一个拷贝。如果myMethod把i改变了,如i++;i变成11了,调用者手里的i并不跟着变,只能等myMethod return i以后才能看到结果。
        如果是int myMethod(Integer i)呢? 这里的i是Integer类的一个实例(一个对象),myMethod得到的不再是i的一个拷贝,而是i的地址的一个拷贝。这时,如果myMethod改变了i,调用者手里的i也跟着变了,因为两者的i都是相同的地址,指向同一个Integer对象。
        由此看来,有人说java里primitive是“pass by value”而对象是“pass by reference“是不对的,java永远是pass by value,就是java只会传拷贝,只不过传primitive的时候拷贝的是参数值,传非primitive的时候拷贝的是对象的地址。如果你学过C++,可以比较一下myMethod(Integer i)和C++里的myMethod(int& i)看有什么不同。注意int[]是按“非primitive”传的,就是说传的是数组的地址。显然,java这种设计是出于效率的考虑。如果把整个对象拷贝一次或把整个数组拷贝一次多浪费,还是说,“哎,那个对象的地址在这儿,要玩自己去玩吧”省事。而primitive呢,还是传拷贝比较省事。就几个字节嘛,有的还不如一个地址长呢。何况这几个字节是在栈(stack)里传的,而给了地址还要按地址到堆(heap)里去找。这两者各有各的用处,有的时候我们非要传地址不可(哪些时候? 你自己想想,想不出再来问),所以才发明了Integer、Boolean、Double这些类,还在里面加上了和字符串互相转换的功能,很好。

        但显然,能用primitive的时候不用非primitive。


在Java的方法调用中,方法中的参数是以传值的形式进行的,不管它是什么数据类型。如果是基本数据类型,则就是传入该值的一个拷贝;如果是类类型,则传入的是引用的一个拷贝。归根结底还是传的值。出处

在Java等编程语言中,基本数据类型Primitive Types)是语言内置的最简单数据类型,它们不是对象。而为了便于将基本数据类型作为对象处理,以及提供更多的功能,每种基本数据类型都有对应的“包装类”(Wrapper Class)。这种机制允许我们把原始值当作对象来操作,这对于集合框架和其他需要对象的地方非常重要。 以下是几种常见的Java基本数据类型及其对应的包装类: | 基本数据类型 | 包装类 | |--|-------------| | byte | Byte | | short | Short | | int | Integer | | long | Long | | float | Float | | double | Double | | char | Character | | boolean | Boolean | ### 使用场景及优点 1. **与泛型一起工作**:由于容器类如ArrayList、HashMap只能存储引用类型的数据,因此当想要在一个列表里存入int数值时就需要先将其转换成Integer。 2. **空值表示法**:包装类能够持有null值,这使得它可以区分"0"和"不存在"这两种情况;而基础类型则总是会有一个默认值(例如整数为0)。 3. **提供更多实用方法**:每个包装类都包含了各种静态方法来进行字符串解析、格式化输出等工作,简化了程序设计。 4. **自动拆箱/装箱(Auto-boxing/unboxing)**:自JDK 5开始引入了一项特性叫做自动装箱(unboxing)和自动拆箱(autoboxing),它可以在必要时候自动地完成从基本类型到其对应包装类之间的相互转化过程。 ### 实际应用示例 ```java // 装箱 - 将基本类型转为包装类实例 Integer intValue = new Integer(10); // 显式创建 Integer autoBoxedValue = 20; // 自动装箱 // 拆箱 - 反之亦然 int primitiveInt1 = intValue.intValue(); // 显示调用intValue()方法得到基本类型 int primitiveInt2 = autoBoxedValue + 5; // 直接运算中的隐含拆箱动作 ``` 需要注意的是,在性能敏感的应用部分应当谨慎使用过度依赖于自动装拆箱的行为,因为频繁的对象构造可能会带来额外开销,并可能导致意想不到的结果或错误。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值