一、泛型
泛型,也可說(shuō)是“參數(shù)化類(lèi)型”,就是將類(lèi)型由原來(lái)的具體的類(lèi)型參數(shù)化,類(lèi)似于方法中的變量參數(shù),此時(shí)類(lèi)型也定義成參數(shù)形式(可以稱之為類(lèi)型形參),然后在使用/調(diào)用時(shí)傳入具體的類(lèi)型(類(lèi)型實(shí)參)。操作的數(shù)據(jù)類(lèi)型被指定為一個(gè)參數(shù),這種參數(shù)類(lèi)型可以用在類(lèi)、接口和方法中,分別被稱為泛型類(lèi)、泛型接口、泛型方法。
泛型的使用
1,定義一個(gè)泛型類(lèi):
class GenericTest<T>{
int age;
T a1;
T a2;
public void test(T a1,T a2){
this.a1 = a1;
this.a2 = a2;
System.out.println(a1.equals(a2));
}
}
使用這個(gè)類(lèi):
GenericTest<String> g1 = new GenericTest<>();
g1.test("jack","jack");
2,關(guān)于泛型最好的例子就是ArrayList的使用,ArrayList可以存放所有的對(duì)象。
ArrayList<String> strings = new ArrayList<>();//可以放字符串
ArrayList<Integer> integers = new ArrayList<>(); //可以存放整數(shù)
二、Set接口
- Set集合里面對(duì)象不能重復(fù) ,如果重復(fù)對(duì)象重復(fù)就添加不進(jìn)去。內(nèi)部使用HashMap來(lái)實(shí)現(xiàn) ,鍵key不能重復(fù)。集合是無(wú)序的 添加順序和存儲(chǔ)順序無(wú)關(guān) 使用了一種默認(rèn)的排序方式
- 如何實(shí)現(xiàn)HashMap里面的key不相同?
計(jì)算這個(gè)key對(duì)應(yīng)的hash值,計(jì)算方式是在對(duì)象的地址的基礎(chǔ)上按照一定的算法計(jì)算出來(lái)的一個(gè)整數(shù),如果兩個(gè)對(duì)象相同 那么計(jì)算出來(lái)的哈希值就相同,此時(shí)就不能再添加進(jìn)去。
Set集合的方法摘要

HashSet類(lèi)
HashSet和ArrayList都是間接繼承Collection接口,在方法上面相差不大,下面只寫(xiě)兩種方法
向集合里添加數(shù)據(jù)
HashSet<String> names = new HashSet<>();
names.add("jack ");
names.add("and ");
names.add("Merry");
names.add("Tom");
System.out.println(names);

