首页 > 其他 > 详细

关于Integer的127与128问题

时间:2018-01-21 12:21:50      阅读:238      评论:0      收藏:0      [点我收藏+]
刷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问题

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!