1,String、StringBuffer、StringBuilder的区别
解答:
- String的对象是字符串常量,如果做大量的字符串拼接效率会很低下。因为Java中对String对象进行的操作实际上是一个不断创建新对象并且把旧对象回收的一个过程,虚拟机需要不断的将对象引用指向新的地址。
- 而StringBuffer和StringBuilder的对象是字符串变量,StringBuilder速度比StringBuffer更快。在线程安全上,StringBuffer中很多方法带有synchronized关键字,可以保证线程是安全的;而StringBuilder中的方法没有synchronized关键字,线程是不安全的。
使用场景小结:
- String:适用于少量的字符串操作的情况;
- StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况;
- StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况;
- 一般方法内的私有变量推荐使用StringBuilder,如果是多线程需要同步的话就选用SringBuffer。
2,对参数为做空验证,就做判断值相等
下面的写法将常量放到方法左边,能防止NPE。
解答:
- null的值调用equals方法与其他值做比较的时候,会导致抛出空指针异常。因为null值,并不是一个String对象,自然不能调用String的实例方法equals
- 在源码中如果anobject为空的时候,调用equals方法只会返回false,并不会出现NPE
public boolean equals(Object anObject) {
//首先,先去判断两个对象是否具有相同的地址(是否同一个对象的引用)
if (this == anObject) {
return true;
}
//如果地址不一样,则证明不是引用同一个对象,接下来就是挨个去比较两个字符串对象的内容是否一致
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++]