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接口的实现
TreeMap和HashMap区别并不带,但是会自动进行排序处理
//需求
创建一个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集合
Collection和Collections的区别:
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)看牌 封装功能