集合技術 作業 作業 猜數字游戲 猜數字游戲 /* * 猜數字游戲 */ public class HomeWork1 { public static void main(String[] args) { // 獲取被猜的那個數字,需要使用隨機數類產生 Random r = new Random() ...
集合技術
-
作業
-
猜數字游戲
-
/*
* 猜數字游戲
*/
public class HomeWork1 {
public static void main(String[] args) {
// 獲取被猜的那個數字,需要使用隨機數類產生
Random r = new Random();
// 獲取到1~100之間的一個數字
int number = r.nextInt(100) + 1;
// 創建專門負責鍵盤錄入的那個對象
Scanner sc = new Scanner( System.in );
// 使用死迴圈,完成數字的判斷和重覆輸入功能
while( true ){
// 獲取鍵盤錄入的數字
System.out.println("請輸入您猜的數字(範圍1~100):");
int x = sc.nextInt();
// 判斷當前輸入的數字和被猜的那個數字關係
if( x == number ){
System.out.println("恭喜您,猜中啦!!!");
break;
}else if( x < number ){
System.out.println("您猜小了,請繼續");
}else{
System.out.println("您猜大了,請繼續");
}
}
}
}
-
Collection集合回顧
集合:Collection介面,它是集合的頂層介面。其中定義了集合共性的操作方法。
增:add、addAll
刪除:clear、remove、removeAll、RetainAll
查詢:size
遍歷:iterator,得到一個迭代器對象
判斷:contains、containsAll、isEmpty
迭代器對象:Iterator,它是所有集合共有的迭代對象
- 先要判斷,使用hasNext方法
- 取出元素,使用next方法
細節:
- 一次判斷,最好使用一次next方法
- 在遍歷的時候,不要使用集合自身的增刪方法修改集合。
List介面:
Set介面:
-
List介面
-
List介面特點
-
List介面它是Collection介面的子介面。List介面下的所有集合容器:
- 有序
- 可以重覆
- 有下標
由於List介面下的集合擁有下標,因此List介面擁有自己特有的方法:這些方法都是圍繞下標設計的。
add(int index , Object element )
remove( int index )
get( int index )
set( int index , Object element )
List介面自己的迭代器:
ListIterator:它可以正向或逆向遍歷List集合。同時可以對集合進行增,刪、改、查操作。
-
ArrayList集合
ArrayList:它的底層是可變數組,查詢快,增刪慢,不安全!
-
LinkedList集合
-
LinkedList介紹:
-
LinkedList集合,它也List介面的實現類。和ArrayList相同。都可以去使用List介面中的所有方法。
sun公司給List介面提供多個實現類的目的:
原因是實際開發中,我們需要不同的容器來存儲不同對象。
不同的容器:每個容器都有自己對數據的存儲方式(數據結構)。不同方式結構存儲的數據,它們在性能上差異很大。
LinkedList集合:它的底層是鏈接列表結構(鏈表)。
-
LinkedList數據結構(理解鏈表結構):
鏈表:它主要也是用來存儲數據。存儲數據的每個空間被稱為節點。
節點一般分成2個小空間:一個存儲的節點的地址,一個存儲的真正存放的數據。
-
LinkedList結構演示(編寫代碼測試)
由於LinkedList集合底層是鏈表結構。因此LinkedList集合在List介面之上,有增加了圍繞頭和尾而設計的增、刪、改、查操作。
xxxxFirst 和 xxxxxLast方法
// 刪除方法
public static void demo2() {
/// 創建集合對象
LinkedList list = new LinkedList();
// 添加元素
list.addFirst("aaa");
list.addFirst("bbb");
list.addLast("ccc");
// 刪除方法
Object obj = list.removeFirst();
System.out.println(obj);
System.out.println(list);
}
// 添加方法
public static void demo1() {
/// 創建集合對象
LinkedList list = new LinkedList();
// 添加元素
list.addFirst("aaa");
list.addFirst("bbb");
list.addLast("ccc");
// 遍歷
for( Iterator it = list.iterator() ; it.hasNext() ; ){
System.out.println(it.next());
}
}
-
模擬數據結構
/*
* 由於LinkedList集合它有頭和尾,因此經常使用這個集合模擬其他的數據結構
* 隊列結構:這種結構存儲的數據在容器,最先進入容器的元素,先先出去。
* 簡單介紹:先進先出,後進後出
* 例如:排隊買票。火車過山洞。
*
* 堆棧結構:這種結構存儲的數據在容器,最先進入的最後出去
* 簡單介紹:先進後出,後進先出。
* 例如:彈夾。Java中的棧記憶體。
*/
public static void demo3() {
/// 創建集合對象
LinkedList list = new LinkedList();
// 添加元素
list.addLast("aaa");
list.addLast("bbb");
list.addLast("ccc");
list.addLast("ddd");
list.addLast("eee");
// 模擬隊列結構
System.out.println(list.removeFirst());
System.out.println(list.removeFirst());
System.out.println(list.removeFirst());
System.out.println(list.removeFirst());
System.out.println(list.removeFirst());
/*
* 結論:使用LinkedList模擬隊列結構的時候:
* 添加和刪除的方法調用正好相反。
* 添加使用addLast ,刪除就使用removeFirst
* 添加使用addFirst,刪除就使用removeLast
*
* 模擬堆棧結構:
* 添加使用addLast ,刪除就使用removeLast
* 添加使用addFirst ,刪除就使用removeFirst
*/
}
-
Vector集合
-
Vector集合介紹
-
Vector集合它是JDK1.0時期存在的集合。其功能和ArrayList集合相同。
Vector的底層使用的也是可變數組。Vector集合它增刪、查詢都慢。它的底層是安全的。後期看到Vector集合,就當作ArrayList集合使用。
-
Vector集合演示
// 使用Iterator遍歷
public static void demo1() {
// 創建集合對象
Vector v = new Vector();
// 添加方法
v.addElement("aaa");
v.add("bbb");
v.add("bbb");
v.add("ccc");
// 使用Iterator遍歷
for( Iterator it = v.iterator() ; it.hasNext() ; ){
System.out.println(it.next());
}
}
-
Enumeration介面(知道這個介面作用)
// 使用古老的枚舉迭代器遍歷
public static void demo2() {
// 創建集合對象
Vector v = new Vector();
// 添加方法
v.addElement("aaa");
v.add("bbb");
v.add("bbb");
v.add("ccc");
/*
* 使用Vector中的 elements 方法可以得到一個枚舉迭代器(早期迭代器)
* Enumeration : 它是一個介面,主要用來遍歷集合(Vector)
* Enumeration這個介面被Iterator代替,並且Iterator中有remove方法,
* Iterator中的方法名稱較短。
*/
Enumeration en = v.elements();
while( en.hasMoreElements() ){
System.out.println(en.nextElement());
}
}
-
List介面總結:
List介面:它限定它下麵的所有集合容器擁有下標、可以存放重覆元素、有序。其中定義了圍繞下標而操作的方法。
ArrayList:
底層是可變數組。增刪慢、查詢快。不安全。可以使用null作為元素。
LinkedList:
底層是鏈表結構。增刪快、查詢慢,不安全。可以使用null作為元素。其中定義了圍繞頭和尾的方法,可以模擬 隊列或堆棧數據結構。
Vector:
底層是可變數組,被ArrayList代替。什麼都慢。但安全。可以使用null作為元素
Enumeration:它是古老的迭代器。被Iterator代替。
-
Set介面
-
Set介面介紹
-
前面學習Collection介面的時候,下麵有2個子介面:
List介面:可以保存重覆元素,有下標,有序。
Set介面:可以保存不重覆元素。
註意:Set介面沒有自己特有的方法,所有方法全部來自於Collection介面。
-
HashSet集合(重點)
Set介面下的所有集合容器中保存的元素都不會重覆。
Set介面下有2個重要的集合:
HashSet:
TreeSet:
-
HashSet集合介紹
HashSet:它的底層是哈希表結構支持。它不保證迭代順序(存取),同時它不安全。
-
HashSet演示
/*
* 演示 HashSet集合
*/
public class HashSetDemo {
public static void main(String[] args) {
// 創建集合對象
HashSet set = new HashSet();
// 添加元素
set.add("aaa");
set.add("aaa");
set.add("bbb");
set.add("ccc");
set.add("ccc");
set.add("ddd");
// 使用Iterator遍歷
for( Iterator it = set.iterator() ; it.hasNext() ; ){
System.out.println( it.next() );
}
}
}
-
哈希表介紹(理解哈希表存儲元素方式)
哈希表:它也是一種存儲數據的方式。它的底層使用的依然是數組,只是在存儲元素的時候不按照數組下標從小到大的順序存放。
如果有元素需要給哈希表結構中保存的時候,這時不會直接將元素給表中保存,而是根據當前這個元素自身的一些特點(成員變數等)計算這個元素應該在表中的那個空間中保存。
哈希表存放對象的時候,需要根據當前對象的特定計算對象在表中的存儲位置。任何對象都可以給集合中保存,那麼任何對象肯定可以給HashSet集合中保存。
任何對象在保存的時候,都需要計算存儲位置。任何對都應該具體計算存儲位置的功能,這個功能(方法)定義在Object類中。
我們給任何哈希表中存儲的對象,都會依賴這個對象的hashCode方法計算哈希值,通過哈希值確定對象在表中的存儲位置。
哈希衝突:如果兩個對象調用hahsCode方法之後得到的哈希值相同,稱為哈希衝突。
在給哈希中存放對象的時候,如果存儲哈希衝突,這時就會調用2個對象equals方法計算它們是否相同。如果相同,就丟棄當前正要存放的這個對象,如果不同就會繼續保存。
-
HashSet存放自定義對象(必須書寫代碼測試,理解hashCode和equals方法作用)
自定義對象:不使用JDK中提供的類創建的對象,自己書寫一個,然後創建這個類的對象,最後將其保存在HashSet集合中。
/*
* 演示給HashSet中存放自定義對象
*/
public class HashSetDemo2 {
public static void main(String[] args) {
// 創建集合對象
HashSet set = new HashSet();
// 添加Person對象到集合中
Person p = new Person("zhangsan",12);
set.add(p);
set.add(new Person("lisi",22));
set.add(new Person("lisi",22));
set.add(new Person("wangwu",29));
set.add(new Person("zhaoliu",32));
set.add(new Person("zhaoliu",32));
set.add(new Person("tianqi",35));
// 遍歷
for( Iterator it = set.iterator(); it.hasNext() ; ){
System.out.println(it.next());
}
}
}
/*
* 自定義類
*/
public class Person {
private String name;
private int age;
// alt + shift + S
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {