看了一些所谓大公司的JAVA面试问题,发现对于JAVA集合类的使用都比较看重似的,而自己在这方面还真的是所真甚少,抽空也学习学习吧。
java.util包中包含了一系列重要的集合类,而对于集合类,关键必须把握的便是它的内部构造,及其遍历集合的迭代更新方式。
接口:Collection
Collection是基础的集合接口,一个Collection意味着一组Object,即Collection的元素(Elements)。一些Collection容许相同的元素而另一些不好。一些能排列而另一些不好。JavaSDK不提供立即继承自Collection的类,JavaSDK提供的类全是继承自Collection的“子接口”如List和Set。
全部实现Collection接口的类都务必提供2个规范的构造函数:无主要参数的构造函数用以建立一个空的Collection,有一个Collection主要参数的构造函数用以建立一个新的Collection,这一新的Collection与传到的Collection有相同的元素。后一个构造函数容许客户拷贝一个Collection。
关键的一个接口方法:booleanadd(Ojbectc)
尽管回到的是boolean,但并不是表明添加取得成功是否,这一返回值表明的实际意义是add()实行后,集合的内容是不是更改了(便是元素的总数、部位等有没有转变)。相近的addAll,remove,removeAll,remainAll也是一样的。
用Iterator方式实现遍历集合
Collection有一个重要的方法:iterator(),回到一个Iterator(迭代器),用以遍历集合的全部元素。Iterator方式可以把浏览逻辑性从不一样的集合类中抽象性出去,进而防止向手机客户端曝露集合的内部构造。典型性的使用方法以下:
Iteratorit=collection.iterator();//得到一个迭代器while(it.hasNext()){
Objectobj=it.next();//获得下一个元素
}
不用维护保养遍历集合的“表针”,全部的內部情况都由Iterator来维护保养,而这一Iterator由集合类根据加工厂方法转化成。
每一种集合类回到的Iterator实际种类很有可能不一样,但他们都实现了Iterator接口,因而,大家不用关注到底是哪样Iterator,它只必须得到这一Iterator接口就可以,这就是接口的益处,面向对象编程的杀伤力。
要保证遍历全过程圆满完成,务必确保遍历全过程中不变更集合的内容(Iterator的remove()方法以外),因此,保证遍历靠谱的标准是:只在一个进程中使用这一集合,或者在线程同步中对遍历编码开展同歩。
由Collection接口继承的2个接口是List和Set。
List接口
List是井然有序的Collection,使用此接口可以精准的操纵每个元素插进的部位。客户可以使用数据库索引(元素在List中的部位,类似数组下标)来浏览List中的元素,这类似Java的数字能量数组。和下边要提及的Set不一样,List容许有相同的元素。
除开具备Collection接口必需的iterator()方法外,List还提供一个listIterator()方法,回到一个ListIterator接口,和规范的Iterator接口对比,ListIterator多了一些add()这类的方法,容许添加,删掉,设置元素,还能往前或向后遍历。
实现List接口的常见类有LinkedList,ArrayList,Vector和Stack。
LinkedList类
LinkedList实现了List接口,容许null元素。除此之外LinkedList提供附加的get,remove,insert方法在LinkedList的第一部或尾端。这种实际操作使LinkedList可被作为局部变量(stack),序列(queue)或双重序列(deque)。
留意LinkedList没有同歩方法。假如好几个进程另外浏览一个List,则务必自己实现浏览同歩。一种处理方法是在建立List时结构一个同歩的List:
Listlist=Collections.synchronizedList(newLinkedList(…));
ArrayList类
ArrayList实现了可变性尺寸的数字能量数组。它容许全部元素,包含null。ArrayList没有同歩。
size,isEmpty,get,set方法运作時间为参量。可是add方法花销为平摊的参量,添加n个元素必须O(n)的時间。别的的方法运作時间为线形。
每个ArrayList案例都是有一个容积(Capacity),即用以储存元素的数字能量数组的尺寸。这一容积可伴随着持续添加新元素而全自动提升,可是提高优化算法并没有界定。当必须插进很多元素时,在插进前可以启用ensureCapacity方法来提升ArrayList的容积以提升插进高效率。
和LinkedList一样,ArrayList也是是非非同歩的(unsynchronized)。
Vector类
Vector十分相近ArrayList,可是Vector是同歩的。由Vector建立的Iterator,尽管和ArrayList建立的Iterator是同一接口,可是,由于Vector是同歩的,当一个Iterator被建立并且已经被使用,另一个进程更改了Vector的情况(比如,添加或删除了一些元素),这时候启用Iterator的方法时将抛出去ConcurrentModificationException,因而务必捕捉该出现异常。
Stack类
Stack继承自Vector,实现一个后进先出的局部变量。Stack提供五个附加的方法促使Vector得到被当作局部变量使用。基础的push和pop方法,也有peek方法获得栈顶的元素,empty方法检测局部变量是不是为空,search方法检验一个元素在局部变量中的部位。Stack刚建立后是空栈。
Set接口
Set是一种不包含反复的元素的Collection,即随意的2个元素e1和e2都是有e1.equals(e2)=false,Set多有一个null元素。
很显著,Set的构造函数有一个约束,传到的Collection主要参数不能包含反复的元素。
请注意:务必当心实际操作可变性对象(MutableObject)。假如一个Set中的可变性元素更改了本身情况造成 Object.equals(Object)=true将造成 一些问题。
Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。