注意:由此可見(jiàn)添加順序和存儲(chǔ)順序無(wú)關(guān)
刪除符合某種條件的元素
names.removeIf(element -> {
return element.compareTo("T") < 0;
});
System.out.println(names);
TreeSet類(lèi)
1,1.TreeSet可以用來(lái)排序時(shí)候默認(rèn)升序排的,,但是只能排常量的
TreeSet<integer> set = new TreeSet<>();
set.add(1);
set.add(4);
set.add(2);
set.add(3);
System.out.println(set);
2,如果想要比較對(duì)象就需要在類(lèi)里面重寫(xiě)CompareTo方法
重寫(xiě)CompareTo方法:
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) {
//判斷o對(duì)象是不是Person類(lèi)的一個(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;
}
}
}
TreeSet的第一種方法:
//可以排序的集合
TreeSet<Person> score = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person person, Person t1) {
return person.compareTo(t1);
}
});
Person p1 = new Person("jack",20);
Person p2 = new Person("tom",21);
Person p3 = new Person("merry",19);
score.add(p1);
score.add(p2);
score.add(p3);
//equals比較的是對(duì)象內(nèi)部的內(nèi)容 使用的兩個(gè)對(duì)象必須實(shí)現(xiàn)Comparable接口的CompareTo方法
// 在CompareTo方法里面具體實(shí)現(xiàn)該如何比較
System.out.println(p1==p2); //輸出結(jié)果為false
TreeSet排序的第二種方法:
//可以排序的集合
TreeSet<Person> score = new TreeSet<>((Person p1,Person p2) -> p1.compareTo(p2));
Person p1 = new Person("jack",20);
Person p2 = new Person("tom",21);
Person p3 = new Person("merry",19);
score.add(p1);
score.add(p2);
score.add(p3);
//equals比較的是對(duì)象內(nèi)部的內(nèi)容 使用的兩個(gè)對(duì)象必須實(shí)現(xiàn)Comparable接口的CompareTo方法
// 在CompareTo方法里面具體實(shí)現(xiàn)該如何比較
System.out.println(score); //輸出結(jié)果為false
if(p1.hashCode() ==p2.hashCode()){
System.out.println("相同");
}else{
System.out.println("不相同");
}
HashMap類(lèi)
HashMap 集合 存儲(chǔ)數(shù)據(jù)的特點(diǎn):鍵值對(duì),鍵key-值value,key不能重復(fù) 可以是任意的對(duì)象對(duì)象類(lèi)型,通常使用字符串
創(chuàng)建一個(gè)HashMap對(duì)象
HashMap<String,Integer> score1 = new HashMap<>(); //創(chuàng)建一個(gè)HashMap ,鍵是字符串類(lèi)型,值是Integer類(lèi)型
添加數(shù)據(jù),鍵值對(duì)
//添加對(duì)象:鍵值對(duì)
score1.put("Chinese",89);
score1.put("Math",89);
score1.put("English",89);
修改鍵值對(duì)的值
//更改某個(gè)鍵值對(duì)對(duì)應(yīng)的值
score1.put("Chinese",91);
獲取鍵值對(duì)的個(gè)數(shù)
//獲取鍵值對(duì)的個(gè)數(shù)
score1.size();
得到所有的鍵組成的集合
//獲取所有的鍵key,返回所有的key組成的集合
System.out.println(score1.keySet());
得到所有值組成的集合
//獲取所有的值value
System.out.println(score1.values());
得到所有鍵值對(duì)組成的集合
//獲取每一個(gè)鍵值對(duì) Entry 所有鍵值對(duì)組成的集合
System.out.println(score1.entrySet());
獲取一個(gè)鍵key對(duì)應(yīng)的值
System.out.println(score1.get("Chinese"));
鍵值對(duì)的遍歷
1,通過(guò)遍歷key來(lái)得到每一個(gè)key對(duì)應(yīng)的值
for(String key:score1.keySet()){
//通過(guò)key得到值
int value = score1.get(key);
System.out.println("key:"+key+"value"+value);
}
2,通過(guò)EntrySet 得到Entry對(duì)象的集合
// 一個(gè)Entry管理一個(gè)鍵值對(duì) getKey getValue
Set<Map.Entry<String,Integer>> entrys = score1.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);
}
異常處理
異常處理機(jī)制能讓程序在異常發(fā)生時(shí),按照代碼的預(yù)先設(shè)定的異常處理邏輯,針對(duì)性地處理異常,讓程序盡最大可能恢復(fù)正常并繼續(xù)執(zhí)行,且保持代碼的清晰。Java中的異??梢允呛瘮?shù)中的語(yǔ)句執(zhí)行時(shí)引發(fā)的,也可以是程序員通過(guò)throw 語(yǔ)句手動(dòng)拋出的,只要在Java程序中產(chǎn)生了異常,就會(huì)用一個(gè)對(duì)應(yīng)類(lèi)型的異常對(duì)象來(lái)封裝異常,JRE就會(huì)試圖尋找異常處理程序來(lái)處理異常。
常見(jiàn)異常處理的結(jié)構(gòu)
try{
//執(zhí)行的代碼,可能會(huì)出現(xiàn)異常 一旦出現(xiàn)異常 系統(tǒng)自動(dòng)為我們創(chuàng)建異常類(lèi)并拋出
}catch(NullPointException o){
//如果需要自己處理異常就catch 圓括號(hào)里面是異常類(lèi)的對(duì)象
}catch(){
//如果有多個(gè)異常 可以使用多個(gè)catch來(lái)捕獲
//如果有多個(gè)異常 catch的順序是從小到大
}finally{
//不管有沒(méi)有異常finally都會(huì)被執(zhí)行
//處理資源回收 網(wǎng)絡(luò)連接 數(shù)據(jù)庫(kù)連接 I/O流
}
注意如果異常出現(xiàn),則后面的代碼將不會(huì)執(zhí)行, 所以 try代碼塊 不要抓太多代碼塊 避免后面的代碼無(wú)法執(zhí)行

拋出異常
當(dāng)特殊情況出現(xiàn)了 自己可以拋出異常throws, 使用throws拋出異常 交給外部處理
public static void test() throws FileNotFoundException {
FileReader fr = new FileReader(" ");
}
public static void test2() throws IllegalAccessException {
if(1 > 2){
throw new IllegalAccessException();
}
}
自己定義異常類(lèi)
自己定義的拋出異常類(lèi)要繼承Exception類(lèi)后Throwable類(lèi)
class TExcepetion {
public static void test3() throws XWJException {
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stackTrace[2];
String detail = e.getFileName()+"->"+e.getMethodName()+"- >"+e.getLineNumber();
throw new XWJException("自己的異常類(lèi):無(wú)所作為"+detail);
}
}
class XWJException extends java.lang.Exception{
//1,提供一個(gè)無(wú)參構(gòu)造方法
public XWJException(){}
//2,提供一個(gè)有參構(gòu)造方法
public XWJException(String desc){
super(desc);
}
使用這個(gè)類(lèi)
try {
TExcepetion.test3();
} catch (XWJException e) {
System.out.println(e.getMessage());
}

學(xué)習(xí)感悟
今天學(xué)習(xí)的內(nèi)容比較雜,但總體來(lái)說(shuō)學(xué)起來(lái)不算困難,但在真正的使用過(guò)程中會(huì)有點(diǎn)不熟練,因此需要多多練習(xí),畢竟孰能生巧!