一、finally语句注意的细节:

 当涉及到break和continue语句的时候,finally字句也会得到执行。

public class Test7 {
public static void main(String[] args) {
int i = 0;
while (true) {
try {
i++;
if (i == 3)
break;
} finally {
if (i == 3)
System.out.println("hi");//输出hi
}
}
}
}

  二、异常在继承的时候需要注意的细节:

  1、异常限制对构造器不起作用,子类构造器可以抛出任意异常,而不必理会基类所抛出的异常(这与方法不同),但是由于基类构造器必须以这样或那样的方式调用,子类构造器的异常说明必须包含基类构造器的异常说明。

class Dad {
public Dad() throws AException { }
}
class Son extends Dad { public Son() throws AException,BException/*AException必须包含在声明*/ {
super();
} }

  2、子类方法可以不抛出任何异常,即使是基类定义的异常,因为假使基类的方法抛出了异常,这样做也不会破坏已有的程序,所以也没有问题。

interface AInterface {
public void f() throws AException;
}
interface BInterface {
public void f() throws BException;
}
class Impl implements AInterface,BInterface { @Override
public void f() {
} }

  3、如果子类对象向上转型为基类的引用,那么在调用方法的时候,编译器就会要求捕获基类可能抛出的异常。同样是上例,在main方法里向上转型为AInterface,那么编译器会要求处理异常:

public class Test8 {
public static void main(String[] args) throws AException{
AInterface imp=new Impl();
imp.f();
}
}
interface AInterface {
public void f() throws AException;
}
interface BInterface {
public void f() throws BException;
}
class Impl implements AInterface,BInterface { @Override
public void f() {
} }

  4、异常说明本身不属于方法类型的一部分,方法类型是有方法的名字和参数的类型组成的。此外一个出现在基类方法的异常说明中的异常不一定会出现在子类中。

  三、getCause方法的运用:(利用getCause处理利用异常链包装进其他异常的异常)

public class Test6 {
public static void main(String[] args) {
try {
new A().f();
}catch(RuntimeException e) {
System.out.println(e.getCause());//输出three.AException
}
}
}
class A {
public void f() {
try {
throw new AException();
} catch (AException e) {
throw new RuntimeException(e);
}
}
}

  四、异常处理的原则:注意能处理的处理,但是一定不能将重要的异常通过catch语句进行捕捉造成隐藏。

  五、优先级队列(PriorityQueue)的介绍:

  优先级队列始终保持队列顶部的元素始终是最小的,而其他元素无法保证,因此当调用队列的remove方法的时候,每次都是获得当前队列里面的最小的元素。PriorityQueue是怎么保证在添加或者删除元素的时候,顶部的元素始终是最小的呢?实际上,查看源码可以发现,其内部是一个二叉树的结构:

   private void siftUpComparable(int k, E x) {
Comparable<? super E> key = (Comparable<? super E>) x;
while (k > 0) {
int parent = (k - 1) >>> 1;
Object e = queue[parent];
if (key.compareTo((E) e) >= 0)
break;
queue[k] = e;
k = parent;
}
queue[k] = key;
}

  while循环进行的工作是,当欲加入的元素小于其父节点时,就将两个节点的位置交换。这个算法保证了如果只执行add操作,那么queue这个二叉树是有序的:该二叉树中的任意一个节点都小于以该节点为根节点的子数中的任意其它节点。这也就保证了queue[0],即队顶元素总是所有元素中最小的。

  六、Map的一个简单的实现

  通过对于Map的一个简单的实现,可以更好的理解Map的内部实现机制,这里出于简单,Key和Value使用了ArrayList,但是实际上这种操作效率极低。

class MyMap<K,V> {
private List<K> kList=new ArrayList<K>();
private List<V> vList=new ArrayList<V>();
private Set<MyEntry> entries=new HashSet<>(); public V put(K key, V value) {
for(K k:kList) {
//如果找到了key.那么替换key对应的value,返回旧的value
if(k.equals(key)) {
int index=kList.indexOf(k);
V oldValue=vList.get(index);
vList.set(index, value);
return oldValue;
}
}
kList.add(key);
vList.add(value);
return null;
} public Object get(Object key) {
for(K k:kList) {
//如果找到了key.返回key对应的value
if(k.equals(key)) {
int index=kList.indexOf(k);
V value=vList.get(index);
return value;
}
}
return null;
} public class MyEntry implements Map.Entry<K, V> {
int index;
public MyEntry(int index) {
this.index=index;
}
@Override
public K getKey() {
return kList.get(index);
} @Override
public V getValue() {
return vList.get(index);
} @Override
public V setValue(V value) {
return vList.set(index, value);
} } public Set<MyEntry> entrySet() {
for(int i=0;i<kList.size();i++) {
entries.add(new MyEntry(i));
}
return entries;
}
}
public class Demo5 {
public static void main(String[] args) {
MyMap<String,String> map=new MyMap<>();
map.put("1", "哈士奇");
map.put("2", "柯基");
map.put("3", "金毛");
map.put("4", "博美");
for(Map.Entry<String, String> en:map.entrySet()) {
System.out.println(en.getKey()+"==>"+en.getValue());
}
}
}

  七、LinkedHashMap

  可以在LinkedHashMap的构造方法中传入参数,使之采用基于访问的最近最少使用的算法。于是没有被访问过的元素就会出现在前面。下面是例子:

