码迷,mamicode.com
首页 > 编程语言 > 详细

Java集合 -Collection

时间:2015-08-02 23:33:06      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

重温下Java集合知识,这块是面试以及项目开发中常常涉及到的知识点,以作记录。


声明一个数组就是在内存空间划出一串连续的空间。数组是比较常用的一种数据结构,但是在项目开发中,由于某些不确定因素,需要采用集合来实现,比如:

1、数组的容量大小是固定的,针对容量扩容情况,array不支持;

2、数组元素类型为相同数据类型,集合可存储不同数据类型元素。

同时Array和Collection又存在关联性,使用相应的toArray()和Arrays.asList()方法可以回想转换。Collection集合可以理解成一个动态的数组,不同的是集合对象中内容可以任意扩充。

<1> 集合体系

List、Set、Map是集合体系中重要的三个接口,List,Set具备相似性,都继承于Collection接口,是单列元素的集合;Map则是双列元素集合。

技术分享

<1.1>List接口
  API中写道:List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标,下标从0开始)来访问List中的元素,这类似于Java的数组。Java中的List是对数据进行有效的扩展,创建时如果不使用泛型,可以容纳任何类型的元素;如果使用,则只能容纳泛型指定类型的元素。

和下面要提到的Set不同,List允许有相同的元素,并且允许元素为null。一个对象可以反复存储进List集合中,每调用一次Add()方法,这个对象就被插入进集合。其实是集合集合中用一个索引变量指向这个对象。List除了可以用Iterator接口取得所有元素外,还可以用get(index i)明确指定第几个元素。
  实现List接口的常用类有LinkedListArrayListVectorStack

<span style="font-family:SimSun;font-size:12px;"><span style="font-family:SimSun;">                List list = new ArrayList() ;
		Random random = new Random() ;
		// add random elements to the list;
		for(int temp =0;temp<5;temp++){
			list.add(new Integer(random.nextInt(10))) ;
		}
		System.out.println(list);
		Iterator it = list.iterator() ;
		//iterator the list elements;
		while(it.hasNext()){
			System.out.print(it.next()+"--");
		}
</span></span>

<1.1.1>LinkedList类
  LinkedList实现了List接口,允许null元素。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列双端队列

注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
    List list =Collections.synchronizedList(new LinkedList(...));

<1.1.2>ArrayList类
  ArrayList实现了可变大小的数组。ArrayList实现了可选列表操作,允许所有元素,包括null。和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

<1.1.3>Vector类
    Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。区别在于,Vector是线程同步的。

<1.1.4>Stack 类
  Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

<1.2>Set接口

Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素,很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。Set可以大致分为两类:不排序Set和排序Set,不排序Set包括HashSet和LinkedHashSet,排序Set主要指TreeSet。其中HashSet和LinkedHashSet可以包含null。

<1.3>Map接口

Map中存储的是”key-value键值对,和Set类似,Java中的Map也有两种:排序的和不排序的,不排序的包括HashMapHashtable,排序的包括TreeMapLinkedHashMap

LinkedHashMapHashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap

 

面试中较多话题

1、HashMapHashtable的区别

都属于Map接口的类,实现了将惟一键映射到特定的值上。   

(1).历史原因:

Hashtable是基于陈旧的Dictionary类的,HashMapJava 1.2引进的Map接口的一个实现  

(2).同步性:

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

(3).值:

 HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。 

 Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。

(4).效率:

Hashtable  HashMap 慢,因为它是同步的。

怎样使HashMap同步

HashMap可以通过Map m =Collections.synchronizedMaphashMap)来达到同步的效果。

2、ArrayListVector的区别

ArrayListVector主要从二方面来说.  

(1).同步性:

   Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。

(2).操作:

    由于Vector支持多线程操作,所以在性能上就比不上ArrayList了。

(3).数据增长:

      ArrayListVector都有一个初始的容量大小,当存储进去它们里面的元素个数超出容量的时候,就需要增加ArrayListVector的存储空间,每次增加存储空间的时候不是只增加一个存储单元,是增加多个存储单元。

      Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍。

      Vector可以由我们自己来设置增长的大小,ArrayList没有提供相关的方法。

3LinkedListArrayList有什么区别

两者都实现的是List接口,不同之处在于:

1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。

2)、get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端

3)、对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据

附加:

      LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的getremoveinsert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

      注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List

List list =Collections.synchronizedList(new LinkedList());

版权声明:本文为博主原创文章,未经博主允许不得转载。

Java集合 -Collection

标签:

原文地址:http://blog.csdn.net/cherishme1988/article/details/47211801

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!