java中==的比的到底是什么

文章探讨了Java中等号(==)用于基本数据类型和引用类型时的区别,强调了对于引用类型,==比较的是存储的地址而非内容。通过String和Integer的实例,解释了常量池和堆区的概念,以及valueOf方法的工作原理。同时提到了equal方法用于比较引用类型的内容。
摘要由CSDN通过智能技术生成

        java中我们常常要进行一些内容的判断,一般情况下,我们都会使用等号,在这里有一点小小的困惑,我记录一下,希望能帮助到你。

        首先,在这里我向先说一点我对于java的感悟。我们的java是C++的升级版,同样是面向对象,可以说是去繁取简,所以在java学习的过程中,一定不可以忘记之前学习过的C++的知识。

        好啦,上结论,==其实还是比较的当前两个地址中的值!

        简单如基本数据类型的比较:

int a=1;
int b=1;
System.out.println(a==b);

        嗯,答案直接是true,很坚定的回答。就是比较了a变量这个地址中的1是否等于b变量中的1,答案是肯定的。

        接下来就是我们的引用类型大比武了,这里需要注意的是,我们的可以将引用对比C++中的指针来学习,都是一种特殊的类型,值存放的是地址!

        首先经典如我们的String四等式了(自己起的名字),如下所示,大家可以试试输出的结果是什么。


String aa="a";
String bb="a";
String cc=new String("a");
String dd=new String("a");
String ee="bc";
String ff="b"+"c";
System.out.println(aa==bb);
System.out.println(cc==dd);
System.out.println(aa==cc);
System.out.println(ee==ff);

        结果是:

         第一个到第三个还是挺好理解的。

        首先第一个,java通过"xxxxx",创建的字符串是会放在我么的常量池中的,在常量池中相同的内容只能有这一份,当我们的aa在创建的时候,发现常量池中没有“a”,于是他就创造了一个并指向它(自己存上了“a”的地址);当我们bb再来常量池的时候,发现有一个“a”了,于是就不在创造,bb变量直接就是指向“a”的(也就是存上了“a”的地址),所以aa和bb存储的地址一样,很自然的,他们就相等了;

        第二个,java中通过new出现的对象是会被放在堆区的,这篇区域中可不会崇拜唯一的王,我的意思是堆区就允许内容一样的家伙出现了,每new一次,就会有一个新的家伙出现,在new的时候,引用变量指向自己的造物(存下它们的地址),既然是不同的对象(地址不一样),那一比较很自然的也是不相等了。

        第三个式子,同上边的推导一样,自己试试看。

        第四个就比较奇怪了,如果按照上边的推导,“b”,“c”,“bc”即便在常量池中,也明明是不一样的呀。没错,如果单单是拆开来看的话,这三个串确实不一样,但是不要忽略了“b”+“c”,这还有一个+号,这是我们的java优化的效果,在编译阶段,他会将“b”+“c”转为“bc”,这样既可以节约内存,又可以节约时间,岂不是美滋滋,所以其实ee和ff还是指向的同一个串(存的同一份地址)。

        好啦,到这里,基本上,就可以解决我们的==问题啦,记住,无论什么时候,比较的还是这个变量中存储的值,只不过引用类型习惯存储别人的地址而不是常规理解的数据。

        下面是拓展,Valueof的记录,valueof是干啥的呢,可以理解为值转换,可以完成我们基本数据类型向包装类型的转换,基本上属于一个手动装箱的过程。其中比较精妙使用的就当属我们的Integer了。

        看看下面的代码:

Integer a1=Integer.valueOf(128);
        Integer a2=Integer.valueOf(128);
        Integer b1=Integer.valueOf(127);
        Integer b2=Integer.valueOf(127);

        System.out.println(a1==a2);
        System.out.println(b1==b2);

        上边说了,这是相当于一个装箱过程,而Integer又是引用类型,结合我们上边的==推导,那么两句输出的结果会是什么呢?

        怎么会,是这样的,啊~很奇怪,有没有!!!明明是128,127,就差个1,结果确实不同了,是不是计算机科学不存在了?

        不会的,计算机科学永生,我们扒开源码看看。

 

        大概意思是这样的,我们在调用Integer的valueOf的时候,会if(判断一下)传进来的数值是否在我们的一个区间内,如在的话,就从我们提前定义好的一个缓存区(已经放到常量池中了)中取出来,给你指(存地址),否则我们就乖乖的调用构造方法给你一个全新的百分百不同的Integer对象来指。

        这就是为什么我们127为true,128为false的症结所在了。

        噢,看来,是有人越界了,这一点点的距离,居然把彼此推开成了陌路,真是令人悲伤啊。

        好啦,最后在来提一嘴,那是不是引用类型只能比地址呢,我们想比比内容咋办,这里就引入了equal方法,上源码:(就不解释了,上边官方注释写的很详致,看源码也是很棒的学习方式)。

        好啦,今天就到这里吧。

        奋斗趁年轻,吃苦趁现在!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值