Java初級培訓筆記------容器 (2)

容器的應用:

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中的成員

這裏有一張圖你就明白了

                                      

就是說在這裏==號對比的是 v1v2的值 也就是棧裏邊的這兩個值,很明顯這兩個值是不一樣,然後equals對比的是在堆當中v1,v2的空間中所存儲的stu1對象的地址值,因爲是同一個stu1對象,所以地址也一樣  所以是true

/**

 * 關於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  該對象 並沒有找到



ArrayList跟Vector是基本相同的 ,不過他是線程不安全的,但是效率比Vector要高的多,因爲底層實現的是數組所以查詢比較快就是需要注意他的.toArray()方法,並不是說Vector裏邊沒有,只是ArrayList用的多一點。如下
//將集合轉化爲 object數組
Object[] obj=list.toArray();//新建一個數組接收
//將數字轉化爲字符串
System.out.println(Arrays.toString(obj));//這裏已經重寫了toString方法所以可以直接輸出

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)



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