HashSet、HashMap和异常处理2019-08-17

目的:

继续学习了有关集合的知识点:HashSet、HashMap,大致功能和List差不多,当然也存在一些区别,已经学习了异常处理,了解代码运行过程中的异常和错误如何处理。

技术:

1.泛型:

泛型:
-- 泛型类
-- 泛型方法
--泛型数组
Java里面泛型一定是引用类型即类类型,若为基本数据类型则使用其包装类
eg:定义一个泛型类:
其中的T是一个泛指,可以是任意引用类型,以及基本数据类型的包装类,但所有的T同一情况下必须一致。

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

}

调用:

public class Myclass {
    public static void main(String[] args){

        GenericTest<String>  genericTest = new GenericTest<>();
        genericTest.test("jack","jack");
}

2.HashSet、HashMap:

hashSet是Set接口下:HashSet类、LinkedHashSet类、TreeSet类之一
hashMap类是Map接口下的一个类。
1.集合里面对象不能重复 如果重复,加不进去
-- 内部使用HashMap来实现 键值对 键Key不能重复
--"jack":obj
2.集合是无序的 添加顺序和存储顺序无关
-- 使用默认排序
-- 哈希算法
-- 如何实现HashMap里面Key不相同
-- 计算这个Key对应的对象的hash值
--整数:在对象的地址的基础上按照一定的算法计算出来的的一个整数
-- 如果两个对象相同 那么计算出来的hash值就相同

HashSet类的方法使用:

插入,不可重复输入相同的数据,同时输入数据后自动进行排序,而且添加顺序和存储顺序无关

        HashSet<String> names = new HashSet<>();
//        names.add("jack");
//        names.add("jack");      //结果只有一个jack
        names.add("jack");
        names.add("merry");
        names.add("abc");         //结果:[abc, jack, merry]

删除一部分内容,使用removeIF(//被删除部分的共性)

        //删除 jack merry
        names.removeIf(ele ->{
            return ele.compareTo("c") > 0 ;   //compareTo返回为整形
        });
        System.out.println(names);

排序 1.对基本数据类型数据进行排序

        //可以排序的集合
        TreeSet<Integer> score = new TreeSet<>();
        score.add(23);
        score.add(2);
        score.add(3);
      System.out.println(score); //已经自动排序喽

对对象排序,自定义排序方法:
equals 比较的是对象内部的内容
使用的两个对象必须实现Compareble接口的compareTo方法
在compareTo里面实现具体该如何实现

      
        //方法1
        TreeSet<Person> score1 = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person person, Person t1) {
                return person.compareTo(t1);
            }
        });

        //方法2
        TreeSet<Person> score1 = new TreeSet<>( (Person person, Person t1) -> {
            return person.compareTo(t1);
        });

        Person person1 = new Person("jack",20);
        Person person2 = new Person("rose",20);
        Person person3 = new Person("jack",30);

        score1.add(person1);
        score1.add(person2);
        score1.add(person3);

       System.out.println(score1);

对应的Person类:( 使用的两个对象必须实现Compareble接口的compareTo方法) 继承接口Compatable,实现compareTo方法

class Person implements Comparable{
    public String name;
    public int age;

    public Person(String name, int age) {
        this.age = age;
        this.name = name;
    }

    @Override
    public int compareTo(Object o) {
        //1.判断o 是不是Person类的对象
        if(o instanceof Person){
            //自己规定比较的策略
            if(this.age != ((Person) o).age){
                return this.age - ((Person) o).age;
            }else{
                //在年龄相同情况下 比较姓名
                return this.name.compareTo(((Person) o).name);
            }
        }else{
            return -1;
        }
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
HashMap类的方法使用:

HashMap 集合 存储数据的特点:建Key-值value
Key不能重复 可以是任意的对象类型 通常使用字符串

1.基本方法:
QQ图片20190817201940.png
   HashMap<String,Integer> score = new HashMap<>();

        //添加对象:键值对
        score.put("Chinese",89);
        score.put("Math",30);
        score.put("English",100);

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

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

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

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

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

        //获取Key对应的值
        System.out.println(score.get("English"));

2.键值对的遍历:

 //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>> entries = score.entrySet();
       for (Map.Entry entry : entries){
           //得到Entry第一的Key
           String key = (String)entry.getKey();
           //得到Entry对应的值
           Integer value = (Integer)entry.getValue();

           System.out.println("key:"+key+" value:"+value);
       }

异常处理:

/**
 * 异常处理  错误:error
 * 运行过程中出现不可控的错误 使程序更健壮
 * Exception1-
 *1. try{
 *     执行代码
 *     可能出现异常
 *     一旦出现异常 系统自动为我们创建一个异常类 并抛出
 * }catch(NullPointerException e){
 *     如果需要自己处理异常就catch
 * }catch(){
 *     如果有多个异常 可以使用多个catch来捕获
 *     如果有多个异常 catch的顺序为从小到大
 * }finally{
 *     处理资源回收  网络链接  数据库链接 I/O流
 * }
 *
 * 如果异常出现 后面的代码将不会执行
 * try代码块不是越多越好 不要抓太多
 *
 * 2.使用throws抛出异常
 *   如果有多个异常 用逗号隔开
 *
 *  3.当出现特殊情况 自己可以选择抛出异常
 *  throw
 *  throw new IllegalAccessException
 */
1.try方法:
image.png
        //圆括号里面只能添加可以关闭的对象
        //实现了Closeable接口的对象
        //如果出现异常 系统自动就关闭这个资源
        try(FileReader fr1 = new FileReader("dddd")){
            //使用对象
        } catch (IOException e) {
            e.printStackTrace();
        }
2.使用throws抛出异常:
 public static void text() throws FileNotFoundException,NullPointerException{
        FileReader fr = new FileReader("");
    }
3.使用throw抛出自己创建的异常:
public static void text2() throws IllegalAccessException{
        //....
        if(2<1){
            throw new IllegalAccessException();
        }
    }
4.⾃自定义异常类: 能够⾃自⼰己定义输出内容 更更快地找到出现问题的位置:
//自定义异常处理
class PXDException extends Throwable{
    //1.提供一个无参构造方法
    public PXDException(){

    }

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

使用:

public static void text3() throws PXDException{
        //........
        StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
        StackTraceElement e = stackTrace[2];
        String detail = " "+e.getFileName()+"->"+e.getMethodName()+"->"+e.getLineNumber();

        throw new PXDException("自己的异常类:无所作为"+detail);
    }

捕获:

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

结果·:

自己的异常类:无所作为 Exception1.java->main->67

.实际编程

心得:

逐渐地习惯这种生活方法了,按时起按时进教室上课,每天都是按部就班地过,“程序员”的世界是真的枯燥,但是编代码成功时的快感是真的爽,得把今天学习的知识吸收的同时复习以前的知识了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 5,995评论 0 13
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 9,747评论 0 16
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 7,061评论 0 4
  • Java基础面试 Java基础面试... 1 1. Java基础知识... 5 1.1. Java源程序的扩展名是...
    来着何人阅读 4,919评论 0 1
  • 对象的创建与销毁 Item 1: 使用static工厂方法,而不是构造函数创建对象:仅仅是创建对象的方法,并非Fa...
    孙小磊阅读 6,268评论 0 3

友情链接更多精彩内容