Java进阶(异常处理、对象容器)

异常类继承层次示意图
在这里插入图片描述
所有的异常类都直接或间接地继承于java.lang.Throwable类。
Error: 程序无法恢复地严重错误,只能让程序终止,如JVM内部错误、内存溢出和资源耗尽等严重情况。
Exception(主要研究)
定义: 程序可恢复异常,如除零异常、空指针访问、网络连接中断和读取不存在地文件等。Exception类可以分为受检查异常和运行时异常。
1、受检查异常:除了RuntimeException(运行时异常)类及其子类外,其他的Exception类及其子类都属于受检查异常,这种异常的特点是要么用try…catch捕获处理,要么用throws语句声明抛出,否则会发生编译错误。
2、运行时异常:RuntimeException类及其子类都被称为运行时异常,这种异常的特点是Java编译器不去检查它,即没有用try…catch语句捕获它,也没有用throws字句声明抛出它,也会编译通过。

捕获异常之try-catch语句
语法:
try {
有可能出现异常的语句;
} [catch(异常类 对象) {
异常处理语句;
} catch(异常类 对象) {
异常处理语句;
}…] [finally {
异常统一出口;
}]
备选可嵌套组合:try…catch、try…finally、try…catch…finally。

throws与声明方法抛出异常
作用:方法没有能力处理该异常,捕获它没有意义,此时需要再方法后面声明抛出该异常。
语法:
[修饰符] 返回值类型 方法名([参数列表])[throws 异常列表]{
// throw 异常对象;
}
异常列表位于方法体之前,可抛出多种类型的异常,每个类型之间用逗号隔开。

throw人工抛出异常
作用:throw关键字用来人工引发异常,通过throw语句显式抛出异常。
语法:throw Throwable 或其子类地实例。

throw 和throws关键字的区别:
throw用于抛出异常对象,后面跟的是异常对象;throw用在方法内。
throws用于抛出异常类,后面跟的异常类名,可以跟多个,用逗号隔开;throws用在方法上。

Java对象容器
划分:1、Collection(单列集合):List列表(有序且可重复),Set集(无序不可重复), Queue(先进先出 FIFO);
2、Map(双列集合):Hashtable,HashMap,TreeMap。保存具有“映射关系”的数据。

Java集合框架优点
(1)使用核心集合类降低开发成本,而非实现我们自己的集合类。
(2)随着使用经过严格测试的集合框架类,代码质量会得到提高。
(3)通过使用JDK附带的集合类,可以降低代码维护成本。
(4)复用性和可操作性。

List接口中常用类及特点
1、Vector:线程安全,但速度慢,已被ArrayList替代。底层数据结构是数组结构, Stack是Vector提供的一个子类,用于模拟"栈"这种数据结构(LIFO后进先出)。
2、ArrayList:线程不安全,查询速度快。底层数据结构是数组结构
3、LinkedList:线程不安全。增删速度快。底层数据结构是链表结构

Set接口中常用的类及特点
1、HashSet(主要运用): 线程不安全,内部是基于散列函数实现,存取速度快。它是如何保证元素唯一性的呢?依赖的是元素的hashCode方法和euqals方法。
2、LinkedHashSet:具有HashSet的查询速度,且内部采用双向链表维护元素的顺序(默认保持插入顺序排序,如果初始化时将accessOrder设置为true将使用最近最少顺序,即最近使用的元素插在链表尾部)。元素必须实现hashCode()方法。内部是由链表实现。
3、TreeSet:线程不安全,可以对Set集合中的元素进行排序,底层采用了红黑树。它的排序是如何进行的呢?通过compareTo或者compare方法中的来保证元素的唯一性。元素是以二叉树的形式存放的。意味着TreeSet中的元素要实现Comparable接口。或者有一个自定义的比较器。

Map接口中常用的类及特点
1、Hashtable:线程安全,速度快,底层是哈希表数据结构,是同步的。不允许null作为键,null作为值。
2、Properties:用于配置文件的定义和操作,使用频率非常高,同时键和值都是字符串,是集合中可以和IO技术相结合的对象。
3、HashMap(主要运用): 线程不安全,速度慢,底层也是哈希表数据结构,是不同步的。允许null作为键,null作为值,替代了Hashtable。
4、LinkedHashMap:可以保证HashMap集合有序,存入的顺序和取出的顺序一致。
5、TreeMap:可以用来对Map集合中的键进行排序,底层是采用红黑树。

Collection包结构,与Collections的区别
Collection是集合类,包含List有序列表,Set无序集合,队列等。
Collections是针对集合类的一个帮助类,提供了静态方法实现对各种集合的搜索、排序、线程安全化等操作。

Array和ArrayList有何区别
1、Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
2、Array是指定大小的,而ArrayList大小是固定的。
3、Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。

ArrayList 和 LinkedList不同点
1、ArrayList 底层是数组。便于堆元素的查找访问。LinkedList 以元素列表的形式存储数据,查找某个元素的时间复杂度是O(n)。
2、LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。
3、LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

HashMap的工作原理
作用: HashMap内部实现是一个桶数组,每个桶中存放着一个单链表的头结点。其中每个结点存储的是一个键值对整体(Entry),HashMap采用拉链法解决哈希冲突。
HashMap提供两个重要的基本操作: put(K, V)和get(K)
1、调用put操作时,HashMap计算键值K的哈希值,然后将其对应到HashMap的某一个桶(bucket)上;此时找到以这个桶为头结点的一个单链表,然后顺序遍历该单链表找到某个节点的Entry中的Key是等于给定的参数K;若找到,则将参数指定的V覆盖;否则插入一个新的Entry节点。
2、调用get(K)操作类似于put操作,HashMap通过计算键的哈希值,先找到对应的桶,然后遍历桶存放的单链表通过比照Entry的键来找到对应的值。

HashMap和HashTable的区别
(1) HashMap允许键和值是null,而Hashtable不允许键或者值是null。
(2)Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
(3)HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator(列举)迭代器不是fail-fast的。

HashSet,TreeSet,LinkedHashSet 之间的区别
1、HashSet: 为查询速度所设计的,存入HashSet的元素必须定义hashCode()方法。内部是基于散列函数实现。
2、TreeSet: 实现了SortedSet(SortedSet的元素可以保证处于排序状态),所以内部的元素是保持一定次序的(次序与元素实现的compareTo()方法有关),且底层是树状结构。使用它可以从Set中提取有序的序列。要求存入的元素必须实现Comparable接口,或则需要传入一个比较器Comparator。否则报ClassCastException。内部采用了红黑树实现。
3、LinkedHashSet: 具有HashSet的查询速度,且内部链表维护元素的顺序(按插入顺序排序)。元素必须实现hashCode()方法。内部是由链表实现。

Java集合框架实践知识
(1) 根据需要选择正确的集合类型。比如,如果指定了大小,我们会选用Array而非ArrayList。如果我们想根据插入顺序遍历一个Map,我们需要使用TreeMap。如果我们不想重复,我们应该使用Set。如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
(2) 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
(3) 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。使用JDK提供的不可变类作为Map的key,可以避免自己实现hashCode()和equals()。
性。
(4) 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
(5) 尽可能使用Collections工具类,或者获取只读、同步或空的集合,而非编写自己的实现。它将会提供代码重用性,它有着更好的稳定性和可维护
(6) 一些集合类允许指定初始容量,所以如果我们能够估计到存储元素的数量,我们可以使用它,就避免了重新哈希或大小调整。
(7) 基于接口编程,而非基于实现编程,它允许我们后来轻易地改变实现。
(8) 总是使用类型安全的泛型,避免在运行时出现ClassCastException。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值