首先抛出一个问题,“如何判断字符串String为空?”

面对这个问题,很多人首先想到的是用equals( )函数。

但事实真的如此吗?

首先确定几个概念:

1. NULL值:表示数据值未知或不可用,因此地址为NULL

例:String istr = NULL;


2. “” :表示空字符串,是已知且可用
例:String istr = “”;


3. "NULL":  表示字符串NULL,由“N”、“U”、“L”、“L”四个字符构成

例:String istr = “NULL”;

结论: "" != NULL


那在Java中我们该如何比较?

4.在Java中,我们比较字符串内容是否相等用equals( )函数,比较字符串地址用 "=="

上面这句话说的很清楚,equals( )函数判断的是字符串内容

String在Java中是一个类,每一个字符串都对应着自己的地址。

if(str1 == str2){ //do something }

判断的是字符串的地址是否相等

所以,我们判断字符串是否为NULL时,应该用"=="

例:

///String跟NULL比较
if(NULL == str1){ //do something }

///String跟""比较
if("".equals(str1)){//do someting}

///String跟"NULL"比较
if("NULL".equals(str1)){//do someting}



最后一个结论:

5.字符串内容不可改变

在使用String类金星操作时,字符串的内容一旦声明则不可改变。这点听起来有点匪夷所思。例如:

public class strDemo{
    public static void main(String[] args){
        String str = "hello";
        str = str + "world!";
        System.out.println("str = " + str);
}
}



程序运行结果: str = hello world!

你可能会说,你看,字符串内容这不是变了吗?但是,真的变了吗?下面通过内存分配图说明内存字符串内容不可更改的含义,如图:

String swiftUI 判空工具方法 string null判断_Java

str = str + "world!";///改变的是堆内存地址的指向

从上图可以清楚的看到,一个String对象内容的改变实际上是通过内存地址的“断开-链接”变化完成的,而本身字符串中的内容没有任何变化!

所以在平时的开发工作中,我们应该避免下面的行为:

public class strDemo{
    public static void main(String[] args){
        String str = "hello";
        for(int i = 0; i < 100; i++){
        str += i;   ///字符串引用不断改变
        }
        System.out.println(str);
    }
}



以上代码通过循环修改了100次str的内容,这就意味着字符串的指向要“断开-链接”100次,此程序的代码性能可想而知有多低。

当然对于以上的需求在Java中有相应的解决方式,可以用StringBuffer类完成。可能你会问,那StringBuffer类怎么用?

哈哈,自己google去!