集合(下)

HashMap

集合本身基于哈希表

 

  它可以保证键的唯一性(Map都是针对键有效)(遍历的时候不能保证其存取一致性)

  HashMap<String,String>

  

  String:人的ID编号

  String:人的姓名

  

HashMap<Integer,String>

  

  Integer:年龄

  String:姓名

 

 

 HashMap<Integer,Sudent>

 

Integer:编号

Student:键值对应的是学生类

 

 

 

 

HashMap<Student,String>:是一种自定义类型

 Student:学生:年龄和姓名

String:朝代

 

 如果对象的成员变量值一样,认为同一个人.

 HashMap底层哈希表

 哈希表:依赖于两个方法  hashCode() ,equals()方法

 

 PS:若要把Student作为键值,要判断是否重复是需要比较Student内的元素的,不能像之前比较键值就可以 ,而上面的两个方法可以保证Student类的唯一性

在自定义类没有重定义上面的两个方法,即使键值重复,原来键值的映射依旧会保存下来.

 

 

 

判断到了键值重复,覆盖了s1原有的映射.

 

 

 

 

 

LinkedHashMap<K,V> :Map接口基于哈希表和链接列表实现的

 

 哈希表保证键的唯一性

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

 

 

 

 

 

 

 

 

TreeMap基于红黑树结构的Map接口的实现

TreeMapHashMap区别并不带,但是会自动进行排序处理

 

//需求

创建一个TreeMap集合,使用比较器排序的方式

匿名内部类的方式

代码如下

 

 

 

 

 

 

HashMap完成集合嵌套

假设HashMap集合的元素是ArrayList。有3个。

 每一个ArrayList集合的值是字符串。

 元素我已经完成,请遍历。

 结果:

  羽毛球

林丹

Lindan

         兵乓球

张继科

大胖子教练

 篮球

姚明

易建联

 

 

 

需求:HashMap集合嵌套HashMap集合(自定义)

 

小学

一年级----6

六年级----12

初中

初一 ------12

初三-------15

高中

高一------16

高三-------18

 

 

 

HashMap综合应用

 

需求:

 字符串:比如:aaaaabbbbcccddddee   ,最终控制台要出现的结果:a(5)b(4)c(3)d(3)e(2)

 

 思路:

 1)改进:键盘录入一个字符串

 2)创建一个HashMap集合key:Character,Value:Integer

 3)将录入的字符串转换成字符数组

 4)遍历可以获取每一个字符

 

 5)将元素添加到对应的HashMap集合中

 使用的put(key,value):通过判断值是否null ,如果是null表示第一次存储

 集合对象.put(ch,1) ;

 否则,不是null

 Integer那个值++;

 集合对象.put(ch,变量Integer)  ;

 

 6)遍历HashMap集合即可

 

Hashtable集合

 

HashMap集合和Hashtable的区别?

 共同点:都是map接口的实现类,都是基于哈希表的实现类

 HashMap集合线程不安全的类,不同步,执行效率高(允许键和值是null)

 Hashtable集合线程安全的类,同步,执行效率低(不允许有null键和null)

 

线程安全的类:

 StringBuffer :字符串缓冲区

 Vector :List集合

 Hashtable :Map集合的

 

 

 

Collections集合

 

CollectionCollections的区别:

 Collection:顶层次单列集合的根接口,它是一个集合,是一个接口

 Collections:是针对集合操作的工具类,有一些功能:随机置换,集合里面的二分查找,将集合的元素进行反转

 public static <T> int binarySearch(List<T> list, T key)集合的二分查找

 static  T max(Collection coll):获取集合中的最大值

 public static void reverse(List<?> list):将集合中的元素顺序反转

 public static void shuffle(List<?> list):将集合中的元素打乱

 

 

//有两种排序方式

  1 .public static void sort(List<T> list)//将元素进行排序  (自然排序)

 

 

2.public static void sort(List<T> list ,Comparator comparator):可以使用比较器进行排序

//下面是比较器排序的代码

 

 

 

 

 

重点:模拟斗地主发牌和洗牌

 思路:

 1)创建一个牌盒(容器:集合)

 ArrayList<String>

 2)装牌

 定义花色数组和点数数组(A,K)

 红桃A

 黑桃A

 梅花A

 方片A

 ....

 3)洗牌

 Collections中的随机置换的功能

 

 4)发牌

 遍历集合(获取集合中的具体的牌)

 需要判断:选择结构语句

 1--->A2--->B3----C

 4---A.................

 

 斗地主三个玩

 发个三个人----->三个人分别ArrayList<String>

 如果当前牌 % 3 ==0/1/2

 

 5)看牌

 三个人看牌:将看牌封装成一个功能(独立的 代码块)

 

 

 

 

 

改良后(到玩家手里面的牌是有序的)

 

 模拟斗地主的洗牌和发牌,发到每一个手上的牌是保证有序的.. 思考:

1)创建牌盒

 创建两个集合:HashMap<Integer,String>,ArrayList<Integer>

2)装牌 定义花色数组和点数数组

 0开始编号,将编号和编号对应的牌都存储到HashMap集合中,同时往ArrayList单独存储编号

3) 洗牌 洗的是编号

4)发牌

 发的也是编号,为了保证牌有序,集合由TreeSet集合接收 或者用集合ArrayList存储,使用 工具类的排序功能排序 

5)看牌 封装功能

 

 

 

 

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值