Java語言的學(xué)習(xí)與實(shí)踐10 (Java泛型,Set集合兜材,Map集合,異常處理)

1.收獲

今天是不一樣的昨天理澎,以前總是以為自己的解決辦法是最適合自己的,但是我今天發(fā)先我錯(cuò)了曙寡,也許把別人的優(yōu)秀方法借鑒過來糠爬,然后轉(zhuǎn)化為自己的方法,肯定是比以前自己的方法好举庶,不僅解決了以前自己沒有解決的問題执隧,而且還還應(yīng)用各個(gè)方面。這也許是我今天最大的收獲。我要把這種方法養(yǎng)成一種習(xí)慣深入到各個(gè)方面镀琉,也許這樣才使自己成長峦嗤。今天也看見了自己與別人的差距在哪,不是你不夠努力滚粟,而是你努力的方向不對(duì)寻仗,朝著錯(cuò)誤的方向前進(jìn),只會(huì)離目標(biāo)越來越遠(yuǎn)凡壤,所以要找到正確的方向加上好的方法署尤,不要忘了還有努力!加油亚侠!

2.技術(shù)

(1)java泛型的定義和應(yīng)用
(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet
(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap
(4)異常處理的方法

3.技術(shù)的實(shí)際應(yīng)用和實(shí)踐

(1)java泛型的定義和應(yīng)用
什么是泛型:
泛型是程序設(shè)計(jì)語言的一種特性曹体。允許程序員在強(qiáng)類型程序設(shè)計(jì)語言中編寫代碼時(shí)定義一些可變部分,那些部分在使用前必須作出指明硝烂。

為什么要用泛型:
不會(huì)強(qiáng)行對(duì)值類型進(jìn)行裝箱和拆箱箕别,或?qū)σ妙愋瓦M(jìn)行向下強(qiáng)制類型轉(zhuǎn)換,所以性能得到提高滞谢。通過知道使用泛型定義的變量的類型限制串稀,編譯器可以在一個(gè)高得多的程度上驗(yàn)證類型假設(shè),所以泛型提高了程序的類型安全狮杨。

怎末應(yīng)用泛型:
A.泛型的分類
泛型可分為泛型類母截,泛型方法,泛型數(shù)組

B.泛型的定義與應(yīng)用
首先我們需要定義一個(gè)泛型類橄教,在這個(gè)類中與以往的類有不同之處清寇,在類名后面有了<T>,并且在他的屬性中护蝶,也是被T 修飾华烟,并不確定他的類型,這就是泛型持灰。在泛型類里面在定義這個(gè)類的構(gòu)造方法盔夜。(注意:下面的T(Type)可以被換成E)

class GenericTest<T>{
    int age;
    T a1;
    T a2;

    public GenericTest( T a2,T a1){
        this.a1=a1;
        this.a2=a2;

        System.out.println(a1.equals(a2));
    }
}

然后我們?cè)谥骱瘮?shù)創(chuàng)建這個(gè)類的具體對(duì)象

 GenericTest<String> g2=new GenericTest<>("VVTFVBG","VVTFVBG");
GenericTest<Integer> g1=new GenericTest<>(1,1);
image.png

上面的泛型解決不同類型的對(duì)象的創(chuàng)建。

在說二三條之前我們來里以下set,map,list之間的關(guān)系

image.png

(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet
Set類繼承Collection接口堤魁,HashSet繼承Set類喂链,而TreeSetS是實(shí)現(xiàn)類SortedSet接口,SortedSet 接口使繼承Set類姨涡。

Set集合
1.集合里面的對(duì)象是不能重復(fù)的 如果重復(fù)就加不進(jìn)去
-----內(nèi)部使用的是HashMap - Map來實(shí)現(xiàn) 鍵值對(duì) 鍵key不能重復(fù)

------------如何是實(shí)現(xiàn)HashMap里面的key不相同
--------- -------- 計(jì)算這個(gè)key對(duì)應(yīng)對(duì)象的hash值
------------- ----整數(shù):在對(duì)象的地址的基礎(chǔ)上按照一定的算法計(jì)算出來的一個(gè)整數(shù) 這個(gè)整數(shù)就是hash值衩藤,如果兩個(gè)對(duì)象相同 那麼計(jì)算出來的hash值相同

2.集合是無序的 添加的順序和存儲(chǔ)的順序無關(guān)
----使用了默認(rèn)的排序

HashSet集合
定義

HashSet<String> names=new HashSet<>();
        names.add("jack");
        names.add("merry");
        names.add("abc");
        names.removeIf(element ->{return element.compareTo("c")>0;});
        System.out.println(names);
        System.out.println(names.hashCode());

實(shí)現(xiàn)效果:


image.png
image.png

TreeSet集合
在這個(gè)集合中能夠?qū)崿F(xiàn)對(duì)這集合中的對(duì)象進(jìn)行排序
首先我們先創(chuàng)建一個(gè)person類吧慢,然后創(chuàng)建多個(gè)person的多個(gè)具體的對(duì)象涛漂,然后將這些對(duì)象放到TreeSet集合中。

