首先抛出一个问题,“如何判断字符串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!
你可能会说,你看,字符串内容这不是变了吗?但是,真的变了吗?下面通过内存分配图说明内存字符串内容不可更改的含义,如图:
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去!