容器的應用:
List因爲說他的三個實現類的繼承跟實現是差不多的,所以說明白了一個,再瞭解一下他們不同的地方就行了
Vector的用法,他的底層實現的是數組,並且定義了初始大小爲10,並且他是線程安全的
現在比如說我們定義了一個學生類,封裝了姓名,年齡,性別以及學號四個屬性並提供set,get方法方便獲取,定義了有參和無參兩個構造方法。
建一個測試類提供main方法步驟
建立了學生類的四個對象:
Student stu1=new Student("張三", 18, '男',"20122212001");
Student stu2=new Student("李四", 20, '男',"20122212002");
Student stu3=new Student("王五", 19, '男',"20122212003");
Student stu4=new Student("趙六", 19, '男',"20122212004");
創建一個Vector 集合對象,要想調用裏邊的方法 肯定是要創建對象的
Vector v=new Vector();
既然是容器什麼都可以存 那麼對象肯定也是可以存的所以提供了一個add方法,整個添加的過程是有順序的,依次添加
v.add(stu1);v.add(stu2);v.add(stu3);v.add(stu4);
判斷容器容量是否爲0 返回布爾類型但是並不是判斷是否爲null,只是判斷容器中有沒有成員
System.out.println(v.isEmpty());//false
System.out.println(v.size());//v.size()是表示容器的實際長度 Vector的初始容量爲10 但是這裏的對象數量不夠10 它輸出的是實際的長度4
System.out.println(v.capacity());//v.capacity()表示的是容器的總 容量 ,Vector的初始容量爲10 但是這裏的對象數量不夠10 他依然輸出10
容器的遍歷:
//遍歷方式1
for (int i = 0; i < v.size(); i++) {
Object obj=v.get(i);//i表示下標 與數組類似 但是要通過get方法得到下標爲i的對象,這個過程中 得到的對象默認類型爲Object類型,所以建立一個obj去接收他
Student stu=(Student) obj;//進行向下的強制類型轉換,方便遍歷,方便調用對象中的屬性System.out.println("姓名:"+stu.getName()+"\t"+"年齡:"+stu.getAge()+"\t"+"性別:"+stu.getSex()+"\t"+"學號:"+stu.getSno()+"\t");
}
//遍歷方式2
for (Object obj : v) {//這時候object對象已經創建好 相當於利用數組foreach循環直接去接收v
//進行向下強轉
Student stu=(Student) obj;
System.out.println("姓名:"+stu.getName()+"\t"+"年齡:"+stu.getAge()+"\t"+"性別:"+stu.getSex()+"\t"+"學號:"+stu.getSno()+"\t");
}
Vector v1=new Vector();//建立容器對象 v
v1.add(stu1);
Vector v2=new Vector();//建立容器對象 v2
v2.add(stu1);
//同時將對象stu1存進容器
System.out.println(v1==v2);//false 此時比較的是地址 因爲new 的兩個容器的地址值是不同的
System.out.println(v1.equals(v2));//true 此時比較的是兩個容器中的對象地址 利用equals方法 對比容器中的對象成員的值,因爲他們指向的是同一個stu1,但是並沒有比較stu1中的成員
這裏有一張圖你就明白了
/**
* 關於equals
* 容器中默認的equals方法 是把容器中的成員對象的地址進行比較
* 如果此時容器中有兩個相同的對象 且順序相同 此時equals返回true
* 但是 如果順序不同 返回的是false 這說明 equals方法是按照順序進行對比的
* 當用戶重寫equals方法之後
* 所對比的的是成員對象中的屬性是否相同 而不是對比地址
* 如果此時容器中有兩個相同的對象 且順序相同 此時equals返回true
* 但是 如果順序不同 返回的是false
* */
Vector v3=new Vector();//建立容器對象 v3
Student stu1_1=new Student("張三", 18, '男',"20122212001");//創建新的stu對象但是 內容是跟已經建立好的stu1對象相同的
v3.add(stu1_1);
System.out.println(v2.equals(v3));//false equals比較的是成員地址 因爲 stu1_1是new出來的 所以地址跟原來的地址是不相同的 這時候需要在 student類當中重寫equals方法 使其實現string中的equals的功能,對容器中成員對象中的內容進行比較
//重寫equals方法後
System.out.println(v2.equals(v3));//true
add與set的區別 :
v.add(3, stu1_1);//表示 在 下標爲 3的位置添加對象 數組長度 size加1
System.out.println(v.size());//5
v.set(3, stu4);//表示 將下標爲3的 位置的對象 替換爲stu4 容器 size不變
System.out.println(v.size());//5
remove:
v.remove(3);//將下標爲3的位置上的對象移除 但是 對象在內存中還是存在的 只是不存在於容器中 size-1
contains():
Student stu5=new Student("楊冪", 20, '女', "20122212008");
System.out.println(v.contains(stu1));//true
System.out.println(v.contains(stu1_1));//false 對比的是成員對象的 地址 重寫之後 比較的是對象的成員屬性
System.out.println(v.contains(stu5));//false 該對象 並沒有找到
LinkedList:一定明白一點就是他底層實現的是鏈表
這裏有一張圖
它符合數據結構裏棧的特點,插入遵循先進後出原則,他提供了一個方法叫push也就是壓棧操作,就是一個一個往裏放,但是往外拿的時候肯定是要從上邊往下拿的
LinkedList link=new LinkedList();創建LinkedList的對象
//對鏈表的表頭操作
link.addFirst(stu1);//這裏表示的是對鏈表頭進行操作,每次操作都是將對象壓在原先數據的上邊跟push操作時一樣一樣的
link.addFirst(stu2);link.addFirst(stu3);link.addFirst(stu4);
//對鏈尾操作
link.addLast(stu1);//這裏是對鏈表尾操作,與addFirst相反,每次操作都會將對象插入到鏈表尾成爲最後一個
link.addLast(stu2);link.addLast(stu3);link.addLast(stu4);
LinkedList 的遍歷:
遍歷1:
/**
* 這種遍歷方法如在對列頭進行操作時 每一次往容器裏存儲 都是存到表頭 先進後出
* 每一次取值都是取是取first位置的對象值
* 然後利用remove方法將上一個first位置的數移除
* getlast正好相反
* */
int size=link.size();
for (int i = 0; i <size ; i++) {
System.out.println(link.getFirst());
link.removeFirst();//LinkedList 裏邊還有一個方法叫poll跟removeFirst方法的功能是相同的
}
//遍歷2
for (Object object : link) {
System.out.println(object);
}
因爲他底層實現的雙向鏈表所以刪改查要比ArrayList快,但是他也是線程不安全的。
List講完了 Set在下一篇裏邊說 Java初級培訓筆記------容器 (3)