首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中==、equals的不同AND在js中==、===的不同

java中==、equals的不同AND在js中==、===的不同

作者头像
洋仔聊编程
发布2019-01-15 16:40:12
3.9K0
发布2019-01-15 16:40:12
举报

一:java中==、equals的不同

       1.==操作符:首先,对于非基本数据类型的对象比较,相同内存中存储的变量的值是否相等,注意是相同内存地址的才可,并且数值相同(当然地址相同,值也一定相同)才会返回true.     但是,对于基本数据类型的比较(比如:int flot double等),值相同,"=="比较便会返回true.(这是编译的规则,当进行基本数据类型的比较时,会编译生成if_icmpne指令不会进行比较地址。而进行对象比较时,会生成if_icmpne指令,会比较地址。生成的指令都是不同的)。

当然,对于不同的封装类型,比较时也会有一些异同。例如:String类型的比较

                1. String = "abcd"创建过程,首先在栈区创建一块区域存储str的引用,之后去查询方法区中的常量池(常量池的相关知识:http://blog.csdn.net/gcw1024/article/details/51026840)是否有有“abcd”常量,如果有则将该引用指到该常量。如果没有则在常量池中创建一个”abcd“常量,并将引用指到该常量。之后,如果还有创建的String str2 = “abcd”;则将栈中的引用直接指向该常量。但是,如果进行赋值操作str2 = "aaa";则会直接子啊常量池再创建一个“aaa”的常量,并将引用修改为该常量,不会去修改原本的“abcd”常量。

               2. String str3 = new String("abcd"): 直接在堆中创建对象,不会去常量池中去查找。之后又有一个String str4 = new String("abcd"),这个身str4对象即使值与str3对象相同但是并不会指向str对象,会在堆中重新创建一个对象,并指向它。如果str3==str4的话,返回值是false,因为他们只是值相同,但是对象的地址不同。str3.equals(str4)会返回true。

 另外:比如Integer类型的比较

                 1. Integer与Integer进行比较时:                         i. 如果两个Integer的值都是在-128<=x<=127的区间时并且都不是通过new出来的话,用"=="判断的话返回值为true。                         ii. 如果两个Integer的值不在-128<=x<=127的区间时并且都不是通过new出来的话,用"=="判断的话返回值为false。                        iii. 因为在Integer类中,会将值在-128<=x<=127区间的缓存在常量池(通过Integer的一个内部静态类IntegerCache进行判断并进行缓存)中,所以这两个对象的引用值是相同的。但是超过这个区间的话,会直接创建各自的对象(在进行自动装箱的时候,调用valueOf()方法,源代码中是判断其大小,在区间内就缓存下来,不在的话直接new一个对象),即使值相同,也是不同的对象,所以返回false。                         iv. 具体解释:http://blog.csdn.net/hxpjava1/article/details/78105146                  2. new Integer(1) 和Integer a = 1不同,前者会创建对象,存储在堆中,而后者因为在-128到127的范围内,不会创建新的对象,而是从IntegerCache中获取的。那么Integer a = 128, 大于该范围的话才会直接通过new Integer(128)创建对象,进行装箱。  另外: Integer a = 1,使用Integer类中的valueOf(int i )进行自动装箱的.详细见:http://blog.csdn.net/wangyang1354/article/details/52623703

       2.equals方法:用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。注意的是只要值相同就会返回true.

       3.例如:

//创建两个String对象,这两个String对象不是同一个内存地址。
            String s1 = new String("a");
            String s2 = new String("a");
            System.out.println(s1.equals(s2));   //输出true
            System.out.println(s1==s2);    //输出false

       4.注意:如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法(object为java中所有类的父类),Object类的equals方法的实现代码如下:

boolean equals(Object o){

      return this==o;

}

也就是说,如果一个方法没有实现自己的equals方法,那么继承的object类的equals方法也是用==操作符进行比较,那么此时==与equals就没有什么不同了。

二:js中==与===的不同

       1.首先===只能在js中使用,不能在java程序中使用,会报错。

       2.==操作符:如果两个操作数不是同一类型,那么==运算符会尝试一些类型转换,然后进行比较。比如,char类型的变量和int类型的变量进行比较时,==会将char转化为int在进行比较。类型不同,如果可以转化并且值相同,那么会返回true。

       3.===操作符:比较这两个值,比较过程没有任何类型转换。比如,类型不同,但如果转化后值相同,那么也会返回flase

       4.例如:

            var p1 = '1'; //字符类型的数字
            var p2 = '1' ;//字符类型的数字
            var p3 = 1;  //整数类型的数字

            p1 === p2; //类型和数值同时相等 true
            p1 === p3; //类型不相等和数值相等 false
            p1 == p3; //类型不同,但是==会自动转化类型,数值相等 true
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月29日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档