码迷,mamicode.com
首页 > 其他好文 > 详细

关于Integer的127与128问题

时间:2018-01-21 12:24:26      阅读:290      评论:0      收藏:0      [点我收藏+]

标签:shm   find   tab   should   pad   nbsp   order   pac   int   

刷leetcode时遇到的一个问题:

Given a pattern and a string str, find if str follows the same pattern.

Here follow means a full match, such that there is a bijection between a letter in pattern and a non-emptyword in str.

Examples:

  1. pattern = "abba", str = "dog cat cat dog" should return true.

  2. pattern = "abba", str = "dog cat cat fish" should return false.

  3. pattern = "aaaa", str = "dog cat cat dog" should return false.

  4. pattern = "abba", str = "dog dog dog dog" should return false.

正确的解决方法:

public boolean wordPattern(String pattern, String str) {

String[] words = str.split(" ");

if(words.length != pattern.length())

           return false;

HashMap<Object, Integer> map = new HashMap<Object, Integer>();

for(Integer i=0;i<words.length;i++){

if (map.put(pattern.charAt(i), i) != map.put(words[i], i))

           return false;

}

return true;

    }

一开始,for循环我写成了:for(int i=0;i<words.length;i++),运行结果错误。

检查发现是Integer的127与128问题。

首先,Integer类中,当数值在(-128,127)之间时,引用指向的是同一个堆内存地址。超过这个范围以后,才会分配新的内存地址。

所以Integer i1 = 127;Integer i2 = 127;i1==i2。而Integer i1 = 128;Integer i2 = 128;i1!=i2

错误的方式for(int i=0;i<words.length;i++):

    由于存int类型进map时,自动将int类型的i封装成Integer类型的i,所以在map.put(pattern.charAt(i), i),map.put(words[i], i)时,存入的是两个new Integer的i对象。而Integer的对象在大于127时是不相等的,所以map的值是不相等的,返回为false;

正确的方式for(Integer i=0;i<words.length;i++):

    在初始化i时,就把i封装成Integer类型,所以map.put(pattern.charAt(i), i),map.put(words[i], i)中,存入的是同一个Integer对象,自然是相等的。



关于Integer的127与128问题

标签:shm   find   tab   should   pad   nbsp   order   pac   int   

原文地址:http://blog.51cto.com/13580976/2063315

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!