Java學(xué)習(xí):泛型,Set接口,異常處理

一、泛型

泛型,也可說(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é)果

注意:由此可見(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());
    }
輸出結(jié)果

學(xué)習(xí)感悟

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容