大内高手社区
标题:
Java Collection类
[打印本页]
作者:
花不败
时间:
2021-12-23 16:11
标题:
Java Collection类
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。JavaSDK不提供直接继承自Collection的类,JavaSDK提供的类都是继承自Collection的“子接口”如List和Set。
一、语法
publicinterfaceCollection<E>extendsIterable<E>{}
它是一个接口,是高度抽象出来的集合,它包含了集合的基本操作:添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等。
二、方法
booleanadd(Ee)
确保此collection包含指定的元素(可选操作)。
booleanaddAll(Collectionc)
将指定collection中的所有元素都添加到此collection中(可选操作)。
voidclear()
移除此collection中的所有元素(可选操作)。
booleancontains(Objecto)
如果此collection包含指定的元素,则返回true。
booleancontainsAll(Collectionc)
如果此collection包含指定collection中的所有元素,则返回true。
booleanequals(Objecto)
比较此collection与指定对象是否相等。
inthashCode()
返回此collection的哈希码值。
booleanisEmpty()
如果此collection不包含元素,则返回true。
Iteratoriterator()
返回在此collection的元素上进行迭代的迭代器。
booleanremove(Objecto)
从此collection中移除指定元素的单个实例,如果存在的话(可选操作)。
booleanremoveAll(Collectionc)
移除此collection中那些也包含在指定collection中的所有元素(可选操作)。
booleanretainAll(Collectionc)
仅保留此collection中那些也包含在指定collection的元素(可选操作)。
intsize()
返回此collection中的元素数。
Object[]toArray()
返回包含此collection中所有元素的数组。
T[]toArray(T[]a)
返回包含此collection中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。
三、iterator接口
不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。iterator方法如下:
booleanhasNext()
如果仍有元素可以迭代,则返回true。
Enext()
返回迭代的下一个元素。
voidremove()
从迭代器指向的集合中移除迭代器返回的最后一个元素(可选操作)。
Iterator实例
Iteratorit=collection.iterator();//获得一个迭代子
while(it.hasNext()){
Objectobj=it.next();//得到下一个元素
}
四、继承体系
Collection
|-----List有序(存储顺序和取出顺序一致),可重复
|----ArrayList,线程不安全,底层使用数组实现,查询快,增删慢,效率高。
|----LinkedList,线程不安全,底层使用链表实现,查询慢,增删快,效率高。
|----Vector,线程安全,底层使用数组实现,查询快,增删慢,效率低。每次容量不足时,默认自增长度的一倍(如果不指定增量的话),如下源码可知
|-----Set元素唯一一个不包含重复元素的collection。更确切地讲,set不包含满足e1.equals(e2)的元素对e1和e2,并且最多包含一个null元素。
|--HashSet底层是由HashMap实现的,通过对象的hashCode方法与equals方法来保证插入元素的唯一性,无序(存储顺序和取出顺序不一致),。
|--LinkedHashSet底层数据结构由哈希表和链表组成。哈希表保证元素的唯一性,链表保证元素有序。(存储和取出是一致)
|--TreeSet基于TreeMap的NavigableSet实现。使用元素的自然顺序对元素进行排序,或者根据创建set时提供的Comparator进行排序,具体取决于使用的构造方法。元素唯一。
Collection包含了List和Set两大分支:
1)、List是一个有序的队列,每一个元素都有它的索引,第一个元素的索引值是0。List的实现类有LinkedList、ArrayList、Vector和Stack。
(1)、LinkedList实现了List接口,允许元素为空,LinkedList提供了额外的get,remove,insert方法,这些操作可以使LinkedList被用作堆栈、队列或双向队列。
LinkedList并不是线程安全的,如果多个线程同时访问LinkedList,则必须自己实现访问同步,或者另外一种解决方法是在创建List时构造一个同步的List。
(2)、ArrayList实现了可变大小的数组,允许所有元素包括null,同时ArrayList也不是线程安全的。
(3)、Vector类似于ArrayList,但Vector是线程安全的。
(4)、Stack继承自Vector,实现一个后进先出的堆栈。
2)、set是一个不允许有重复元素的集合。set的实现类有Hashset和Treeset。HashSet依赖于HashMap,实际上是通过HashMap实现的;TreeSet依赖于TreeMap,通过TreeMap来实现的。
五、总结
(1)如果涉及到堆栈,队列等操作,应该考虑用List;对于需要快速插入,删除元素,应该使用LinkedList;如果需要快速随机访问元素,应该使用ArrayList。
(2)如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高;如果多个线程可能同时操作一个类,应该使用同步的类。
(3)要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
(4)尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
六、例子
publicclassCollectionReview{
publicstaticvoidmain(String[]args){
test1();
}
privatestaticvoidtest1(){
Collection<String>collection=newVector<>();
collection.add("gogogo");
collection.add("pap");
collection.add("niko");
collection.add("kitty");
Collection<String>coll=newArrayList<>();
coll.add("niko");
coll.add("kitty");
coll.add("pecuyu");
//collection.clear();//清空集合
//System.out.println(collection.isEmpty());//集合是否为空
//intsize=collection.size();//获取集合大小
//System.out.println(size);
//booleancontains=collection.contains("niko");//是否包含另一个元素
//System.out.println(contains);
//booleancontainsAll=collection.containsAll(coll);//是否完全包含另一个集合
//System.out.println(containsAll);
//collection.remove("kitty");//删除第一个匹配项,删除了匹配项则返回true
//booleanremoveAll=collection.removeAll(coll);//删除与指定集合有交集的部分,原集合有改变就返回true
//System.out.println(removeAll);
//booleanretainAll=collection.retainAll(coll);//保留与指定集合有交集的部分,原集合有改变就返回true
//System.out.println(retainAll);
//iterator迭代器,方式1
Iterator<String>iterator=collection.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+"");
}
System.out.println("\n"+"-------------------");
//方式2,for循环完iterator1就会被销毁,节约内存提高效率
for(Iterator<String>iterator1=collection.iterator();iterator1.hasNext();){
System.out.print(iterator1.next()+"");
}
System.out.println("\n"+"-------------------");
Object[]array=collection.toArray();//转化为object数组
for(Objectstring:array){
System.out.print(string+"");
}
System.out.println("\n"+"-------------------");
String[]arr=newString[collection.size()];
String[]array2=collection.toArray(arr);//指定要转化的数组类型
for(Stringstring:array2){
System.out.print(string+"");
}
}
欢迎光临 大内高手社区 (https://bbs.tedu.cn/)
Powered by Discuz! X3.4