Java语言的学习与实践10 (Java泛型,Set集合,Map集合,异常处理)

1.收获

今天是不一样的昨天,以前总是以为自己的解决办法是最适合自己的,但是我今天发先我错了,也许把别人的优秀方法借鉴过来,然后转化为自己的方法,肯定是比以前自己的方法好,不仅解决了以前自己没有解决的问题,而且还还应用各个方面。这也许是我今天最大的收获。我要把这种方法养成一种习惯深入到各个方面,也许这样才使自己成长。今天也看见了自己与别人的差距在哪,不是你不够努力,而是你努力的方向不对,朝着错误的方向前进,只会离目标越来越远,所以要找到正确的方向加上好的方法,不要忘了还有努力!加油!

2.技术

(1)java泛型的定义和应用
(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet
(3)Map集合下的HashMap集合和SortedSet接口以及塔下面的TreeMap
(4)异常处理的方法

3.技术的实际应用和实践

(1)java泛型的定义和应用
什么是泛型:
泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。

为什么要用泛型:
不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换,所以性能得到提高。通过知道使用泛型定义的变量的类型限制,编译器可以在一个高得多的程度上验证类型假设,所以泛型提高了程序的类型安全。

怎末应用泛型:
A.泛型的分类
泛型可分为泛型类,泛型方法,泛型数组

B.泛型的定义与应用
首先我们需要定义一个泛型类,在这个类中与以往的类有不同之处,在类名后面有了<T>,并且在他的属性中,也是被T 修饰,并不确定他的类型,这就是泛型。在泛型类里面在定义这个类的构造方法。(注意:下面的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));
    }
}

然后我们在主函数创建这个类的具体对象

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

上面的泛型解决不同类型的对象的创建。

在说二三条之前我们来里以下set,map,list之间的关系

image.png

(2)Set集合下的HashSet集合和SortedSet接口以及他下面的TreeSet
Set类继承Collection接口,HashSet继承Set类,而TreeSetS是实现类SortedSet接口,SortedSet 接口使继承Set类。

Set集合
1.集合里面的对象是不能重复的 如果重复就加不进去
-----内部使用的是HashMap - Map来实现 键值对 键key不能重复

------------如何是实现HashMap里面的key不相同
--------- -------- 计算这个key对应对象的hash值
------------- ----整数:在对象的地址的基础上按照一定的算法计算出来的一个整数 这个整数就是hash值,如果两个对象相同 那麽计算出来的hash值相同

2.集合是无序的 添加的顺序和存储的顺序无关
----使用了默认的排序

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());

实现效果:


image.png
image.png

TreeSet集合
在这个集合中能够实现对这集合中的对象进行排序
首先我们先创建一个person类,然后创建多个person的多个具体的对象,然后将这些对象放到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);

在进行排序的过程中,会进行对象的比较,而equals 比较的是对象内部的内, 使用的两个对象在类中必须实现Comparable接口的compareTo方法在compareTo里面实现具体该如何比较,想要打印出对象的信息进必须要实现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对象是不是peron的一个对象
        if(o instanceof Person){
            Person o1=(Person)o;
            //自己规定比较的策略
            if(this.age!=o1.age){
                return this.age-o1.age;
            }else{
                //年龄相同情况下
                return this.name.compareTo(o1.name);
            }

        }else{
            return -1;
        }
    }
}

对集合中的对象排序的两种方法

//比较:方法一
        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));

实现效果:


image.png

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

image.png

方法的具体使用

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

        //添加对象 添加键值对
        score.put("CHINA",100);
        score.put("CHI",95);
        score.put("C",86);

        //更改某个键值对对应的值
        score.put("C",85);

        //获取键值对的个数
        System.out.println(score.size());

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

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

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

       //获取一个键Key对应的值
        System.out.println(score.get("CHINA"));
                }

效果:


image.png

在HashMap集合中我们怎样来遍历键值对,下面有两种方法

 //1.通过遍历key来得到每一个Key对应的值
        for(String key:score.keySet()){
            //通过key得到值
            int s=score.get(key);
            System.out.println("key:"+key+"  value:"+s);
        }
        //2.通过Entryset 得到Entry对象的集合
        //一个Entry管理一个键值对 getkey getvalue
        Set<Map.Entry<String,Integer>> entrys = score.entrySet();
        for(Map.Entry entry:entrys){
            //得到Entry对应的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)异常处理的方法

什么是异常,什么是错误:
异常是指使程序出现停止编译的现象,经过修改,程序正常运行,而错误是使程序出现崩溃的现象。程序异常和错误没有明显的分界线。

出现异常怎末办:
我们可以根据系统的提示将异常抛出,利用系统的方法。但是我们也可以自己写异常的方法,利用自己的方法将异常抛出

处理异常的模板
try{
执行代码
可能会出现异常
一旦出现异常 系统自动会为我们创建一个异常对象 并抛出
}catch( NullPointException e){
如果需要自己处理异常 局catch
}catch(IOException e){
如果有多个异常 可以使用多个catch来捕获
如果有多个异常 catch的顺序是从小到大
}catch(Exception e){

}finally{
//不管有没有异常finally都会被执行
处理资源回收 不会处理网络连接 数据库连接 I/O流
}
注意:
如果异常出现 后面的代码不会执行
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;出现了异常,后面的语句: System.out.println("hello");没有执行,那麽我们只需要将a的值部位0就可以了


image.png

现在将 System.out.println("hello");执行了,但是在后面的程序中出现了异常,所以我们利用了系统的方法将他抛出。

try(){
}catch{
}这种抛出异常方法

圆括号里面只能添加可以关闭的对象
实现了Closeble接口的对象
如果出项异常 系统就会自动关闭这个资源。

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

利用自己写的抛出异常的方法来抛出程序的异常

首先我们需要根据系统中的抛出异常的方法来写出抛出异常的类

class PXDException extends Exception{
    //1.提供一个无参构造方法
    public PXDException(){

    }
    //2.提供一个有参构造方法 参数是一个字符串
    public PXDException(String des){
        super(des);
    }
}

然后再创建一个类,来抛出这个异常的具体信息,以提示用户进行修改

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

然后在实际的运行过程中进行调用方法来抛出

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

效果:


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,257评论 0 16
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,932评论 0 13
  • 1.import static是Java 5增加的功能,就是将Import类中的静态方法,可以作为本类的静态方法来...
    XLsn0w阅读 1,219评论 0 2
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,048评论 0 4
  • 写着写着发现简书提醒我文章接近字数极限,建议我换一篇写了。 建议52:推荐使用String直接量赋值 一般对象都是...
    我没有三颗心脏阅读 1,338评论 2 4