Collection接口,集合框架

来源:互联网 发布:空间地理基础数据库 编辑:程序博客网 时间:2024/05/16 13:51
1.
*什么是集合

*通常情况下,把具有相同性质的一类东西,汇聚成一个整体,就可以称为

集合。

*什么是集合框架

*集合框架是为表示和操作集合而规定的一种统一的标准的体系结构。任何

集合框架都包含三大块内容:对外的接口、接口的实现和对集合运算的算法。

*接口:即表示集合的抽象数据类型。

*实现:也就是集合框架中接口的具体实现。

*算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的

计算的方法,例如查找、排序等。 


2.
*Collection集合层次中的根接口,JDK没有提供这个接

口直接的实现类。
*
*Set接口继承Collection,但不允许重复,使用自己内部

的一个排列机制。
*
*List接口继承Collection,允许重复,以元素安插的次

序来放置元素,不会重新排列。提供了按索引访问的方式。
*
*Map接口是一组成对的键-值对象,即所持有的是key-

value pairsMap中不能有重复的key。拥有自己的内

部排列机制。
*
*容器中的元素类型都为Object。从容器取得元素时,必

须把它转换成原来的类型。

3.java.util.ArrayList实现了List接口,用于描述长度可

变的数组列表(底层采用数组实现)。可以将ArrayList

象成一种可以自动增加容量,可以存放不同类型对象的
数组。

4.
* HashMapHashtable的区别:
*Hashtable中的“key”和“value”都不允许null
HashMap允许。

Hashtable是线程安全的,适合在多用户环境中使用,效
率稍
低;HashMap不是线程安全的,效率稍高,适合环境下
5.
*集合框架中有两种常规的List

现:ArrayListList接口的大小可变数组的实现。实

现了所有可选列表操作,并允许包括null在内的所有
元素。
*LinkedListList接口的链接列表实现。实现所有可

选的列表操作,并且允许所有元素(包括null)。

*使用那种List的实现取决于您特定的需要:

*如果要支持随机访问,而不必在除尾部的任何位置插入或除

去元素,那么,ArrayList提供了可选的集合。

*但如果,您要频繁的从列表的中间位置添加和除去元素,而

只要顺序的访问列表元素,那么,LinkedList实现更好。

 

Set接口是Collection的子接口,Set接口没有提供新增的方


法,但实现Set接口的容器中元素不可以重复。JDK中提供的实

Set接口的类有HashSetTreeSet等:


*TreeSet:基于平衡树的方式存放数据(支持排序)

*HashSet:基于散列表的方式存放数据(无顺序)

   *在选择的时候,如果顺序很重要,则可以选择

     TreeSet,如果操作性能和时间效率很重要的话

以选择HashSet



============================面试题=============================
1、说出ArrayList,Vector, LinkedList的存储性能和特性
 ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储
 的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素
要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快

2. 各种线性表选择策略

  1. 数组:是以一段连续内存保存数据的;随机访问是最快的,但不支持插入、删除、迭代等操作。
  2. ArrayList与ArrayDeque:以数组实现;随机访问速度还行,插入、删除、迭代操作速度一般;线程不安全。
  3. Vector:以数组实现;随机访问速度一般,插入、删除、迭代速度不太好;线程安全的。
  4. LinkedList:以链表实现;随机访问速度不太好,插入、删除、迭代速度非常快。


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


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

  答:就ArrayList与Vector主要从二方面来说:

  1、同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的

  2、数据增长:当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半

  就HashMap与HashTable主要从三方面来说:

  1、历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是

Java 1.2引进的Map接口的一个实现

  2、同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的

  3、值:只有HashMap可以让你将空值作为一个表的条目的key或value 

4、Collection 和 Collections的区别。 

  Collection是集合类的上级接口,继承与他的接口主要有Set 和List.

      Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对

各种集合的搜索、排序、线程安全化等操作。

 如在COLLECTION框架中,实现比较要实现什么样的接口? Collection框架

