這兩者上的主要操作是 append(String x) 和 insert (int n,String x)方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串緩衝區中。append 方法始終將這些字符添加到緩衝區的末端;而 insert 方法則在指定的點添加字符。
2. 兩者區別:StringBuffer是線程安全的,StringBuilder是多線程不安全的
3. String是定長的,這意味着在String裏面做字符串的聯結很耗資源。
4. 如果需要經常進行字符串連接,用StringBuffer,StringBuilder會快很多,但如果一般不需改其值或要對值進很修改,String會更好一些
其中List和Set接口都繼承自Collection接口,而Map接口和他倆不同,不是繼承於Collection接口。
(1)集 Set
集(set)是最簡單的一種集合,它的對象不按特定方式排序,只是簡單的把對象加入集合中,就像往口袋裏放東西。
對集中成員的訪問和操作是通過集中對象的引用進行的,所以集中不能有重複對象。
集也有多種變體,可以實現排序等功能,如TreeSet,它把對象添加到集中的操作將變爲按照某種比較規則將其插入到有序的對象序列中。它實現的是SortedSet接口,也就是加入了對象比較的方法。通過對集中的對象迭代,我們可以得到一個升序的對象集合。
1:HashSet 能夠快速定位一個元素,但是它要求存入HashSet的對象必須實現HashCode方法
2:TreeSet 將放入其中的元素按序存放
(2)列表 List
List接口與其實現類是容量可變的列表,可以按照索引訪問集合中的元素,是有序的集合
列表在數據結構中分別表現爲:數組和向量、鏈表、堆棧、隊列。
1:ArrayList: 實現一個數組,它的規模可變並且能像鏈表一樣被訪問。它提供的功能類似Vector類但不同步,它是以Array方式實現的List,允許快速隨機存取。
2:LinkedList: 實現一個鏈表,提供最佳順序存取,適合插入和移除元素。由這個類定義的鏈表也可以像棧或隊列一樣被使用。
(3)映射 Map
映射與集或列表有明顯區別,映射中每個項都是成對的,Map是把鍵對象和值對象進行關聯的容器。映射中存儲 的每個對象都有一個相關的關鍵字(Key)對象,關鍵字決定了對象在映射中的存儲 位置,檢索對象時必須提供相應的關鍵字,就像在字典中查單詞一樣。關鍵字應該是唯一的,也就是說Map中的鍵對象不允許重複,這是爲了保證查詢結果的一致性。
關鍵字本身並不能決定對象的存儲位置,它需要對過一種散列(hashing)技術來處理,產生一個被稱作散列碼(hash code)的整數值,散列碼通常用作一個偏置量,該偏置量是相對於分配給映射的內存區域起始位置的,由此確定關鍵字/對象對的存儲位置。理想情況下,散列處理應該產生給定範圍內均勻分佈的值,而且每個關鍵字應得到不同的散列碼。
1:HashMap: 實現一個鍵到值映射的哈希表,通過鍵取得值對象,允許存儲空對象,而且允許鍵是空(由於鍵必須是唯一的,當然只能有一個)。
2:HashTable: 實現一個映象,所有的鍵必須非空。爲了能高效的工作,定義鍵的類必須實現hashcode()方法和equal()方法。這個類是前面java實現的一個繼承,並且通常能在實現映象的其他類中更好的使用。Dictionary的子類,缺省是線程同步的。不允許關鍵字或值爲null,當元素的順序很重要時選用TreeMap,當元素不必以特定的順序進行存儲時,使用HashMap.
Hashtable的使用不被推薦,因爲HashMap提供了所有類似的功能,並且速度更快。當你需要在多線程環境下使用時,HashMap也可以轉換爲同步的。
在編寫程序的過程中,使用到集合類,要根據不同的需求,來決定使用哪種集合類,比如,要經常遍歷集合內元素,就要使用List,如果要保證集合中不存在重複的數據,就要用Set;如果要通過某一鍵來查找某一值,就要使用Map
(2)Java的方法重載,就是在類中可以創建多個方法,它們具有相同的名字,但具有不同的參數和不同的定義。調用方法時通過傳遞給它們的不同參數個數和參數類型來決定具體使用哪個方法, 這就是多態性。
(3)重載的時候,方法名要一樣,但是參數類型和個數不一樣,返回值類型可以相同也可以不相同。無法以返回型別作爲重載函數的區分標準
public class Dog {
Dog()
{
this.bark();
}
void bark()//bark()方法是重載方法
{
System.out.println("no barking!");
this.bark("female", 3.4);
}
void bark(String m,double l)//注意:重載的方法的返回值都是一樣的,
{
System.out.println("a barking dog!");
this.bark(5, "China");
}
void bark(int a,String n)//不能以返回值區分重載方法,而只能以“參數類型”和“類名”來區分
{
System.out.println("a howling dog");
}
}
(2) 若子類中的方法與父類中的某一方法具有相同的方法名、返回類型和參數表,則新方法將覆蓋原有的方法。如需父類中原有的方法,可使用super關鍵字,該關鍵字引用了當前類的父類。
(3) 子類函數的訪問修飾權限不能少於父類的;
public class Base
{
void test(int i)
{
System.out.print(i);
}
void test(byte b)
{
System.out.print(b);
}
}
public class TestOverriding extends Base
{
void test(int i)
{
i++;
System.out.println(i);
}
public static void main(String[]agrs)
{
Base b=new TestOverriding();
b.test(0)
b.test((byte)0)
}
}
根據程序上下文環境,Java關鍵字final有“這是無法改變的”或者“終態的”含義,它可以修飾非抽象類、非抽象類成員方法和變量。你可能出於兩種理解而需要阻止改變:設計或效率。
final類不能被繼承,沒有子類,final類中的方法默認是final的。
final方法不能被子類的方法覆蓋,但可以被繼承。
final成員變量表示常量,只能被賦值一次,賦值後值不再改變。
final不能用於修飾構造方法。
二、static
static表示“全局”或者“靜態”的意思,用來修飾成員變量和成員方法,也可以形成靜態static代碼塊,但是Java語言中沒有全局變量的概念。
1、static變量
2、靜態方法
靜態方法可以直接通過類名調用,任何的實例也都可以調用,因此靜態方法中不能用this和super關鍵字,不能直接訪問所屬類的實例變量和實例方法(就是不帶static的成員變量和成員成員方法),只能訪問所屬類的靜態成員變量和成員方法。因爲static方法獨立於任何實例,因此static方法必須被實現,而不能是抽象的abstract。
3、static代碼塊
static代碼塊也叫靜態代碼塊,是在類中獨立於類成員的static語句塊,可以有多個,位置可以隨便放,它不在任何的方法體內,JVM加載類時會執行這些靜態的代碼塊,如果static代碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個代碼塊只會被執行一次。
class Base{
static void a( ){System.out.println("A"); }
void b( ){System.out.println("B"); }
}
public class Inherit extends Base{
static void a( ){System.out.println("C"); }
void b( ){System.out.println("D"); }
public static void main(String args[]){
Base b=new Base();
Base c=new Inherit();
b.a();
b.b();
c.a();
c.b();
}
}
/*
以上輸出的結果是:A
B
A
D
非靜態方法 按重寫規則調用相應的類實現方法,而靜態方法只與類相關。
*/
public √ √ √ √
protected √ √ √ ×
friendly √ √ × ×
private √ × × ×