get in Hashmap返回null

时间:2015-03-23 10:33:57

标签: java android hashmap

我有一个基本的Hashmap代码,由于某种原因无法运行。

ConcurrentHashMap<Bitmap, byte[]> pixels = new ConcurrentHashMap<Bitmap, byte[]>();

它的关键是位图,值是我使用此代码得到的字节:

public byte[] getPixels(Bitmap bmp) {
    int bytes = bmp.getRowBytes() * bmp.getHeight();
 buffer = ByteBuffer.allocateDirect(bytes);
    bmp.copyPixelsToBuffer(buffer);
    buffer.clear();
    return buffer.array();
}

在我放置的所有位图的hashmap中:

    pixels.put(bitmap1, getPixels(b)); 

当我想要获取值(字节)时,我会这样做:

    byte[] pixelData = pixels.get(bitmap1);

由于一些奇怪的原因它总是空的!为什么?我尝试了不同的位图,它们都返回null,并且它是相同的位图..

3 个答案:

答案 0 :(得分:1)

它必须是Bitmap的相同实例。如果您创建相同Bitmap的另一个实例,则它不会是同一个对象。

例如:

Bitmap b1 = BitmapFactory.decodeFile("mybitmap.png");
ConcurrentHashMap<Bitmap, byte[]> pixels = new ConcurrentHashMap<Bitmap, byte[]>();
pixels.add(b1);
[...]
Bitmap b2 = BitmapFactory.decodeFile("mybitmap.png");
byte[] barray1 = pixels.get(b1);
byte[] barray2 = pixels.get(b2);

barray1不为空

barray2为空

答案 1 :(得分:1)

第一件事:Android Bitmap的javadoc并不能保证它支持equals()hashCode(),如果它们具有相同的内容,这意味着如果他们没有&# 39,你,你已经搞砸了。

第二:the javadoc of ByteBuffer.allocateDirect()声明:

  

是否具有支持数组是未指定的。

因此 - &gt;不要使用它,使用ByteBuffer.allocate()而不是保证来拥有支持数组。

但我认为问题在于第一点。

答案 2 :(得分:1)

每当您使用HashMap并将某种类型的对象视为时,您需要考虑该对象的equals()方法是否已针对自定义相等进行了正确设计检查。在大多数情况下,它不是,因此您需要重新实现equals()方法。

Java中的主流逻辑是,当您覆盖equals()时,您还必须覆盖hashCode()方法。 (见this post

换句话说,您需要从CustomBitmap派生一个类Bitmap,并将新equals()hashCode()的实现添加到新类中。然后,它可以成功用作HashMap

中的键