ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-04-02 00:35:03  阅读:169  来源: 互联网

标签:字符 相等 JAVA String System ch ex str new


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

标签:字符,相等,JAVA,String,System,ch,ex,str,new
来源: https://www.cnblogs.com/ElloeStudy/p/16089862.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有