Set/Map/異常處理
學(xué)習(xí)目的
set和map跟前期學(xué)習(xí)的list的目的一樣寡具,學(xué)習(xí)他的主要方法可以方便后面的學(xué)習(xí)战秋,提高效率百侧。異常以及錯(cuò)誤時(shí)我們?cè)谇么a的時(shí)候最害怕的介却,當(dāng)看到他們時(shí)谴供,就感覺前功盡棄了,所以學(xué)習(xí)異常處理齿坷,讓我們懂得及時(shí)處理一些麻煩桂肌,以免對(duì)項(xiàng)目產(chǎn)生畏懼感。
知識(shí)點(diǎn)
- Set/Map
- HashSet
- TreeSet
- compareTo
- HashMap
- 鍵值對(duì)的遍歷
- 異常處理
解析
Set/Map
1.1 集合里面對(duì)象不能重復(fù)永淌, 如果重復(fù)加不進(jìn)去崎场,內(nèi)部使用HashMap來實(shí)現(xiàn) 鍵值對(duì) 鍵key不能重復(fù)。
1.2 集合是無序的 遂蛀,添加的順序和存儲(chǔ)的順序無關(guān)谭跨。
其使用了默認(rèn)排序:哈希算法(Hash)
1.3 如何實(shí)現(xiàn)HashMap里面key不相同
計(jì)算這個(gè)key對(duì)應(yīng)的對(duì)象的hash值。
如:整數(shù):在對(duì)象的地址的基礎(chǔ)上按照一定的算法計(jì)算出來的一個(gè)整數(shù)李滴。
如果兩個(gè)對(duì)象相同 那么計(jì)算出來的hash值就相同螃宙。HashSet
HashSet<String> names = new HashSet<>();
names.add("jack");
names.add("merry");
names.add("abc");
names.removeIf(ele -> {
return ele.compareTo("c") > 0;
});
- TreeSet(可以排序的集合)
TreeSet<Person> score = new TreeSet<>();
Person p1 = new Person("jack",20);
Person p2 = new Person("jack",30);
Person p3 = new Person("rose",20);
score.add(p1);
score.add(p2);
score.add(p3);
equals :比較的是對(duì)象內(nèi)部的內(nèi)容
- compareTo
使用的兩個(gè)對(duì)象必須實(shí)現(xiàn)Comparable接口的compareTo方法
在compareTo里面實(shí)現(xiàn)具體該如何比較:
System.out.println(p1==p2);
}
}
class Person implements Comparable{
String name;
int age;
public Person(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
//1. 判斷o對(duì)象是不是peron的一個(gè)對(duì)象
if (o instanceof Person){
Person o1 = (Person)o;
//自己規(guī)定比較的策略
if (this.age != o1.age){
return this.age - o1.age;
}else{
//年齡相同的情況下 再比姓名的字母
return this.name.compareTo(o1.name);
}
}else{
return -1;
}
}
- HashMap 集合
- 存儲(chǔ)數(shù)據(jù)的特點(diǎn):鍵key-值value
key不能重復(fù) 可以是任意的對(duì)象類型 通常使用字符串String。
HashMap<String,Integer> score = new HashMap<>();
- 方法:
方法 | 用途 | 實(shí)例 |
---|---|---|
put | 添加對(duì)象所坯,鍵值對(duì) | score.put("Chinese",89); |
size | 獲取鍵值對(duì)的個(gè)數(shù) | score.size(); |
keySet | 獲取所有的key | System.out.println(score.keySet()); |
values | 獲取所有的value | System.out.println(score.values()); |
entrySet | 獲取Entry:key-value | System.out.println(score.entrySet()); |
get | 獲取一個(gè)鍵key對(duì)應(yīng)的值 | System.out.println(score.get("English")); |
- 鍵值對(duì)的遍歷
6.1 通過遍歷key來得到每一個(gè)key對(duì)應(yīng)的值
for (String key: score.keySet()){
//通過key得到值
int s = score.get(key);
System.out.println("key:"+key+" value:"+s);
}
6.2 通過EntrySet 得到Entry對(duì)象的集合
// 一個(gè)Entry管理一個(gè)鍵值對(duì) getKey getValue
Set<Map.Entry<String, Integer>> entrys = score.entrySet();
for (Map.Entry entry: entrys){
//得到Entry對(duì)應(yīng)的key
String key = (String)entry.getKey();
//獲取Entry對(duì)應(yīng)的值
Integer value = (Integer)entry.getValue();
System.out.println("key:"+key+" value:"+value);
}
- 異常處理
處理運(yùn)行過程中出現(xiàn)的不可控的錯(cuò)誤(錯(cuò)誤:error谆扎,區(qū)別)
方法:
- try{
執(zhí)行的代碼
可能出現(xiàn)異常
一旦出現(xiàn)異常 系統(tǒng)自動(dòng)為我們創(chuàng)建一個(gè)異常對(duì)象 并拋出
}catch(NullPointerException e){
如果需要自己處理異常就catch
}catch(Exception e){
如果有多個(gè)異常 可以使用多個(gè)catch來捕獲
如果有多個(gè)異常 catch的順序是從小到大
}finally{
不管有沒有異常finally都會(huì)被執(zhí)行
處理資源回收 如網(wǎng)絡(luò)連接 數(shù)據(jù)庫(kù)連接 I/O流
}
public static void main(String[] args) {
int a=0;
int b=20;
FileReader fr=null;
try{
int c=b/a;
//它異常之后后面的代碼將不會(huì)運(yùn)行
//System.out.println("hello");
FileReader f=new FileReader("");
}catch(ArithmeticException e){
System.out.println(e.getMessage());
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
fr.close();
} catch (IOException e) {
}
注意:如果異常出現(xiàn)后面的代碼將不會(huì)出現(xiàn),try代碼塊不要捕獲太多的異常芹助。
- 關(guān)閉資源:
//圓括號(hào)里面只能添加可以關(guān)閉的對(duì)象
//實(shí)現(xiàn)了Closeable接口的對(duì)象
//如果出現(xiàn)異常 系統(tǒng)自動(dòng)關(guān)閉這個(gè)資源
try(FileReader fr1=new FileReader("DD")){
//使用對(duì)象
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 使用throws拋出異常 給外部處理
try {
TException.test();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
public class myclass throws FileNotFoundException
- 當(dāng)特殊情況 自己可以選擇拋出異常 用throw堂湖。
throw new IllegalAccessException();
class TException{
//多個(gè)異常用‘闲先,’隔開
public static void test()throws FileNotFoundException,NullPointerException{
FileReader fr=new FileReader("");
}
public static void test2()throws IllegalAccessException{
if (2>1){
throw new IllegalAccessException();
}
}
- 自定義異常類
class XJTException extends Exception{
//1.提供一個(gè)無參構(gòu)造方法
public XJTException(){
}
//2.提供一個(gè)有參構(gòu)造方法 參數(shù)是一個(gè)字符串
public XJTException(String desc){
super(desc);
}
}
應(yīng)用:
public static void test3()throws XJTException{
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stackTrace[2];
String detail = e.getFileName()+"->"+e.getMethodName()+"->"+e.getLineNumber();
throw new XJTException("自己的異常類:無用的實(shí)現(xiàn)"+detail);
}
感悟
學(xué)習(xí)Java快要結(jié)束了,但是感覺什么都不懂无蜂,有很多知識(shí)點(diǎn)還是不明確伺糠。感覺沒有一條線把他們串起來。所以就覺得學(xué)的很雜酱讶,記的好亂退盯,很混彼乌。還是要自己去多去做總結(jié)吧泻肯,多去了解。