Collection和Map

arays是操作array的类,其中arrays拥有一组static函数
equals():比较两个array是否相等,拥有元素个数是否相等,相等的下标是否相等
fill():将元素添加到array中
sort():对数组进行排序
System.arraycopy:array的复制

数组是最有效的存储和随机访问一串对象的做法,但是他的缺点同样十分明显,那就是容量固定切无法动态改变,需要进行扩容才可以,不然在数据量大的时候会抛出indexoutofboundexception异常.同时,你还无法判断一个数组中有多少个元素,只能知道这个数组的大小.所以我们需要更加强大的类,集合Collection和Map就是中提供了丰富的方法,同时也解决数组无法自动扩容的问题.同时由于他们实现了Iterable接口,所以他们都是有iterator方法,为集合遍历提供了有效的途径.

分类:
collection:List,Set和Queue
Map:HashMap.TreeMap和HashTable

List(有序可重复性)继承与Collection,主要有ArrayList和LinkedList,其中线程安全的vector已经废弃了.那么我们主要讲ArrayList和LinkedList的用法:

ArrayList:底层是数组的结构,但是它比数组强大的地方在于它可以自动扩容并拥有更加丰富的方法.因为底层是数组,所以ArrayList查询的速度快,而且还可以容纳重复的数据,并且可以为null.但是不好的地方在于不利于进行增删功能,因为每进行这样的操作都需要重新遍历一边数组,导致十分消耗性能.同时这个也是不安全的.所以我们可以使用同步包容器使其变成Collections.synchronizedList(new ArrayList()),这样我们就可以得到线程安全的数组.

LinkedList:底层是链表结构,每个元素都是首尾相连的形式存在的,这样的效果就是我们删除和增加的时候速度是十分迅速的,但是因为没有下标,不利于查询.同时存在addFirst,addLast,getFirst,getLast,removeFirst,removeLast方法的存在,我们还可以将其作为堆栈,队列等使用.LinkedList也不是线程安全的,但是我们同样可以使用同步包容器使其变成线程安全的,例如:Collections.synchronizedList(new LinkedList());

Set(无序不可重复)继承于Collection,主要有HashSet和TreeSet.

HashSet:按照哈希算法来进行存取的结合,所以存取速度较快,实现原理是:存入元素先比较其hash值是否相等,然后再去比较其equals方法,其集合是不可重复和无序的.其中只有一个值是可以为null的.


TreeSet:底部是红黑树结构,因此是有次序的集合.同时需要排序的时候可以通过两个办法,一:实现Compareable接口,覆盖compareTo方法,二是:实现Compareator接口,覆盖compare方法.

另外LinkedHashSet是HashSet升级版,拥有HashSet的查询速度,同时使用链表维护集合元素的顺序.


Queue继承于Collection,其主要的实现有:ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列(此部分是借鉴的)

ConcurrentLinkedQueue:它是一个适合于高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于BlockingQueue。它是基于链接
节点的无界线程安全队列。该队列的元素遵循先进先出的原则。队列不允许null元素.
ConcurrentLinkedQueue有2个重要的方法:
add()、offer():增加元素,这个2个方法没什么区别
poll()、peek():从头部取元素、poll()会删除该节点,后者不会。


BlockingQueue:
1.ArrayBlockingQueue:基于数据的阻塞队列的实现,在ArrayBlockingQueue内部,维护了一个定长的数组,以便缓存队列中的数据对象,其内部没实现读写分离,也就意味着生产
和消费不能完全并行,长度是需要定义的。可以指定先进先出或者先进后出,也叫有界队列,在很多场合下非常适合使用
2.LinkedBlockingQueue:基于链表的阻塞队列,与ArrayBlockingQueue类似,其内部也是维持着一个数据的缓冲队列该队列(该队列有一个链表构成),LinkedBlockingQueue之所以能够高效的处理并发数据,是因为其内部实现采用分离锁(读写分离2个锁),从而实现生产者和消费者操作的完全并行运行,它是一个无界队列
3.SynchronousQueue:一种没有缓冲的队列,生产者产生的数据会直接被消费者获取并消费。该队列不允许添加任何元素
4.PriorityBolckingQueue:基于优先级的阻塞队列(优先级的判断通过构造函数的传入Compator对象来决定,也就是说传入队列的对象必须实现Comparable接口),在实现PriorityBolckingQueue的时候,内部控制线程同步的锁采用公平锁,他也是一个无界的队列。

5.DelayQueue:带有延迟时间的Queue,其中的元素只有但其指定的延迟时间到了,才能够从队列中获取到该元素,DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、任务超时处理、空闲连接的关闭等等。

Map是一个key-value形式存在的集合,其中常用的有:HashMap,TreeMap,HashTable和currentHashMap等.

HashMap是以key-value形式成对出现的,其内部是数组+链表的形式,数组中存放着哈希值形同的链表,如果数组的大小不够的话,就会成倍增加数组的长度,并将原来的数组copy进去.Map是通过比较链表中的key的哈希值和equals方法来保证key的唯一性的,如果添加相同的key的数据,JVM会覆盖前面的数据.其中key值可以有一个为null,但是对于value没有限制,因为其是线程不安全,我们同样可以使用Collections.synchronizedMap(new HashMap());获取一个线程安全的map集合.


TreeMap是基于红黑树实现,其是一个有序的map,可以通过两个方法实现排序:一:实现Compareable接口,覆盖compareTo方法,二是:实现Compareator接口,覆盖compare方法.这样我们可以看出,其实TreeSet是使用了这个方法的.

HashTable是线程安全的map集合,其内部实现是使用synchronzied关键字锁住了整个对象,这样保证了其线程的安全性.

LinkedHashMap:其内部是基于链表的map,当其在迭代是访问的速度是很快.其取值的顺序是按照插入的顺序的.

CurrentHashMap是一个线程安全的map集合,因为HashTable使用同步锁的时候锁住了整个对象,导致在多线程的情况下访问时很慢,必须等待上一个线程释放锁才可以进行访问,所以Sun在JDK1.5引入了CurrentHashMap.其比Hashtable优异的地方是他将其内部分为16个桶(默认),诸如get,put,remove等方法的锁只是属于当前的桶,这样比较下来性能就很高了.

collentions(列举几个)作为集合类其中有很多很好用的的方法:
isEmpty判断是否为空
shuffle打乱顺序
sort排序
fill替换所有元素

Iterator是集合和map常用的迭代器,因为我们在remove集合或map中元素的时候可能会报出ConcurrentModificationException的异常,所以我们会调用集合自身的iterator方法,这样就不会抛出异常.
原因如下:Iterator在被创建之后会建立一个索引指向原来对象的单链索引表,当对象被我们操作之后(数量发生改变),索引却没有同时改变,会造成我们在遍历的时候,通过索引就找不到原先的对象,
这样就会跑出异常: java.util.ConcurrentModificationException.但是我们引用集合自身的iterator时会同时保证索引和对象的同步一致问题,就不会抛出异常了.
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值