在java中==号和equals有什么区别

前言

        在java当中,所有带双引号的字符串,都是String类的对象,字符串是不可以改变的,值在创建后不能被更改,但是String的值是可以被共享的。

字符串常量池

        在jdk7版本开始,字符串常量池从方法区中移动到了堆内存,当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在,如果存在,就会直接复用,不存在则会创建

        

package com.entor.practice.designmode.pra1;

public class Test {

    public static void main(String[] args) {


        String s = "起飞";
        String s2 = "起飞";
        System.out.println(s == s2);//true
/**
*@Description 在字符串常量池中复用了
**/

        String s3 = new String("起飞");

        /**
        *@Description 实际上这句话创建了两个对象,首先new会在内存中
         * 开辟一片空间,而双引号里面又会创建一个Sting对象,但是已经存在了,所以会
         * 拿字符串常量池中拿,该字符串的内存空间是指向new出来的空间
        **/

        System.out.println(s2 == s3);//false


        String s4 = "飞";
        String s5 = "起" +s4;

        System.out.println(s5==s2);//false
        /**
         *@Description  当字符串之间使用加号连接时,系统会在底层创建一个StringBuilder
         * 对象,然后调用append方法完成拼接,之后用toString方法转换成Stirng类型
         **/

        String s6 = "起" + "飞";

        System.out.println(s6==s2);
    /**
    *@Description java存在常量优化机制,在编译的时候会将"起" + "飞"拼接成"起飞"
     * 之后的操作就是和第一个比较一样了
    **/

    /**
    *@Description 使用== 做比较
     * 基本数据类型:比较的数据值是否相同
     * 引用类型:比较的是地址值是否相同
    **/

    }
}

equals在object中也是比较内存值的

api中是这样写的 

      • equals类方法Object实现对象上差别可能性最大的相等关系; 也就是说,对于任何非空的参考值xy ,当且仅当xy引用相同的对象( x == y具有值true )时,该方法返回true

        请注意,无论何时覆盖该方法,通常需要覆盖hashCode方法,以便维护hashCode方法的通用合同,该方法规定相等的对象必须具有相等的哈希码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值