Map集合的子类以及Collections类

Map集合常用的子类有两种: HashMap  TreeMap

1.HashMap集合

注意:

             Map集合都是针对键有效,且键是唯一的, 如果有相同的键,则第二个键的值覆盖掉第一个键的值,如果第一次给HashMap添加元素,则put()方法返回值为null,第二次添加相同键的元素,则返回第一次添加的元素的值

 存储自定义对象的两种方式:

              自定义对象为键  :不能重复 ,需要重写equals()和HashCode()两个方法

              自定义对象为值  :可以重复

注释:

              如果成员变量的值相同则认为是同一个人,即重复
              HashMap底层依赖的是哈希表
              哈希表依赖于两个方法:equals()和HashCode();

 //自定义对象作为键,必须具有唯一性,输出不能保证顺序

面试题:  

     HashMap和HashTable的区别?

                     共同点:都是基于Map集合的实现类,都是哈希表的实现类
                   HashMap集合:线程不安全,执行效率高,不同步,允许null值和null键
                   HashTable集合:线程安全,执行效率低,同步,不允许null值和null键
  
 
     线程安全的类:
                   StringBuffer    :字符串缓冲区
                   Vector             :List集合的子集合

                   HashTable       :Map集合的子集合

HashMap集合的应用:

1). 输入字符串:aaasamslndlkda  ,如何输出 a(5)s(2)d(2)k(1)l(2)m(1)n(1)

示例如图:


2).HashMap集合嵌套HashMap集合


2.LinkedHashMap集合

     LinkedHashMap集合是Map接口基于哈希表和链表实现的
   
    哈希表可保证键的唯一性

    链表保证了元素的有序性(存储和取出一致)

3.TreeMap集合

TreeMap集合的两种排序方式:

自然排序:自定义的类实现Comparable接口,通过无参构造形式创建对象,并且重写ComparaTo()方法
比较器排序:通过public TreeSet(Comparator<E> comparator)构造方法创建对象,并且重写了Compare()方法
       比较器排序的两种方式:
                     1).创建实现类继承Comparator接口,并且重写Compare()方法

                     2).直接使用匿名内部类实现 ,重写Compare()方法,不用创建实现类

  TreeSet集合保证元素是看ComparaTo()方法或者Compare()方法返回值是否为0;

  TreeSet集合底层依赖于TreeMap集合的方法,存储方式为红黑树结构

4.Collections工具类

 Collections和Collection的区别:
         Collection:顶层次单列集合的根接口,它是一个集合,也是一个接口
         Collections:是针对集合操作的工具类,里面包含了一些功能,随机置换,集合里面的二分
         查找,将集合的元素进行反转
        
 Collections集合的常用方法:
         public static <T> int binarySearch(List<T> list,T key)   二分查找
         public static  T max(Collection coll): 获取集合中的最大值
         public static void reverse(List<?> list) :将集合中的元素顺序反转
         public static void shuffle(List<?> list) :将集合中的元素打乱

         public static void sort(List<> list) :将集合中的元素进行排序

使用如图:


Collections类中的两种排序方式

          1).自然排序

          2).比较器排序

如图所示:


Collections工具类的应用

1).模拟斗地主的发牌和洗牌

思路:
  1)创建一个牌盒(容器:集合)
  ArrayList<String>
  2)装牌
  定义花色数组和点数数组(A,K)
  红桃A
  黑桃A
  梅花A
  方片A
  ....
  3)洗牌
  Collections中的随机置换的功能
 
  4)发牌
  遍历集合(获取集合中的具体的牌)
  需要判断:选择结构语句
  1--->A 2--->B 3----C
  4---A .................
 
  斗地主三个玩
  发个三个人----->三个人分别创建ArrayList<String>
  如果当前牌 % 3 ==0/1/2 
 
  5)看牌 
  三个人看牌:将看牌封装成一个功能(独立的 代码块)

代码如图:



2)模拟斗地主的发牌洗牌_保证牌有序

思路:
         1)创建牌盒
             创建两个集合:HashMap<Integer,String>,ArrayList<Integer>
        
         2)装牌
             定义花色数组
             从0开始编号,将编号和编号对应的牌都存到HashMap集合中,同时往ArrayList<Integer>
             集合中单独存储编号
            
         3)洗牌
             洗的是编号
           
         4)发牌
             发的也是编号,为了保证牌有序,集合有TreeSet集合接收
           
         5)看牌

             封装功能

代码如图:        




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值