首先Java中.equals()和==的区别我知道,但我一直以为当字符串为空时,.equals("")和==""是一样的,而且在程序中写也一直没发现问题。如下:
String b="";
System.out.println(b.equals(""));
System.out.println(b=="");
这两结果都是true;
但,在页面中,例如提交一个页面http://localhost:7001/wh.do?rylb=
然后在后台: String b=request.getParameter("rylb");
b=="";
b.equals("");
却一个是false,一个是true;
为什么?
String b="";
System.out.println(b.equals(""));
System.out.println(b=="");
这两结果都是true;
但,在页面中,例如提交一个页面http://localhost:7001/wh.do?rylb=
然后在后台: String b=request.getParameter("rylb");
b=="";
b.equals("");
却一个是false,一个是true;
为什么?
这种情况,b引用的是字符串常量池里的对象。
所以b == "" 是true。String b=request.getParameter("rylb");
得到的是一个新创建的对象,比较引用不相同,正常。
“==”是整个对象都要相等,包括引用
equals是对象里面的值。等待牛人给个比较理论的解释
实质上String 中的equals()的代码如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
如果是""的话 str.equals("")也就相当于 str == "";
.equals("")比对的是指向值的内存地址,也就是对象!
因为request.getParameter("rylb")获取不到值,由于你没有传参数
通常我都是这样写的..
if(b == null || ("").equals(b.trim())) {
...
}
equals():比较两个引用对象所指向的内容是否相等
== 比较地址
用到 request response 就牵连到作用域 所以是比较地址
aString.equals(s) 本质是调用了一个对象的方法,我们通常在这个方法里加上我们判断两个对象是否"相等"的比较逻辑,比如Account类的equals方法比较的可能是id,Person比较的是身份证号等
equals是String自带的方法,两个字符串比较的是内容,即使不是指向同一个对象但内容一样,即返回true!
==是比较内存的地址是否相同
String a = new String("");
当你采用这个方式声明的时候,即便在我们的缓存池里有“”这个字符串了,虚拟机会忽略这个缓存里面的而另外再创建一个
而你这样声明的时候:
String a = "";
它会首先去虚拟机里面的缓存里去寻找是否已经存在"",如果存在了,虚拟机就直接将引用指向那个已存在的那个“”的地址空间推荐你看一下effective java 这本书,里面似乎有对这个问题的讲解。
个人认为楼主用此方法比较两个空字串不妥当,最好先使用String的trim()方法然后再使用equals方法进行比较,其它的 #1 楼已经说得很明白了