为什么这样做? (SameAs vs ==)

时间:2016-01-22 03:04:12

标签: java android performance bitmap drawable

我有一个问题:

Why is this not working sometimes?

我正在比较位图并相应地执行代码,但代码并没有执行。我的问题收到很多很好的答案。其中一个有效的答案建议删除==,并将其更改为.sameAs(),以使我的应用能够在较新的手机上运行。

ClickGround = v.getBackground(); //Get the background of button clicked (ClickGround is a bitmap)
        BitClick = ((BitmapDrawable) ClickGround).getBitmap(); //the bitmap background of the button clicked

那么,为什么使用sameAs()方法比使用==比较位图更有效?另外,为什么使用==在较低版本中工作? android(kitkat)和更高版本中的sameAs

谢谢,

Ruchir

3 个答案:

答案 0 :(得分:0)

为了清楚起见,sameAs()不能更有效地工作",而是唯一一个正常/可靠的工作。这是因为==只决定两个对象是否相同 - 即指向同一个对象 - 但即使对于完全相同但恰好是不同对象的位图,也可能返回false。

您调用的方法可能会在某些设备上和API的合同中为同一位图返回不同的对象,因此==将返回false。如果位图相同(在所有属性中都相同),sameAs()将返回true:

Given another bitmap, return true if it has the same dimensions, config,
and pixel data as this bitmap. If any of those differ, return false. If 
other is null, return false. 

背后有同样的想法:

void foo(Integer a, Integer b) {
  if (a == b) {
   ...
  }
}

这几乎肯定是错的 - 如果a.equals(b)可以为null,您通常需要a或者对象.equals(a,b),否则甚至会调用:

foo(1234, 1234)

通常会失败上述比较。

答案 1 :(得分:0)

==是一个关系运算符,因此实际上只对数字代表值有用

但是,sameAs()正在查看包含的DATA,而不是整个文件及其相关内容。

例如:

int a = 3; 
String b = "3"; 

我们知道3是数值,“3”是表示数值的String。它们对正常人和计算机都代表着同样的东西。在这种情况下,如果您尝试比较

if (a==b){//something}

我们知道我们必须进行某种翻译,因为两者对于计算机来说并不相同。

这样的东西
if (Integer.parseInt("b") == a){//do something}

将需要甚至

if( Integer.toString(a).equals(b)){//do something)

对于图像,两者具有完全不同的位置和其他参考,因此对于==类型比较它们永远不会“等效”。即使两者都作为字符串,它们在内存中具有不同的位置以及不同的关联值,这就是使用.equals()的原因。

对于Bitmaps,它们是一种抽象数据类型,因此即使equals()也不适用。因为您需要比较使用的sameAs()所包含的抽象数据。

答案 2 :(得分:0)

  

那么,为什么使用sameAs()方法比使用==比较位图更有效?

效率更高 。当sprintf有效时,它比==更有效。

但是,sameAs()适用于sameAs()不起作用的情况。这就是您应该使用==而不是sameAs()来比较位图的原因。

  

另外,为什么使用==在较低版本的android(kitkat)中工作,而在较高版本中使用sameAs?

有关创建和共享(或不共享)==对象的方式在新版本中发生了变化。当您使用Bitmap进行测试时,您依赖于未记录的实现特定行为。这种行为已经改变了。

为什么会改变?我的 guess 是它改变了幕后的位图缓存机制的副作用。

相关问题