JAVA里面判断两个字符是否相等

JAVA里面判断两个字符串是否相等

== 比较引用 , equals 比较值

String a = "abc";
String b = "abc";
System.out.println(a == b);
System.out.println(a.equals(b));

String c = new String("abc");
String d = new String("abc");
System.out.println(c == d);  // 在堆里面创建两个对象,所以引用不同
System.out.println(c.equals(d)); // equals() 比较的是对象的值

String e = "ab" + "c";
System.out.println(a == e);
System.out.println(a.equals(e));  // 在编译的时候在堆里面创建对象

true
true
false
true
true
true
  • 无论在常量池里面还是堆中的对象,用equals()方法比较的都是对象的内容

图解

image-20220401195901821

  • new的时候,会在内存创建一个对象

例子

public class Example{
    String str = new String("good");
    char[ ] ch = { 'a' , 'b' , 'c' };
    public static void main(String args[]){
        Example ex = new Example();
        ex.change(ex.str,ex.ch);
        System.out.print(ex.str + " and ");
        System.out.print(ex.ch);
    }
    public void change(String str,char ch[ ]){
        str = "test ok";
        ch[0] = 'g';
    }
}

结果:     good and gbc 
  • String确实是个不可变对象,这个不可变是JDK特有的

  • String str = new String("good");是在编译时在堆栈中创建对象和分配内容,而在传参的时候,传递的是地址,把外面的str引用地址复制了一份给方法内的str而不是里面的内容

  • 题目中的形参str只是原引用ex.str的一个引用副本,传的是一个副本地址值,这个值与ex.str地址值是不一样的,但是它们同时指向了堆中的对象new String("good"),当你在函数中改变形参也就是地址的副本值也就是这句str="test ok"只是将副本地址指向常量"test ok",并没有改变原ex.str的指向方向,它还是指向对象new String("good")的

  • char数组与String一样传的也是地址的副本,但是关键是形参ch它没有新的指向 ch[0]只是ch在指向原对象时改变了对象的内部结构, 所以在ex.ch指向与它是同一个对象的情况下当然也会随之变化

  • 图解:

总结

直接赋值而不是使用new关键字给字符串初始化,在编译时就将String对象放进字符串常量池中;使用new关键字初始化字符串时,是在堆栈区存放变量名和内容;字符串的拼接操作在程序运行时,才在堆中创建对象。一般,可以认为使用"=="比较的是引用,equals比较的是内容。

凡事有交代,事事有回音

End

posted @ 2022-04-02 00:17  ElloeStudy  阅读(745)  评论(0编辑  收藏  举报