IT form 整理4(集合方面)

来源:互联网 发布:pkzip算法 编辑:程序博客网 时间:2024/04/29 03:36

1,介绍Collection框架的结构..

从网上搜集了一个觉得比较合理的答案。

框架的完整结构(Collection)

1.类集框架最大的接口:Collection、Map、Iterator、Enumeration

2.Collection:存放单值

   |- List:允许有重复内容,有序

       |- ArrayList:异步处理,新的操作类,非线程安全。

       |- Vector:同步处理,旧的操作类,线程安全。支持Enumeration输出

   |- Set:不允许有重复内容,无序,靠hashCoke()和equals()进行重复的严重

       |- HashSet:无序存放

       |- TreeSet:有序存放,安Comparable排序

3.Map:存放一对值

   |- HashMap:新的类,异步处理,非线程安全,允许有null

   |- Hashtable:旧的类,同步处理,线程安全,不允许有null

        |- Properties:属性操作类

   |- TreeMap:有序排列,按key排序,根据Comparable指定排序规则

4.Iterator:

   |- 迭代输出,依靠Collection接口中的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方法就有可能出现这种情况。 

0 0
原创粉丝点击