java中equals和==区别

/*
* equals和==区别
*   功能不同
        "=="是判断两个变量或实例是不是指向同一个内存空间。
        "equals"是判断两个变量或实例所指向的内存空间的值是不是相同。

    定义不同
        "equals"在JAVA中是一个方法,在Object中定义的。
        "=="在JAVA中只是一个运算符合。
* */

/**
 * 测试equals和==的异同
 */
public class Demo {
    public static void main(String[] args) {
        String s2=new String("equals");
        String s1="equals";


        boolean b2 = s1.equals(s2);
        boolean b1 = s1 == s2;


        System.out.println("使用==:"+b1 );
        System.out.println("使用equals:"+ b2);

        System.out.println("====================================");
        /*
        补充一:new String()与直接定义的区别
            1、java字符串池:
                和所有池的概念一样,字符串池为一块特殊的内存空间,存放已经定义过的字符串.当需要使用字符串时,先去字符串池中查看该字符串是否已经存在,如果存在,则可以直接使用,如果不存在,初始化,并将该字符串放入字符创常量池中
                以上边操作为例:String s1 = "equals";创建了一个字符串常量,值为equals
                此时字符串池中为空,创建一个s1时会把"equals"放入字符串池中。
                再次创建String s2 = "equals";
                字符串池中已有,直接使用,s1==s2为true
             2.new String("equals");创建了一个字符串对象,值为equals
                new关键字的作用:
                    内存(堆)中开辟一块空间
                    在开辟的空间中创建对象
                    调用对象的构造函数初始化对象
                 String s2=new String("equals");
                此时由于new了一个对象,所以在堆中中一定会创建一个String对象
                但检查字符串池时发现其中已经有了"equals",就不在创建了,否则会创建两个对象,但此时==的结果仍为false,因为一个地址在堆中一个在字符串池中
             3.字符串常量是在再编译时确定的,字符串对象的值是在执行的时候确定的
         */
        String s3 = "equals";
        System.out.println(s1==s3);//ture
        System.out.println("==================================");
        /*
            补充二:字符串拼接
                str1、str2、str3是常量,编译时就确定了,str4中有一个str1,我们知道String是引用类型,
                每一个变量名都是一个引用,所以str4不会在编译时确定,而String是final的,
                所以在运行时确定就相当于创建了一个String对象,然后在把新创建对象的引用传给str4
                所以在项目中还是不要使用new String去创建字符串,最好使用String直接赋值;
                因为str4和str3值是一样的,但却存了两遍;但是str5和str3值一样并且指向的都是字符串池里的"ab"
         */
        String str1 ="a";
        String str2 = "b";
        String str3 = "ab";
        String str4 =str1+"b";
        String str5 = "a"+"b";
        String str6 = str1+str2;
        System.out.println(str3==str4);//false
        System.out.println(str3==str5);//ture
        System.out.println(str3==str6);//false

        /*
            补充三:面试题
                String s = new String(“xyz”); 产生几个对象?
                    一个或两个。如果常量池中原来没有 ”xyz”, 就是两个。
                    如果原来的常量池中存在“xyz”时,就是一个。
                    对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。
                java中String new和直接赋值的区别
                    对于字符串:其对象的引用都是存储在栈中的,如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,
                    如果是运行期(new出来的)才能确定的就存储在堆中。
                    对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份(new几个有几个)。
         */


    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值