一、根本区别
“” :空字符串,分配了内存 ,字符串的内容是空(比喻:存在一个杯子,但是杯子里面的内容为空,长度为0)
null :NULL,未分配内存(比喻:杯子都没有,没有长度)
" " :空格串,分配了内存,字符串的内容是一个空格(比喻:存在一个杯子,杯子里面的内容是一个空格,长度为1)
举例如下:
package com.javabase.javabase.nullAndNullString;
import org.junit.Test;
/**
* @Author ShawnYang
* @Date 2019-10-17 9:25
* @Description TODO
* 修改人:
* 修改时间:
* 修改备注:
*/
public class NullAndNullStringTest {
@Test
public void test() {
String str1 = ""; //空字符串 str1.length() 等于 0
String str2 = null; //NULL
String str3 = " "; //空格串,本质上和其他字符串一样,只是这个字符串的内容是空格 str2.length() 等于 1
// 1 str1在堆内存中存在,可以调用indexOf 方法
System.out.println(str1.length());//0
System.out.println(str1.indexOf('d'));// 结果:-1
System.out.println(str1.indexOf(' '));// 结果:-1
// 2 str2在堆内存中不存在,无法调用方法,调用indexOf的时候会报空指针异常
// System.out.println(str2.length());// 结果:NullPointerException
// System.out.println(str2.indexOf('d'));// 结果:NullPointerException
// System.out.println(str2.indexOf(' '));//结果:NullPointerException
// 3 str3 本质上和其他字符串一样,只是这个字符串的内容是空格
System.out.println(str3.length());//1
System.out.println(str3.indexOf('d'));//结果-1
System.out.println(str3.indexOf(' '));//结果0
}
}
由此可见下面的isEmpty 和isBlank的区别
isEmpty的作用:如果str 是null 或者空字符串 判定 该字符串为空, 如果str是空格串,则判定该字符串不为空
isBlank的作用:如果str是null或者空字符串或者空串,判定该字符串为空,否则不为空
/**
* 判断字符串是否为空
*/
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
/**
* 判断字符串是否不为空
*/
public static boolean isNotEmpty(String str) {
return !StringUtils.isEmpty(str);
}
/**
* 判断字符串是否为空
*/
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
/**
* 判断字符串是否不为空
*/
public static boolean isNotBlank(String str) {
return !StringUtils.isBlank(str);
}
二、在java中的使用区别
1 NULL 和空字符串的联合使用
//String的null或空值的判断处理:方法一
String name=null;
if (name == null&&name.equals("")) {
//do something
}
//String的null或空值的判断处理:方法二
//将""写在前头,这样,不管name是否为null,都不会出错。
if (name == null&&"".equals(name)) {
//do something
}
2 空格串的使用区别
要判读String是否为空字符串,比较简单,只要判断该String的length是否为0就可以,或者直接用方法isEmpty()来判断。
但很多时候我们也会把由一些不可见的字符组成的String也当成是空字符串(e.g, space, tab, etc),这时候就不能单用length或isEmpty()来判断了,因为technically上来说,这个String是非空的。这时候可以用String的方法trim(),去掉前导空白和后导空白,再判断是否为空。
如下所示
//注意这里的isEmpty 是String的原生方法,只是return value.length == 0;
if(str3.isEmpty()){
System.out.println("str3 is Empty");
}else{
System.out.println("str3 is not Empty");
}
if(str3.trim().isEmpty()){
System.out.println("str3 is Empty");
}else{
System.out.println("str3 is not Empty");
}
或者用上面的 自定的isEmpty或者isBlank 方法
补充:java中判断字符串为空的四种方法
以下是java 判断字符串是否为空的四种方法
方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null || s.equals(""));
方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法: if(s == null || s.length() == 0);
方法三: Java SE 6.0 才开始提供的方法, 效率和方法二几乎相等, 但出于兼容性考虑, 推荐使用方法二. if(s == null || s.isEmpty());
方法四: 这是一种比较直观,简便的方法,而且效率也非常的高,与方法二、三的效率差不多: if (s == null || s == “”);