DataBinding xml使用三元运算符的坑

1、dataBinding xml使用三元运算符出现的bug

最开始的代码 ,用 == 比较一直是 false

<data>
        <variable
            name="bean"
            type="com.oaapp.bean.MerchantBean" />
    </data>
    
<com.oaapp.widget.LayoutTitleContentCommon
                    android:id="@+id/asmTitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:cont_right="@{bean.title == bean.stash_change.title? bean.title +`\n调整后→\t`+bean.stash_change.title : bean.title }"
                    app:layout_constrainedHeight="true"
                    app:layout_constraintHeight_min="@dimen/dp_45"
                    app:layout_constraintTop_toTopOf="parent"
                    app:title="供应商名称:" />

2、== 与 equal的坑

最后改成equal比较,可以比较成功

<data>
        <variable
            name="bean"
            type="com.oaapp.bean.MerchantBean" />
    </data>
<com.oaapp.widget.LayoutTitleContentCommon
                    android:id="@+id/asmTitle"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    app:cont_right="@{bean.title.equals(bean.stash_change.title)? bean.title +`\n调整后→\t`+bean.stash_change.title : bean.title }"
                    app:layout_constrainedHeight="true"
                    app:layout_constraintHeight_min="@dimen/dp_45"
                    app:layout_constraintTop_toTopOf="parent"
                    app:title="供应商名称:" />

3、hashcode 与 equal 的区别

我们先看一下Java之中的所有类的父类 Object 里面的hashCode与equals方法:

   public native int hashCode();

   public boolean equals(Object obj) {
        return (this == obj);
    }

我们知道 “==”这个比较方式比较的是 hashcode的值,也就是说在Object 里面 == 与equals两者的比较是完全一样的,都是比较hashcode.而hashcode是一个native方法,是底层实现的。

hashcode的作用

JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做 Object的比較或者取这个对象的时候,它会依据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。

1.new Object(),JVM依据这个对象的Hashcode值,放入到相应的Hash表相应的Key上,假设不同的对象确产生了同样的hash值,也就是发 生了Hash key同样导致冲突的情况,那么就在这个Hash key的地方产生一个链表,将全部产生同样hashcode的对象放到这个单链表上去,串在一起。
2.比較两个对象的时候,首先依据他们的 hashcode去hash表中找他的对象,当两个对象的hashcode同样,那么就是说他们这两个对象放在Hash表中的同一个key上,那么他们一 定在这个key上的链表上。

那么此时就仅仅能依据Object的equal方法来比較这个对象是否equal。当两个对象的hashcode不同的话,肯定 他们不能equal.

附:
Java的 == 与 equal 的区别:
1、 == 表示 判断两个变量或对象实例是否指向同一个内存空间,equals()表示 判断两个变量或对象实例所指向的内存空间的值是否相同。
2、比较对象为基本数据类型(byte,short,char,int,long,float,double,boolean)比较两个基本数据类型是否相等用==,因为只有类才会有equals方法

Kotlin的 == 与 === 的区别:
Kotlin 提供了两种方式用于对象的比较。
比较对象的结构是否相等( == 或者 equals )
Kotlin 中的操作符 == 等价于 equals 用于比较对象的结构是否相等, 很多情况下使用的是 ==,因为对于浮点类型 Float 和 Double,其实现方法 equals 不遵循 IEEE 754 浮点运算标准。
比较对象的引用是否相等 ( === )
Kotlin 中的操作符 === 用于比较对象的引用是否指向同一个对象,运行时如果是基本数据类型 === 等价于 ==。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值