2017-05-05 27 views
1

我试图找出是否一个给定的String是回文,但它从来没有得到的进入if块打印“给定的字符串是一个回文”即使回文。Java字符串概念回文

String s; 
Scanner scan = new Scanner(System.in); 

System.out.println("enter any string"); 
s = scan.nextLine(); 
System.out.println("contents of string s " + s); 
scan.close(); 

StringBuffer stringbuffer = new StringBuffer(s); 
System.out.println("contents of stringbuffer " + stringbuffer); 
stringbuffer = stringbuffer.reverse(); 

System.out.println("contents of reversed stringbuffer " + stringbuffer); 
if(s.equals(stringbuffer)) 
{ 
    System.out.println(" given string is a palindrome"); 
} 

谁能告诉我我做错了什么?

+0

从一见钟情,它看起来没问题。在IF声明中插入一个断点,看看有什么不同。可能是编码。 – johni

回答

6

if(s.equals(stringbuffer))这里您试图比较StringStringBuffer,它总是会返回false

public boolean equals(Object anObject) { 
    if (this == anObject) { 
     return true; 
    } 
    if (anObject instanceof String) { 
     String anotherString = (String)anObject; 
     int n = value.length; 
     if (n == anotherString.value.length) { 
      char v1[] = value; 
      char v2[] = anotherString.value; 
      int i = 0; 
      while (n-- != 0) { 
       if (v1[i] != v2[i]) 
        return false; 
       i++; 
      } 
      return true; 
     } 
    } 
    return false; 
} 

这是.equals()方法内部如何运作。所以首先它会检查其他对象是否为instanceOf String。所以在这里它将返回false,所以.equals()方法最终会在每种情况下给出false作为输出。

您可以使用有s.contentEquals(stringbuffer)比较两个或转换StringBufferString并调用String.equals()方法。

if(s.contentEquals(stringbuffer)) 
{ 
    System.out.println(" given string is a palindrome"); 
} 

或转换StringBufferString,然后调用.equals()方法,

if(s.equals(stringbuffer.toString())) 
{ 
    System.out.println(" given string is a palindrome"); 
} 
+1

谢谢你让我知道这是内部实现。 –

+1

@PrasadS如果您发现任何有用的答案,请接受它! –

+1

我无法做到这一点,因为我只有13个声望点。否则我会这样做的。再次感谢您 –

2

你比较类型String和类型StringBufferString#equals()因此,它会永远进入if块。

String#equals()不仅比较String内容,但还会检查其他的对象是你要找的String#contentEquals()它没有做类型检查的String

一个实例。

if(s.contentEquals(stringbuffer)) 
{ 
    System.out.println(" given string is a palindrome"); 
} 

StringBuffer变量转换为类型String比较之前。

if(s.equals(stringbuffer.toString())) 
{ 
    System.out.println(" given string is a palindrome"); 
} 
+1

是的,我尝试了你之前建议的第二种方法。它工作正常。谢谢 –

3

在您的if条件中,您正在比较2种不同类型的对象。请记住String & StringBuffer是两个不同的类,因此它们的对象不会相同。 为了得到正确的结果,你需要得到String对象的StringBuffer ....

所以if(s.equals(stringbuffer.toString()))会为你工作。