这篇文章主要从==和equals的区别然后延伸到开发中字符串判断是否是空(null)或空字符串("")的讲解。
一、java中操作符"=="的作用:
①在基本数据类型中byte,short,int,long,float,double,boolean,char,"=="的比较是值。
public static void main(String[] args) {
int i=1;
int j=1;
System.out.println(i==j);
}
运行结果:true
②在引用数据类型中,"=="比较的是在堆内存中的地址值。
public static void main(String[] args) {
Man man1 = new Man();
Man man2 = new Man();
System.out.println(man1==man2);
}
运行结果:false
二、java中equals的作用
①在引用数据类型中比较的是堆内存中的地址值。
public static void main(String[] args) {
Man man1 = new Man();
Man man2 = new Man();
System.out.println(man1.equals(man2));
}
运行结果:false
不过一般在使用equals比较时,都会对equals进行重写,这样它比较的就不是对象在堆内存中的地址值啦。
三、String类中的==和equals的作用,这里会有点不一样
①==还是进行地址比较
public static void main(String[] args) {
String s1 = new String("dada");
String s2 = new String("dada");
System.out.println(s1==s2);//false
String s3="dada";
String s4="dada";
System.out.println(s3==s4);//true
}
s1==s2还是false,这说明的确比较的是堆内存中的地址值,s3==s4是true他也是比的堆内存中的地址,只是字符串有个字符串池的概念,字符串池中"abc"只有一个abc,他们的地址一样,所以s3==s4的结果是true。
②由于字符串中的equals方法被重写啦,所以比较的是两个字符串的内容
public static void main(String[] args) {
String s1 = new String("dada");
String s2 = new String("dada");
System.out.println(s1.equals(s2));
}
运行结果:true
四、如何判断字符串是否为空(null)或者是空字符串("")的方法
①在判断之前先要理解一个知识点:null和""的区别
null表示这个字符串没有任何指向,因为null没有分配空间,而""在堆中分配了空间。
②java判断字符串的四种方法
方法1:if(s==null || s.equals("")){逻辑...} 这种效率低
方法2:if(s==null || s.length()==0){逻辑...} 效率比方法一的效率高
方法3:if(s==null || s.isEmpty() ){逻辑...}效率和方法二差不多,但是Strng的isEmpty()方法是1.6以上才生效
得到这样效率快慢结论的依据:
我们分别看下这三个方法的源码:
s.equals("")
public boolean equals(Object anObject) {
if (this == anObject) {//比较地址
return true;
}
if (anObject instanceof String) {//判断是否是字符串类型
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {//比较长度
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])//每个字符都得相同
return false;
i++;
}
return true;
}
}
return false;
}
s.length()==0
public int length() {
return value.length;
}
s.isEmpty()
public boolean isEmpty() {
return value.length == 0;
}
我们可以看出来,方法二和方法一比较的方法,都是比较长度是否==0,所以理论上效率应该基本一致,而方法一在比较字符串的时候则明显要比方法二和方法三复杂,所以方法一理论上效率要慢些。
方法4:通过StringUtils判断是否为空(优先推荐使用org.apache.commons.lang包下的StringUtils来判断,原因是:用StringUtils可以避免空指针问题)
例如 String dada=null;
然后在下面进行if(dada.equals("")),如果dada没有初始化,则会报空指针的错误,提示dada不能为空,但是我们在用stringutils时可以避免这个问题。
①StringUtils.isEmpty判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0
StringUtils.isEmpty(null) = true
StringUtils.isEmpty("") = true
StringUtils.isEmpty(" ") = false //注意在 StringUtils 中空格作非空处理
②StringUtils.isBlank判断某字符串是否为空,为空的标准是str==null 或 str.length()==0或由空白符(whitespace) 构成
StringUtils.isBlank(null) = true
StringUtils.isBlank("") = true
StringUtils.isBlank(" ") = true
-------------------------------------------------------------华丽的分割线------------------------------------------------------------------------------------------
错误的判断方法:
if(s==null || s=="" ){逻辑...} ----------------但这种方法是不太正确的,因为操作运算符==实质还是比较堆内存中的地址,只不过String dada="";的这样的方式创建字符串,dada=="";的结果就是true,但是如果以下面的方式创建就是false.。
public static void main(String[] args) {
String s=new String("");
System.out.println(s=="");
}
所以在判断字符串的内容是否等于""时用equals
参考文章:
https://www.cnblogs.com/yaya-yaya/p/6096539.html
https://blog.csdn.net/weixin_41404773/article/details/79558355
我是阿达,一名喜欢分享知识的程序员,时不时的也会荒腔走板的聊一聊电影、电视剧、音乐、漫画,这里已经有16位小伙伴在等你们啦,感兴趣的就赶紧来点击关注我把,哪里不明白或有不同观点的地方欢迎留言。