欢迎来到知了堂!
联系电话:知了堂-电话号码 028-62016472

Java中==和equal的区别-知了堂

Java中==和equal的区别

  简单来说,equal是比较两个对象内容是否相等,==是比较两者是否是同一个内存地址。

  举例说明:

  public class StringAndStringBuffer {
  public static void main(String[] args) {
  String str1="hello";
  String str2="he"+"llo";
  String str3="he"+new String("llo");
  String str4=new String("hello");
  System.out.println(str1==str2);
  System.out.println(str1==str3);
  System.err.println(str1.equals(str3));
  System.err.println(str1==str4);
  }
  }

  结果:
       true

  false

  true

  false

  分析:

  1) 因为在比较中使用了== ,所以返回的值为一个布尔值

  2)==与.equals()都可以比较值是否相等,但是局限于基本数据类型;在String类中==判断的是其在内存中的地址是否相等, .equals可以比较值是否相等,所以如果比较两个字符串的值是否相等,最好还是用equals(),如上面的str1==str3与str1.equals(str3)的区别

  3)"hello","he","llo"都为字符串常量,

  第一次出现字符串常量时会在池中创建一个新的,之后出现就不会创建了,而是直接把引用指向第一次创建的对象。但对于new出来的对象,

  无论怎样赋值,new一次创建一次(在堆中),不会考虑之前是否已经已存在相同的。而且,字符串是不可追加的,

  所以每次使用连接符号其实相当于先产生一个常量,然后再赋给引用,原来指向的串就成垃圾被回收了。

  str3创建过程中,new String("llo")存在于堆内存中,所以所得到的字符串对象在自己的内存中,而不再缓冲池中

  str2创建的过程中,"he","llo"都已经存在缓存池中,得到的str2="hello"已经存在缓冲池中,所以直接引用str1

  str4创建的对象存在于堆内存中,不能直接引用

  4)System.out.println与System.err.println()都是打印出来,但是后者显示的为红色,而且在显示顺序上始终在out的后面

Java中==和equal的区别

  比较两个字符串是否相等,优先使用

  1)StringUtils.equals(str1,str2);

  org.apache.commons.lang.StringUtils

  2)str1.equals(str2);

  3)str1==str2;

版权声明:本文来源于网络,由知了堂搜集整理,仅供大家学习