Queue集合,Map集合,HashSet、HashMap性能

Queue集合

Queue集合用来实现队列,通常队列不允许随机访问队列元素,以下是Queue接口中的方法在这里插入图片描述
PriorityQueue保存队列元素的顺序并不是按加入队列的顺序,而是按队列元素的大小进行重新排序。因此当调用peek0方法或者poll()方法取出队列中的元素时,并不是取出最先进入队列的元素,而是取出队列中最小的元素。从这个意义上来看,PriorityQueue 已经违反了队列的最基本规则:先进先出(FIFO)。
PriorityQueue的两种排序:
1.自然排序:采用自然顺序的PriorityQueue集合中的元素必须实现了Comparable接口,而且应该是同一个类的多个实例,否则可能导致ClassCastException 异常,要求集合里的其他对象和该对象是同一个类的实例。
2.定制排序:创建PriorityQueue 队列时,传入-一个Comparator对象,该对象负责对队列中的所有元素进行排序。采用定制排序时不要求队列元素实现Comparable接口,可用Lambda表达式代替。

Deque接口是Queue接口的子接口,代表双端队列,双端队列的操作方法:
在这里插入图片描述
ArrayDeque它是一个基于数组实现的双端队列,创建Deque时同样可指定一个numElements参数,该参数用于指定Object[]数组的长度;如果不指定numElements参数,Deque 底层数组的长度为16。他既可当成栈使用又可以当成队列使用。

LinkedList类是List接口的实现类是一个List集合,可以根据索引来随机访问集合中的元素。除此之外,LinkedList 还实现了Deque接口,可以被当成双端队列来使用,因此既可以被当成“栈”来使用,也可以当成队列使用。下 面程序简单示范了LinkedList 集合的用法。
总体来说,ArrayList性能比LinkedList性能好。
如果需要遍历List集合元素,对于ArrayList、Vector 集合,应该使用随机访问方法(get) 来遍历集合元素,这样性能更好;对于LinkedList集合,则应该采用迭代器(Iterator) 来遍历集合元素。
如果需要经常执行插入、删除操作来改变包含大量数据的List 集合的大小,可考虑使用LinkedList集合。使用ArrayList、 Vector 集合可能需要经常重新分配内部数组的大小,效果可能较差。
如果有多个线程需要同时访问List集合中的元素,开发者可考虑使用Collections将集合包装成线程安全的集合。

Map集合

Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value都可以是任何引用类型的数据。Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false。
Map里的key和Set集合很像,value和List很像;
Map中的常用方法:在这里插入图片描述
Map中包括一一个内部类Entry,该类封装了一个key-value对。Entry 包含如下三个方法:
1.Object getKey():返回该Entry里包含的key值。
2.Object getValue():返回该Entry里包含的value值。
3.Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
如果新的value覆盖了原有的value,put()方法返回被覆盖的value。
通常用map. remove(key)来删除key-value对
java8给Map新增的方法:在这里插入图片描述
HashMap和Hashtable的关系类似于ArrayList和Vector的关系,他们主要有以下两点区别:
1.Hashtable是一个线程安全的Map实现,但HashMap 是线程不安全的实现,所以HashMap比Hashtable的性能高一点;但如果有多个线程访问同一个Map对象时,使用Hashtable实现类会更好。
2.Hashtable不允许使用null 作为key和value,如果试图把null值放进Hashtable中,将会引发NullPointerException异常;但HashMap可以使用null作为key或value。
HashMap中的key不能重复,但是value可以。
为了成功地在HashMap、Hashtable 中存储、获取对象,用作key的对象必须实现hashCode()方法和equals()方法。HashMap、Hashtable 也不能保证其中key-value对的顺序。类似于HashSet, HashMap、 Hashtable 判断两个key相等的标准也是:两个key通过equals()方法比较返回true,两个key的hashCode值也相等。
当使用自定义类作为HashMap、Hashtable的key时,如果重写该类的equals(Objectobj)和hashCode()方法,则应该保证两个方法的判断标准一致一当 两个key通过equals()方法比较返回true时,两个key的hashCode()返回值也应该相同。因为HashMap、Hashtable保存key的方式与HashSet保存集合元素的方式完全相同,所以HashMap、Hashtable 对key的要求与HashSet对集合元素的要求完全相同。
如果修改了作为key的可变对象和HashSet类似,我们难以再准确访问到该key以及和修改后的key”撞值“的key。

LinkedHashMap实现类是HashSet的子类,他使用双向链表来维护key-value 对的次序(其实只需要考虑key的次序),该链表负责维护Map的迭代顺序,迭代顺序与key-value对的插入顺序保持一-致。

Properties类是Hashtable 类的子类,该对象在处理属性文件时特别方便,他的key和value都只能是字符串型。Properties 类可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件中,也可以把属性文件中的“属性名=属性值"加载到Map对象中。以下三个方法可以用来修改它里面的key,value值在这里插入图片描述
两个读写属性文件的方法(看不懂)在这里插入图片描述

SortedMap是Map的子接口,他有一个TreeMap实现类。
TreeMap的两种排列方式:
1.自然排序: TreeMap 的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则将会抛出ClassCastException异常。
2.定制排序:创建TreeMap时,传入一 个Comparator对象,该对象负责对TreeMap中的所有key进行排序。采用定制排序时不要求Map的key实现Comparable接口。
根据key顺序访问key-value对的方法在这里插入图片描述
WeakHashMap的用法和HashMap相似HashMap的key对实际对象是强引用,所以只要对象不销毁,就不会被当垃圾回收,在WeakHashMap中这些可能会被垃圾回收,也可能被自动删除。(WeakHashMap是弱引用实际对象)

IdentityHashMap中当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap 才认为两个key相等;对于普通的HashMap而言,只要key1和key2通过equals()方法比较返回true, 且它们的hashCode值相等即可。他的key和value也可以是null

EnumMap是-一个与枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。其特点有:
1.EnumMap在内部以数组形式保存,所以这种实现形式非常紧凑、高效。
2.EnumMap根据key的自然顺序(即枚举值在枚举类中的定义顺序)来维护key-value对的顺序。当程序通过keySet()、entrySet()、 values()等 方法遍历EnumMap时可以看到这种顺序。
3.EnumMap不允许使用null作为key,但允许使用null 作为value。 如果试图使用null 作为key时将抛出NullPointerException 异常。如果只是查询是否包含值为null的key,或只是删除值为null的key,都不会抛出异常。

各Map类性能分析:HashMap比Hashtable快;TreeMap比HashMap、Hashtable慢,但他总处于有序状态;LinkedHashMap比HashMap慢一点,因为它要维持添加顺序;EnumMap性能最好,但是只能是一个枚举类的枚举值作为key。

HashSet、HashMap性能分析:他们的Hash属性:
他们的Hash属性
还有一个负载极限表示Hash表最大的填充程度,达到极限后他会将桶里原有的元素重新分配,成倍增加桶的数量。初始化容量可以巧妙使用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值