我有一个基本的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,并且它是相同的位图..
答案 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
。