1
class helloworld {
public static void main (String[] args) {
System.out.println("helloworld!");
}
}
2 命名規(guī)則
標(biāo)識(shí)符起名:不能以數(shù)字開頭,不能是java的關(guān)鍵字,區(qū)分大小寫
標(biāo)識(shí)符組成規(guī)則:英文大小寫,數(shù)字,$和_
包名要求全部小寫,一般是公司的域名倒著寫
例如:com.heima.包的作用
類或接口
如果是一個(gè)單詞,要求首字母大寫,如果是多個(gè)單詞要求每個(gè)單詞首字母大寫(駝峰命名)
DemoStudent
方法和變量
如果是一個(gè)單詞,每個(gè)字母都小寫,如果是多個(gè)單詞,從第二個(gè)單詞開始首字母大寫
getName setName maxValue常量
如果是一個(gè)單詞,所有字母大寫,如果是多個(gè)單詞也是所有字母大寫,但是用_分開
MAX
MAX_VALUE
3 進(jìn)制
- 1byte=8bit 1m=1024k 1g=1024m 1t=1024g
- 0b110 表示二進(jìn)制的110
- 0110 表示八進(jìn)制110
- 0x110 表示十六進(jìn)制的22
- 十進(jìn)制轉(zhuǎn)換任意進(jìn)制:除積倒取余數(shù)
- 二進(jìn)制轉(zhuǎn)八進(jìn)制:每3位劃成一組
- 二進(jìn)制轉(zhuǎn)十六進(jìn)制:每4位劃成一組
- 8421碼二進(jìn)制快速轉(zhuǎn)任意進(jìn)制
4 原碼 反碼 補(bǔ)碼
- 原碼
- 最高位是符號(hào)位,“0”表示正,“1”表示負(fù)
- 反碼
- 正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對(duì)其原碼逐位取反,但符號(hào)位除外。
- 補(bǔ)碼
- 正數(shù)的反碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。
多態(tài)
- 多態(tài)的前提
- 要有繼承或?qū)崿F(xiàn)關(guān)系
- 要有方法的重寫
- 要有父類引用指向子類對(duì)象
- 多態(tài)成員訪問特點(diǎn)
- 成員變量:編譯看父類,運(yùn)行看父類
- 成員方法:編譯看父類,運(yùn)行看子類
- 向上轉(zhuǎn)型
- 父類引用指向子類對(duì)象就是向上轉(zhuǎn)型
- 向下轉(zhuǎn)型
- 格式:子類型 對(duì)象名 = (子類型)父類引用;
- 多態(tài)的好處:提高可擴(kuò)展性
- 多態(tài)的弊端:無法調(diào)用子類特有的方法
抽象類
- 抽象類和抽象方法必須使用abstract修飾
- 抽象類中不一定有抽象方法,有抽象方法的類一定是抽象類
- 抽象類通過子類,采用多態(tài)的形式實(shí)例化(不能直接實(shí)例化)
- 抽象類的子類必須重寫抽象類中的所有抽象方法(抽象類的子類本身是個(gè)抽象類除外)
- 抽象方法定義:public abstract 返回值類型 方法名();
接口
接口就是一種規(guī)范
接口的成員變量默認(rèn)被public static final修飾,是個(gè)常量,可以 接口名.變量名 直接調(diào)用。
接口的成員方法默認(rèn)被 public abstract修飾。
接口沒有構(gòu)造方法。
接口內(nèi)不能有非抽象方法。
接口和抽象類的區(qū)別?
抽象類有局限性,只能繼承一次,唯一的繼承位一定是留給共性抽取的
接口可以實(shí)現(xiàn)任意個(gè),接口可以定義規(guī)范
接口不能直接實(shí)例化。接口如何實(shí)例化呢?
-
參照多態(tài)的方式,通過實(shí)現(xiàn)類對(duì)象實(shí)例化,這叫接口多態(tài)。
【多態(tài)的形式:具體類多態(tài),抽象類多態(tài),接口多態(tài)?!?/p>
接口的子類
要么重寫接口中的所有抽象方法
要么子類也是抽象類
接口和接口關(guān)系是繼承關(guān)系,可以多繼承
內(nèi)部類
內(nèi)部類可分為兩種形式
成員內(nèi)部類
局部內(nèi)部類
內(nèi)部類可以直接訪問外部類的成員,包括私有
外部類要訪問內(nèi)部類的成員,必須創(chuàng)建對(duì)象
匿名內(nèi)部類
前提:存在一個(gè)類或者接口,可以是具體類也可以是抽象類
本質(zhì):是一個(gè)繼承了該類或者實(shí)現(xiàn)了該接口的子類匿名對(duì)象
解釋: 匿名(匿了實(shí)現(xiàn)類的名字) 內(nèi)部類 (這個(gè)類是在main方法內(nèi)的局部內(nèi)部類)
-
匿名內(nèi)部類的格式
格式:new 類名 ( ) { 重寫方法 } new 接口名 ( ) { 重寫方法 }
舉例:
java
new Inter(){
@Override
public void method(){}
} ;
-
匿名內(nèi)部類直接調(diào)用方法
例1
java
interface Inter{
void method();
}class Test{ public static void main(String[] args){ new Inter(){ //這是一個(gè)匿名內(nèi)部類,也是匿名對(duì)象 @Override public void method(){ System.out.println("我是匿名內(nèi)部類"); } }.method(); // 直接調(diào)用方法 } }
例2
java
interface Inter{
void method();
}
class Test{
public static void main(String[] args){
Inter i=new Inter(){ //這是一個(gè)匿名內(nèi)部類,不是匿名對(duì)象
@Override
public void method(){
System.out.println("我是匿名內(nèi)部類");
}
};
i.method(); // 調(diào)用方法
}
}
常用API
- Math()
- Math類的常用方法
| 方法名 方法名 | 說明 |
|---|---|
| public static int abs(int a) | 返回參數(shù)的絕對(duì)值 |
| public static double ceil(double a) | 返回大于或等于參數(shù)的最小double值,等于一個(gè)整數(shù) |
| public static double floor(double a) | 返回小于或等于參數(shù)的最大double值,等于一個(gè)整數(shù) |
| public static int round(float a) | 按照四舍五入返回最接近參數(shù)的int |
| public static int max(int a,int b) | 返回兩個(gè)int值中的較大值 |
| public static int min(int a,int b) | 返回兩個(gè)int值中的較小值 |
| public static double pow (double a,double b) | 返回a的b次冪的值 |
| public static double random() | 返回值為double的正值,[0.0,1.0) |
- System
- System類的常用方法
| 方法名 | 說明 |
| ---------------------------------------- | --------------------------------------------- - |
| public static void exit(int status) | 終止當(dāng)前運(yùn)行的 Java 虛擬機(jī),非零表示異常終止 |
| public static long currentTimeMillis() | 返回當(dāng)前時(shí)間(以毫秒為單位) |
- Object類
- 重寫toString方法的方式
- Alt + Insert 選擇toString
- 在類的空白區(qū)域,右鍵 -> Generate -> 選擇toString
toString方法的作用:
以良好的格式,更方便的展示對(duì)象中的屬性值重寫equals方法的場(chǎng)景
不希望比較對(duì)象的地址值,想要結(jié)合對(duì)象屬性進(jìn)行比較的時(shí)候。重寫equals方法的方式
alt + insert 選擇equals() and hashCode(),IntelliJ Default,一路next,finish即可-
Arrays的常用方法
方法名 說明 public static String toString(int[] a) 返回指定數(shù)組的內(nèi)容的字符串表示形式 public static void sort(int[] a) 按照數(shù)字順序排列指定的數(shù)組
基本包裝類
- Integer 類
- Integer的構(gòu)造方法
| 方法名 | 說明 |
|---|---|
| public Integer(int value) | 根據(jù) int 值創(chuàng)建 Integer 對(duì)象(過時(shí)) |
| public Integer(String s) | 根據(jù) String 值創(chuàng)建 Integer 對(duì)象(過時(shí)) |
| public static Integer valueOf(int i) | 返回表示指定的 int 值的 Integer 實(shí)例 |
| public static Integer valueOf(String s) | 返回一個(gè)保存指定值的 Integer 對(duì)象 String |
int和String類型的相互轉(zhuǎn)換
- int轉(zhuǎn)換為String
- 轉(zhuǎn)換方式
- 方式一:直接在數(shù)字后加一個(gè)空字符串
- 方式二:通過String類靜態(tài)方法valueOf()
- String轉(zhuǎn)換為int
- 轉(zhuǎn)換方式
- 方式一:先將字符串?dāng)?shù)字轉(zhuǎn)成Integer,再調(diào)用intValue()方法
Integer i = Integer.valueOf(s);
int x = i.intValue(); -
方式二:通過Integer靜態(tài)方法parseInt()進(jìn)行轉(zhuǎn)換
int y = Integer.parseInt(s);
- 方式一:先將字符串?dāng)?shù)字轉(zhuǎn)成Integer,再調(diào)用intValue()方法
- StringBuilder類
- 構(gòu)造方法
StringBuilder sb = StringBuilder(); - 常用方法
append(String s) :在字符串后連接字符串s
String toString() :返回字符串結(jié)果
自動(dòng)裝箱和拆箱
-
自動(dòng)裝箱
? 把基本數(shù)據(jù)類型轉(zhuǎn)換為對(duì)應(yīng)的包裝類類型
-
自動(dòng)拆箱
? 把包裝類類型轉(zhuǎn)換為對(duì)應(yīng)的基本數(shù)據(jù)類型
例子:
Integer i = 100; // 自動(dòng)裝箱
i += 200; // i = i + 200; i + 200 自動(dòng)拆箱;i = i + 200; 是自動(dòng)裝箱
時(shí)間、日期類
Date類
-
構(gòu)造方法
方法名 說明 public Date() 分配一個(gè) Date對(duì)象,并初始化,默認(rèn)為創(chuàng)建對(duì)象時(shí)的時(shí)間,精確到毫秒 public Date(long date) 分配一個(gè) Date對(duì)象,并將其初始化為表示從標(biāo)準(zhǔn)基準(zhǔn)時(shí)間起指定的毫秒數(shù) -
常用方法
方法名 說明 public long getTime() 獲取的是日期對(duì)象從1970年1月1日 00:00:00到現(xiàn)在的毫秒值 public void setTime(long time) 設(shè)置時(shí)間,給的是毫秒值 【getTime(long time)和System.currentTimeMillis()類似?!?/p>
SimpleDateFormat類
-
SimpleDateFormat類構(gòu)造方法
方法名 說明 public SimpleDateFormat() 構(gòu)造一個(gè)SimpleDateFormat,使用默認(rèn)模式和日期格式 public SimpleDateFormat(String pattern) 構(gòu)造一個(gè)SimpleDateFormat使用給定的模式和默認(rèn)的日期格式 -
SimpleDateFormat類的常用方法
- 格式化(從Date到String)
- public final String format(Date date):將日期格式化成日期/時(shí)間字符串
- 解析(從String到Date)
- public Date parse(String source):從給定字符串的開始解析文本以生成日期
- 格式化(從Date到String)
-
示例代碼
public class SimpleDateFormatDemo { public static void main(String[] args) throws ParseException { //格式化:從 Date 到 String Date d = new Date(); // SimpleDateFormat sdf = new SimpleDateFormat(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String s = sdf.format(d); System.out.println(s); System.out.println("--------"); //從 String 到 Date String ss = "2048-08-09 11:11:11"; //ParseException SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date dd = sdf2.parse(ss); System.out.println(dd); } }
Calendar類
其日歷字段已使用當(dāng)前日期和時(shí)間初始化:Calendar rightNow = Calendar.getInstance();
Calendar是一個(gè)抽象類,不能直接構(gòu)造,可以用.getInstance() 方法構(gòu)造(多態(tài)的形式)。-
Calendar類常用方法
public int get(int field) 返回給定日歷字段的值
public abstract void add(int field, int amount) 根據(jù)日歷的規(guī)則,將指定的時(shí)間量添加或減去給定的日歷字段
public final void set(int year,int month,int date) 設(shè)置當(dāng)前日歷的年月日
注意:MONTH范圍是0~11,所以實(shí)際月份是MONTH+1
例子
Calendar c = Calendar.getInstance();
int year = c.get(Calendar.YEAR); //Calendar.YEAR =1;.get(1)代表返回年的值。
int month = c.get(Calendar.MONTH)+1; //Calendar.MONTH=2;
int date = c.get(Calendar.DATE); //Calendar.DATE=5;
System.out.println(year + "年" + month + "月" + date + "日");
//需求1:3年前的今天
c.add(Calendar.YEAR,-3);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
//設(shè)置當(dāng)前日歷的年月日
c.set(2050,10,10);
year = c.get(Calendar.YEAR);
month = c.get(Calendar.MONTH) + 1;
date = c.get(Calendar.DATE);
System.out.println(year + "年" + month + "月" + date + "日");
異常
異常的體系
- Throwable
- Error
- Exception
- RuntimeException
- 非RuntimeException
- Error嚴(yán)重問題,不需要處理
- Exception 稱為異常類,它表示程序本身可以處理的問題
- RuntimeException 在編譯器不檢查
- 非RuntimeException 編譯器就必須處理,否則程序不能通過編譯
try-catch方式處理異常
-
定義格式
try { 可能出現(xiàn)異常的代碼; } catch(異常類名 變量名) { 異常的處理代碼; } -
執(zhí)行流程
- 程序從 try 里面的代碼開始執(zhí)行
- 出現(xiàn)異常,就會(huì)跳轉(zhuǎn)到對(duì)應(yīng)的 catch 里面去執(zhí)行
- 執(zhí)行完畢之后,程序還可以繼續(xù)往下執(zhí)行
Throwable成員方法(應(yīng)用)##
-
常用方法
方法名 說明 public String getMessage() 返回此 throwable 的詳細(xì)消息字符串 public String toString() 返回此可拋出的簡短描述 public void printStackTrace() 把異常的錯(cuò)誤信息輸出在控制臺(tái)
throws方式處理異常(應(yīng)用)
- 定義格式
public void 方法() throws 異常類名 {
}
-
注意事項(xiàng)
- 這個(gè)throws格式是跟在方法的括號(hào)后面的
- 編譯時(shí)異常必須要進(jìn)行處理,兩種處理方案:try...catch …或者 throws,如果采用 throws 這種方案,將來誰調(diào)用誰處理
- 運(yùn)行時(shí)異常可以不處理,出現(xiàn)問題后,需要我們回來修改代碼
throws和throw的區(qū)別
- throws
- 用在方法聲明后面,跟的是異常類名
- 表示拋出異常,由該方法的調(diào)用者來處理
- 表示出現(xiàn)異常的一種可能性,并不一定會(huì)發(fā)生這些異常
- throw
- 用在方法體內(nèi),跟的是異常的對(duì)象名
- 表示拋出異常,由方法體內(nèi)的語句處理
- 執(zhí)行throw一定拋出了某種異常
自定義異常(應(yīng)用)
- 例子
- 自定義異常類
public class ScoreException extends Exception {
public ScoreException() {}
public ScoreException(String message) {
super(message);
}
}
-
老師類
public class Teacher { public void checkScore(int score) throws ScoreException { if(score<0 || score>100) { // throw new ScoreException(); throw new ScoreException("你給的分?jǐn)?shù)有誤,分?jǐn)?shù)應(yīng)該在0-100之間"); } else { System.out.println("成績正常"); } } } -
測(cè)試類
public class Demo { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("請(qǐng)輸入分?jǐn)?shù):"); int score = sc.nextInt(); Teacher t = new Teacher(); try { t.checkScore(score); } catch (ScoreException e) { e.printStackTrace(); } } }
Collection集合
集合體系結(jié)構(gòu)
- 集合
- collection(單列)
- list(可重復(fù),有序列)
- ArrayList (查詢快,增刪慢)
- LinkedList (查詢慢,增刪快)
- set (不可重復(fù))
- HashSet (無序)
- LinkedHashSet (有序)
- TreeSet (會(huì)按一定規(guī)則排序)
- HashSet (無序)
- list(可重復(fù),有序列)
- map(雙列)
- HashMap
Collection集合基本使用
-
Collection集合概述
- 是單例集合的頂層接口,它表示一組對(duì)象,這些對(duì)象也稱為Collection的元素
創(chuàng)建Collection集合的對(duì)象
Collection<String> c = new ArrayList<String>();Collection集合的常用方法【應(yīng)用】
| 方法名 | 說明 |
|---|---|
| boolean add(E e) | 添加元素 |
| boolean remove(Object o) | 從集合中移除指定的元素 |
| void clear() | 清空集合中的元素 |
| boolean contains(Object o) | 判斷集合中是否存在指定的元素 |
| boolean isEmpty() | 判斷集合是否為空 |
| int size() | 集合的長度,也就是集合中元素的個(gè)數(shù) |
Collection集合的遍歷
- 迭代器的介紹
- 迭代器,集合的專用遍歷方式
Collection<String> c = new ArrayList<>();
//返回此集合中元素的迭代器,地址指向it
Iterator<String> it = c.iterator();
//用while循環(huán)改進(jìn)元素的判斷和獲取
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
List集合概述和特點(diǎn)
- List集合概述
- 有序集合(也稱為序列),用戶可以精確控制列表中每個(gè)元素的插入位置。用戶可以通過整數(shù)索引訪問元素,并搜索列表中的元素
- 與Set集合不同,列表通常允許重復(fù)的元素
- List集合特點(diǎn)
- 有索引
- 可以存儲(chǔ)重復(fù)元素
- 元素存取有序
List集合的特有方法
| 方法名 | 描述 |
|---|---|
| void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
| E remove(int index) | 刪除指定索引處的元素,返回被刪除的元素 |
| E set(int index,E element) | 修改指定索引處的元素,返回被修改的元素 |
| E get(int index) | 返回指定索引處的元素 |
2.5列表迭代器【應(yīng)用】##
-
ListIterator介紹
- 通過List集合的listIterator()方法得到,所以說它是List集合特有的迭代器
- 用于允許程序員沿任一方向遍歷的列表迭代器,在迭代期間修改列表,并獲取列表中迭代器的當(dāng)前位置
-
示例代碼
public class ListIteratorDemo { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 List<String> list = new ArrayList<String>(); //添加元素 list.add("hello"); list.add("world"); list.add("java"); //獲取列表迭代器 ListIterator<String> lit = list.listIterator(); while (lit.hasNext()) { String s = lit.next(); //用listIterator()方法獲得的列表迭代器在遍歷期間加元素 不會(huì)發(fā)生并發(fā)修改異常。 if(s.equals("world")) { lit.add("javaee"); } } System.out.println(list); } }
增強(qiáng)for循環(huán)
for(String s : list) {
System.out.println(s);
}
List集合子類的特點(diǎn)##
-
ArrayList集合
? 底層是數(shù)組結(jié)構(gòu)實(shí)現(xiàn),查詢快、增刪慢
-
LinkedList集合
? 底層是鏈表結(jié)構(gòu)實(shí)現(xiàn),查詢慢、增刪快
LinkedList集合的特有功能##
-
特有方法
方法名 說明 public void addFirst(E e) 在該列表開頭插入指定的元素 public void addLast(E e) 將指定的元素追加到此列表的末尾 public E getFirst() 返回此列表中的第一個(gè)元素 public E getLast() 返回此列表中的最后一個(gè)元素 public E removeFirst() 從此列表中刪除并返回第一個(gè)元素 public E removeLast() 從此列表中刪除并返回最后一個(gè)元素
Set集合
Set集合概述和特點(diǎn)
- Set集合的特點(diǎn)
- 沒有索引、只能通過迭代器或增強(qiáng)for循環(huán)遍歷
- 不能存儲(chǔ)重復(fù)元素
- HashSet集合特點(diǎn)
- 底層是哈希表
- 儲(chǔ)存無序
- LinkHashSet集合特點(diǎn)
- 儲(chǔ)存有序
//創(chuàng)建集合對(duì)象
Set<String> set = new HashSet<String>();
哈希值
-
哈希值簡介
? 是JDK根據(jù)對(duì)象的地址或者字符串或者數(shù)字算出來的int類型的數(shù)值
-
如何獲取哈希值
? Object類中的public int hashCode():返回對(duì)象的哈希碼值
-
哈希值的特點(diǎn)
- 同一個(gè)對(duì)象多次調(diào)用hashCode()方法返回的哈希值是相同的
- 默認(rèn)情況下,不同對(duì)象的哈希值是不同的。而重寫hashCode()方法,可以實(shí)現(xiàn)讓不同對(duì)象的哈希值相同
HashSet集合保證元素唯一性源碼分析
-
HashSet集合保證元素唯一性的原理
? 1.根據(jù)對(duì)象的哈希值計(jì)算存儲(chǔ)位置
? 如果當(dāng)前位置沒有元素則直接存入
? 如果當(dāng)前位置有元素存在,則進(jìn)入第二步
? 2.當(dāng)前元素的元素和已經(jīng)存在的元素比較哈希值
? 如果哈希值不同,則將當(dāng)前元素進(jìn)行存儲(chǔ)
? 如果哈希值相同,則進(jìn)入第三步
? 3.通過equals()方法比較兩個(gè)元素的內(nèi)容
? 如果內(nèi)容不相同,則將當(dāng)前元素進(jìn)行存儲(chǔ)
? 如果內(nèi)容相同,則不存儲(chǔ)當(dāng)前元素
HashSet集合存儲(chǔ)學(xué)生對(duì)象并遍歷
-
案例需求
- 創(chuàng)建一個(gè)存儲(chǔ)學(xué)生對(duì)象的集合,存儲(chǔ)多個(gè)學(xué)生對(duì)象,使用程序?qū)崿F(xiàn)在控制臺(tái)遍歷該集合
- 要求:學(xué)生對(duì)象的成員變量值相同,我們就認(rèn)為是同一個(gè)對(duì)象
【注意點(diǎn)】:要對(duì)對(duì)象的類的hashCode()和equals()方法重寫,才能保證集合內(nèi)對(duì)象唯一性
-
代碼實(shí)現(xiàn)
-
學(xué)生類
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; } } -
測(cè)試類
public class HashSetDemo02 { public static void main(String[] args) { //創(chuàng)建HashSet集合對(duì)象 HashSet<Student> hs = new HashSet<Student>(); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("林青霞", 30); Student s2 = new Student("張曼玉", 35); Student s3 = new Student("王祖賢", 33); Student s4 = new Student("王祖賢", 33); //把學(xué)生添加到集合 hs.add(s1); hs.add(s2); hs.add(s3); hs.add(s4); //遍歷集合(增強(qiáng)for) for (Student s : hs) { System.out.println(s.getName() + "," + s.getAge()); } } }
-
LinkedHashSet集合概述和特點(diǎn)
-
LinkedHashSet集合特點(diǎn)
- 哈希表和鏈表實(shí)現(xiàn)的Set接口,具有可預(yù)測(cè)的迭代次序
- 由鏈表保證元素有序,也就是說元素的存儲(chǔ)和取出順序是一致的
- 由哈希表保證元素唯一,也就是說沒有重復(fù)的元素
TreeSet集合概述和特點(diǎn)
-
TreeSet集合概述
- 元素有序,可以按照一定的規(guī)則進(jìn)行排序,具體排序方式取決于構(gòu)造方法
- TreeSet():根據(jù)其元素的自然排序進(jìn)行排序
- TreeSet(Comparator comparator) :根據(jù)指定的比較器進(jìn)行排序
- 沒有帶索引的方法,所以不能使用普通for循環(huán)遍歷
- 由于是Set集合,所以不包含重復(fù)元素的集合
- 元素有序,可以按照一定的規(guī)則進(jìn)行排序,具體排序方式取決于構(gòu)造方法
自然排序Comparable的使用
-
案例需求
- 存儲(chǔ)學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用無參構(gòu)造方法
- 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
-
實(shí)現(xiàn)步驟
- 用TreeSet集合存儲(chǔ)自定義對(duì)象,無參構(gòu)造方法使用的是自然排序?qū)υ剡M(jìn)行排序的
- 自然排序,就是讓元素所屬的類實(shí)現(xiàn)Comparable接口,重寫compareTo(T o)方法
- 重寫方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和次要條件來寫
-
代碼實(shí)現(xiàn)
-
學(xué)生類
public class Student implements Comparable<Student> { //繼承Comparable接口,接口帶泛型 private String name; private int age; .... @Override public int compareTo(Student s) { //重寫compareTo方法 /* 如果返回值大于0,括號(hào)內(nèi)對(duì)象放在序列最后一個(gè)對(duì)象后面; 如果返回值等于0,表示對(duì)象重復(fù),則對(duì)象不添加進(jìn)集合; 如果返回值小于0,括號(hào)內(nèi)對(duì)象和序列最后一個(gè)對(duì)象對(duì)換位置; */ int num = this.age - s.age; //this.age在前-->正序; // int num = s.age - this.age; //this.age在后-->倒序; //年齡相同時(shí),按照姓名的字母順序排序 int num2 = num==0?this.name.compareTo(s.name):num; return num2; } } -
測(cè)試類
public class TreeSetDemo02 { public static void main(String[] args) { //創(chuàng)建集合對(duì)象 TreeSet<Student> ts = new TreeSet<Student>(); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("xishi", 29); .... //把學(xué)生添加到集合 ts.add(s1); .... //遍歷集合 for (Student s : ts) { System.out.println(s.getName() + "," + s.getAge()); } } }
-
比較器排序Comparator的使用
-
案例需求
- 存儲(chǔ)學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用帶參構(gòu)造方法
- 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
-
實(shí)現(xiàn)步驟
- 用TreeSet集合存儲(chǔ)自定義對(duì)象,帶參構(gòu)造方法使用的是比較器排序?qū)υ剡M(jìn)行排序的
- 比較器排序,就是讓集合構(gòu)造方法接收Comparator的實(shí)現(xiàn)類對(duì)象,重寫compare(T o1,T o2)方法
- 重寫方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和次要條件來寫
-
代碼實(shí)現(xiàn)
-
學(xué)生類
public class Student { private String name; private int age; .... } -
測(cè)試類
public class TreeSetDemo { public static void main(String[] args) { //創(chuàng)建集合對(duì)象,匿名內(nèi)部類重寫compare方法 TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { //注意,這里重寫compare //this.age - s.age //s1,s2 int num = s1.getAge() - s2.getAge(); int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; //注意,這里調(diào)用的是compareTo()方法 return num2; } }); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("xishi", 29); .... //把學(xué)生添加到集合 ts.add(s1); .... //遍歷集合 for (Student s : ts) { System.out.println(s.getName() + "," + s.getAge()); } } }
-
泛型概述和好處
-
泛型概述
? 是JDK5中引入的特性,它提供了編譯時(shí)類型安全檢測(cè)機(jī)制,該機(jī)制允許在編譯時(shí)檢測(cè)到非法的類型
-
泛型的好處
- 把運(yùn)行時(shí)期的問題提前到了編譯期間
- 避免了強(qiáng)制類型轉(zhuǎn)換
泛型類
-
示例代碼
-
泛型類
public class Generic<T> { private T t; public T getT() { return t; } public void setT(T t) { this.t = t; } } -
測(cè)試類
public class GenericDemo { public static void main(String[] args) { Generic<String> g1 = new Generic<String>(); g1.setT("林青霞"); System.out.println(g1.getT()); Generic<Integer> g2 = new Generic<Integer>(); g2.setT(30); System.out.println(g2.getT()); } }
-
-
示例代碼
-
帶有泛型方法的類
public class Generic { public <T> void show(T t) { System.out.println(t); } }
-
泛型接口
-
示例代碼
-
泛型接口
public interface Generic<T> { void show(T t); }
-
類型通配符
-
類型通配符的作用
? 為了表示各種泛型List的父類,可以使用類型通配符
-
類型通配符的分類
- 類型通配符:<?>
- List<?>:表示元素類型未知的List,它的元素可以匹配任何的類型
- 這種帶通配符的List僅表示它是各種泛型List的父類,并不能把元素添加到其中
- 類型通配符上限:<? extends 類型>
- List<? extends Number>:它表示的類型是Number或者其子類型
- 類型通配符下限:<? super 類型>
- List<? super Number>:它表示的類型是Number或者其父類型
- 類型通配符:<?>
可變參數(shù)
-
可變參數(shù)介紹
? 可變參數(shù)又稱參數(shù)個(gè)數(shù)可變,用作方法的形參出現(xiàn),那么方法參數(shù)個(gè)數(shù)就是可變的了
可變參數(shù)定義格式
修飾符 返回值類型 方法名(數(shù)據(jù)類型… 變量名) { }
public void method(String... s){ } //s是個(gè)數(shù)組
Map集合
Map集合概述和特點(diǎn)【理解】
-
Map集合概述
interface Map<K,V> K:鍵的類型;V:值的類型 -
Map集合的特點(diǎn)
- 鍵值對(duì)映射關(guān)系
- 一個(gè)鍵對(duì)應(yīng)一個(gè)值
- 鍵不能重復(fù),值可以重復(fù)
- 元素存取無序 !!!!!!!!!!!!!!!!!!!!!!
Map集合的基本功能【應(yīng)用】
-
方法介紹
方法名 說明 V put(K key,V value) 添加元素 修改元素 V remove(Object key) 根據(jù)鍵刪除鍵值對(duì)元素 void clear() 移除所有的鍵值對(duì)元素 boolean containsKey(Object key) 判斷集合是否包含指定的鍵 boolean containsValue(Object value) 判斷集合是否包含指定的值 boolean isEmpty() 判斷集合是否為空 int size() 集合的長度,也就是集合中鍵值對(duì)的個(gè)數(shù)
Map集合的獲取功能【應(yīng)用】
-
方法介紹
方法名 說明 V get(Object key) 根據(jù)鍵獲取值 Set<K> keySet() 獲取所有鍵的集合 Collection<V> values() 獲取所有值的集合 Set<Map.Entry<K,V>> entrySet() 獲取所有鍵值對(duì)對(duì)象的集合
Map集合的遍歷(方式1)【應(yīng)用】
-
遍歷思路
- 我們剛才存儲(chǔ)的元素都是成對(duì)出現(xiàn)的,所以我們把Map看成是一個(gè)夫妻對(duì)的集合
- 把所有的丈夫給集中起來
- 遍歷丈夫的集合,獲取到每一個(gè)丈夫
- 根據(jù)丈夫去找對(duì)應(yīng)的妻子
- 我們剛才存儲(chǔ)的元素都是成對(duì)出現(xiàn)的,所以我們把Map看成是一個(gè)夫妻對(duì)的集合
-
步驟分析
- 獲取所有鍵的集合。用keySet()方法實(shí)現(xiàn)
- 遍歷鍵的集合,獲取到每一個(gè)鍵。用增強(qiáng)for實(shí)現(xiàn)
- 根據(jù)鍵去找值。用get(Object key)方法實(shí)現(xiàn)
Map集合的遍歷(方式2)【應(yīng)用】
-
遍歷思路
- 我們剛才存儲(chǔ)的元素都是成對(duì)出現(xiàn)的,所以我們把Map看成是一個(gè)夫妻對(duì)的集合
- 獲取所有結(jié)婚證的集合
- 遍歷結(jié)婚證的集合,得到每一個(gè)結(jié)婚證
- 根據(jù)結(jié)婚證獲取丈夫和妻子
- 我們剛才存儲(chǔ)的元素都是成對(duì)出現(xiàn)的,所以我們把Map看成是一個(gè)夫妻對(duì)的集合
-
步驟分析
- 獲取所有鍵值對(duì)對(duì)象的集合
- Set<Map.Entry<K,V>> entrySet():獲取所有鍵值對(duì)對(duì)象的集合
- 遍歷鍵值對(duì)對(duì)象的集合,得到每一個(gè)鍵值對(duì)對(duì)象
- 用增強(qiáng)for實(shí)現(xiàn),得到每一個(gè)Map.Entry
- 根據(jù)鍵值對(duì)對(duì)象獲取鍵和值
- 用getKey()得到鍵
- 用getValue()得到值
- 獲取所有鍵值對(duì)對(duì)象的集合
集合嵌套之ArrayList嵌套HashMap
-
案例需求
- 創(chuàng)建一個(gè)ArrayList集合,存儲(chǔ)三個(gè)元素,每一個(gè)元素都是HashMap
- 每一個(gè)HashMap的鍵和值都是String,并遍歷。
集合嵌套之HashMap嵌套ArrayList
-
案例需求
- 創(chuàng)建一個(gè)HashMap集合,存儲(chǔ)三個(gè)鍵值對(duì)元素,每一個(gè)鍵值對(duì)元素的鍵是String,值是ArrayList
- 每一個(gè)ArrayList的元素是String,并遍歷。
Collections集合工具類
Collections概述和使用【應(yīng)用】
-
Collections類的作用
? 是針對(duì)集合操作的工具類
-
Collections類常用方法
方法名 說明 public static void sort(List<T> list) 將指定的列表按升序排序 public static void reverse(List<?> list) 反轉(zhuǎn)指定列表中元素的順序 public static void shuffle(List<?> list) 使用默認(rèn)的隨機(jī)源隨機(jī)排列指定的列表
ArrayList集合存儲(chǔ)學(xué)生并排序【應(yīng)用】
-
案例需求
- ArrayList存儲(chǔ)學(xué)生對(duì)象,使用Collections對(duì)ArrayList進(jìn)行排序
- 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
-
代碼實(shí)現(xiàn)
-
測(cè)試類
public class CollectionsDemo02 { public static void main(String[] args) { //創(chuàng)建ArrayList集合對(duì)象 ArrayList<Student> array = new ArrayList<Student>(); //創(chuàng)建學(xué)生對(duì)象 Student s1 = new Student("linqingxia", 30); .... //把學(xué)生添加到集合 array.add(s1); .... //使用Collections對(duì)ArrayList集合排序 //sort(List<T> list, Comparator<? super T> c) Collections.sort(array, new Comparator<Student>() { //傳入array集合和Comparator方法并 //重寫 @Override public int compare(Student s1, Student s2) { //按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序 int num = s1.getAge() - s2.getAge(); int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num; return num2; } }); //遍歷集合 for (Student s : array) { System.out.println(s.getName() + "," + s.getAge()); } } }
-
File類
File類概述和構(gòu)造方法【應(yīng)用】
-
File類介紹
- 它是文件和目錄路徑名的抽象表示
- 文件和目錄是可以通過File封裝成對(duì)象的
- 對(duì)于File而言,其封裝的并不是一個(gè)真正存在的文件,僅僅是一個(gè)路徑名而已。它可以是存在的,也可以是不存在的。將來是要通過具體的操作把這個(gè)路徑的內(nèi)容轉(zhuǎn)換為具體存在的
-
File類的構(gòu)造方法
方法名 說明 File(String pathname) 通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建新的 File實(shí)例 File(String parent, String child) 從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例 File(File parent, String child) 從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例 示例代碼
public class FileDemo01 {
public static void main(String[] args) {
//File(String pathname):通過將給定的路徑名字符串轉(zhuǎn)換為抽象路徑名來創(chuàng)建新的 File實(shí)例。
File f1 = new File("E:\\itcast\\java.txt");
System.out.println(f1);
//File(String parent, String child):從父路徑名字符串和子路徑名字符串創(chuàng)建新的 File實(shí)例。
File f2 = new File("E:\\itcast","java.txt");
System.out.println(f2);
//File(File parent, String child):從父抽象路徑名和子路徑名字符串創(chuàng)建新的 File實(shí)例。
File f3 = new File("E:\\itcast");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
}
}
File類創(chuàng)建功能【應(yīng)用】
-
方法分類
方法名 說明 public boolean createNewFile() 當(dāng)具有該名稱的文件不存在時(shí),創(chuàng)建一個(gè)由該抽象路徑名命名的新空文件 public boolean mkdir() 創(chuàng)建由此抽象路徑名命名的目錄 public boolean mkdirs() 創(chuàng)建由此抽象路徑名命名的目錄,包括任何必需但不存在的父目錄
File類判斷和獲取功能【應(yīng)用】
-
判斷功能
方法名 說明 public boolean isDirectory() 測(cè)試此抽象路徑名表示的File是否為目錄 public boolean isFile() 測(cè)試此抽象路徑名表示的File是否為文件 public boolean exists() 測(cè)試此抽象路徑名表示的File是否存在 -
獲取功能
方法名 說明 public String getAbsolutePath() 返回此抽象路徑名的絕對(duì)路徑名字符串 public String getPath() 將此抽象路徑名轉(zhuǎn)換為路徑名字符串 public String getName() 返回由此抽象路徑名表示的文件或目錄的名稱 public String[] list() 返回此抽象路徑名表示的目錄中的文件和目錄的名稱字符串?dāng)?shù)組 public File[] listFiles() 返回此抽象路徑名表示的目錄中的文件和目錄的File對(duì)象數(shù)組
File類刪除功能【應(yīng)用】
-
方法分類
方法名 說明 public boolean delete() 刪除由此抽象路徑名表示的文件或目錄
-
絕對(duì)路徑和相對(duì)路徑的區(qū)別
- 絕對(duì)路徑:完整的路徑名,不需要任何其他信息就可以定位它所表示的文件。例如:E:\itcast\java.txt
- 相對(duì)路徑:必須使用取自其他路徑名的信息進(jìn)行解釋。例如:myFile\java.txt
遞歸
遞歸【應(yīng)用】
-
遞歸的介紹
- 以編程的角度來看,遞歸指的是方法定義中調(diào)用方法本身的現(xiàn)象
- 把一個(gè)復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解
- 遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算
-
遞歸的基本使用
public class DiGuiDemo { public static void main(String[] args) { //回顧不死神兔問題,求第20個(gè)月兔子的對(duì)數(shù) //每個(gè)月的兔子對(duì)數(shù):1,1,2,3,5,8,... //方法一(普通): int[] arr = new int[20]; arr[0] = 1; arr[1] = 1; for (int i = 2; i < arr.length; i++) { arr[i] = arr[i - 1] + arr[i - 2]; } System.out.println(arr[19]); //方法二(遞歸): System.out.println(f(20)); //調(diào)用下面定義的f()方法 } /* 遞歸解決問題,首先就是要定義一個(gè)方法: 定義一個(gè)方法f(n):表示第n個(gè)月的兔子對(duì)數(shù) 那么,第n-1個(gè)月的兔子對(duì)數(shù)該如何表示呢?f(n-1) 同理,第n-2個(gè)月的兔子對(duì)數(shù)該如何表示呢?f(n-2) StackOverflowError:當(dāng)堆棧溢出發(fā)生時(shí)拋出一個(gè)應(yīng)用程序遞歸太深 */ public static int f(int n) { if(n==1 || n==2) { //設(shè)定遞歸出口 return 1; } else { return f(n - 1) + f(n - 2); } } } -
遞歸的注意事項(xiàng)
- 遞歸一定要有出口。否則內(nèi)存溢出
- 遞歸雖然有出口,但是遞歸的次數(shù)也不宜過多。否則內(nèi)存溢出
遞歸求階乘【應(yīng)用】
-
案例需求
? 用遞歸求5的階乘,并把結(jié)果在控制臺(tái)輸出
-
代碼實(shí)現(xiàn)
public class DiGuiDemo01 { public static void main(String[] args) { //調(diào)用方法 int result = jc(5); //輸出結(jié)果 System.out.println("5的階乘是:" + result); } //定義一個(gè)方法,用于遞歸求階乘,參數(shù)為一個(gè)int類型的變量 public static int jc(int n) { //在方法內(nèi)部判斷該變量的值是否是1 if(n == 1) { //是:返回1 return 1; } else { //不是:返回n*(n-1)! return n*jc(n-1); } } }
遞歸遍歷目錄【應(yīng)用】
-
案例需求
? 給定一個(gè)路徑(E:\itcast),通過遞歸完成遍歷該目錄下所有內(nèi)容,并把所有文件的絕對(duì)路徑輸出在控制臺(tái)
-
代碼實(shí)現(xiàn)
public class DiGuiDemo02 { public static void main(String[] args) { //根據(jù)給定的路徑創(chuàng)建一個(gè)File對(duì)象 // File srcFile = new File("E:\\itcast"); File srcFile = new File("E:\\itheima"); //調(diào)用方法 getAllFilePath(srcFile); } //定義一個(gè)方法,用于獲取給定目錄下的所有內(nèi)容,參數(shù)為第1步創(chuàng)建的File對(duì)象 public static void getAllFilePath(File srcFile) { //獲取給定的File目錄下所有的文件或者目錄的File數(shù)組 File[] fileArray = srcFile.listFiles(); //獲得目錄內(nèi)所有文件夾和文件的File對(duì)象組成的數(shù)組 //遍歷該File數(shù)組,得到每一個(gè)File對(duì)象 if(fileArray != null) { //防止目錄內(nèi)容為null,報(bào)錯(cuò) for(File file : fileArray) { //判斷該File對(duì)象是否是目錄 if(file.isDirectory()) { //是:遞歸調(diào)用 getAllFilePath(file); } else { //不是:獲取絕對(duì)路徑輸出在控制臺(tái) System.out.println(file.getAbsolutePath()); } } } } }