中实现比较要实现Comparable 接口和 Comparator 接口 

5、HashMap和Hashtable的区别。
 
    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算法都大概一样,所以性能不会

有很大的差异。

6、List, Set, Map是否继承自Collection接口?
       List,Set是,Map不是

7、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==

还是equals()? 它们有何区别?

    Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。

equals()是判读两个Set是否相等。

      equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,

为的是当两个分离的对象的内容和类型相配的话,返回真值。

8、你所知道的集合类都有哪些?主要方法?

 最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和

 Vector,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象

的元素列表。 List 适用于按数   值索引访问元素的情形。
 
   Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称

作"键"和"值"),其中每个键映射到一个值。

9、List、Map、Set三个接口,存取元素时,各有什么特点?

      List 以特定次序来持有元素,可有重复元素。

      Set 无法拥有重复元素,内部排序。

      Map 保存key-value值,value可多值。

10、介绍JAVA中的Collection FrameWork(包括如何写自己的数据结构)? 
答:Collection FrameWork如下:
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)
Map提供key到value的映射

11.Java集合框架的基础接口有哪些?

Collection为集合层级的根接口。一个集合代表一组对象,这些对象即为它的元素。Java平台不提供这个接口任何直接的实现。

Set是一个不能包含重复元素的集合。这个接口对数学集合抽象进行建模,被用来代表集合,就如一副牌。

List是一个有序集合,可以包含重复元素。你可以通过它的索引来访问任何元素。List更像长度动态变换的数组。

Map是一个将key映射到value的对象。一个Map不能包含重复的key:每个key最多只能映射一个value。

一些其它的接口有Queue、Dequeue、SortedSet、SortedMap和ListIterator。


12.· Collection 接口是一组允许重复的对象。 
· Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制。 
· List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列。
· Map接口是一组成对的键-值对象,即所持有的是key-value pairs。Map中不能有重复的
key。拥有自己的内部排列机制。


List、Map、Set三个接口,存取元素时,各有什么特点?


ListSet都是单列元素的集合,它们有一个功共同的父接口Collection

Set里面不允许有重复的元素,

存元素:add方法有一个boolean的返回值,当集合中没有某个元素,此时add方法可成功加入该元素时,则返回true;当集合含有与某个元素equals相等的元素时,此时add方法无法加入该元素,返回结果为false

取元素:没法说取第几个,只能以Iterator接口取得所有的元素,再逐一遍历各个元素。

 

List表示有先后顺序的集合

存元素:多次调用add(Object)方法时,每次加入的对象按先来后到的顺序排序,也可以插队,即调用add(int index,Object)方法,就可以指定当前对象在集合中的存放位置。

取元素:方法1Iterator接口取得所有,逐一遍历各个元素

        方法2调用get(index i)来明确说明取第几个。

 

Map双列的集合,存放用put方法:put(obj key,obj value),每次存储时,要存储一对key/value,不能存储重复的key,这个重复的规则也是按equals比较相等。

取元素:用get(Object key)方法根据key获得相应的value

        也可以获得所有的key集合,还可以获得所有的value集合,

        还可以获得keyvalue组合成的Map.Entry对象的集合。

 

List以特定次序来持有元素,可有重复元素。Set 无法拥有重复元素,内部排序。Map 保存key-value值,value可多值。


线程数组HashMap为什么是线程不安全的?

一直以来只是知道HashMap是线程不安全的,但是到底HashMap为什么线程不安全,多线程并发的时候在什么情况下可能出现问题?    HashMap底层是一个Entry数组,当产生hash冲突的时候,hashmap是采取链表的方法来解决的,在对应的数组位置寄存链表的头结点。对链表而言,新加入的节点会从头结点加入

在hashmap做put操纵的时候会调用到以上的方法。当初假如A线程和B线程同时对同一个数组位置调用addEntry,两个线程会同时得到当初的头结点,然后A写入新的头结点以后,B也写入新的头结点,那B的写入操纵就会覆盖A的写入操纵造成A的写入操纵丧失