今天写了个超垃圾的代码,在后台进行字符串校验时,一不小心使用了!=""
对字符串进行校验
问题代码
// 获取前端提交数据
String username = req.getParameter("username");
// 进行非空判断(这里对字符串使用了!="",拉出去赏200大板)
if (username != null && username!="") {
System.out.println("username有值");
} else {
System.out.println("username字符串是空值");
}
解决后的代码
// 获取前端提交数据
String username = req.getParameter("username");
// 进行非空判断(对字符串使用 !name.equals("")才是正确的做法,千万注意)
if (username != null && !username.equals("")) {
System.out.println("username有值");
} else {
System.out.println("username字符串是空值");
}
在后台对字符串进行非空判断时,使用 “ !=""
” 来进行空字符串校验了,这是千万千万要注意的,被老大先发现,这月绩效就完蛋了。
注意:
在后台进行字符串非空判断时,应该使用username != null && !username.equals("")
,字符串是要用equals进行比较的,而不能使用==
和!=
,这里顺便说下==
和equals的区别
:
==和equals的区别
1、==
-
==是直接比较两个对象在堆内存中的地址,如果相等(true),那么说明这两个对象的引用指向的是一个堆内存地址。
-
但是==在比较8大基本数据类型时,他们直接比较的是值是否相等。这么说也不是很准确,应该说基本数据类型是存放在常量池中的,他们以HashSet策略进行存储,在常量池中,一个常量只会对应一个地址,因此当出现多个值相同的基本数据类型的数据时,他们其实都存储在同一个地址,多个变量的引用指向的是同一个地址。因此对于基本数据类型和String常量,是可以直接使用==直接比较的,值相同那么地址就相同。
2、equals
-
equals 比较的是两个字符串的值,可以这么说,但是应该说也不是很准确
-
equals源码
public boolean equals(Object anObject) { // 使用==比较,如果两个对象的地址一样,直接返回true if (this == anObject) { return true; } // 如果地址不同,判断参数是不是String类型的实例 if (anObject instanceof String) { // 将参数强转成Stringo类型 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++; } // 两个对象的内容完全一致,返回true return true; } } // 如果参数不是String类型的实例,字符串长度不同,对应的字符不同,都会被认为两个字符串不同,返回false return false; }
-
根据equals源码,我们能够看出,
- 它首先比较的就是两个对象的地址,地址相同直接返回true
- 地址不同再去比较字符串的长度和内容
-
那么为什么说equals比较的是两个字符串的内容呢?
- 首先我们都应该知道,所有类的基类都是Object类,而equals方法是属于Object类的
- 然后我们应该知道,equals方法是可以被我们重写的,也就是equals的比较规则是可以被我们左右的
- 最后,地址相同的两个对象,肯定是同一对象,而地址不同的两个对象,如果内容相同我们也可以认为他是同一个对象
- 所以,说equals比较的是两个对象的内容,也是正确的。