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

时间:2018-07-03 21:07:13

标签: java linked-list palindrome

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

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

我很好奇为什么会这样。这是我的代码:

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;
}

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

Integer类具有内部缓存,用于表示从-128到127的数字的实例。使用equals方法比较Integers