jvm比较String和StringBuffer.reverse()总是失败

我有一个问题,我在哪里找到所有他是一个字符串是palindromes子串。 输入总是1个字。 测试输入是aabaa。 我决定尝试聪明,使我的子字符串的字符串缓冲区,然后使用相反的方法来比较与使用String.equals的原始。 它没有工作。

import java.util.* fun main(args: Array<String>) { val scan = Scanner(System.`in`) val input = scan.next() val found = ArrayList<String>() for (i in 0..input.length - 1) { for (j in 0..input.length - i) { val sub = input.substring(i, i + j) if (!found.contains(sub)) { // println(sub) found.add(sub) val rev = StringBuffer(sub).reverse() if (sub.equals(rev)) { println(rev) } } } } } 

当我取消注释第一个打印语句的输出看起来像这样使用测试输入aabaa

 a aa aab aaba aabaa ab aba abaa b ba baa 

所以我得到正确的子字符串,但最后的if语句永远不会解决,我不知道这是为什么。

sub是一个String。 rev是一个StringBuffer。 他们不可能是平等的,因为他们甚至没有相同的类型。

补充笔记:

  • 不要使用StringBuffer。 使用StringBuilder。 StringBuffer是不必要的同步的,不应该再使用了(就像Vector不应该被使用,而ArrayList应该被使用)。
  • for (i in 0..input.length - 1)可以写for (i in 0 until input.length)这是更优雅
  • input.substring(i, i + j)不可能是正确的:在两个循环的末尾,我会是长度为1,而j将是长度为1,因此你会得到一个长度为1和2 *长度 – 2。
  • 要存储唯一的结果,请使用HashSet,而不是ArrayList。 在HashSet上调用contains()是O(1),而在ArrayList上是O(n)。
  • 在Kotlin中,与Java不同,可以使用a == b来测试a是否等于b,即使a和b是引用也是如此。