A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. import java.io.*;


  2. public class StringTest {

  3.         public static void isSymmetrical(String str){
  4.                 StringBuilder string1 = new StringBuilder(str);
  5.                 string1.reverse();
  6.                 boolean flag = (string1.equals(str));
  7.                 if(!flag)
  8.                         {System.out.println(str+ " is not symmetrical!");}
  9.                 else
  10.                         System.out.println(str + " is symmetrical");
  11.         }
  12.         public static void main(String[] args) throws Exception{
  13.                 /*Scanner in = new Scanner(System.in);
  14.                 String str = in.next();*/
  15.                
  16.                 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  17.                 String str = null;
  18.                 while((str = bufr.readLine())!= null)
  19.                 {
  20.                         if("over".equals(str))
  21.                                 break;
  22. //                        System.out.println(line);
  23.                         isSymmetrical(str);       
  24.                 }
  25.                 bufr.close();
  26.                
  27.                
  28.         }
  29. }
复制代码


输出:
asd
asd is not symmetrical!
asa
asa is not symmetrical!


但是在boolean flag = (string1.equals(str));
改为:boolean flag = ((string1.toString()).equals(str.toString()));
问题就没有了...这到底是为什么?我测试了,输入的制确实被反转了,但为什么比较出来永远是false?

3 个回复

倒序浏览
equals比较的是他们所在的内存地址,string1是new出来的,在内存新开辟一块空间。两个字符串的地址不一样,所以才会false.你只能重写equals方法。希望能帮到你~
回复 使用道具 举报
string1是StringBuilder的对象,string1.equals()是继承自Object的方法,没有被重写过。相当于==,比较的是引用地址。而(string1.toString()).equals()是调用的String类的equals(),是被重写过的,比较的是内容,不是引用地址。
回复 使用道具 举报
String1是new出来的StringBuilder的对象,而equals()方法是比较字符串内容的,所以String1.equals(str)返回值必定是false,而当String1.toString()时返回的是一个字符串,所以这问题就解决了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马