Java字符串

String類

String在JVM內存中的存儲java

使用String str1 = "abc";方式建立的字符串存放在常量池中;數組

使用String str2 = new String("abc");方式建立的字符串存放在堆中;此方式更佔內存;安全

String類的hashCode()方法,equals()方法多線程

hashcode()方法是Object類中的方法,默認返回JVM中的32位內存地址;String重寫了hashCode()方法併發

public int hashCode() {
    int h = hash;    //Default to 0 ### String類中的私有變量,
    if (h == 0 && value.length > 0) {    
        //private final char value[]; ### Sting類中保存的字符串內容的的數組
        char val[] = value;

        for (int i = 0; i < value.length; i++) {
            h = 31 * h + val[i];
        }
        hash = h;
    }
    return h;
}

String的比較,==是運算符,比較的是引用變量自己,而不是引用變量指向的對象;app

equals()方法是Object中的方法,默認使用==比較;String類重寫了equals()方法;工具

//一個字符串常量的引用使用equals()方法是自動裝箱
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;//value屬性獲取字符數組
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

String類是不可變類,任何對String的改變都 會引起新的String對象的生成,動態的構建String數據應該用StringBuffere類。性能

String類爲何要設計成不可變:https://my.oschina.net/kailuncen/blog/1483860ui

StringBuffere類與StringBuilder類

  • append()
  • deleteCharAt()
  • insert()
  • reverse()
  • length()

線程安全:this

先說一下集合的故事,HashTable是線程安全的,不少方法都是synchronized方法,而HashMap不是線程安全的,但其在單線程程序中的性能比HashTable要高。StringBuffer和StringBuilder類的區別也是如此,他們的原理和操做基本相同,區別在於StringBufferd支持併發操做,線性安全的,適 合多線程中使用。StringBuilder不支持併發操做,線性不安全的,不適合多線程中使用。新引入的StringBuilder類不是線程安全的,但其在單線程中的性能比StringBuffer高。

經常使用字符串工具類 

/* 對象轉換爲字符串,對象爲null時轉化爲空字符串*/
public static String convertNullToEmpty(Object obj) {
    return obj == null ? "" : String.valueOf(obj);
}

/* 對象轉換爲字符串,避免"null"的出現*/
public static String objectToString(Object obj) {
    return obj == null ? null : obj + "";
}

/* 判斷字符串 是否 爲數字*/
public static boolean isNumeric(String str) {
    Pattern pattern = Pattern.compile("[0-9]*");
    Matcher isNum = pattern.matcher(str);
    if (!isNum.matches()) {
        return false;
    }
    return true;
}

public static boolean isEmpty(String str) {
    if (null == str || "null".equals(str) || "".equals(str))
        return true;
    else {
        return false;
    }
}
相關文章
相關標籤/搜索