57-71 容器考点 一、Collection框架结构,List,Set,Map三个接口的区别,存取元素的特点。你所知道的集合类有哪些,主要方法? 二、Collection和Collections区别 三、Collection框架实现比较要实现什么接口 四、各种容器类的区别 五、去掉Vector集合中的重复元素 六、两个对象值相同(x.equals(y)==true),但有不同的hashcode。这句话对吗? 七、TreeSet里面放对象,如果同时放入父类和子类对象,比较时使用的是父类的还是子类的compareTo(),还是抛异常?

注意List,Set继承自Collection,Map不继承Collection。

57-71 容器考点
一、Collection框架结构,List,Set,Map三个接口的区别,存取元素的特点。你所知道的集合类有哪些,主要方法?
二、Collection和Collections区别
三、Collection框架实现比较要实现什么接口
四、各种容器类的区别
五、去掉Vector集合中的重复元素
六、两个对象值相同(x.equals(y)==true),但有不同的hashcode。这句话对吗?
七、TreeSet里面放对象,如果同时放入父类和子类对象,比较时使用的是父类的还是子类的compareTo(),还是抛异常?

二、Collection和Collections区别

1、java.util.Collection接口:是集合类的上级接口,继承他的接口主要有Set和List。

2、java.util.Collections类:是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

三、Collection框架实现比较要实现什么接口

  Comparable 和 Comparator 都是用来实现集合中元素的比较、排序的。只是 Comparable 是在集合内部定义的方法实现的排序,而Comparator 是在集合外部实现的排序。所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

1、实现java.lang.Comparable接口(集合本身实现该接口)

  重写该接口的唯一方法 int compareTo(T o)方法。

public class User implements Comparable{}//是User类继承该接口
使用时Arrays.sort(users);

2、实现java.util.Comparator接口(集合外定义一个类实现该接口)

  重写该接口的两个方法:int compare(T o1, T o2)和boolean equals(Object obj)。

public class SampleComparator implements Comparator{}//不是User类继承该接口
使用时Arrays.sort(array, new SampleComparator()); //需传入该接口的实例化对象

四、各种容器类的区别

1、ArrayList和Vector的区别

相同点:二者都继承了List接口,是有序集合,允许重复元素,使用数组方式存储数据,可以按索引号取出元素。(HashSet之类的集合不允许重复,不可按索引号取元素)

区别:

(1)Vector是线程安全的,适合多线程的情况;ArrayList线程不安全,效率高。

  注意:Vector和Hashtable是旧的,线程安全的(即方法是synchronized的);ArrayList与HashMap是后来才提供的,线程不安全,多线程访问时需要为它提供外同步。

(2)二者都有一个初始容量(可以自己设置),当存储元素超过容量时,Vector默认增长为原来两倍(可以自己设置);ArrayList增长为原来1.5倍(不可自己设置)。

2、HashMap和Hashtable区别

(1)HashMap实现Map接口,Hashtable实现Map接口,同时也继承陈旧的Dictionary类。

(2)HashMap非线程安全,效率高;Hashtable线程安全。

(3)HashMap允许有一个null key;Hashtable不允许null key。

(4)迭代 HashMap 采用快速失败机制,而 Hashtable 不是,所以这是设计的考虑点。

补充:我们知道java.util.HashMap不是线程安全的,因此如果在使用迭代器的过程中有其他线程修改了map,那么将抛出ConcurrentModificationException,这就是所谓fail-fast策略。

3、ArrayList,Vector,LinkedList的存储性能和特点

  三者都实现List接口,其中ArrayList和Vector继承AbstractList,LinkedList继承AbstractSequentialList。

(1)ArrayList和Vector都是使用数组方式存储元素,查找快,插入慢;

  LinkedList使用双向链表实现存储,查找慢,插入快。LinkedList提供了一些方法,它可以被当做堆栈和队列使用。

(2)ArrayList和LinkedList线程不安全;Vector线程安全。

五、去掉Vector集合中的重复元素

HashSet set = new HashSet(vector);

六、两个对象值相同(x.equals(y)==true),但有不同的hashcode。这句话对吗?

  对!

  如果对象保存在HashSet或HashMap中,那么如果x.equals(y)==true,则hashcode必须相等。

  如果对象不是保存在HashSet或HashMap中,则hashcode可以不等。例如ArrayList中的对象可以不重写hashcode(),当然,我们建议重写,因为关于hashcode的常规规定是:如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。

七、TreeSet里面放对象,如果同时放入父类和子类对象,比较时使用的是父类的还是子类的compareTo(),还是抛异常?

  当前add方法放入的是哪个对象,就调用那个对象的compareTo方法,至于这个方法怎么做,就要看它如何被重写的。