public class Demo6 {
public static void main(String[] args) {
LinkedHashMap<String, String> lh=new LinkedHashMap<>(5, 0.75f, true);
lh.put("1", "小狗");
lh.put("2", "小兔子");
lh.put("3", "小猫");
lh.put("4", "小老鼠");
lh.put("5", "小鸡");
System.out.println(lh.keySet());
String test1=lh.get("2");
String test2=lh.get("3");
System.out.println(lh.keySet());
}
}

  输出为(其中最近访问的排在后面):

[1, 2, 3, 4, 5]
[1, 4, 5, 2, 3]

  在这类HashMap的内部实现中,查询一个值的情况是,先计算散列码,然后根据散列码查询内部的数组,(数组可以看做桶,而数组中的一个个元素称之为桶位。)数组不保存值,而是保存值的List,然后对List中的值使用equals方法进行线性的查询。

  LinkedHashMap的构造器参数中的float参数是负载因子。代表当负载情况(尺寸/容量)>负载因子的时候,容器将自动增加容量(桶位数),实现的情况是容量大致加倍,并且将现有的对象分配到新的桶位中。(称为再散列)

Java编程思想学习笔记_4(异常机制,容器)的更多相关文章

  1. JAVA编程思想读书笔记(二)--容器

    接上篇JAVA编程思想读书笔记(一) 第八章.对象的容纳 No1: java提供了四种类型的集合类:Vector(矢量).BitSet(位集).Stack(堆栈).Hashtable(散列表) No2 ...

  2. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  3. Java编程思想 学习笔记12

    十二.通过异常处理错误  Java的基本理念是“结构不佳的代码不能运行”. Java中的异常处理的目的在于通过使用少于目前数量的代码来简化大型.可靠的程序的生成,并且通过这种方式可以使你更加自信:你的 ...

  4. Java编程思想 学习笔记10

    十.内部类  可以将一个类的定义放在另一个类的定义内部,这就是内部类. 内部类是一种非常有用的特性,因为它允许你把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性.然而必须要了解,内部类和组合是 ...

  5. [Java编程思想-学习笔记]第1章 对象导论

    1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...

  6. Java编程思想 学习笔记11

    十一.持有对象  通常,程序总是根据运行时才知道的某些条件去创建新对象.在此之前,不会知道所需对象的数量,甚至不知道确切的类型. Java实用库还提供了一套相当完整的容器类来解决这个问题,其中基本的类 ...

  7. Java编程思想 学习笔记1

    一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...

  8. Java编程思想学习笔记——类型信息

    前言 运行时类型信息(RTTI:Runtime Type Information)使得我们可以在程序运行时发现和使用类型信息. Java在运行时识别对象和类的信息的方式: (1)一种是RTTI,它假定 ...

  9. Java编程思想 学习笔记7

    七.复用类 1.组合语法 在新的类中产生现有类的对象.由于新的类是由现有类的对象所组成,所以这种方法叫做组合. 类中域为基本类型时能够自动被初始化为零.对象引用被初始化为null. 编译器不是简单地为 ...

随机推荐

  1. yii2 批量插入or更新

    $sql1 = 'insert into business_ip (gid, name, area, belongName, belongArea, destIPv4, created, update ...

  2. char 型变量中能不能存贮一个中文汉字,为什么?

    char类型可以存储一个中文汉字,因为Java中使用的编码是Unicode(不选择任何特定的编码,直接使用字符在字符集中的编号,这是统一的唯一方法),一个char类型占2个字节(16比特),所以放一个 ...

  3. 【转】Tomcat中部署java web应用程序

    http://www.blogjava.net/jiafang83/archive/2009/06/02/279644.html 转载:今天给大家介绍怎样在Tomcat5.5.9中部署Java Web ...

  4. YTU 3004: 栈的基本运算(栈和队列)

    3004: 栈的基本运算(栈和队列) 时间限制: 1 Sec  内存限制: 128 MB 提交: 32  解决: 10 题目描述 编写一个程序,实现顺序栈的各种基本运算,主函数已给出,请补充每一种方法 ...

  5. SQL Server 索引和表体系结构(一)

    转自:http://www.cnblogs.com/chenmh/p/3780221.html 聚集索引 概述 关于索引和表体系结构的概念一直都是讨论比较多的话题,其中表的各种存储形式是讨论的重点,在 ...

  6. php编译器

    WordPress http://pan.baidu.com/s/1eQnOnv0 epp3: http://pan.baidu.com/s/1pJKFOD1 配合xampp: http://pan. ...

  7. spring注入参数详解

    spring注入参数详解 在Spring配置文件中, 用户不但可以将String, int等字面值注入到Bean中, 还可以将集合, Map等类型的数据注入到Bean中, 此外还可以注入配置文件中定义 ...

  8. reactjs入门到实战(七)---- React的组件的生命周期

    React的组件的生命周期有三个状态分别是:挂载(生产组件示例化.准备挂载到页面.挂载到页面).更新(更新值.更新DOM).和卸载(卸载后). >>>其他     getInitia ...

  9. reactjs入门到实战(一)---- hello world例子

    React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西 ...

  10. jQueryEasyUI Messager基本使用

    二.jQueryEasyUI Messager基本使用 1.$.messager.alert(title, msg, icon, fn)1>.基本用法 代码: 1 2 3 4 5 6 7 8 9 ...