一、容器
容器,顧名思義就是用來裝東西的一個東西,稍微官方一點就是用來存儲對象的一個對象。
數組就是一個容器,但是我們在使用數組的時候會發現數組有着它的優勢,也有它的缺點。
數組的優勢:是一種簡單的線性序列,可以快速地訪問數組元素,效率高。如果從效率和類型檢查的角度講,數組是最好的。
數組的劣勢:不靈活。容量需要事先定義好,不能隨着需求的變化而擴容。比如,當你需要存儲一個不清楚大小的數據時,數組就不太好用了。
所有我們就需要一個容量可以隨時根據你所需要的容量來變換的容器來裝載我們的對象,於是我們就要用到容器了。
容器也叫做集合(collection),以下是容器的接口層次圖:
二、泛型
泛型是JDK1.5以後增加的,它可以幫助我們建立類型安全的集合。在使用了泛型的集合中,遍歷時不必進行強制類型轉換。JDK提供了支持泛型的編譯器,將運行時的類型檢查提前到了編譯時執行,提高了代碼可讀性和安全性。
泛型的本質就是“數據類型的參數化”。 我們可以把“泛型”理解爲數據類型的一個佔位符(形式參數),即告訴編譯器,在調用泛型時必須傳入實際類型。
簡單來講,泛型就是在容器上面貼一個標籤,使這個人容器只能裝載標籤上寫的類型的對象。
加泛型前,一個容器可以隨便放什麼類型的對象,就像這樣:
用代碼來說,就是這樣:
public class TestGeneric {
public static void main(String[] args) {
MyCollection col=new MyCollection();
col.set("fkds", 1);
col.set(123, 2);
String a=(String) col.get(1);
Integer b=(Integer) col.get(2);
System.out.println(a);
System.out.println(b);
}
}
class MyCollection{
Object[] objs=new Object[5];
public void set(Object obj,int index) {
objs[index]=obj;
}
public Object get(int index) {
return objs[index];
}
}
輸出結果爲
這裏我們把MyCollection這個容器就設爲數組容器,沒有加泛型,我們發現可以存任何類型的對象,但是我們發現我們取的時候就很麻煩,要定義取的對象的類型
然後我們將泛型加上
然後我們在代碼上也加上泛型
我們發現我們想把其他類型的對象加進我們的容器時,編譯器就報錯了,說明我們定了什麼類的泛型,我們的容器就只能裝載這類的對象,我們把它改過來
public class TestGeneric {
public static void main(String[] args) {
MyCollection<String> col=new MyCollection<>();
col.set("fkds", 1);
col.set("jdggds", 2);
System.out.println(col.get(1));
System.out.println(col.get(2));
}
}
class MyCollection<T>{
Object[] objs=new Object[5];
public void set(T t,int index) {
objs[index]=t;
}
public T get(int index) {
return (T)objs[index];
}
}
運行結果
這裏我們發現,我們取容器中的對象時,不用定義類型,可以直接拿出來用。
當然,這裏我們是爲了解釋才用代碼自己寫了一個MyCollection容器,其實容器相關的類都定義了泛型,他的底層代碼就直接寫好了那些存取過程,我們直接拿過來用就行了,下面我們用list來使用泛型:
public class TestList {
public static void main(String[] args) {
List<String> c=new ArrayList<>();
c.add("fsdaf");//在c容器中加一個對象
System.out.println(c);
}
}
運行結果
list是容器的相關接口,一里面就介紹。
三、Collection接口
Collection 表示一組對象,它是集中、收集的意思。Collection接口的兩個子接口是List、Set接口。
下面是Collection接口中定義的方法:
下面我們來運用一下
public class TestList {
public static void main(String[] args) {
Collection<String> c=new ArrayList<>();
c.add("fsdaf");//在c容器中加一個對象
c.add("ff");
System.out.println(c);
System.out.println(c.size());//c容器中的對象數量
System.out.println(c.contains("ff"));//查詢c容器中是否有“ff”這個對象
Object[] s=c.toArray();//裝出一個s數組,就是把c裏面的對象拿出來,放到s數組中
System.out.println(s);
c.remove("ff");//將"ff"對象從c中移除,就是刪除他存在c中的地址
System.out.println(c);
}
}
運行結果
還有一些其他的方法我們學其他接口時在講。
感謝閱讀
這是我自學Java基礎,在b站看高淇老師的視頻後一些理解,其中有一部分也是引用了老師的東西,如果我的理解有錯誤希望可以提出,一起進步。