1.为什么集合类没有实现Cloneable和Serializable接口?
答:克隆Cloning或者是序列化Serialization的语义和含义是跟具体的实现相关的。因此,应该由集合类的
具体实现来决定如何被克隆或者是序列化。
实现Serializable序列化的作用
将对象的状态保存在存储媒体中以便可以在以后重写创建出完全相同的副本;按值将对象从一个应用程序域
发向另外一个应用程序域。实现serializable接口的作用就是可以把对象存到字节流,然后可以恢复。所有
你想如果你的对象没有序列化,怎么才能进行网络传输呢?要网络传输就得转为字节流,所以在分布式应用
中,你就得实现序列化。如果你不需要分布式应用,那就没必要实现序列化。
2.什么是迭代器Iterator?
答:Iterator接口提供了很多对集合元素进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭
代方法。迭代器可以在迭代的过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object Obj)删除,可以通过迭代器的remove()方法删除。
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的
底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
Java中的Iterator功能比较简单,并且只能单项移动;
使用方法iterator()要求容器返回一个Iterator.第一次调用Iterator的next()方法时,它返回序列的第一个元素。iterator()方法是java.lang.Iterable接口,被Collection继承。
使用next()获得序列中的下一个元素。
使用hasNext()检查序列中是否还有元素。
使用remove()将迭代器新返回的元素删除。
迭代器应用:
list l = new ArrayList();
l.add("aa");
l.add("bb");
l.add("cc");
for (Iterator iter = l.iterator(); iter.hasNext();) {
String str = (String)iter.next();
System.out.println(str);
}
/*迭代器用于while循环
Iterator iter = l.iterator();
while(iter.hasNext()){
String str = (String) iter.next();
System.out.println(str);
}
*/
3.Iterator和ListIterator的区别是什么?
答:Iterator可以用来遍历Set和List集合,但是ListIterator只能用来遍历List.
Iterator对集合只能是前向遍历,ListIterator即可以前向也可以后向。
ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元
素的索引,等等。
4.快速失败fail-fast和安全失败fail-safe的区别?
答:Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。java.util包下面的
所有集合类都是快速失败的,而java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代
器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
5.Java中的HashMap的工作原理是什么?
答:Java中的HashMap是以键值对的形式存储元素的。HashMap需要一个hash函数,它使用hashcode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是它的容量capacity,负载因子load factor和扩容极限threshold resizing。
6.hashCode()和equals()方法的重要体现在什么地方?
答:Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对hashMap的精准性和正确性是至关重要的。
7.HashMap和Hashtable有什么区别?
答:HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有一下不同点:
HashMap允许键和值是null,而Hashtable不允许键或者值是null.
Hashtable是同步的,而HashMap不是。因此,
HashMap是非线程安全,更适合于单线程环境,而Hashtable是线程安全的,适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,
HashMap是快速失败的。另一方面,Hashtable提供了对键的列举。
一般认为Hashtable是一个遗留的类。