• Java中equals和=的区别


    本篇简单介绍javaequals== 区别

    equals 和 ==

    ==

    • 基本数据类型 byte,short,char,int,long,float,double,boolean
      ==比较的是它们的值

    • 复合数据类型(类)
      ==比较的是它们的在内存中的存放位置

    equals

    对于复合数据类型(类)使用equals来比较它们的内容是否一致

    String,Integer,Date在这些类当中equals有其自身的实现。

    String.class

            
            //先使用`==`进行比较内存地址 如果`true` 则`return`
            
    		public boolean equals(Object obj) {
    		        return (this == obj);
    		    } 
    		
    		//如果内存地址不相同则比较内容
    		   
    		public boolean equals(Object anObject) {
    		        if (this == anObject) {
    		            return true;
    		        }
    		        if (anObject instanceof String) {
    		            String anotherString = (String)anObject;
    		            int n = value.length;
    		            if (n == anotherString.value.length) {
    		                char v1[] = value;
    		                char v2[] = anotherString.value;
    		                int i = 0;
    		                while (n-- != 0) {
    		                    if (v1[i] != v2[i])
    		                        return false;
    		                    i++;
    		                }
    		                return true;
    		            }
    		        }
    		        return false;
    		}
    
    

    Integer.class

    
    		 public boolean equals(Object obj) {
    		        if (obj instanceof Integer) {
    		            return value == ((Integer)obj).intValue();
    		        }
    		        return false;
    		    }
    
    
    
    

    Date.class

    
    	  public boolean equals(Object obj) {
    	        return obj instanceof Date && getTime() == ((Date) obj).getTime();
    	    }
    
    

    关于内存池

    基于以上的理论基础上,我测试了一下发现。

    
    	String str1 = "string";
    	String str2 = "string";
    	
    	System.out.println(date == date2);
     
        output: true  ??? 说好的比较地址呢
    
    
    	String str1 = "string";
    	String str2 = new String("string");
    	
    	System.out.println(date == date2);
     
        output: false  正常情况
        
        String str1 = new String("string");
    	String str2 = new String("string");
    	
    	System.out.println(date == date2);
     
        output: false  正常情况
    

    查看了一下源码intern()函数给出了如下注释

    
         * When the intern method is invoked, if the pool already contains a
         * string equal to this {@code String} object as determined by
         * the {@link #equals(Object)} method, then the string from the pool is
         * returned. Otherwise, this {@code String} object is added to the
         * pool and a reference to this {@code String} object is returned.
    
    
    

    大体的意思是放你当没有使用new关键字创建一个字符串String str1 = "string"的时候,会先检查内存池如果已经包含该字符串
    如果存在则 返回内存池中的该字符串的引用。如果没有再创建一个新的。

    而使用关键字new则会默认创建一个新的String所以拥有不同的内存地址。

  • 相关阅读:
    Java MQTT 客户端之 Paho
    Spring Security + JJWT 实现 JWT 认证和授权
    MinIO
    Spring Boot 实现看门狗功能 (调用 Shell 脚本)
    Canal Admin
    canal
    浅尝 Elastic Stack (五) Logstash + Beats + Kafka
    养鸡场下蛋记
    涛声依旧
    原创:矩阵论学习心得
  • 原文地址:https://www.cnblogs.com/chenjy1225/p/9661248.html
Copyright © 2020-2023  润新知