【java基础】细说集合(3)—Queue集合、Map集合

Queue集合

queue就是队列,队列的特点是“先进先出”,通常,队列不允许随机访问元素。Queue接口有三个重要的实现类:PriorityQueue和Deque下的ArrayDeque、LinkedList。
在这里插入图片描述

(1)PriorityQueue

PriorityQueue是按元素的大小进行排序的。不允许存入null值,排序方式和TreeSet一样,分为自然排序和定制排序。

//定义一个PriorityQueue类型的队列,并依次加入5,-4,7
PriorityQueue pq=new PriorityQueue();
pq.offer(5);
pq.offer(-4);
pq.offer(7);

//取出队列中的第一个元素,输出最小的元素-4
a.poll();

(2)ArrayDeque

Deque代表一个双端队列,特点是允许从两端操作队列。其有一个典型的实现类,ArrayDeque。其可以作为栈来使用,也可以作为队列来使用。

  • 作为栈来使用:
public class ArrayDequeStack{
   public static void main(String[] args)
   {
      ArrayDeque stack=new ArrayDeque();
      //将三个元素push入栈
      stack.push("绿色");
      stack.push("红色");
      stack.push("黄色");
      System.out.println(stack);
      //访问第一个元素,只访问不弹出
      System.out.println(stack.peek());
      //弹出第一个元素
      System.out.println(stack.pop());
   }
}
  • 作为队列来使用:
public class ArrayDequeQueue{
   public static void main(String[] args)
   {
      ArrayDeque queue=new ArrayDeque();
      //将三个元素加入队列
     queue.offer("绿色");
      queue.offer("红色");
      queue.offer("黄色");
      System.out.println(queue);
      //访问队列头部的元素
      System.out.println(queue.peek());
      //poll处第一个元素
      System.out.println(stack.poll());
   }
}

(3) LinkedList

LinkedList不光实现了List接口,还实现了Queue接口,说明其既是一个List集合,还是一个Queue集合。作为List集合,可以根据索引来随机访问集合中的元素。作为Queue集合,可以被当成双端队列来使用,既可以当栈来使用,也可以当队列来使用。

(4)性能分析

  • a、ArrayList、ArrayDeque内部以数组的形式来保存集合中的元素,因此随机访问时速度较快。LinkedList内部以链表的形式来保存集合中的元素,因此擅长于插入、删除元素。
  • b、ArrayList比LinkList的性能好,所以一个不经常对元素进行插入、删除操作的List集合,可以选用ArrayList。
  • c、如果要遍历List集合的元素,对于ArrayList使用随机访问(get)的方式;LinkedList使用迭代器(Iterator)来遍历。
Map集合

Map集合和Set集合一样,也像一个罐子,不过里面存储的是有映射关系的数据,是key-value类型的。key集和Set集合类似,无序不可重复;value集和List集合类似,可重复,是根据索引来查找的。
在这里插入图片描述
Map接口有N个实现类,今天我们主要说说其中的:
在这里插入图片描述

(1)常用方法举例

Map map=new HashMap();
//放入3组数据
map.put("语文",35);
map.put("数学",97);
map.put("英语",43);
//判断是否包含指定的key
map.containsKey("语文");
//判断是否包含指定的value
map.containsValue(97);
//对map集合进行遍历
for(Object key:map.keySet())
{
System.out.println(key+"-->"+map.get(key));
}
//根据key来删除key-value对
map.remove("语文");

(2)HashMap和Hashtable的比较

  • 异:

Hashtable存入的值不能为null,HashMap可以为null,所以HashMap性能略高一点。但是如果多个线程访问同一个map对象,使用Hashtable会更好。

  • 同:

判断两个key相等的标准是:两个key通过equals()方法比较返回true,两个key的hashCode值也相等。
判断两个value相等的标准是:两个对象通过equals()方法比较返回true即可。

(3) WeakHashMap

WeakHashMap和HashMap的用法基本相似,不同之处在于,HashMap的key保留了对实际对象的强引用,这意味着,只要该HashMap对象不被销毁,该HashMap的所有key所引用的对象就不会被垃圾回收,HashMap也不会自动删除对应的key-value对。
那WeakHashMap是个什么样的情况呢?可先参看下面的代码:

WeakHashMap whm=new WeakHashMap();
//向WeakHashMap中添加三个元素,三个key都是匿名字符串对象,即没有其它引用
whm.put(new String("语文"),new String(“80”));
whm.put(new String("数学"),new String(“45”));
whm.put(new String("英语"),new String(“67”));
//再向集合中添加一个key是系统缓存的字符串对象的元素
whm.put("物理",new String("90"));
//输出whm对象,结果是四个key-value对
System.out.println(whm);
//通知系统进行垃圾回收
System.gc();
System.runFinalization();
//一般只看到一个key-value对
System.out.println(whm);

说明:WeakHashMap只保留了对对象的弱引用。如果WeakHashMap对象的key所引用的对象没有被其它强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。

(4)TreeMap

TreeMap是一个红黑树数据结构,每个key-value对是一个红黑树的节点。其可以保证所有的key-value处于有序状态。

(5) IdetityHashMap

其实现机制和HashMap类似,独特之处在于比较两个key是否相等时更严格一点。在HashMap中,只要满足了如下两个条件,则认为两个key相等:

  • equals()方法比较返回true
  • hashCode值相等

而在IdetityHashMap中,当且仅当两个key严格相等(key1==key2)时,才会认为两个key相等。

(6)EnumMap

EnumMap是和枚举类一起使用的Map实现。其内部以数组的形式保存,根据key的定义顺序来维护key-value的顺序,不允许使用null作为key值,但可以作为value值。

enum Season
{
spring,summer,fall,winter
}
public class EnumMapTest
{
  public static void main(String[] args)
  {
      EnumMap enumMap=new EnumMap(Season.class);
      enumMap.put(Season.summer,"夏日炎炎");
      enumMap.put(Season.spring,"春暖花开");
      System.out.println(enumMap);
  }
}

(6)性能分析

HashMap通常比Hashtable要快,所以最常用。如果程序需要一个总是排好序的Map时,可以考虑使用TreeMap。

尾记

至此,对集合的总结就算告一个段落了。虽浅显,但也还算全面。
集合相对于数组来说,在可存入的元素个数,能够存储有映射关系的元素等方面进行了改进,但是在编译阶段,数组能检查存入的元素的数据类型是否正确,而集合只有在代码运行起来后,才能校验。为了将“运行时”的错误校验提到“编译期”进行,可以使用泛型。下篇小编就讲讲泛型。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卡夫卡的熊kfk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值