java基本类型与引用类型

java基本类型与引用类型java 基本类型与引用类型目录 java 基本类型与引用类型目录一基本数据类型二引用类型三基本类型与引用类型的区别默认值内存分配自动装箱自动拆箱自动装箱拆箱带来的问题程序的性能空指针异常对象相等比较时一 基本数据类型 java 中一共分为 8 种基本数据类型 byte short int long float double char b

java基本类型与引用类型


目录

一、基本数据类型

java中一共分为8种基本数据类型:byte、short、int、long、float、double、char、boolean,其中byte、short、int、long是整型。float、double是浮点型,char是字符型,boolean是布尔型。

二、引用类型

java为每种基本类型都提供了对应的封装类型,分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean。引用类型是一种对象类型,它的值是指向内存空间的引用,就是地址。

三、基本类型与引用类型的区别

1.默认值

整型byte、short、int、long的默认值都为0,浮点型float、double的默认值为0.0,boolean默认值为false,char默认值为空。对应的包装类型默认值都为null。

2.内存分配

基本数据类型的变量是存储在栈内存中,而引用类型变量存储在栈内存中,保存的是实际对象在堆内存中的地址,实际对象中保存这内容。

3.自动装箱、自动拆箱

Java从jdk1.5开始引入自动装箱和拆箱,使得基本数据类型与引用类型之间相互转换变得简单。

自动装箱: java自动将原始类型转化为引用类型的过程,自动装箱时编译器会调用valueOf方法,将原始类型转化为对象类型。

自动拆箱: java自动将引用类型转化为原始类型的过程,自动拆箱时编译器会调用intValue(),doubleValue()这类的方法将对象转换成原始类型值。

Integer a = 3; //自动装箱 int b = a; //自动拆箱

b.方法调用

public Integer query(Integer a){ return a; } query(3); //自动装箱 int result = query(3); //自动拆箱

4.自动装箱、拆箱带来的问题

1.程序的性能

由于装箱会隐式地创建对象创建,因此千万不要在一个循环中进行自动装箱的操作,下面就是一个循环中进行自动装箱的例子,会额外创建多余的对象,增加GC的压力,影响程序的性能:

Integer sum = 0; for(int i=0; i<1000; i++){ sum+=i; }
2.空指针异常

注意拆箱过程中可能产生的空指针异常,一个简单的例子:

Object obj = null; int i = (Integer)obj;
3.对象相等比较时

先来看一个常见的例子:

Integer a = 120; int b= 120; Integer c = 120; Integer d = new Integer(120); System.out.println(a == b); //true t1 System.out.println(a == c); //true t2 System.out.println(a == d); //false t3 Integer e = 128; Integer f = 128; System.out.println(e == f); //false t4
Integer a = Integer.valueOf(120); int b = 120; Integer c = Integer.valueOf(120); Integer d = new Integer(120); System.out.println(a.intValue() == b); System.out.println(a == c); System.out.println(a == d); Integer e = Integer.valueOf(127); Integer f = Integer.valueOf(127); System.out.println(e == f); Integer e1 = Integer.valueOf(128); Integer f1 = Integer.valueOf(128); System.out.println(e1 == f1);

可以看到变量a、c在初始化的时候编译器调用了valueOf进行自动装箱,在a==b时对变量a调用了intValue()方法进行了自动拆箱操作,这就很好解释t1~t4的结果了。

public static Integer valueOf(int i) { assert IntegerCache.high >= 127; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }

t3结果无论如何都不会相等的,因为new Integer(120)构造器会创建新的对象。

Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法都会做缓存,而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177900.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午6:29
下一篇 2026年3月26日 下午6:29


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号