1,介绍Collection框架的结构..
从网上搜集了一个觉得比较合理的答案。
框架的完整结构(Collection)
1.类集框架最大的接口:Collection、Map、Iterator、Enumeration
2.Collection:存放单值
3.Map:存放一对值
4.Iterator:
5.Enumeration:旧的输出标准
摘抄书上一段话:(1)java容器类库中一共有两种主要类型:Collection 和Map;两者的区别在于每个“槽”内所存储的元素个数不同。前者是只有一个元素,后者是键值对。
(2)容器仅仅能持有对象引用,而不是将对象信息复制一份至数列某位置,一旦将 对象置入容器内,便损失了该对象的类别信息。
网上好了一个详细的解释“://www.jb51.net/article/32152.htm”(http)
2,Collection框架中实现比较要实现什么接口.
由集合排序引出的两个比较接口:comparable(java.lang包中),comparator(java.util包中)
1:二者使用目的:
如果一个类的不同对象之间需要比较大小,那么就需要实现这两个接口。根据业务需要定义比较规则。
2:使用区别
(1)comparable接口
是需要比较的类自己实现,例如:定义的Student类需要进行比较,那么就需要由Student类自己实现这个接口,实现comparaTo()方法。
(2)comparator接口
自定义一个比较器类,去实现这个接口的compare,然后在在集合对象生成的时候,用一个比较器对象做参数,跟集合绑定。例如:
ClassAimplementsComparator{}//定义一个比较器类Aa=newA();//生成一个比较器对象
Setset=newTreeSet(a);//在构造一个集合对象时,传入比较器
3,ArrayList和Vector的区别.
(1)ArrayList和Vector功能类似:整体上ArrayList是Vector的“裸奔新版”,Vector从Java 1.0起就存在,ArrayList从Java 1.2起才存在,较新。 所以Vector在JavaME、Card等各种微小版本都可以使用,而ArrayList不能。 ArrayList不具备线程同步的安全性,但速度较快,所以叫裸奔。Vector具备线程安全。(2)非常有道理的一个解释“://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857791.html” (+http)
首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:
(1)ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
(2)Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
(3)LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
(4)在扩充容量时:关于ArrayList和Vector区别如下:
(1)ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
(2)Vector提供indexOf(obj, start)接口,ArrayList没有。
(3)Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。
4,HashMap与Hashtable的区别:
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,
(1)主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。(HashMap没有分类或者排序,它允许一个null键和多个null值;Hashtable类似于HashMap,但是不允许null键和null值)
(2)Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。HashMap把Hashtable的contains方法去掉了,改成containsvalue(如果相对应的map对应指定的value有多个key,返回值为真)和containsKey(如果对指定的key,map存在相应的映射则返回为真)。因为contains(检测哈希表中是否有value和key存在对应)方法容易让人引起误解。
(3)最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步(Collections.synchronizedMap)。 Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。
5,去掉一个Vector集合中重复的元素.
(1)方法一:在插入时做限制,不允许插入重复值:
import java.util.Vector;
public class DeleteVector {
public static void main(String []args){
Vector<String> vector = new Vector<String>();
addObject(vector, "aa");
addObject(vector, "bb");
addObject(vector, "cc");
addObject(vector, "aa");
addObject(vector, "dd");
addObject(vector, "bb");
System.out.println(vector);
}
public static void addObject(Vector<String> c,String str){
if(!c.contains(str)){
c.add(str);
}
}
}
(2)插入后,利用HashSet做修改:
import java.util.HashSet;
import java.util.Vector;
public class DeleteVector {
public static void main(String []args){
Vector<String> vector = new Vector<String>();
vector.add("1");
vector.add("2");
vector.add("2");
vector.add("3");
vector.add("4");
vector.add("5");
vector.add("4");
vector.add("5");
//HashSet是set的一个实现类,以对象作为元素,拒绝接受重复的对象,允许使用null元素。
HashSet<String> hs = new HashSet<String>(vector);
System.out.println(hs);
}
}
6,
Collection和 Collections的区别
(1)Collection是个java.util下的接口,它是各种集合结构的父接口。
(2)Collections是个java.util下的类,它包含有各种有关集合操作的静态方法。
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。
collections 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 collection 支持的新 collection,以及少数其他内容。 如果为此类的方法所提供的 collection 或类对象为 null,则这些方法都会抛出 NullPointerException 。7, 两个对象值相同(x.equals(y)== true),但却可有不同的hash code,这句话对不对?
按照API规定:equal相等,hashcode也一定相等 ; hashcode不等,equal也一定不等;但也可以不按照这个协定。
如果你重写了equals方法而没有重写hashcode方法就有可能出现这种情况。