Java - 通用链表值比较在值大于 127 时失败

标签 java linked-list palindrome

此代码检查链接列表是否是回文。

当我比较列表中大于 127 的两个值时,将返回值始终不相等,例如运行 [1, 128, 100, 100, 128, 1] 代码将返回 128 != 128 除非我在 if 语句中将它们转换为 int。

我只是好奇为什么会发生这种情况。这是我的代码:

while(firstHalf != null && secondHalf != null)
    {
        //COMPARISON ONLY WORKS WHEN CASTED TO AN INT
        if(((int)firstHalf.value) != ((int)secondHalf.value))
        {
            return false;
        }
        firstHalf = firstHalf.next;
        secondHalf = secondHalf.next;
    }

整个方法:

// Definition for singly-linked list:
// class ListNode<T> {
//   ListNode(T x) {
//     value = x;
//   }
//   T value;
//   ListNode<T> next;
// }
//
boolean isListPalindrome(ListNode<Integer> l) {
    if(l == null)
        return true;

    ListNode fastPnter = l;
    ListNode slowPnter = l;
    ListNode slowPnterPrev = l;

    //find mid point
    while(fastPnter != null && fastPnter.next !=null)
    {
        fastPnter = fastPnter.next.next;
        slowPnterPrev = slowPnter;
        slowPnter = slowPnter.next;
    }

    //odd case
    if(fastPnter != null)
    {
        slowPnterPrev = slowPnter;
        slowPnter = slowPnter.next;
    }

    //reverse second half
    slowPnterPrev.next = null;
    ListNode midNode = reverse(slowPnter);

    //check halves
    ListNode firstHalf = l;
    ListNode secondHalf = midNode;
    while(firstHalf != null && secondHalf != null)
    {
        //COMPARISON ONLY WORKS WHEN CASTED TO AN INT
        if(((int)firstHalf.value) != ((int)secondHalf.value))
        {
            return false;
        }
        firstHalf = firstHalf.next;
        secondHalf = secondHalf.next;
    }

    return true;
}

最佳答案

没有显式转换为 int ,列表中的值被视为 Integer (从参数定义 ListNode<Integer> l 可以看出)。

为了正确比较Objects (如两个 Integers ),您应该使用 .equals()方法而不是 == 。当您使用==时,您实际上是在比较整数指向相同的内存地址。 JVM 缓存 -128 到 127 之间的整数值,因此这就是代码仅适用于这些值的原因。

(参见 http://www.owasp.org/index.php/Java_gotchas#Immutable_Objects_.2F_Wrapper_Class_Caching )

关于Java - 通用链表值比较在值大于 127 时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51162824/

相关文章:

java - Playframework 从嵌套 Controller 加载表单

c# - 对象内的链接是否被视为反模式?

链表数据结构的java实现

c - 使用线程从链表中删除元素

c - 如何在忽略区分大小写和标点符号的情况下检查 C 中的回文?

c - 递归函数查找回文

Java/Android : How to get a spectrum of the MP3/wav file?

java - 如何将类型为byte []的对象转换为字符串

algorithm - 使用 K 个字母查找大小为 N 的回文的总数

java - 我的前缀表达式计算器出现问题