class Person implements Comparable{
    String name;
    int age;

    public Person(String name, int age){
        this.name=name;
        this.age=age;
    }
}
 Person p1=new Person("jack",20);
     Person p2=new Person("merry",10);
      Person p3=new Person("tom",20);

       people.add(p1);
       people.add(p2);
       people.add(p3);

在進(jìn)行排序的過程中,會(huì)進(jìn)行對(duì)象的比較匈仗,而equals 比較的是對(duì)象內(nèi)部的內(nèi)瓢剿, 使用的兩個(gè)對(duì)象在類中必須實(shí)現(xiàn)Comparable接口的compareTo方法在compareTo里面實(shí)現(xiàn)具體該如何比較,想要打印出對(duì)象的信息進(jìn)必須要實(shí)現(xiàn)ToString方法

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;
        }
    }
}

對(duì)集合中的對(duì)象排序的兩種方法

//比較:方法一
        TreeSet<Person> people=new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person person, Person t1) {
                return person.compareTo(t1);
            }
        });
        //方法二
        TreeSet<Person> people=new TreeSet<>((Person p1,Person p2) -> p1.compareTo(p2));

實(shí)現(xiàn)效果:


image.png

(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap
HashMap集合

image.png

方法的具體使用

 HashMap<String,Integer> score=new HashMap<>();

        //添加對(duì)象 添加鍵值對(duì)
        score.put("CHINA",100);
        score.put("CHI",95);
        score.put("C",86);

        //更改某個(gè)鍵值對(duì)對(duì)應(yīng)的值
        score.put("C",85);

        //獲取鍵值對(duì)的個(gè)數(shù)
        System.out.println(score.size());

        //獲取所有的key
        System.out.println(score.keySet());

        //獲取所有的值
        System.out.println(score.values());

        //獲取Entry:key-value
       System.out.println( score.entrySet());

       //獲取一個(gè)鍵Key對(duì)應(yīng)的值
        System.out.println(score.get("CHINA"));
                }

效果:


image.png

在HashMap集合中我們?cè)鯓觼肀闅v鍵值對(duì)悠轩,下面有兩種方法

 //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);
        }
        //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)的keyf
            String key=(String)entry.getKey();

            //獲取Entry的值
            Integer value =(Integer)entry.getValue();
            System.out.println("key:"+key+"  value:"+value);
        }

        System.out.println(score);

效果:


image.png

在HashSet间狂,TreeSet,HashMap火架,TreeMap集合的特殊要求

image.png

(4)異常處理的方法

什么是異常鉴象,什么是錯(cuò)誤:
異常是指使程序出現(xiàn)停止編譯的現(xiàn)象,經(jīng)過修改何鸡,程序正常運(yùn)行纺弊,而錯(cuò)誤是使程序出現(xiàn)崩潰的現(xiàn)象。程序異常和錯(cuò)誤沒有明顯的分界線骡男。

出現(xiàn)異常怎末辦:
我們可以根據(jù)系統(tǒng)的提示將異常拋出淆游,利用系統(tǒng)的方法。但是我們也可以自己寫異常的方法隔盛,利用自己的方法將異常拋出

處理異常的模板
try{
執(zhí)行代碼
可能會(huì)出現(xiàn)異常
一旦出現(xiàn)異常 系統(tǒng)自動(dòng)會(huì)為我們創(chuàng)建一個(gè)異常對(duì)象 并拋出
}catch( NullPointException e){
如果需要自己處理異常 局catch
}catch(IOException e){
如果有多個(gè)異常 可以使用多個(gè)catch來捕獲
如果有多個(gè)異常 catch的順序是從小到大
}catch(Exception e){

}finally{
//不管有沒有異常finally都會(huì)被執(zhí)行
處理資源回收 不會(huì)處理網(wǎng)絡(luò)連接 數(shù)據(jù)庫連接 I/O流
}
注意:
如果異常出現(xiàn) 后面的代碼不會(huì)執(zhí)行
try代碼塊 不要抓太多代碼

例子:

nt a=0;
        int b=20;
        FileReader fr=null;
        try{
            int c=b/a;
            System.out.println("hello");

            fr=new FileReader("");
        }catch (ArithmeticException e){
            System.out.println(e.getMessage());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            try{
                fr.close();
            }catch (IOException e){

            }
        }
