jvm 中的常量以及常量的衍生类以及==和equals的比较

本文深入探讨Java中的八大基础数据类型及其对应的包装类,解析基本类型与引用类型的区别,包括数组、类、接口和字符串的特点。同时,对比分析了==与equals在不同类型比较中的应用,并通过实例说明了自动装箱与拆箱机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在jvm中主要存在8大基础数据类型分别是(byte、int、long、short、float、double、char、boolean)

基本数据类型对应的包装类
byte(内存8位,无符号位时最大存储255,表数范围:-128~127)Byte
short(内存16位,无符号位时最大存储65536,表数范围:-32768~32767)Short
int(内存32位,无符号位时最大存储(2^32)-1,表数范围:-2^31~(2^31)-1)Integer
long(内存64位,无符号位时最大存储(2^64)-1,表数范围:-2^61~(2^61)-1)Long
float(内存32位,数据范围在2^-149~(2^128)-1,直接赋值时必须在数字后加上f或F)Float
double(内存64位,数据范围在2^-1074~(2^1024)-1,赋值时可以加d或D也可以不加)Double
char(内存16位,存储Unicode字符集,用单引号赋值,因为有ASCLL码对应值,可以参与加减乘除运算和比较大小)Character
boolean(数值只有true和false,不能用0代替;其他数值类型不能转换成boolean)Boolean

装箱与拆箱

装箱是指由基本数据类型向对应的包装类型转换。例如,int包装成Integer类的对象。 

   拆箱是指有包装类转换成基本数据类型。例如,把Integer类的对象简化成int。

常见包装类应用(手动装箱与拆箱) 
1、实现int和Integer相互转换 
Integer类通过构造方法将int装箱,通过intValue()方法进行拆箱。

int n = 1;
Integer m = new Interger(n);//手动装箱
int n = m.intValue();//手动拆箱(typeVale)

2、自动装箱与拆箱 
Java 1.5之后,Java支持自动装箱和拆箱

int n = 1;
Integer m = n;//自动装箱
int a = m;//自动拆箱

二、四大引用类型

     引用类型分为:数组,类,接口,字符串。

数组:其实就是一个容器,存储同一种数据类型的集合;如 int[] a = {1,2,3,4}

    类:对象是对事物的抽象,而类是对对象的抽象和归纳;如 public class Person{ ......}

     接口:使用interface来定义一个接口,只能定义方法,不能有方法的实现;如public interface personImpl{......}

     字符串:是存放数据区(静态区)以Unicode编码的字符集合,如 String a="你好"

基本类型与引用类型的区别:

(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。
三、==和equals的比较

3.1、基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值。 当存在基本数据类型和包装类型进行比较的时候,由于jvm的自动装箱机制和自动拆箱机制使其也可以使用==进行比较

3.2、复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。   对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

实践:

/**
 * Created by Administrator on 2019/2/17.
 */
public class LearnDataType {
    public static void main(String []args){
        int i = 10;
        Integer i1 = 10;
        Integer i2 = new Integer(10);

        int j = 128;
        Integer j1 = 128;
        Integer j2 = new Integer(128);

        System.out.println("i1:"+i1);
        System.out.println("i2:"+i2);

        System.out.println("i==i1:"+(i==i1));
        System.out.println("i==i2:"+(i==i2));
        System.out.println("i2==i:"+(i2==i));
        System.out.println("i1==i2:"+(i1==i2));
        System.out.println("i2==i1:"+(i2==i1));

        System.out.println("i1.equals(i):"+(i1.equals(i)));
        System.out.println("i2.equals(i):"+(i2.equals(i)));
        System.out.println("i2.equals(i1):"+(i2.equals(i1)));
        System.out.println("i1.equals(i2):"+(i1.equals(i2)));


        System.out.println("j==j1:"+(j==j1));
        System.out.println("j==j2:"+(j==j2));
        System.out.println("j2==j:"+(j2==j));
        System.out.println("j1==j2:"+(j1==j2));
        System.out.println("j2==j1:"+(j2==j1));

        System.out.println("j1.equals(j):"+(j1.equals(j)));
        System.out.println("j2.equals(j):"+(j2.equals(j)));
        System.out.println("j2.equals(j1):"+(j2.equals(j1)));
        System.out.println("j1.equals(j2):"+(j1.equals(j2)));

        System.out.println(new Integer(15));
    }
}
i1:10
i2:10
i==i1:true
i==i2:true
i2==i:true
i1==i2:false(由于两个对象在使用==进行比较的时候是通过比较引用的地址是否相等)
i2==i1:false
i1.equals(i):true
i2.equals(i):true
i2.equals(i1):true
i1.equals(i2):true
j==j1:true
j==j2:true
j2==j:true
j1==j2:false
j2==j1:false
j1.equals(j):true
j2.equals(j):true
j2.equals(j1):true
j1.equals(j2):true
15

在jvm中通常存在常量池,主要缓存的数据是8大基础数据类型,以及字符串缓存常量池

通常基础数据类型变量赋值是从常量池里面获取,如果不存在的话,则创建一个常量,而当使用new的话则是在堆里面创建一个对象并且引用的值是常量池里面的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值