永发信息网

如何比较两个字符串

答案:3  悬赏:40  手机版
解决时间 2021-11-21 08:14
  • 提问者网友:niaiwoma
  • 2021-11-20 09:33
如何比较两个字符串
最佳答案
  • 五星知识达人网友:低音帝王
  • 2021-11-20 09:44
==比较的是内存地址,如果你是这样

String a = "aaa";
String b = "aaa";
System.out.println(a == b);结果:true,但是你如果是这样:

String a = new String("aaa");
String b = new String("aaa");
System.out.println(a == b);结果:false
因为它分配了两个内存地址,如果用equals则结果为true,所以在比较字符串的时候还是用equals()方法比较合理。
全部回答
  • 1楼网友:笑迎怀羞
  • 2021-11-20 11:51
equals 是比较数据
== 是一个逻辑上的判断
  • 2楼网友:逃夭
  • 2021-11-20 11:06
给你澄清几个概念,然后再说equals,有助理解,如不感兴趣,可越过此部分。
知道什么是引用不?引用也就是引用变量,Java中的变量按照数据类型,可以分为两种,一种是基本数据类型变量,一种是引用数据类型变量:
基本数据类型变量:byte,short,char,int,long,float,double,boolean,以这8种基本数据类型声明的变量,如:int i;
基本数据类型变量:到目前为止引用数据类型包括 类,接口,数组,枚举,注解,以它们声明的变量叫做引用变量,或者引用,如:
String s1 = new String("abc");
String s2 = "abc";
引用s1里面存的是一个地址,地址什么样你不用管,就知道 通过这个地址就可以准确的找到上面这个new出来的String对象,所以我们说,引用s1指向了这个String对象。同样,s2也指向了一个String对象。

再说 == 和 equals 的区别:
s1 == s2 是true还是false?
== 比较的是引用地址,换句话说,==号两边的这两个变量所记录的地址是不是相同,用new关键字new出来的对象位于内存的堆区,"abc"是一个字符串常量,Java中字符串常量也是String类的一个对象,字符串常量被分配在内存的data segment(数据区),现在它们是两个不同的对象,s1指向new出来的这个,s2指向这个字符串常量,s1和s2指向的是不同的对象,它们的引用地址当然不同,毫无疑问表达式返回false

再说equals方法,s1.equals(s2) 是true还是false?

有些人上来就说equals方法比较的内容,其实这是不全面的,equals方法和==的区别,面试也经常考,
equals方法是父类Object所定义的方法,用来实现两个对象内容是否相等的逻辑,说equals方法要从两个方面:
1)从Object角度来说,==与equals是一样的,都是比较引用,因为Object类的equals()方法是这样定义的, public boolean equals(Object obj) { return (this == obj); }
方法内部的实现就是比较引用地址,用的也是==号,所以对于Object来讲,equals与==是一样的。

2)对于其它类来说,可以根据需要,在自定义的类中重写(Override) equals方法,实现内容是否相等的逻辑,因为String类重写了equals方法,所以我们才说String的equals比较的是两个字符串的内容,内容就是"abc",第一个new出来的时候传入构造方法的实参就是"abc",第二个字符串常量也是"abc",它们虽然是两个不同的对象,但是它们的内容相同,所以s1.equals(s2)返回真,它们相等。

我再给你写一个,String s3 = "abc"; String s4 = new String("abc");
s2 == s3 是真是假?
答案是true,注意,Java虚拟机 对于内存数据区里面的内容有一个优化,如果已经存在了,不会分配第二个,上面已经 String s2 = "abc";了, 这个"abc"已经存在了,下面String s3 = "abc"; 就不会分配第二个"abc"了,那么s3指向谁?s3也指向上面s2指向的这个对象,现在是s2和s3同时指向同一个对象,那么它们的地址当然一样,==比较的是引用地址,所以s2 == s3 返回true。
s2.equals(s3) 呢? 都是同一个对象了,那自己和自己内容还能不一样?返回true。

s1 == s4 是真是假?
答案是false,注意,使用new关键字生成的对象分配在内存的堆区(heap),并且只要是用了new关键字了,不管你new多少个,内容是否一样,它们都是不同的对象,new一个就出现一个新的,所以s4指向的这个对象,和s1指向的这个是两个不同的对象,地址不同, 因此s1 == s4为false,使用equals比较返回true,因为内容相同。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