【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() { 
}
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章