Java基础
java为什么不直接实现Iterator接口,而是实现Iterable?
- Iterator是迭代器类,而Iterable是接口,很多集合都可以去实现Iterable接口,这样对象就可以调用iterator()方法。
- Iterator有两个核心方法Next()和hasNext()是依赖于迭代器的当前迭代位置,如果Collection直接实现Iterabor,势必导致集合对象中包含当前迭代位置的指针,当集合在不同方法传递时,由于当前迭代位置不可预知,那么Next()方法的结果也会变的不可预知。
请简述JDK和JRE的区别?
- JDK:全称Java Development Kit,翻译为Java开发工具包,提供Java的开发和运行环境,是整个Java的核心。
- JRE:全程Java Runtime Environment,Java运行时环境,为Java提供运行所需的环境
- JDK包括JRE,如果只是运行java程序只需要安装JRE;如果需要开发java程序,需要安装JDK。
简述什么是值传递和引用传递?
- 值传递是指方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数的值改变不影响实际参数的值。
- 引用传递也成为传地址。方法调用时,实际参数的引用(地址)传递给形式参数,在方法执行中,对形式参数的操作实际是对实际参数的操作,所以形式参数值的改变会引起实际参数值的改变。
简述什么是迭代器?
- 迭代器是一种设计模式,java迭代器是集合框架的一个接口,给集合提供了一种统一访问元素的方式,从而而不需要了解集合内部数据结构和细节。
- 通过调用集合的iterable()方法可以获取一个迭代器,并使用 hasNext() 方法判断是否还有下一个元素,如果有,则使用 next() 方法获取下一个元素。
- 一旦使用了迭代器进行遍历,就不能在遍历时修改集合中的元素,否则可能会导致不可预知的行为。如果需要修改集合中的元素,应该使用集合提供的遍历方式(如 for-each 循环)来进行遍历,或者使用列表迭代器(ListIterator)来对列表进行修改。
Iterator和ListIterator的区别?
- Iterator是ListIterator的父接口。
- Iterator对于所有集合通用,而ListIterator只能用于List集合。
- Itertor具备的功能只有hashNext(),next(),remove();ListIterator中具备着对被遍历的元素进行增删改查的方法,可以对元素进行逆向遍历。
简述快速失败(fail-fast)和安全失败(fail-safe)的区别?
- 快速失败和安全失败是针对迭代器而言的。
- 当迭代一个集合时,如果有另一个线程在修改这个集合,就会抛出ConcurrentModificationException异常,称为快速失败。java.util下的集合都是快速失败不能在多线程下修改。
- 安全失败是迭代的时候会在集合二层做一个拷贝,所以在修改集合上层元素的时候不会影响下层,所以不会抛出ConcurrentModificationException异常。java.util.concurrent包下的容器都是安全失败。
hashCode()和equals()方法的重要性体现在什么地方?
- java中的hashmap使用了hashCode()和equals()方法来确定键值对索引,当根据键获取值时也会用到这两个方法。
- 如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,同事这两个方法也能发现重复元素。
- 同一个对象无论何时调用hashCode(),得到的返回值必须一样。
- hashCode()返回值相等,对象不一定相等,通过hashCode()和equals()必须能唯一确定一个对象。
- 一旦重写了equals(),就必须重写hashCode()。而且hashCode()生成哈希值的依据应该是equals()中用来比较是否相等的字段。如果两个由equals()规定相等的对象生成的hashCode不等,对于HashMap来说,他们可能分别映射到不同位置,没有调用equals()比较是否相等的机会,两个实际上相等的对象可能被插入到不同位置,出现错误。其他一些基于哈希方法的集合类可能也会有这个问题。
finalize()方法什么时候被调用?析构函数(finalization)的目的是什么?
- 垃圾回收器决定回收某个对象时,就会运行该对象的finalize()方法,在java中,如果内存总是充足的,那么垃圾回收器永远不会进行,所以可能finalize()方法永远不会执行。
- java程序有垃圾回收期,所以一般情况下内存问题不用程序员操心。finalize()方法的主要用途是用来回收一些特殊渠道申请的内存,比如JNI(Java Native Interface)调用non-Java 程序(C 或 C++), finalize() 的工作就是回收这部分的内存。
- java可以使用finalize()在垃圾回收期将对象从内存中清理之前做一些必要的清理工作。这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。
- finalization析构函数的目的是:在清除对象前,完成一些清理工作,比如:释放内存等。
Java中Exception和Erroe有什么区别?
- Exception 和 Error 都是继承了 Throwable 类,在 Java 中只有 Throwable 类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。
- Exception 和 Error 体现了 Java 平台设计者对不同异常情况的分类
- Exception 是程序运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。Error是值在正常情况下,不太可能出现的情况,绝大多数Error都会导致程序处于不正常和不可恢复状态。既然是非正常情况,所以也不需要捕获,常见的比如 OutOfMemoryError 之类,都是 Error 的子类。
- Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常是指在代码里必须显式地进行捕获处理。不检查异常就是所谓的运行时异常,通常可以编码避免的逻辑错误,具体根据需要来判断是否需要捕获,并不会在编译期强制要求。