集合总结 Java

发布时间:

7.12.集合
集合对象:用于管理其他若干对象的对象数组:长度不可变
List:有顺序的,元素可以重复遍历:for迭代
排序:ComparableComparatorCollections.sort(ArrayList:底层用数组实现的List
特点:查询效率高,增删效率低轻量级线程不安全LinkedList:底层用双向循环链表实现的List特点:查询效率低,增删效率高
Vector:底层用数组实现List接口的另一个类特点:重量级,占据更多的系统开销线程安全
Set:无顺序的,元素不可重复(值不相同)遍历:迭代
排序:SortedSet
HashSet:采用哈希算法来实现Set接口
唯一性保证:重复对象equals方法返回为true
重复对象hashCode方法返回相同的整数不同对象哈希码尽量保证不同(提高效率)
SortedSet:对一个Set排序
TreeSet:在元素添加的同时,进行排序。也要给出排序规则
唯一性保证:根据排序规则,compareTo方法返回为0就可以认定两个对象中有一个是重复对象。
Map:元素是键值对key:唯一,不可重复value:可重复遍历:先迭代遍历key的集合,再根据key得到valueHashMap:轻量级线程不安全允许key或者valuenullHashtable:重量级线程安全不允许key或者valuenullPropertiesHashtable的子类,keyvalue都是String
SortedMap:元素自动对key排序TreeMap
集合是指一个对象可以容纳了多个对象(不是引用)这个集合对象主要用来管理维护一系列相似的对象。
7.12.1.集合接口类层次位于packagejava.util.*;Collection
|ˉˉˉˉˉˉ|

SetListMap||SortedSetSortedMap
1Set:集合类中不允许有重复对象;
2SortedSet:Set接口同,但元素按升序排列;
3List:元素加载和移出时按照顺序,可以保存重复对象。4Map:(key-value存储了唯一关键字辨识和对应的值。5SortedMap:Map类同,但对象按他们关键字的升序排列。
7.12.2.集合类层次
(注:JAVA1.5JAVA1.4的最大改进就是增加了对范型的支持)
Collection
|ˉˉˉˉˉˉ|
HashSetLinkedListHashtable(SetVector,ArrayListHashmap(List(Map||TreeSetTreeMap(SortedSet(SortedMapCollection接口的方法:add(Objecto
addAll(Collectionccontains(Objecto
containsAll(Collectioncremove(Objecto
removeAll(Collectioncclear(
equals(ObjectoisEmpty(iterator(size(toArray(
toArray(Object[]o
7.12.3.五个最常用的集合类之间的区别和联系1ArrayList:元素单个,效率高,多用于查询2Vector:元素单个,线程安全,多用于查询3LinkedList:元素单个,多用于插入和删除

4HashMap:元素成对,元素可为空
5HashTable:元素成对,线程安全,元素不可为空
ArrayList
底层是Object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点。而在LinkedList的底层是一种双向循环链表。在此链表上每一个数据节点都由三部分组成:前指针(指向前面的节点的位置),数据,后指针(指向后面的节点的位置)。最后一个节点的后指针指向第一个节点的前指针,形成一个循环。双向循环链表的查询效率低但是增删效率高。
ArrayListLinkedList在用法上没有区别,但是在功能上还是有区别的。
LinkedList
经常用在增删操作较多而查询操作很少的情况下:队列和堆栈。队列:先进先出的数据结构。栈:后进先出的数据结构。
注意:使用栈的时候一定不能提供方法让不是最后一个元素的元素获得出栈的机会。
Vector
(与ArrayList相似,区别是Vector是重量级的组件,使用使消耗的资源比较多。结论:在考虑并发的情况下用Vector(保证线程的安全)在不考虑并发的情况下用ArrayList(不能保证线程的安全)
面试经验(知识点)java.util.stackstack即为堆栈)的父类为Vector可是stack的父类是最不应该为Vector的。因为Vector的底层是数组,且Vectorget方法(意味着它可能访问到并不属于最后一个位置元素的其他元素,很不安全)对于堆栈和队列只能用push类和get类。Stack类以后不要轻易使用。实现栈一定要用LinkedList
(在JAVA1.5中,collectionqueue来实现队列。
Set-HashSet实现类:
遍历一个Set的方法只有一个:迭代器(interator
HashSet中元素是无序的(这个无序指的是数据的添加顺序和后来的排列顺序不同)而且元素不可重复。
Object中除了有finalize(toString(equals(,还有hashCode(HashSet底层用的也是数组。
当向数组中利用add(Objecto添加对象的时候,系统先找对象的hashCodeinthc=o.hashCode(;返回的hashCode为整数值。IntI=hc%n;n为数组的长度),取得余数后,利用余数向数组中相应的位置添加数据,以n6为例,如果I=0则放在数组a[0]位置,如果I=1,则放在数组a[1]位置。如果equals(返回的值为true,则说明数据重复。如果equals(返回的值为false,则再找其他的位置进行比较。这样的机制就导致两个相同的对象有可能重复地添加到数组中,因为他们的hashCode不同。

如果我们能够使两个相同的对象具有相同hashcode,才能在equals(返回为真。在实例中,定义student对象时覆盖它的hashcode
因为String类是自动覆盖的,所以当比较String类的对象的时候,就不会出现有两个相同string对象的情况。
现在,在大部分的JDK中,都已经要求覆盖了hashCode
结论:如将自定义类用hashSet来添加对象,一定要覆盖hashcode(equals(覆盖的原则是保证当两个对象hashcode返回相同的整数,而且equals(返回值为True
如果偷懒,没有设定equals(,就会造成返回hashCode虽然结果相同,但在程序执行的过程中会多次地调用equals(,从而影响程序执行的效率。
我们要保证相同对象的返回的hashCode一定相同,也要保证不相同的对象的hashCode尽可能不同(因为数组的边界性,hashCode还是可能相同的)
例子:
publicinthashCode({
returnname.hashcode(+age;}
这个例子保证了相同姓名和年龄的记录返回的hashCode是相同的。
使用hashSet的优点:
hashSet的底层是数组,其查询效率非常高。而且在增加和删除的时候由于运用的hashCode的比较开确定添加元素的位置,所以不存在元素的偏移,所以效率也非常高。因为hashSet查询和删除和增加元素的效率都非常高。
但是hashSet增删的高效率是通过花费大量的空间换来的:因为空间越大,取余数相同的情况就越小。HashSet这种算法会建立许多无用的空间。
使用hashSet类时要注意,如果发生冲突,就会出现遍历整个数组的情况,这样就使得效率非常的低。
7.12.4.比较
Collections类(工具类―――全是static方法)
PublicstaticintbinarySearch(Listlist,ObjectkeyPublicstaticvoidSort(Listlist,ComparatorcomPublicstaticvoidsort(Listlist方法一:
Comparator接口
Intcompare(Objecta,ObjectbBooleanequals(Objecto例子:
importjava.util.*;publicclassTest{
publicstaticvoidmain(String[]arg{ArrayListal=newArrayList(;Personp1=newPerson("dudi";Personp2=newPerson("cony";

Personp3=newPerson("aihao";al.add(p1;al.add(p2;al.add(p3;
Collections.sort(al,p1;
for(Iteratorit=al.iterator(;it.hasNext(;{Personp=(Personit.next(;System.out.println(p.name;}}}
classPersonimplementsjava.util.Comparator{
publicStringname;
publicPerson(Stringname{this.name=name;}
publicintcompare(Objecta,Objectb{
if(ainstanceofPerson&&binstanceofPerson{Personpa=(Persona;Personpb=(Personb;
returnpa.name.compareTo(pb.name;}
return0;}
publicbooleanequals(Objecta{returntrue;}}
方法二
Java.lang.Comparable
PublicintcompareTo(Objecto
ClassPersonimplementsjava.lang.Comparable{PublicintcompareTo(Objecto{Comparablec1=(Comparablethis;Comparablec2=(Comparableo;
Returnc1.name.compareTo(c2.name;}}
„„„„„„„„„„„„.}
Main方法中
Collections.sort(list;
*注意:程序员和类库之间是平等的关系,而不是上下级关系,以前的类可以是通过接口调用后来的类
集合的最大缺点是无法进行类型判定(这个缺点在JAVA1.5中已经解决)这样就可能出现因

为类型不同而出现类型错误。
解决的方法是添加类型的判断。7.13.反射
用于工具,架构,动态开发等开发工程三种得到类对象的途径:
Class.forName(name//输入全类名object.getClass(//得到该对象的类对象object.class
无参构造一个对象newInstance(有参的构造一个对象
Constructorcon=c.getConstructor(String.classObjecto=con.newInstance(liucy;
调用对象方法
ClassnewClass=Student.class;//得到一个类对象Objecto=newClass.newInstance(;//产生对象
MethodnewMethod=newClass.getDeclaredMethod("study";//得到这个类的方法类newMethod.invoke(o;//调用方法,需要提供是哪个对象调用和参数
1确定一个对象的类;
2获得一个类的修改符、变量、方法、构器函数、和父类的相类信息;3找出哪些常量和方法是从一个接口声明的;4创建一个在运行时才知道名称的类;5调用对象的方法;
ArrayListVector的区别。
1ArrayListList接口的一个可变长数组实现。实现了所有List接口的操作,并允许存null值。ArrayList基本等同于
Vector,但Vector是线程安全的,也就是说是同步的,而ArrayList是线程不安全的,不是同步的。
2)当需要增长时,Vector默认增长为原来一倍,而ArrayList却是原来的一半。
HashMapHashtable的区别。
1)历史原因:Hashtable是基于陈旧的Dictionary类的,HashMapJava1.2引进的Map接口的一个实现。
2)同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程不安全的,不是同步的。

3)值:只有HashMap可以让你将空值作为一个表的条目的keyvalue,而Hashtable不能为空。
CollectionCollections的区别。
1Collections是个java.util下的类,它包含各种有关集合操作的静态方法,实现对各种集合的搜索、排序、线程安全化等操作。
2Collection是个java.util下的接口,它是各种集合结构的父接口,继承他的接口主要setlist

集合总结 Java

相关推荐