标签:
重温下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接口的常用类有LinkedList,ArrayList,Vector和Stack。
<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也有两种:排序的和不排序的,不排序的包括HashMap、Hashtable,排序的包括TreeMap和LinkedHashMap。
LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。
面试中较多话题
1、HashMap和Hashtable的区别
都属于Map接口的类,实现了将惟一键映射到特定的值上。
(1).历史原因:
Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
(2).同步性:
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
(3).值:
HashMap 类没有分类或者排序。它允许一个 null 键和多个 null 值。
Hashtable 类似于 HashMap,但是不允许 null 键和 null 值。
(4).效率:
Hashtable 比 HashMap 慢,因为它是同步的。
怎样使HashMap同步
HashMap可以通过Map m =Collections.synchronizedMap(hashMap)来达到同步的效果。
2、ArrayList和Vector的区别
ArrayList与Vector主要从二方面来说.
(1).同步性:
Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
(2).操作:
由于Vector支持多线程操作,所以在性能上就比不上ArrayList了。
(3).数据增长:
ArrayList和Vector都有一个初始的容量大小,当存储进去它们里面的元素个数超出容量的时候,就需要增加ArrayList和Vector的存储空间,每次增加存储空间的时候不是只增加一个存储单元,是增加多个存储单元。
Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍。
Vector可以由我们自己来设置增长的大小,ArrayList没有提供相关的方法。
3、LinkedList与ArrayList有什么区别
两者都实现的是List接口,不同之处在于:
(1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。
(2)、get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端
(3)、对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据
附加:
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list =Collections.synchronizedList(new LinkedList(…));
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/cherishme1988/article/details/47211801