==和equals在比较字符串时候的区别

作为一个菜鸟  之前一直迷茫 都说比较字符串要用equals()方法  但是有时候用==貌似也可以  话不多说  先来一个例子

public static void main(String[] args) {
    String str1="str";
    String str2="str";
    System.out.println(str1==str2);//返回true

  
System.out.println(str1.equals(str2));//返回true
}

返回一个 true

 再来一个用==不行的例子

public static void main(String[] args) {
    String str1=new String("str");
    String str2=new String ("str");
    System.out.println(str1.equals(str2));//返回true
    System.out.println(str1==str2);//返回false

}

 

 

 经过比较得知  new()出来的字符串不能用==比较

有以下两种原因 

  1、equals()方法比较的是两个对象值   而==比较的两个引用是否指向同一个对象   有些同学要问了  为什么直接=字符串和new()字符串难道不同吗?  对的 第二点就是new和=的区别

  2、用=时 会在字符常量串常量池中创建 如 string  s="123"; 字符串常量池不属于堆也不属于栈  这样就会在字符串常量池创建“123”(如果字符串常量池中已经有“123” 就把s引用指向它)。再创建一个string s1=“123”;

    会把s1的引用指向已经存在的“123”;而不会再创建一个 这样s和s1的引用都是一样的 用==也可以判断出来

    用new()时  不管字符串常量池中有没有  都到从堆内存中开辟一块空间存放 new一次 开辟一次 所以 String str1=new String("str"); String str2=new String ("str");是不同的两块空间 所以引用也就不相同的

    ==只会判断两个引用是否指向同一个对象(也就是同一块内存地址) 所以这时候用==是false

 

 结论

  1、==用于比较两个引用是否指向同一个对象   equals用于比较两个对象是否相等

  2、由于字符串特殊 在字符串常量池中的字符串可以使用==也可以使用equals 推荐不管哪种方式 只要是比较字符串就用equals

 

posted @ 2018-03-10 21:21  菜鸟~风  阅读(11044)  评论(0编辑  收藏  举报