Java学习第六周--集合及异常

学习目标:
1.  Comparator接口的使用
2.  Map集合
3.  异常的概念与原理
4.  异常的分类
5.  处理异常的方法
6.  自定义异常

一:Comparator接口的使用

使用Comparable接口定义排序顺序有局限性:实现此接口的类只能按compareTo()定义的这一种方式排序。
如果同一类对象要有多种排序方式,应该为该类定义不同的比较器(实现Comparator接口的类)TreeSet有一个构造方法允许给定比较器,它就会根据给定的比较器对元素进行排序

1.  Comparator接口中的比较方法:public int compare(Object o1, Object o2); 

该方法如果:

返回 0,表示 o1 == o2
返回正数,表示 o1 > o2
返回负数,表示 o1 < o2

二: Map集合

1.  特点:实现Map接口的集合类用来存储“键-值”映射对。
不能包含重复的键,每个键最多只能映射到一个值,值可以重复。

2. Map接口的实现类常用的有:HashMap    TreeMap    Hashtable (不常用)

(1)  HashMap类与TreeMap类

HashMap存储结构使用哈希表,使用“键”进行散列存放。所以根据“键”去取“值”的效率很高。
TreeMap中的“key-value”对的“key”必须是可“排序”的。

(2) HashMap和Hashtable区别

HashMap不同步,Hashtable同步
HashMap可以存储null键null值,Hashtable不可以
HashMap多线程操作环境下效率高,Hashtable多线程操作环境下效率低

3.  Map接口中的常用方法

Object  put(Object key, Object value); //将指定的“键-值”对存入Map中
Object  get(Object key);  //返回指定键所映射的值
Object  remove(Object key); //根据指定的键把此“键-值”对从Map中移除。
boolean  containsKey(Object key);   //判断此Map是否包含指定键的“键-值”对。
boolean  containsValue(Object value);     //判断此Map是否包含指定值的“键-值”对。
boolean  isEmpty();  //判断此Map中是否有元素。
int  size();   //获得些Map中“键-值”对的数量。
void  clear();   //清空Map中的所有“键-值”对。
Set  keySet();    //返回此Map中包含的键的Set集。
Collection values();   //返回此Map中包含的值的Collection集。
Set<Map.Entry<K,V>> entrySet()  将所有包含键-值对的Map.Entry收集到Set

eg.

public static void main(String[] args) {
HashMap<String,String> hm=new HashMap<>();
hm.put("一班","小红");
hm.put("二班","小明");
hm.put("三班","小丽");
System.out.println("现在集合中共有键值对:"+hm.size());
System.out.println("key为一班的元素值:"+hm.get("一班"));
System.out.println("包括key为二班的键值对吗?"+hm.containsKey("二班"));
System.out.println("包括value为小丽的键值对吗?"+hm.containsValue("小丽"));
Set<String> b=hm.keySet(); 
System.out.println("所有的key是:");
for(String a:b){
System.out.print(a+"  ");
}
Collection<String> d=hm.values();
System.out.println("所有的value是:");
for(String c:d){
System.out.print(c+"  ");
}

4.  Map.Entry接口

Map.Entry是Map中内部定义的一个接口,专门用来保存keyvalue的内容。

eg.

Set<Map.Entry<String, String>> entrySet = map.entrySet();
for(Map.Entry<String, String> me:entrySet){
System.out.println(me.getKey()+"=>"+me.getValue());
}

5. HashTable类

操作大多跟HashMap相同,只是它保证线程的同步。
它有一个子类Properties(属性集)比较常用:Properties 类表示了一个持久的属性集。

Properties 可保存在流中或从流中加载。属性集中每个键及其对应值都是一个字符串。应该使用setProperty(String key, String value)方法,因为存放的“键-值”对都是字符串。类似取值也应该使用getProperty(String key)

eg.

public static void main(String[] args) {
Properties pro=new Properties();
pro.setProperty("一班","小红");
pro.setProperty("二班","小明");
pro.setProperty("三班","小丽");
System.out.println(pro.getProperty("一班"));
}

三:异常的概念与原理

1.异常是指在程序的运行过程中所发生的不正常的事件,它会中断正在运行的程序

2.Java的异常处理是通过5个关键字来实现的:  try、catch、 finally、throw、throws


3.  Java程序编译和运行时所发生的问题有两大类:
(1)错误(Error):JVM系统内部错误或资源耗尽等严重情况-属于JVM需要负担的责任
(2)异常(Exception):其它因编程错误或偶然的外在因素导致的一般性问题。
程序员通常只能处理异常(Exception),而对错误(Error)无能为力。

4.  异常处理机制的原理

Java程序在执行过程中如果出现异常,会自动生成一个异常类对象,该异常对象将被自动提交给JVM(在程序没有显式处理异常的情况下),这个过程称为抛出(throw)异常。

四:异常的分类

运行时异常:RuntimeException

    ArithmeticException:数学计算异常,如以零作除数
    NullPointerException:空指针异常
    ArrayOutOfBoundsException:数组索引越界异常
    ClassCastException:类型转换异常

检查时异常:SQLException,IOException,ClassNotFoundException

1.  Exception与RuntimeException区别

Exception在程序中是必须进行处理
RuntimeException可以不使用try…catch进行处理,但是如果有异常产生,则异常将由JVM进行处理。

五:处理异常的方法

1.  使用try-catch块捕获异常,catch块可以有多个

public void method(){
try {
      // 代码段(此处可能产生异常)
} catch (异常类型 ex) {
      // 对异常进行处理的代码段
}
// 代码段
}

public static void main(String[] args) {
Runtime r=Runtime.getRuntime();
try {
r.exec("calc");
} catch (IOException e) {
e.printStackTrace();
}
}

2.在try-catch块后加入finally块:是否发生异常都执行
不执行的唯一情况:当在catch块中发现无异常,则中断程序,退出Java虚拟机 

3.  多重catch块 

引发多种类型的异常,排列catch 语句的顺序:先子类后父类 
发生异常时按顺序逐个匹配,只执行第一个与异常类型匹配的catch语句

public static void main(String[] args) {
int a=100;
int b=0;
String str=null;
int[] array=new int[5];
try{
array[5]=100;
str.equals("abc");
int c=a/b;
}catch(NullPointerException e){
System.out.println("空指针异常~~~");
}catch(ArithmeticException e){
System.out.println("算数异常~~~");
}catch(Exception e){
System.out.println("以上catch都没有捕获到异常,由最大父类Exception处理异常");
}finally{
System.out.println("无论异常是否发生,都会执行");
}
System.out.println("main()方法执行完毕!");
}

4.  try…finally 不能捕获异常 ,仅仅用来当发生异常时,用来释放资源

5.  throw与throws的区别

(1) throw用来手动抛出异常对象。
(2)  throws用于方法声明处,用于抛出该方法体内部可能发生的异常类型。一旦在方法声明处通过throws抛出某种类型的异常,则在该方法体内部就不用处理该类型的异常,交给方法调用处处理该类型的异常。

六:自定义异常

1.创建自定义异常

public class MyException extends Exception {
    public MyException() {        super();    }
    public MyException(String msg) {       
            super(msg);    
    }
}

2.使用自定义异常

public String[] createArray(int length) throws MyException {
    if (length < 0) {    
        throw new MyException("数组长度小于0,不合法");
    } 
    return new String[length]; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值