枚舉
什么是枚舉
枚舉是逐一列舉的意思,枚舉的作用是進行取值的規范和分類。 有限數據的集合,可以使用枚舉表示,比如性別,季節,星期,月份等數據。
定義枚舉的格式:
public enum 枚舉名稱
{ 枚舉
1 ,枚舉
2 ,枚舉
3. . . ;
}
public enum Season { SPRING
, SUMMER
, AUTUMN
, WINTER
;
}
訪問枚舉值:
Season . SPRING
案例:季節枚舉
package com. demo_05 枚舉
; public enum Season { SPRING
, SUMER
, AUTUMN
, WINTER
;
}
package com. demo_05 枚舉
; public class MyCalendar { private int year
; private int mouth
; private int data
; private Season season
; public MyCalendar ( int year
, int mouth
, int data
, Season season
) { this . year
= year
; this . mouth
= mouth
; this . data
= data
; this . season
= season
; } public void show ( ) { System . out
. println ( year
+ "年" + mouth
+ "月" + data
+ "日" + season
) ; }
}
package com. demo_05 枚舉
; public class Demo { public static void main ( String [ ] args
) { MyCalendar m
= new MyCalendar ( 2022 , 07 , 10 , Season . SPRING
) ; m
. show ( ) ; }
}
1. 異常
1.1 異常的概述
Error:嚴重問題,不需要處理 Exception:稱為異常類,它表示程序本身可以處理的問題
RuntimeException:在編譯期是不檢查的,出現問題后,需要我們回來修改代碼 非RuntimeException:編譯期就必須處理的,否則程序不能粉通過編譯,就更不能正常運行了
1.2 JVM的默認處理方案
如果程序出現了問題,我們沒有做任何處理,最終JVM會做默認的處理
把異常的名稱,異常原因及異常出現的位置等信息輸出在了控制臺 程序停止執行
1.3 異常處理try…catch…
try {
} catch (異常類名 變量名)
{
}
程序從try里面的代碼開始執行 出現異常,會自動生成一個異常類對象,該異常對象將被提交給Java運行時系統 當Java運行時系統接收到異常對象時,會到catch中去找匹的異常類,找到后進行異常的處理 執行完畢之后,程序還可以繼續往下執行
package demo_01 ;
public class ExceptionDemo { public static void main ( String [ ] args
) { System . out
. println ( "開始" ) ; method ( ) ; System . out
. println ( "結束" ) ; } public static void method ( ) { int [ ] arr
= { 15 , 22 , 66 , 88 } ; try { System . out
. println ( arr
[ 4 ] ) ; } catch ( ArrayIndexOutOfBoundsException e
) { System . out
. println ( "訪問的索引越界" ) ; e
. printStackTrace ( ) ; } }
}
1.4 Throwable的成員方法
方法名說明 public String getMessage() 返回此throwable的詳細消息字符串 public String toString() 返回此可拋出的簡短描述 public void printStackTrace() 把異常的錯誤信息輸出在控制臺
package demo_01 ;
public class ExceptionDemo { public static void main ( String [ ] args
) { System . out
. println ( "開始" ) ; method ( ) ; System . out
. println ( "結束" ) ; } public static void method ( ) { int [ ] arr
= { 15 , 22 , 66 , 88 } ; try { System . out
. println ( arr
[ 4 ] ) ; } catch ( ArrayIndexOutOfBoundsException e
) { System . out
. println ( e
. toString ( ) ) ; System . out
. println ( "------------" ) ; System . out
. println ( e
. getMessage ( ) ) ; System . out
. println ( "------------" ) ; e
. printStackTrace ( ) ; } }
}
開始
java. lang. ArrayIndexOutOfBoundsException: Index 4 out of bounds
for length
4
-- -- -- -- -- --
Index 4 out of bounds
for length
4
-- -- -- -- -- --
結束
java. lang. ArrayIndexOutOfBoundsException: Index 4 out of bounds
for length
4 at
demo_01. ExceptionDemo. method ( ExceptionDemo . java
: 18 ) at
demo_01. ExceptionDemo. main ( ExceptionDemo . java
: 11 )
1.5 編譯時異常和運行時異常的區別
Java中的異常被分為兩大類:編譯時異常 和運行時異常 ,也被稱為受檢異常 和非受檢異常 所有的RuntimeException類及其子類被稱為運行時異常,其他的異常都是編譯時異常
編譯時異常:必須顯示處理,否則程序就會發生錯誤,無法通過編譯 運行時異常:無需顯示處理,也可以和編譯時異常一樣處理
package demo_01 ; import java. text. ParseException ;
import java. text. SimpleDateFormat ;
import java. util. Date ; public class ExceptionDemo_02 { public static void main ( String [ ] args
) { method ( ) ; method2 ( ) ; } public static void method ( ) { try { String s
= "2022-04-24" ; SimpleDateFormat sdf
= new SimpleDateFormat ( "yyyy-MM-dd" ) ; Date d
= sdf
. parse ( s
) ; System . out
. println ( d
) ; } catch ( ParseException e
) { e
. printStackTrace ( ) ; } } public static void method2 ( ) { try { int [ ] arr
= { 55 , 88 , 99 } ; System . out
. println ( arr
[ 3 ] ) ; } catch ( ArrayIndexOutOfBoundsException e
) { System . out
. println ( "訪問索引越界" ) ; } }
}
1.6 異常處理之throws
雖然我們通過try…catch…可以對異常進行處理,但是并不是所有的情況我們都有權限進行異常的處理 也就是說,有些時候可能出現的異常是我們處理不了的,這個時候該怎么辦呢? 針對這種情況,Java提供了throws的處理方案
throws 異常類名
;
注意:這個格式是跟在方法的括號后面的
編譯時異常必須要進行處理,兩種處理方案:try…catch…或者throws,如果采用throws這種方案,將來誰調用誰處理 運行時異常可以不處理,出現問題后,需要我們回來修改代碼
package demo_01 ; import java. text. ParseException ;
import java. text. SimpleDateFormat ;
import java. util. Date ;
public class ThrowsDemo { public static void main ( String [ ] args
) { System . out
. println ( "開始" ) ; try { method ( ) ; } catch ( ParseException e
) { e
. printStackTrace ( ) ; } System . out
. println ( "結束" ) ; } public static void method ( ) throws ParseException { String s
= "2022-04-24" ; SimpleDateFormat sdf
= new SimpleDateFormat ( "yyyy-MM-dd" ) ; Date d
= sdf
. parse ( s
) ; System . out
. println ( d
) ; }
}
1.7 throw關鍵字
Java中提供了throw關鍵字,可以在程序運行過程中,拋出某種特定的異常。
格式:
throw new 異常類名
( ) ;
產生異常的意義
在方法中,當傳遞的參數有誤,程序沒有運行下去的意義時,可以直接拋出異常,結束方法 告知調用者方法中出現了問題,讓調用者修改代碼邏輯
public class Demo1 { public static void main ( String [ ] args
) { getResule ( 10 , 0 ) ; try { test ( 10 , 0 ) ; } catch ( Exception e
) { e
. printStackTrace ( ) ; } } public static int getResule ( int a
, int b
) { if ( b
!= 0 ) { return a
/ b
; } else { throw new RuntimeException ( "除數不能為0" ) ; } } public static int test ( int a
, int b
) throws Exception { if ( b
!= 0 ) { return a
/ b
; } else { throw new Exception ( "除數不能為0" ) ; } }
1. 8 throws和throw的區別
throwsthrow 用在方法聲明后面,跟的是異常類名 用在方法體內,跟的是異常對象名 表示拋出異常,由該方法的調用者來處理 表示拋出異常,由方法體內的語句處理 表示出現異常的一種可能性,并不一定會發生這些異常 執行throw一定拋出了某種異常
1.9 自定義異常
public class 異常類名
extends Exception {
}
public class ScoreException extends Exception { public ScoreException ( ) { } public ScoreException ( String message
) { super ( message
) ; }
}
package scoreDemo ; public class ScoreException extends Exception { public ScoreException ( ) { } public ScoreException ( String message
) { super ( message
) ; }
}
package scoreDemo ; public class Teacher { public void checkScore ( int score
) throws ScoreException { if ( score
< 0 || score
> 100 ) { throw new ScoreException ( "分數輸入的不正確" ) ; } else { System . out
. println ( "分數正確" ) ; } }
}
package scoreDemo ; import java. util. Scanner ; public class TeacherDemo { public static void main ( String [ ] args
) { Scanner sc
= new Scanner ( System . in
) ; System . out
. print ( "請輸入分數:" ) ; int score
= sc
. nextInt ( ) ; Teacher t
= new Teacher ( ) ; try { t
. checkScore ( score
) ; } catch ( ScoreException e
) { e
. printStackTrace ( ) ; } }
}
請輸入分數:
98
分數正確請輸入分數:
150
scoreDemo. ScoreException: 分數輸入的不正確at
scoreDemo. Teacher. checkScore ( Teacher . java
: 6 ) at
scoreDemo. TeacherDemo. main ( TeacherDemo . java
: 13 )
2.Collection
集合的特點:提供一種存儲空間可變的存儲模型,存儲的數據容量可以隨時發生改變
2.1 集合體系結構
2.2 Collection集合概述和使用
Collection集合概述
是單列集合的頂層接口,它表示一組對象,這些對象也稱為Collection的元素 JDK不提供此接口的任何直接實現,它提供更具體的子接口(如Set和List)實現
創建Collection集合的對象
package collectionDemo_01 ; import java. util. ArrayList ;
import java. util. Collection ; public class CollectionDemo { public static void main ( String [ ] args
) { Collection < String > c
= new ArrayList < String > ( ) ; c
. add ( "張三" ) ; c
. add ( "李四" ) ; c
. add ( "王五" ) ; System . out
. println ( c
) ; }
}
[ 張三
, 李四
, 王五
]
2.3 Collection集合常用方法
方法名說明 boolean add(E e) 添加元素 boolean remove(Object o) 從集合中移除指定的元素 void clear() 清空集合中的元素 boolean contains(Object o) 判斷集合中是否存在指定的元素 boolean isEmpty() 判斷集合是否為空 int size() 集合的長度,也就是集合中元素的個數
2.4 Collection集合的遍歷
Iterator:迭代器,集合的專用遍歷方式
Iterator iterator():返回此集合中元素的迭代器,通過集合的iterator()方法得到 迭代器是通過集合的iterator()方法得到的,所以我們說它是依賴于集合而存在的
Iterator中的常用方法
E next():返回迭代中的下一個元素 boolean hasNext():如果迭代具有更多元素,則返回true
package collectionDemo_01 ; import java. util. ArrayList ;
import java. util. Collection ;
import java. util. Iterator ; public class CollectionDemo { public static void main ( String [ ] args
) { Collection < String > c
= new ArrayList < String > ( ) ; c
. add ( "張三" ) ; c
. add ( "李四" ) ; c
. add ( "王五" ) ; Iterator < String > it
= c
. iterator ( ) ; while ( it
. hasNext ( ) ) { String n
= it
. next ( ) ; System . out
. println ( n
) ; } }
}
張三
李四
王五
2.5 集合的使用步驟
2.6 Collection集合存儲學生對象并遍歷
需求:創建一個存儲學生對象的集合,存儲3個學生對像,使用程序實現在控制臺遍歷該集合
思路: ①定義學生類 ②創建Collection集合對像 ③創建學生對象 ④把學生添加到集合 ⑤遍歷集合(迭代器方式)
package demo_02 ; public class Student { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; }
}
package demo_02 ; import java. util. ArrayList ;
import java. util. Collection ;
import java. util. Iterator ; public class CollectionDemo { public static void main ( String [ ] args
) { Collection < Student > c
= new ArrayList < Student > ( ) ; Student sc1
= new Student ( "張三" , 18 ) ; Student sc2
= new Student ( "李四" , 19 ) ; Student sc3
= new Student ( "王五" , 10 ) ; c
. add ( sc1
) ; c
. add ( sc2
) ; c
. add ( sc3
) ; Iterator < Student > it
= c
. iterator ( ) ; while ( it
. hasNext ( ) ) { Student n
= it
. next ( ) ; System . out
. println ( n
. getName ( ) + ", " + n
. getAge ( ) ) ; } }
}
張三
, 18
李四
, 19
王五
, 10
3. List
3.1 List集合概述和特點
List集合概述:
有序集合(也稱為序列),用戶可以精確控制列表中每個元素的插入位置。用戶可以通過整數索引訪問元素,并搜索列表中的元素 與Set集合不同,列表通常允許重復的元素
List集合特點:
有序:存儲和取出的元素順序一致 可重復:存儲的元素可以重復
package listDemo_03 ; import java. util. ArrayList ;
import java. util. Iterator ;
import java. util. List ; public class ListDemo { public static void main ( String [ ] args
) { List < String > list
= new ArrayList < > ( ) ; list
. add ( "張三" ) ; list
. add ( "李四" ) ; list
. add ( "王五" ) ; list
. add ( "王五" ) ; System . out
. println ( list
) ; Iterator < String > it
= list
. iterator ( ) ; while ( it
. hasNext ( ) ) { String s
= it
. next ( ) ; System . out
. println ( s
) ; } }
}
[ 張三
, 李四
, 王五
, 王五
]
張三
李四
王五
王五
3.2 List集合特有方法
方法名說明 void add(int index,E element) 在此集合中的指定位置插入指定的元素 E remove(int index) 刪除指定索引處的元素,返回被刪除的元素 E set(int index,E element) 修改指定索引處的元素,返回被修改的元素 E get(int index) 返回指定索引處的元素
3.3 list集合存儲學生對象并遍歷
需求:創建一個存儲學生對象的集合,存儲3個學生對像,使用程序實現在控制臺遍歷該集合 思路: ①定義學生類 ②創建List集合對象 ③創建學生對象 ④把學生添加到集合 ⑤遍歷集合(迭代器方式,for循環方式)
package demo_02 ; public class Student { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; }
}
package demo_02 ; import java. util. ArrayList ;
import java. util. Iterator ;
import java. util. List ; public class ListDemo { public static void main ( String [ ] args
) { List < Student > list
= new ArrayList < > ( ) ; Student sc1
= new Student ( "張三" , 18 ) ; Student sc2
= new Student ( "李四" , 19 ) ; Student sc3
= new Student ( "王五" , 10 ) ; list
. add ( sc1
) ; list
. add ( sc2
) ; list
. add ( sc3
) ; Iterator < Student > it
= list
. iterator ( ) ; while ( it
. hasNext ( ) ) { Student n
= it
. next ( ) ; System . out
. println ( n
. getName ( ) + ", " + n
. getAge ( ) ) ; } System . out
. println ( "------------" ) ; for ( int i
= 0 ; i
< list
. size ( ) ; i
++ ) { Student s
= list
. get ( i
) ; System . out
. println ( s
. getName ( ) + ", " + s
. getAge ( ) ) ; } }
}
張三
, 18
李四
, 19
王五
, 10
-- -- -- -- -- --
張三
, 18
李四
, 19
王五
, 10
3.4 Listlterator
Listlterator:列表迭代器
通過List集合的listlterator()方法得到,所以說它是List集合特有的迭代器 用于允許程序員沿任一方向遍歷列表的列表迭代器,在迭代期間修改列表,并獲取巧列表中迭代器的當前位置
Listlterator中的常用方法:
方法名說明 E next() 返回迭代中的下一個元素 boolean hasNext() 如果迭代具有更多元素,則返回true E previous() 返回列表中的上一個元素 boolean hasPrevious() 如果此列表迭代器在相反方向遍歷列表時具有更多元素,則返回true void add(E e) 將指定的元素插入列表
package listDemo_03 ; import java. util. ArrayList ;
import java. util. List ;
import java. util. ListIterator ; public class ListIteratorDemo { public static void main ( String [ ] args
) { List < String > list
= new ArrayList < > ( ) ; list
. add ( "張三" ) ; list
. add ( "李四" ) ; list
. add ( "王五" ) ; ListIterator < String > lit
= list
. listIterator ( ) ; while ( lit
. hasNext ( ) ) { String n
= lit
. next ( ) ; System . out
. println ( n
) ; } System . out
. println ( "----------" ) ; while ( lit
. hasPrevious ( ) ) { String b
= lit
. previous ( ) ; System . out
. println ( b
) ; } }
}
張三
李四
王五
-- -- -- -- --
王五
李四
張三
3.5 增強for循環
增強for:簡化數組和Collection集合的遍歷
實現Iterable接口的類允許其對象成為增強型for語句的目標 它是DKS之后出現的,其內部原理是一個lterator迭代器
增強for的格式:
for ( 元素數據類型變量名
: 數組或者
Collection 集合
) {
}
int [ ] arr
= { 1 , 2 , 3 , 4 , 5 } ;
for ( int i
: arr)
{ System . out
. printIn ( i
)
}
3.6 案例:List集合存儲學生對像用三種方式遍歷
需求:創建一個存儲學生對象的集合,存儲3個學生對像,使用程序實現在控制臺遍歷該集合 思路: ①定義學生類 ②創建List集合對象 ③創建學生對象 ④把學生添加到集合 ⑤遍歷集合 迭代器:集合特有的遍歷方式 普通for:帶有索引的遍歷方式 增強for:最方使的遍歷方式
package demo_02 ; public class Student { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; }
}
package demo_02 ; import java. util. ArrayList ;
import java. util. Iterator ;
import java. util. List ; public class ListDemo { public static void main ( String [ ] args
) { List < Student > list
= new ArrayList < > ( ) ; Student sc1
= new Student ( "張三" , 18 ) ; Student sc2
= new Student ( "李四" , 19 ) ; Student sc3
= new Student ( "王五" , 10 ) ; list
. add ( sc1
) ; list
. add ( sc2
) ; list
. add ( sc3
) ; Iterator < Student > it
= list
. iterator ( ) ; while ( it
. hasNext ( ) ) { Student n
= it
. next ( ) ; System . out
. println ( n
. getName ( ) + ", " + n
. getAge ( ) ) ; } System . out
. println ( "------------" ) ; for ( int i
= 0 ; i
< list
. size ( ) ; i
++ ) { Student s
= list
. get ( i
) ; System . out
. println ( s
. getName ( ) + ", " + s
. getAge ( ) ) ; } System . out
. println ( "------------" ) ; for ( Student sc
: list
) { System . out
. println ( sc
. getName ( ) + ", " + sc
. getAge ( ) ) ; } }
}
張三
, 18
李四
, 19
王五
, 10
-- -- -- -- -- --
張三
, 18
李四
, 19
王五
, 10
-- -- -- -- -- --
張三
, 18
李四
, 19
王五
, 10
3.7 數據結構
數據結構是計算機存儲、組織數據的方式。是指相互之間存在一種或多種特定關系的數據元素的集合 通常情況下,精心選擇的數據結構可以帶來更高的運行或者存儲效率
3.8 常見數據結構之棧
數據進入棧模型的過程稱為:壓/進棧 數據離開棧模型的過程稱為:彈/出棧 棧是一種數據先進后出的模型
3.9 常見數據結構之隊列
數據從后端進入隊列模型的過程稱為:入隊列 數據從前端離開隊列模型的過程稱為:出隊列 隊列是一種數據先進先出的模型
3.10 常見數據結構之數組
數組是一種查詢快,增刪慢的模型 查詢數據通過索引定位,查詢任意數據耗時相同,查詢效率高 刪除數據時,要將原始數據刪除,同時后面每個數據前移,刪除效率低 添加數據時,添加位置后的每個數據后移,再添加元素,添加效率極低
3.11 常見數據結構之鏈表
3.11.1 添加數據
在數據AC之間添加一個數據B,保存在地址54位置
在數據B對應的下一個數據地址指向數據C 在數據A對應的下一個數據地址指向數據B
3.11.2 刪除數據
在數據AC之間添加一個數據B,保存在地址54位置,刪除數據BD之間的數據C
數據B對應的下一個數據地址指向數據D 數據C刪除
3.11.3 鏈表查詢
查詢數據D是否存在,必須從頭(head)開始查詢 查詢第3個數據,必須從頭(head)開始查詢
鏈表是一種增刪快的模型(對比數組) 鏈表是一種查詢慢的模型(對比數組)
3.12 List集合子類特點
List集合常用子類:ArrayList, LinkedList
ArrayList::底層數據結構是數組,查詢快,增刪慢 LinkedList:底層數據結構是鏈表,查詢慢,增刪快
練習:
分別使用ArrayLista和LinkedList完成存儲字符串并遍歷
package myList ; import java. util. ArrayList ;
import java. util. LinkedList ; public class ListDemo { public static void main ( String [ ] args
) { ArrayList < String > array
= new ArrayList < String > ( ) ; array
. add ( "張三" ) ; array
. add ( "李四" ) ; array
. add ( "hello" ) ; for ( String s
: array
) { System . out
. println ( s
) ; } System . out
. println ( "--------------" ) ; LinkedList < String > linkedList
= new LinkedList < String > ( ) ; linkedList
. add ( "hello" ) ; linkedList
. add ( "world" ) ; linkedList
. add ( "java" ) ; for ( String c
: linkedList
) { System . out
. println ( c
) ; } }
}
張三
李四
hello
-- -- -- -- -- -- --
hello
world
java
3.13 案例:ArrayList集合存儲學生對象用三種方式遍歷
需求:創建一個存儲學生對象的集合,存儲3個學生對像,使用程序實現在控制臺遍歷該集合 思路: ①定義學生類 ②創建ArrayList集合對像 ③創建學生對象 ④把學生添加到集合 ⑤遍歷集合 迭代器:集合特有的遍歷方式 普通for:帶有索引的遍歷方式 增強for:最方便的遍歷方式
package demo_02 ; public class Student { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; }
}
package demo_02 ; import java. util. ArrayList ;
import java. util. Iterator ; public class ArrayListDemo { public static void main ( String [ ] args
) { ArrayList < Student > array
= new ArrayList < Student > ( ) ; Student sc1
= new Student ( "張三" , 18 ) ; Student sc2
= new Student ( "李四" , 19 ) ; Student sc3
= new Student ( "王五" , 10 ) ; array
. add ( sc1
) ; array
. add ( sc2
) ; array
. add ( sc3
) ; Iterator < Student > it
= array
. iterator ( ) ; while ( it
. hasNext ( ) ) { Student s
= it
. next ( ) ; System . out
. println ( s
. getName ( ) + ", " + s
. getAge ( ) ) ; } System . out
. println ( "-----------" ) ; for ( int i
= 0 ; i
< array
. size ( ) ; i
++ ) { Student s1
= array
. get ( i
) ; System . out
. println ( s1
. getName ( ) + ", " + s1
. getAge ( ) ) ; } System . out
. println ( "-----------" ) ; for ( Student s2
: array
) { System . out
. println ( s2
. getName ( ) + ", " + s2
. getAge ( ) ) ; } }
}
張三
, 18
李四
, 19
王五
, 10
-- -- -- -- -- -
張三
, 18
李四
, 19
王五
, 10
-- -- -- -- -- -
張三
, 18
李四
, 19
王五
, 10
3.14 LinkedList集合的特有功能
方法名說明 public void addFirst(E e) 在該列表開頭插入指定的元素 public void addLast(E e) 將指定的元素追加到此列表的末尾 public E getFirst() 返回此列表中的第一個元素 public E getLast() 返回此列表中的最后一個元素 public E removeFirst() 從此列表中刪除并返回第一個元素 public E removeLast() 從此列表中刪除并返回最后一個元素
package myList ; import java. util. LinkedList ;
public class LinkdeListDemo { public static void main ( String [ ] args
) { LinkedList < String > linkdeList
= new LinkedList < String > ( ) ; linkdeList
. add ( "hello" ) ; linkdeList
. add ( "world" ) ; linkdeList
. add ( "java" ) ; linkdeList
. addFirst ( "javase" ) ; linkdeList
. addLast ( "javaee" ) ; System . out
. println ( linkdeList
. getFirst ( ) ) ; System . out
. println ( linkdeList
. getLast ( ) ) ; System . out
. println ( linkdeList
. removeFirst ( ) ) ; System . out
. println ( linkdeList
. removeLast ( ) ) ; }
}
javase
javaee
javase
javaee
4. set
4.1 set集合的概述和特點
Set集合特點
不包含重復元素的集合 沒有帶索引的方法,所以不能使用普通for循環遍歷
Set集合練習:
package demo_01 ; import java. util. HashSet ;
import java. util. Set ; public class SetDemo { public static void main ( String [ ] args
) { Set < String > set
= new HashSet < String > ( ) ; set
. add ( "hello" ) ; set
. add ( "java" ) ; set
. add ( "world" ) ; set
. add ( "java" ) ; for ( String s
: set
) { System . out
. println ( s
) ; } }
}
java
world
hello
4.2 哈希值
哈希值 :是JDK根據對象的地址或者字符串或者數字算出來的int類型的數值
Object類中有一個方法可以獲取對象的哈希值
public int hashCode():返回對象的哈希碼值
對象的哈希值特點
同一個對象多次調用hashCode()方法返回的哈希值是相同的 默認情況下,不同對象的哈希值是不同的。而重寫hashCode()方法,可以實現讓不同對象的哈希值相同
package demo_02 ; public class Student { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; }
}
package demo_02 ; public class HashDemo { public static void main ( String [ ] args
) { Student s1
= new Student ( "張三" , 18 ) ; System . out
. println ( s1
. hashCode ( ) ) ; System . out
. println ( s1
. hashCode ( ) ) ; Student s2
= new Student ( "張三" , 18 ) ; System . out
. println ( s2
. hashCode ( ) ) ; System . out
. println ( "-----------" ) ; System . out
. println ( "java" . hashCode ( ) ) ; System . out
. println ( "world" . hashCode ( ) ) ; System . out
. println ( "java" . hashCode ( ) ) ; System . out
. println ( "-----------" ) ; System . out
. println ( "重地" . hashCode ( ) ) ; System . out
. println ( "通話" . hashCode ( ) ) ; }
}
4.3 HashSet:集合概述和特點
HashSet集合特點:
底層數據結構是哈希表 對集合的迭代順序不作任何保證,也就是說不保證存儲和取出的元素順序一致 沒有帶索引的方法,所以不能使用普通for循環遍歷 由于是Set集合,所以是不包含重復元素的集合
HashSet集合練習:
package demo_03 ; import java. util. HashSet ; public class HashSetDemo { public static void main ( String [ ] args
) { HashSet < String > hs
= new HashSet < String > ( ) ; hs
. add ( "hello" ) ; hs
. add ( "world" ) ; hs
. add ( "java" ) ; hs
. add ( "world" ) ; for ( String s
: hs
) { System . out
. println ( s
) ; } }
}
world
java
hello
4.4 常見數據結構之哈希表
哈希表
JDK8之前,底層采用數組+鏈表實現,可以說是一個元素為鏈表的數組 JDK8以后,在長度比較長的時候,底層實現了優化
4.5 案例:HashSet集合存儲學生對像并遍歷
需求:創建一個存儲學生對象的集合,存儲多個學生對象,使用程序實現在控制臺遍歷該集合 要求:學生對象的成員變量值相同,我們就認為是同一個對像 思路: ①定義學生類 ②創建HashSet集合對象 ③創建學生對像 ④把學生添加到集合 ⑤遍歷集合(增強for) ⑥在學生類中重寫兩個方法 hashCode()和equals() 自動生成即可
package demo_03 ; public class Student { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; } @Override public boolean equals ( Object o
) { if ( this == o
) return true ; if ( o
== null || getClass ( ) != o
. getClass ( ) ) return false ; Student student
= ( Student ) o
; if ( age
!= student
. age
) return false ; return name
!= null ? name
. equals ( student
. name
) : student
. name
== null ; } @Override public int hashCode ( ) { int result
= name
!= null ? name
. hashCode ( ) : 0 ; result
= 31 * result
+ age
; return result
; }
}
package demo_03 ; import java. util. HashSet ; public class HashSetStuDemo { public static void main ( String [ ] args
) { HashSet < Student > hs
= new HashSet < Student > ( ) ; Student s1
= new Student ( "張三" , 18 ) ; Student s2
= new Student ( "李四" , 20 ) ; Student s3
= new Student ( "王五" , 19 ) ; Student s4
= new Student ( "李四" , 20 ) ; hs
. add ( s1
) ; hs
. add ( s2
) ; hs
. add ( s3
) ; hs
. add ( s4
) ; for ( Student sc
: hs
) { System . out
. println ( sc
. getName ( ) + ", " + sc
. getAge ( ) ) ; } }
}
王五
, 19
張三
, 18
李四
, 20
4.6 LinkedHashSet:集合概述和特點
LinkedHashSet集合特點
哈希表和鏈表實現的Set接口,具有可預測的迭代次序 由鏈表保證元素有序,也就是說元素的存儲和取出順序是一致的 由哈希表保證元素唯一,也就是說沒有重復的元素
LinkedHashSet:集合練習
package demo_04 ; import java. util. LinkedHashSet ; public class LinkedHashSetDemo { public static void main ( String [ ] args
) { LinkedHashSet < String > linkedHashSet
= new LinkedHashSet < String > ( ) ; linkedHashSet
. add ( "hello" ) ; linkedHashSet
. add ( "world" ) ; linkedHashSet
. add ( "java" ) ; linkedHashSet
. add ( "world" ) ; for ( String s
: linkedHashSet
) { System . out
. println ( s
) ; } }
}
hello
world
java
4.7 TreeSet集合概述和特點
TreeSet:集合特點:
元素有序,這里的順序不是指存儲和取出的順序,而是按照一定的規則進行排序,具體排序方式取決于構造方法
? (1) TreeSet():根據其元素的自然排序進行排序
? (2) TreeSet(Comparator comparator):根據指定的比較器進行排序
沒有帶索引的方法,所以不能使用普通for循環遍歷 由于是Set集合,所以不包含重復元素的集合
TreeSet集合練習:
package demo_05 ; import java. util. TreeSet ; public class TreeSetDemo { public static void main ( String [ ] args
) { TreeSet < Integer > treeSet
= new TreeSet < Integer > ( ) ; treeSet
. add ( 10 ) ; treeSet
. add ( 50 ) ; treeSet
. add ( 30 ) ; treeSet
. add ( 20 ) ; treeSet
. add ( 40 ) ; for ( Integer s
: treeSet
) { System . out
. println ( s
) ; } }
}
10
20
30
40
50
4.8 自然排序Comparable的使用
存儲學生對像并遍歷,創建TreeSet集合使用無參構造方法 要求:按照年齡從小到大排序,年齡相同時,按照姓名的字母順序排序
結論:
用TreeSet集合存儲自定義對像,無參構造方法使用的是自然排序對元素進行排序的 自然排序,就是讓元素所屬的類實現Comparable接口,重寫compareTo(To)方法 重寫方法時,一定要注意排序規則必須按照要求的主要條件和次要條件來寫
package demo_05 ;
public class Student implements Comparable < Student > { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; } @Override public int compareTo ( Student s
) { int num
= this . age
- s
. age
; int num2
= num
== 0 ? this . name
. compareTo ( s
. name
) : num
; return num2
; }
}
package demo_05 ; import java. util. TreeSet ;
public class TreeSetDemo02 { public static void main ( String [ ] args
) { TreeSet < Student > ts
= new TreeSet < Student > ( ) ; Student s1
= new Student ( "xishi" , 18 ) ; Student s2
= new Student ( "wangzhaojun" , 19 ) ; Student s3
= new Student ( "diaochan" , 20 ) ; Student s4
= new Student ( "yangyuhuan" , 16 ) ; Student s5
= new Student ( "chenghanhan" , 20 ) ; ts
. add ( s1
) ; ts
. add ( s2
) ; ts
. add ( s3
) ; ts
. add ( s4
) ; ts
. add ( s5
) ; for ( Student s
: ts
) { System . out
. println ( s
. getName ( ) + ", " + s
. getAge ( ) ) ; } }
}
yangyuhuan
, 16
xishi
, 18
wangzhaojun
, 19
chenghanhan
, 20
diaochan
, 20
4.9 比較器排序Comparator的使用
存儲學生對象并遍歷,創建TreeSet集合使用帶參構造方法 要求:按照年齡從小到大排序,年齡相同時,按姓名的字母順序排序
結論:
用TreeSet集合存儲自定義對象,帶參構造方法使用的是比較器排序對元素進行排序的 比較器排序,就是讓集合構造方法接收Comparator的實現類對象,重寫compare(To1,To2)方法 重寫方法時,一定要注意排序規則必須按照要求的主要條件和次要條件來寫
package demo_06 ; public class Student { private String name
; private int age
; public Student ( ) { } public Student ( String name
, int age
) { this . name
= name
; this . age
= age
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getAge ( ) { return age
; } public void setAge ( int age
) { this . age
= age
; }
}
package demo_06 ; import java. util. Comparator ;
import java. util. TreeSet ;
public class TreeSetDemo { public static void main ( String [ ] args
) { TreeSet < Student > ts
= new TreeSet < Student > ( new Comparator < Student > ( ) { @Override public int compare ( Student o1
, Student o2
) { int num
= o1
. getAge ( ) - o2
. getAge ( ) ; int num2
= num
== 0 ? o1
. getName ( ) . compareTo ( o2
. getName ( ) ) : num
; return num2
; } } ) ; Student s1
= new Student ( "xishi" , 18 ) ; Student s2
= new Student ( "wangzhaojun" , 19 ) ; Student s3
= new Student ( "diaochan" , 20 ) ; Student s4
= new Student ( "yangyuhuan" , 22 ) ; Student s5
= new Student ( "chenghanhan" , 20 ) ; ts
. add ( s1
) ; ts
. add ( s2
) ; ts
. add ( s3
) ; ts
. add ( s4
) ; ts
. add ( s5
) ; for ( Student s
: ts
) { System . out
. println ( s
. getName ( ) + ", " + s
. getAge ( ) ) ; } }
}
xishi
, 18
wangzhaojun
, 19
chenghanhan
, 20
diaochan
, 20
yangyuhuan
, 22
4.10 案例:成績排序
需求:用TreeSet集合存儲多個學生信息(姓名,語文成績,數學成績,并遍歷該集合) 要求:按照總分從高到低出現
思路:
①定義學生類 ②創建TreeSet集合對象,通過比較器排序進行排序 ③創建學生對象 ④把學生對象添加到集合 ⑤遍歷集合
package demo_07 ; public class Student { private String name
; private int chinese
; private int math
; public Student ( ) { } public Student ( String name
, int chinese
, int math
) { this . name
= name
; this . chinese
= chinese
; this . math
= math
; } public String getName ( ) { return name
; } public void setName ( String name
) { this . name
= name
; } public int getChinese ( ) { return chinese
; } public void setChinese ( int chinese
) { this . chinese
= chinese
; } public int getMath ( ) { return math
; } public void setMath ( int math
) { this . math
= math
; } public int sum ( ) { return chinese
+ math
; }
}
package demo_07 ; import java. util. Comparator ;
import java. util. TreeSet ;
public class TreeSetDemo { public static void main ( String [ ] args
) { TreeSet < Student > ts
= new TreeSet < Student > ( new Comparator < Student > ( ) { @Override public int compare ( Student o1
, Student o2
) { int num
= o1
. sum ( ) - o2
. sum ( ) ; int num2
= num
== 0 ? o1
. getName ( ) . compareTo ( o2
. getName ( ) ) : num
; return num2
; } } ) ; Student s1
= new Student ( "張三" , 98 , 99 ) ; Student s2
= new Student ( "李四" , 95 , 95 ) ; Student s3
= new Student ( "王五" , 95 , 99 ) ; Student s4
= new Student ( "小陳" , 98 , 100 ) ; Student s5
= new Student ( "小尚" , 100 , 99 ) ; Student s6
= new Student ( "逸樂" , 95 , 99 ) ; ts
. add ( s1
) ; ts
. add ( s2
) ; ts
. add ( s3
) ; ts
. add ( s4
) ; ts
. add ( s5
) ; ts
. add ( s6
) ; for ( Student s
: ts
) { System . out
. println ( s
. getName ( ) + ", " + s
. getChinese ( ) + ", " + s
. getMath ( ) + ", " + s
. sum ( ) ) ; } }
}
李四
, 95 , 95 , 190
王五
, 95 , 99 , 194
逸樂
, 95 , 99 , 194
張三
, 98 , 99 , 197
小陳
, 98 , 100 , 198
小尚
, 100 , 99 , 199
4.11 案例:不重復的隨機數
需求:編寫一個程序,獲取10個1-20之間的隨機數,要求隨機數不能重復,并在控制臺輸出
思路:
①創建Set集合對象 ②創建隨機數對象 ③判斷集合的長度是不是小于10 是:產生一個隨機數,添加到集合 回到3繼續 ④遍歷集合
package demo_07 ; import java. util. HashSet ;
import java. util. Random ;
import java. util. Set ;
import java. util. TreeSet ; public class SetDemo { public static void main ( String [ ] args
) { Set < Integer > set
= new TreeSet < Integer > ( ) ; Random r
= new Random ( ) ; while ( set
. size ( ) < 10 ) { int num
= r
. nextInt ( 20 ) + 1 ; set
. add ( num
) ; } for ( Integer i
: set
) { System . out
. println ( i
) ; } }
}
更多內容請訪問博主博客:逸樂的博客 - 今晚一起吃火鍋
文章如有紕漏請指出,整理不易多多包涵。
Java后續筆記將持續更新…
總結
以上是生活随笔 為你收集整理的Java笔记 - 黑马程序员_04(枚举,异常,Collection,List,Set) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。