org.springframework.util包下的StringUtils.isEmpty()方法对对象判空特别合适。
public static boolean isEmpty(Object str) {
return str == null || "".equals(str);
}
大神们的源码更加合理高效。
在对一些字符串值进行判断时,常用equals方法
String s = "800";
String a = null;
System.out.println("800".equals(s)); //ture
System.out.println(s.equals("800")); //true
System.out.println("800".equals(a)); //false 重要:合理写法
System.out.println(a.equals("800")); // 空指针异常
由此可见,在进行字符串判断时,并不需要,在值判断之前,再对字符串是否为空进行判断,只需要将以常量进行判断,也就是说以常量调用equals方法。字符串是否匹配常量值,而不是常量值是否匹配字符串。
既然这样就再看一下String.equals方法的源码
public boolean equals(Object anObject) {
//返回的是boolean值,传入的是object类型对象
if (this == anObject) {
//首先比较两个对象的内存地址是否一致。
//this是一个对象中隐藏的引用变量,它保存了当前对象的内存地址,指向自身
//this只能使用在实例方法中。谁调用这个实例方法,this就是谁。
//this存储在堆内存当中对象的内部。
return true;
}
if (anObject instanceof String) {
//如果当前对象属于String类型
String anotherString = (String)anObject; //强转
int n = value.length; //value String类中的final字符串数组
//private final char value[];
//当前对象的数组化长度
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++;
}
return true;
}
}
return false;
}
这里又涉及到value的赋值操作,再看一下源码是如何赋值value
public String(String original) {
//String的构造方法
this.value = original.value; //将目标值的value赋值给String的私有字节数组属性value
this.hash = original.hash;
}
//由此可见 String.value;会返回一个字节数组
但是在平常使用时,并没有.value。这里其实传入的就是一个String类型的字符串。
但是这里有一个疑问,String在初始化时,传入的就是一个String对象,这不就意味着一直是循环嵌套?没有结束?是和自动装箱,八大基本对象和封装类有关吗?但是基本类型中字符类型对应的是char,封装类也是Char,并不是String。这里希望有大神能够回答下疑问。
尽管在IDEA中这种写法没有报错,但编译并不能通过,是因为value属性在String中并没有对应的get,set方法。并且属于私有化属性。