zoukankan      html  css  js  c++  java
  • equals 和== 的区别

    首先

        看比较的对象是否为字符串,若为(String)字符串用equals 比较, 比较的是他们的值。相同返回 true ,不相同返回false.

    package one;
    
    public class Bijiao {
        public static void main(String[] args) {
             String a="kitty";
             String b="kitty";
              if(a.equals(b)){
                  System.out.println(a.equals(b));
        }else{
            System.out.println("不相等");
        }
        }
    }

    运行结果   为 true   

        " == " 是比较运算符,用来比较基本数据类型 byte int float long short double boolean char  ,比较的是他们的值

    	      int c=4;
    	      int d=4;
    	      if(c==d){
    	    	  System.out.println("相等");
    	      }else{
    	    	  System.out.println("不相等");
    	      }
    

    运行结果   为 相等  

    当比较的数据类型为复合数据类型时,==比较的是他们的内存地址。(复合数据类型是指String,数组,一般的class类,接口等,除了基本的都是由基本类型复合而成的数据类型 )。

     所以除非是同一个new 出来的对象,他们比较的后的结果是true,否则比较结果都是 false.

    public class TestString {
    public static void main(String[] args) {
    String s1 = "Monday";
    String s2 = new String("Monday");
    if (s1 == s2)
    {
    System.out.println("s1 == s2");
    
    }else
    {
    System.out.println("s1 != s2");
    }

      运行结果 为    s1 != s2

     java中所有的类都是继承于Object这个类中,在object中的定义的一个equals 的方法,这个方法的初始行为是比较对象的内存地址,但在一些类库当中这个方法被覆盖掉了,如String Integer Date 在这些类当中equals有自己的实现,不在比较类在堆内存的存放地址。

    对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。

     

        public static void main(String[] args) {
    	String s1="one";
    	String s2=new String ("one");
    	if(s1==s2){
    		System.out.println("s1==s2");
    	}else {
    		System.out.println("s1!=s2");
    	}
    	
          if(s1.equals(s2)){
    		System.out.println("s1 equals(s2)");
    	}else{
    		System.out.println("s1 not equals(s2)");
    	}
    	}
    }
    

      运行结果为     s1!=s2                  

                   s1 equals(s2)
    我们将s2用new 创建的程序输出 s1!=s2 S1 equals s2
    说明:s1 s2 分别引用了两个“one ”“String”对象


    字符缓冲池 原来,程序在运行的时候汇创建一个字符缓冲池当做使用的"one" 这样的表达是创建字符串的时候,程序首先会在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1 将s2引用s1所引用的对象"one" 第二段程序中,使用了 new 操作符,他明白的告诉程序:"我要一个新的!不要旧的!"于是一个新的"one"Sting对象被创建在内存中。他们的值相同,但是位置不同,一个在池中游泳一个在岸边休息。
       public static void main(String[] args) {
    	String s1="one";
    	String s2=new String ("one");
    	s2=s2.intern();
    	if(s1==s2){
    		System.out.println("s1==s2");
    	}else{
    		System.out.println("s1!=s2");
    	}
    	if(s1.equals(s2)){
    		System.out.println("s1.equals(s2)");
    	}else{
    		System.out.println("s1 not equals(s2)");
    	}
    }
    }
    

      

    这次加入:s2 = s2.intern(); 程序输出: s1 == s2 s1 equals s2 原 来,(java.lang.String的intern()方法"abc".intern()方法的返回值还是字符串"abc",表面上看起来好像这个方 法没什么用处。但实际上,它做了个小动作:检查字符串池里是否存在"abc"这么一个字符串,如果存在,就返回池里的字符串;如果不存在,该方法会 把"abc"添加到字符串池中,然后再返回它的引用。 

     
  • 相关阅读:
    【Nginx】ngx_event_core_module模块
    ELMAH--Using HTTP Modules and Handlers to Create Pluggable ASP.NET Components 77 out of 90 rated th
    nyist oj 214 单调递增子序列(二) (动态规划经典)
    java 入门书籍(java7)
    ARCGIS将WGS84坐标投影到高斯平面
    【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
    【springboot】【socket】spring boot整合socket,实现服务器端两种消息推送
    【linux】linux修改open file 大小
    【docker】docker限制日志文件大小的方法+查看日志文件的方法
    【docker】docker部署spring boot服务,但是docker logs查看容器输出控制台日志,没有日志打印,日志未打印,docker logs不打印容器日志
  • 原文地址:https://www.cnblogs.com/cuixiaomeng/p/6848919.html
Copyright © 2011-2022 走看看