DataBinding 使用运算符遇到的坑
  fIf0rCzjdQ4z 2023年11月02日 120 0

@[TOC](DataBinding 使用运算符遇到的坑)

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 中的操作符 === 用于比较对象的引用是否指向同一个对象,运行时如果是基本数据类型 === 等价于 ==。

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
fIf0rCzjdQ4z