image.png

在這代碼中 int c=b/a;出現(xiàn)了異常犹菱,后面的語句: System.out.println("hello");沒有執(zhí)行,那麼我們只需要將a的值部位0就可以了


image.png

現(xiàn)在將 System.out.println("hello");執(zhí)行了吮炕,但是在后面的程序中出現(xiàn)了異常腊脱,所以我們利用了系統(tǒng)的方法將他拋出。

try(){
}catch{
}這種拋出異常方法

圓括號(hào)里面只能添加可以關(guān)閉的對(duì)象
實(shí)現(xiàn)了Closeble接口的對(duì)象
如果出項(xiàng)異常 系統(tǒng)就會(huì)自動(dòng)關(guān)閉這個(gè)資源来屠。

        try(FileReader fr1=new FileReader("ddd")){
            //使用對(duì)象
        }catch(IOException e){
             e.printStackTrace();
        }

利用自己寫的拋出異常的方法來拋出程序的異常

首先我們需要根據(jù)系統(tǒng)中的拋出異常的方法來寫出拋出異常的類

class PXDException extends Exception{
    //1.提供一個(gè)無參構(gòu)造方法
    public PXDException(){

    }
    //2.提供一個(gè)有參構(gòu)造方法 參數(shù)是一個(gè)字符串
    public PXDException(String des){
        super(des);
    }
}

然后再創(chuàng)建一個(gè)類虑椎,來拋出這個(gè)異常的具體信息,以提示用戶進(jìn)行修改

class TException {
    public static void test3()throws PXDException{
        StackTraceElement[] stackTrace=Thread.currentThread().getStackTrace();
        StackTraceElement e=stackTrace[2];
        String detail=e.getClassName()+"->"+e.getFileName()+"->"+e.getMethodName()+"->"+e.getLineNumber();
         //....
        throw new PXDException("自己的異常類:無所作為  "+detail);
    }
}

然后在實(shí)際的運(yùn)行過程中進(jìn)行調(diào)用方法來拋出

try {
            TException.test3();
        } catch (PXDException e) {
                System.out.println(e.getMessage());
        }

效果:


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俱笛,一起剝皮案震驚了整個(gè)濱河市捆姜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迎膜,老刑警劉巖泥技,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異磕仅,居然都是意外死亡珊豹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門榕订,熙熙樓的掌柜王于貴愁眉苦臉地迎上來店茶,“玉大人,你說我怎么就攤上這事劫恒》坊茫” “怎么了轿腺?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長丛楚。 經(jīng)常有香客問我族壳,道長,這世上最難降的妖魔是什么趣些? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任仿荆,我火速辦了婚禮,結(jié)果婚禮上坏平,老公的妹妹穿的比我還像新娘拢操。我一直安慰自己,他們只是感情好舶替,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布庐冯。 她就那樣靜靜地躺著,像睡著了一般坎穿。 火紅的嫁衣襯著肌膚如雪展父。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天玲昧,我揣著相機(jī)與錄音栖茉,去河邊找鬼。 笑死孵延,一個(gè)胖子當(dāng)著我的面吹牛吕漂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尘应,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼惶凝,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了犬钢?” 一聲冷哼從身側(cè)響起苍鲜,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎玷犹,沒想到半個(gè)月后混滔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歹颓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年坯屿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巍扛。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡领跛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撤奸,到底是詐尸還是另有隱情吠昭,我是刑警寧澤鹅经,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站怎诫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贷痪。R本人自食惡果不足惜幻妓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劫拢。 院中可真熱鬧肉津,春花似錦、人聲如沸舱沧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熟吏。三九已至距糖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牵寺,已是汗流浹背悍引。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留帽氓,地道東北人趣斤。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像黎休,于是被迫代替她去往敵國和親浓领。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 一、基本數(shù)據(jù)類型 注釋 單行注釋:// 區(qū)域注釋:/* */ 文檔注釋:/** */ 數(shù)值 對(duì)于byte類型而言...
    龍貓小爺閱讀 4,257評(píng)論 0 16
  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,922評(píng)論 0 13
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法捎拯,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,216評(píng)論 0 2
  • 面向?qū)ο笾饕槍?duì)面向過程撑蒜。 面向過程的基本單元是函數(shù)。 什么是對(duì)象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,046評(píng)論 0 4
  • 寫著寫著發(fā)現(xiàn)簡(jiǎn)書提醒我文章接近字?jǐn)?shù)極限玄渗,建議我換一篇寫了座菠。 建議52:推薦使用String直接量賦值 一般對(duì)象都是...
    我沒有三顆心臟閱讀 1,335評(píng)論 2 4