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"添加到字符串池中,然后再返回它的引用。 

     
  • 相关阅读:
    leetcode231 2的幂 leetcode342 4的幂 leetcode326 3的幂
    leetcode300. Longest Increasing Subsequence 最长递增子序列 、674. Longest Continuous Increasing Subsequence
    leetcode64. Minimum Path Sum
    leetcode 20 括号匹配
    算法题待做
    leetcode 121. Best Time to Buy and Sell Stock 、122.Best Time to Buy and Sell Stock II 、309. Best Time to Buy and Sell Stock with Cooldown 、714. Best Time to Buy and Sell Stock with Transaction Fee
    rand7生成rand10,rand1生成rand6,rand2生成rand5(包含了rand2生成rand3)
    依图
    leetcode 1.Two Sum 、167. Two Sum II
    从分类,排序,top-k多个方面对推荐算法稳定性的评价
  • 原文地址:https://www.cnblogs.com/cuixiaomeng/p/6848919.html
Copyright © 2011-2022 走看看