equals 为什么要把常量写在前面?

简介: equals 为什么要把常量写在前面?

使用str1.equals("abc");


如果str1是null,空是没有equals方法的,会抛出空指针异常


如果"abc".equals(str1);如果str1是null,最终始终返回的都是false;


也就是说 null在前会报空指针,null在后不会,会返回false


空指针就是空引用,java空指针异常就是引用本身为空,却调用了方法,这个时候就会出现空指针异常。可以理解,成员变量和方法是属于对象的(除去静态),在对象中才存在相对应的成员变量和方法,然后通过对象去调用这些成员变量和方法。对于空指针来说,它不指向任何对象,也就没有所谓的成员变量和方法,这个时候用它去调用某些属性和方法,当然会出现空指针异常。


null是所有引用类型的默认值,如果没有让一个引用指向一个实际存在的对象,它的默认值就是null。null本质上是一个值,这跟int的默认值是0,boolean的默认值是false一样。现在,我们通常都使用像eclipse等的集成开发环境进行开发,一般在定义变量的时候都会进行初始化(这也是写代码的一个良好的习惯),如果没有进行初始化,系统会进行提示。


所以null调任何方法都会报空指针,空字符串则不会,因为已经分配了内存地址


反过来想为什么把变量放在括号里就不会出现空指针异常呢?


equals()方法也可以比较一个变量是不是等于空,就是 "abc".equals(null); 括号里直接写null都可以了,还怕变量为null吗?


建议使用org.apache.commons.lang包下的StringUtils.equals(String str1, String str2)方法,这是官方给出的工具类


其中利用三元表达式规避了null的问题

public static boolean equals(String str1, String str2)
    {
        return str1 != null ? str1.equals(str2) : str2 == null;
    }
  //忽略大小写进行比较
    public static boolean equalsIgnoreCase(String str1, String str2)
    {
        return str1 != null ? str1.equalsIgnoreCase(str2) : str2 == null;
    }


相关文章
|
18天前
equals方法中变量在前和在后的区别
equals方法中变量在前和在后的区别
|
18天前
|
缓存 Java
equal 和 == 在对象、变量类型下的不同情况
equal 和 == 在对象、变量类型下的不同情况
21 0
|
18天前
|
JavaScript 前端开发
JavaScript基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。
JavaScript基础语法:包括变量声明、数据类型(Number, String, Boolean, Null, Undefined, Symbol, Object)、运算符、流程控制语句(if...else, switch, for, while, do...while)等。
34 0
|
9月前
|
存储 算法 Java
Java 中的 == 运算符、equals 方法和 hashCode 方法
HashMap 中键是不可以重复的,因此它的键就必须是不同的对象,那么这个时候就先用计算速度快的 hashCode 进行比较,若哈希值都不相等,那么这两个对象必然不相等,若是相等的,那么这个就有两种可能出现,一种情况是这两个对象是真的相等,另外一种情况就是出现了罕见的“哈希冲突”现象,那么这个时候就轮到 equals 来进行判断了!在 HashMap 中,键是不可以重复的,也就是说,它们的键都是不相同的,因此就要判断不同对象是否为同一对象。因此,哈希值可以用于判断两个对象是否不等。
74 1
|
11月前
|
存储 JavaScript 前端开发
JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)
JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)
72 0
|
存储 缓存 Java
Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?
Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?
220 0
Java基本类型和包装类什么情况下判断相等(“==“或“equals“)?
|
JavaScript API 开发者
你知道toString()可以获取变量的数据类型吗?
js是弱类型语言,或者说是动态语言,在定义变量时我们可以不提前声明变量的类型,也可以在变量声明后赋予不同类型的值。变量的类型会在程序运行的过程中被确定。对于开发者来说,虽然可以不用频繁的定义不同的数据类型,但是如果是比较复杂的项目,或者接手他人的项目,发现一个变量到处被使用并且赋予不同类型的值,也许头都大了。变量类型的不确定还可能出现运行时报错:`xxx is not a function`,根本原因就是不同的数据类型所具有的方法是不一样的,也许有的大家都有,因此不报错;但是如果是特有的,或者有差异的,不判断变量的类型就直接调用,就有可能出现生产bug。那么应该如何才能获取准确的变量类型呢?
189 0
|
Java API
Java - equals 方法变量和常量位置区别
Java - equals 方法变量和常量位置区别
202 0
Java - equals 方法变量和常量位置区别
|
Java 存储
==运算符和equals()方法的区别
==运算符和equals()方法的区别 Java语言程序中判断两个变量是否相等有两种方式:一是运用==运算符,二是运用equals方法。 1. ==运算符 对于==运算符来说,如果两个变量是基本类型的,并且是数值类型,则只要它们的值相等,就会返回true;然而如果是两个引用类型的变量,则分为两种情.
1531 0
|
Java 算法 Android开发
Object::hashCode的返回值是不是对象的内存地址?
某一天,和小伙伴之间的话题不知怎么转到如何实现Object::hashCode上,于是就有了这篇文章。 有什么好讨论的呢,取对象的内存基址不就挺好的吗?方便又高效。且看下文的讨论 当GC发生时…… JavaDoc中描述了Object::hashCode的三个约束,其中要求对象不变时其hash code就应该不变,Object本身没什么属性可变的,自然hash code也就不会变。
3208 0

热门文章

最新文章