java里面集合属于顶层接口之一,也是我们日常使用的基础。梳理下有关知识点。
一概述
Collection接口是 (java.util.Collection)是Java集合类的顶级接口之一。所以不能直接实例化一个Collection,但是可以实例化它的一个子类,Collection接口仅仅只是定义了每个子类共享的一系列方法。看以看上图,他的子类如下:list,set,queue.而map单独一类。
set:不记录元素的保存顺序,且不允许有重复元素; List(列表):记录元素的保持顺序,且允许有重复元素。queue:
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。map是存放kv键值对,方便查找.
二 Collection
增加和移除元素
add()
方法向Collection中增加元素,如果Collection结构改变了,作为add()
方法的结果,将返回true。如果一个Set
的实例中已经存在了这个元素,那么不会重复增加,这个Set
实例的结构也不会发生变化。另一方面,如果在一个List
上调用这个方法,而这个List
已经存在了这个元素,那么这个List
将有两个这个元素。remove()
方法移除一个元素。如果Collection中存在这个元素并且被移除了,这个方法将返回true。如果元素不存在,将返回false。这是对单个元素的操作,对应操作多个元素还有addAll(),removeAll().retainAll()
方法正好和removeAll()
方法相反。不是移除所有给定参数Collection中元素,而是保留保留这些元素,移除其他的。
检测一个Collection是否包含一个确定的元素
Collection接口有两个方法来检查一个Collection是否包含一个或多个元素。这就是
contains()
和
containsAll()
方法。
Collection大小
你可以通过调用size()
方法来检测一个Collection的大小,”Size“表示Collection中的元素个数。
迭代一个Collection
你可以迭代collection中的所有元素,collection中包含的Iterator将完成这件事情,就像下面这样:
1 |
Collection collection = new HashSet(); |
2 |
//... add elements to the collection |
4 |
Iterator iterator = collection.iterator(); |
5 |
while (iterator.hasNext()){ |
6 |
Object object = iterator.next(); |
7 |
//do something to object; |
泛型(Generic)
The Collection interface can be generified like this:
Collection stringCollection = new HashSet();
三 List
因为
List
是一个接口,为了使用它,你必须实例化一个具体的实现,
Collection接口的所有方法在List接口里也适用
,你可以在下列List的实现中选择:
- java.util.ArrayList
- java.util.LinkedList
- java.util.Vector
- java.util.Stack
具体方法参见api,下面demo整理常见方法。
public static void main(String[] args) {
// TODO Auto-generated method stub
List listA = new ArrayList();
//尾部追加元素
listA.add("element 0");
listA.add("element 1");
listA.add("element 2");
//头部插入元素
listA.add(0, "element");
//追加指定collection多个元素到尾部
listA.addAll(new ArrayList());
//打印长度
System.out.println(listA.size());
// 如果列表包含指定的元素,则返回true
listA.contains("test");
//移除元素
listA.remove(0);
listA.remove("element 1");
//获取指定位置元素
listA.get(0);
// 用指定元素替换列表中指定位置的元素
listA.set(0, "set");
// 返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
listA.indexOf("lwc");
//access via new for-loop
for(Object object : listA) {
String element = (String) object;
System.out.println(element);
}
//清空
listA.clear();
System.out.println(listA.size());
}
运行结果:
补
充:关于ArrayList和LinkedList
ArrayList依赖于数组实现的,初始长度为10的Object[],并且可随需要而增加的动态数组。当元素超过10,那么ArrayList底层会新生成一个数组,长度为原来的1.5倍+1, 然后将原数组内容复制到新数组中,并且后续增加的内容会放到新数组中, 当新数组无法容纳增加的元素,重复该过程
ArrayList对随机访问性能很好,但进行大量插入,删除操作,性能很差, 因为操作之后后续元素需要移动
LinkedList功能与ArrayList,Vector相同,内部是依赖双链表实现的,
因此有很好的插入和删除性能,但随机访问元素的性能很差。
LinkedList底层Entry结构
Entry{
Entry previous;
Object element;
Entry next;
}
其中element就是我们添加的元素,最后将生成的Entry对象加入到链表中 。
使用场景:插入和删除操作时,采用LinkedList好,搜索时,采用ArrayList好 。
四 set
set是Collection的子接口,不包含重复元素,最多包含一个null,元素没有顺序 。实现类如下:
- java.util.EnumSet
- java.util.HashSet
- java.util.LinkedHashSet
- java.util.TreeSet
HashSet是基于hashmap实现的,它不保证有序性。
HashSet中是否存在一个对象是通过equals()和hashCode()协同判断 。
LinkedHashSet是Ordered,采用双链表实现的,有固定顺序,也就是插入顺序,LinkedHashSet底层是使用LinkedHashMap实现的 。
SortedSet接口
保证迭代器按照元素递增顺序遍历的集合,可以按照元素的自然顺序进行排序
常用方法
Object first()
返回此有序集合中当前第一个(最小的)元素
Object last()
返回此有序集合中最后一个(最大的)元素
SortedSet headSet(Object toElement)
返回此有序集合的部分视图,其元素严格小于toElement
SortedSet tailSet(Object fromElement)
返回此有序集合的部分视图,其元素大于或等于fromElement
SortedSet subSet(Object fromElement,Object toElement)
返回此有序集合的部分视图,元素范围从fromElement(包括)到toElement(不包括)
Comparator comparator()
返回与此有序集合关联的比较器,如果使用元素的自然顺序,则返回 null
TreeSet
TreeSet是SortedSet接口的实现,元素不论以什么元素插入,在遍历的时候,都会以天然顺序遍历
TreeSet底层是使用TreeMap实现的
构造方法
public TreeSet()
public TreeSet(SortedSet s)
public TreeSet(int initialCapacity)
public TreeSet(Comparator super E>)
public TreeSet(Collection c)
因为TreeSet是带排序的,
所以想要为TreeSet增加自定义类型,必须指定排序规则。举例:
Comparator comparator = new MyComparator();
SortedSet setB = new TreeSet(comparator);
五 Map
map是存放key-value键值对元素的,它不是collection的子接口。
Map是接口,他的实现类如下:
- java.util.HashMap
- java.util.Hashtable
- java.util.EnumMap
- java.util.IdentityHashMap
- java.util.LinkedHashMap
- java.util.Properties
- java.util.TreeMap
- java.util.WeakHashMap
HashMap存放key,vlaue.它不是有序的。也不是线程安全的。
Hashtable是线程安全的。
TreeMap存放key,vlaue,它是有序的,基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
下面是treemap的例子
********treemap************
key:3;value:ff
key:4;value:dd
key:5;value:cc
key:6;value:gg
**********treemap by value***********
5:cc
4:dd
3:ff
6:gg
六queue
队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。
add
增加一个元索
如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove
移除并返回队列头部的元素
如果队列为空,则抛出一个NoSuchElementException异常
element
返回队列头部的元素
如果队列为空,则抛出一个NoSuchElementException异常
offer
添加一个元素并返回true
如果队列已满,则返回false
poll
移除并返问队列头部的元素
如果队列为空,则返回null
peek
返回队列头部的元素
如果队列为空,则返回null
put
添加一个元素
如果队列满,则阻塞
take
移除并返回队列头部的元素