if(id!=null&&id!="")代码中经常这样写,空字符串跟null 都不用equals吗?
光阴似箭催人老,日月如移越少年。
首先,你的id!=""这种写法是错误的,要写成!id.equals("")。 其次,要明白==与equals的含义id!=""这种写法是错误的,要写成!id.equals("")。 其次,要明白==与equals的含义
id!=""
!id.equals("")
==
equals
==表示两个对象是同一个对象的引用,==null表示这个对象不是任何实例对象的引用,该对象为空。
==null
一直都这么写的,同问,为啥呢?
空字符串其实是要用equals的,否则会出错。null是可以使用!=
下面的代码,结果为false
String d = new String(""); System.out.println(""==d);
所以必须使用equals来判断空字符串,如
public static boolean isEmpty(String str) { return (str == null || "".equals(str)); }
或者使用length来判断并扩展到任何CharSequence,如
public static boolean isEmpty(final CharSequence cs) { return cs == null || cs.length() == 0; }
1.equals()方法存在于Object类中,所有的包装类如Integer,Long等均对该函数进行了重新实现,假如你自己写了一个类在类中使用equals()方法,该方法的效果等同于"==",会判断两个类的对象引用是否相同,而在包装类中equals会判断该对象的内容是否相等。2.如果该判断写为if(id.equals("")&&id!=null),会存在NullPoint的问题,假如id的值为null,你去掉调用equals()方法将会抛出异常。equals()方法存在于Object类中,所有的包装类如Integer,Long等均对该函数进行了重新实现,假如你自己写了一个类在类中使用equals()方法,该方法的效果等同于"==",会判断两个类的对象引用是否相同,而在包装类中equals会判断该对象的内容是否相等。2.如果该判断写为if(id.equals("")&&id!=null),会存在NullPoint的问题,假如id的值为null,你去掉调用equals()方法将会抛出异常。
equals()
Object
Integer
Long
if(id.equals("")&&id!=null)
3.
解释一下以上程序 str1 == str2比较的是两者的引用是否相同,我们声明的字符串会被存放到字符串常量池中,str1时会将abc放入常量池,str3的时候会首先检查常量池中是否有字符串abc有的话就会直接引用。str2因为是直接new了一个新的对象,所以地址肯定与str1的不同。那为什么使用了intern方法之后就相同了呢当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串,则返回池中的字符串,此时并不会去生成新的字符串。因为还是引用了常量池中的字符串所以str2.intern() == str1返回值还是true
str1 == str2
str1
str3
abc
intern
str2.intern() == str1
true
id==null时,表示id这个引用没有指向任何对象,只是一个引用;Java中具体的对象才可以调用方法(这里就是equals())。所以当id==null时调用equals()是会抛出NullPointerException。
id==null
NullPointerException
这代码写错,没用equals比较空串,而且对于空字符串有很多,比如tab,回车之类的都没有check,有n多现成的函数可以用,比如apache commons里面的StingUtils.isBlank方法,Guava的Strings.isNullOrEmpty方法都可以判断null和空白字符串的情况。
还是需要明白 == 与 equals 的区别, ""与 null的区别 ,== 是比较值是否相等 或 引用类型的地址是否相等equals 是比较引用类型地址的值 即内容是否相等
首先,你的
id!=""
这种写法是错误的,要写成!id.equals("")
。其次,要明白
==
与equals
的含义id!=""
这种写法是错误的,要写成!id.equals("")
。其次,要明白
==
与equals
的含义==
表示两个对象是同一个对象的引用,==null
表示这个对象不是任何实例对象的引用,该对象为空。equals
==
表示两个对象是同一个对象的引用,==null
表示这个对象不是任何实例对象的引用,该对象为空。equals
是String类中的方法,表示两个字符串的内容相同。🎜🎜 🎜一直都这么写的,同问,为啥呢?
空字符串其实是要用equals的,否则会出错。null是可以使用!=
下面的代码,结果为false
所以必须使用equals来判断空字符串,如
或者使用length来判断并扩展到任何CharSequence,如
1.
equals()
方法存在于Object
类中,所有的包装类如Integer
,Long
等均对该函数进行了重新实现,假如你自己写了一个类在类中使用equals()方法,该方法的效果等同于"==",会判断两个类的对象引用是否相同,而在包装类中equals
会判断该对象的内容是否相等。2.如果该判断写为
if(id.equals("")&&id!=null)
,会存在NullPoint的问题,假如id的值为null,你去掉调用equals()
方法将会抛出异常。equals()
方法存在于Object
类中,所有的包装类如Integer
,Long
等均对该函数进行了重新实现,假如你自己写了一个类在类中使用equals()方法,该方法的效果等同于"==",会判断两个类的对象引用是否相同,而在包装类中equals
会判断该对象的内容是否相等。2.如果该判断写为
if(id.equals("")&&id!=null)
,会存在NullPoint的问题,假如id的值为null,你去掉调用equals()
方法将会抛出异常。3.
解释一下以上程序
str1 == str2
比较的是两者的引用是否相同,我们声明的字符串会被存放到字符串常量池中,str1
时会将abc放入常量池,str3
的时候会首先检查常量池中是否有字符串abc
有的话就会直接引用。str2因为是直接new了一个新的对象,所以地址肯定与str1的不同。那为什么使用了intern
方法之后就相同了呢当调用
intern
方法时,如果池已经包含一个等于此 String 对象的字符串,则返回池中的字符串,此时并不会去生成新的字符串。因为还是引用了常量池中的字符串所以str2.intern() == str1
返回值还是true
str1 == str2
比较的是两者的引用是否相同,我们声明的字符串会被存放到字符串常量池中,str1
时会将abc放入常量池,str3
的时候会首先检查常量池中是否有字符串abc
有的话就会直接引用。str2因为是直接new了一个新的对象,所以地址肯定与str1的不同。那为什么使用了intern
方法之后就相同了呢当调用
intern
方法时,如果池已经包含一个等于此 String 对象的字符串,则返回池中的字符串,此时并不会去生成新的字符串。因为还是引用了常量池中的字符串所以str2.intern() == str1
返回值还是true
。🎜 🎜以上,就是这些。(●'◡'●)🎜id==null
时,表示id这个引用没有指向任何对象,只是一个引用;Java中具体的对象才可以调用方法(这里就是equals()
)。所以当id==null
时调用equals()
是会抛出NullPointerException
。这代码写错,没用equals比较空串,而且对于空字符串有很多,比如tab,回车之类的都没有check,有n多现成的函数可以用,比如apache commons里面的StingUtils.isBlank方法,Guava的Strings.isNullOrEmpty方法都可以判断null和空白字符串的情况。
还是需要明白 == 与 equals 的区别, ""与 null的区别 ,
== 是比较值是否相等 或 引用类型的地址是否相等
equals 是比较引用类型地址的值 即内容是否相等