1. 程式人生 > >【Java基礎】Java常見幾組概念的比較(String、StringBuilder、StringBuffer、HashMap、HashTable

【Java基礎】Java常見幾組概念的比較(String、StringBuilder、StringBuffer、HashMap、HashTable

一、String、StringBuilder、StringBuffer的區別

String是字串常量,StringBuffer和StringBuilder是字串變數。

  • StringBuilder 執行緒不安全的字元產變數,一般來說效率高
  • StringBuffer 執行緒安全的字串變數
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() { 
}
}