今天写了个超垃圾的代码,在后台进行字符串校验时,一不小心使用了!=""对字符串进行校验

问题代码

// 获取前端提交数据
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比较的是两个对象的内容,也是正确的。