集合

来源:互联网 发布:java get classpath 编辑:程序博客网 时间:2024/05/20 08:45
Collection和Collections的区别?
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。


Set里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用==还是equals()?他们有何区别

1、什么是Set?(what)

     Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象。

2、如何来区分重复与否呢?(how)

     “ 用 iterator() 方法来区分重复与否 ”,这是在网上流传的答案,个人认为这是个错误的答案。JPI中写的很明白:“set 不包含满足

e1.equals(e2) 的元素对 e1e2 ”,由此可见回答使用equals()区分更合适。

 3、为什么用equals()而不用==来区分?(why)

   应该从它俩的区别谈起,==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是

对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,

也就出现了重复元素。所以应该用equals()来判断。


List,set,Map是否集成Collection接口?

List,Set是,Map不是。

如图:

      Collection

  List

  LinkedList

  ArrayList

    Vector

  Stack

  Set

  Map

  Hashtable

  HashMap

  WeakHashMap

      Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java JDK不能提供直接继承自Collection的类,Java JDK提供的类都是继承自Collection的"子接口",如:List和Set。

        注意:Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当做一组key集合,一组value集合,或者一组key-value映射。


看JDK源码:

两个对象值相同(x.equals(y)==true),但却有不同的hash code,这句话对不对?
值相同使用equals方法来判断,equals方法重写后不一定是判断对象是否是同一个对象
所以hashcode不同是很正常的
就好比我定义个类,有名字和编号
我重写equals方法,让名字相同就返回相等
那么我虽然有hashcode不同的两个对象(他们的编号都可以不同,或者两个对象的所有属性值都一样)
但他们的hashcode当然不同
因为根本就不是一个对象
说出ArrayList,Vector,LinkedList的储存性能和特性
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。


HashMap和Hashtable的区别

1 HashMap不是线程安全的

hastmap是一个接口 是map接口的子接口,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。HashMap允许null key和null value,而hashtable不允许。


2   HashTable是线程安全的一个Collection。


HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
Hashtable继承自Dictionary类,而HashMap是Java1.2引进的Map interface的一个实现。
最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多个线程访问Hashtable时,不需要自己为它的方法实现同步,而HashMap 就必须为之提供外同步。
Hashtable和HashMap采用的hash/rehash算法都大概一样,所以性能不会有很大的差异。


ArrayList和Vector的区别,HashMap和Hashtable的区别

ArrayList与Vector主要从二方面来说: 
   1、同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的 
   2、数据增长:当需要增长时,Vector默认增长为原来一倍ArrayList却是原来的一半 
  就HashMapHashTable主要从三方面来说:
   1、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
   2同步性Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
   3、值:只有HashMap可以让你将空值作为一个表的条目的key或value