【Java基礎】Java常見幾組概念的比較(String、StringBuilder、StringBuffer、HashMap、HashTable
阿新 • • 發佈:2019-01-27
一、String、StringBuilder、StringBuffer的區別
String是字串常量,StringBuffer和StringBuilder是字串變數。
- StringBuilder 執行緒不安全的字元產變數,一般來說效率高
- StringBuffer 執行緒安全的字串變數
// StirngBuffer 的方法,同步的,執行緒安全
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
StringBuilder 的部分原始碼//StringBuilder的方法,非同步,執行緒不安全,較高效率
public StringBuilder append(char[] str) {
super.append(str);
return this;
}
在每次對 String 型別進行改變的時候其實都等同於生成了一個新的 String 物件,然後將指標指向新的 String
物件。StringBuilder和StringBuffer每次都對物件本身進行操作。
二、HashMap 和 Hashtable
- HashMap 執行緒不安全,效率高
- Hashtable 執行緒安全
三、抽象類和介面的區別//HashTable原始碼,執行緒安全 public synchronized boolean containsKey(Object key) { Entry<?,?> tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) { if ((e.hash == hash) && e.key.equals(key)) { return true; } } return false; } //HashMap原始碼,執行緒不安全,效率高 public boolean containsKey(Object key) { return getNode(hash(key), key) != null; }
- 1、抽象類單繼承,介面可以多繼承。
- 2、抽象類既能有抽象方法又能有非抽象方法,還能定義一般的屬性;介面只能有抽象方法,介面中定義的屬性全部都是static final修飾的。
abstract class AA{ public int a = 0; //抽象類中的一般屬性 public int play(){ return 0; }//非抽象方法 abstract int say(); //抽象方法 } class BB extends AA{ @Override int say() { return 0; } } interface CC { public final static int a=1; //介面中的屬性 靜態不可修改 void say(); //預設 public abstract 修飾 } class DD implements CC { @Override public void say() { } }