黑马程序员——Java编程语言学习总结 –Map集合
来源:互联网 发布:linux启动进入grub 编辑:程序博客网 时间:2024/05/16 14:41
作为学生来说,是根据学号来区分不同的学生的,那么假设我现在已经知道了学生的学号,我要根据学号去获取学生姓名,请问怎么做呢?
如果采用前面讲解过的集合,我们只能把学号和学生姓名作为一个对象的成员,然后存储整个对象,将来遍历的时候,判断,获取对应的名称。
但是呢,如果我都能把学生姓名拿出来了,我还需要根据编号去找吗?
针对我们目前的这种需求:仅仅知道学号,就想知道学生姓名的情况,Java就提供了一种新的集合Map。
一,Map集合
通过查看API,我们知道Map集合的一个最大的特点,就是它可以存储键值对的元素。这个时候存储我们上面的需求,就可以这样做
学号1 姓名1
学号2 姓名2
学号3 姓名3
学号2(不行) 姓名4
学号4 姓名4
1, Map集合的特点:
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
2, Map集合和Collection集合的区别?
Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)
注意:
Map集合的数据结构值针对键有效,跟值无关
HashMap,TreeMap等会讲。
Collection集合的数据结构是针对元素有效
3, Map集合的功能概述:
A:添加功能
V put(Kkey,V value):添加元素。这个其实还有另一个功能?先不告诉你,等会讲
如果键是第一次存储,就直接存储元素,返回null
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
B:删除功能
voidclear():移除所有的键值对元素
Vremove(Object key):根据键删除键值对元素,并把值返回
C:判断功能
booleancontainsKey(Object key):判断集合是否包含指定的键
booleancontainsValue(Object value):判断集合是否包含指定的值
booleanisEmpty():判断集合是否为空
D:获取功能
Set<Map.Entry<K,V>>entrySet():???
Vget(Object key):根据键获取值
Set<K>keySet():获取集合中所有键的集合
Collection<V>values():获取集合中所有值的集合
E:长度功能
int size():返回集合中的键值对的对数
4,Map集合的遍历
A:键找值
a:获取所有键的集合
b:遍历键的集合,得到每一个键
c:根据键到集合中去找值
B:键值对对象找键和值
a:获取所有的键值对对象的集合
b:遍历键值对对象的集合,获取每一个键值对对象
c:根据键值对对象去获取键和值
代码体现:
Map<String,String>hm = new HashMap<String,String>();
hm.put("it002","hello");
hm.put("it003","world");
hm.put("it001","java");
方式1 键找值
Set<String>set = hm.keySet();
for(Stringkey : set) {
Stringvalue = hm.get(key);
System.out.println(key+"---"+value);
}
方式2 键值对对象找键和值
Set<Map.Entry<String,String>>set2 = hm.entrySet();
for(Map.Entry<String,String>me : set2) {
String key= me.getKey();
Stringvalue = me.getValue();
System.out.println(key+"---"+value);
5,Map的子类
5.1, HashMap:是基于哈希表的Map接口实现。
哈希表的作用是用来保证键的唯一性的。
HashMap<String,String>
键:String
值:String
HashMap<Integer,String>
键:Integer
值:String
HashMap<String,Student>
键:String 学号
值:Student 学生对象
HashMap<Student,String>
键:Student
要求:如果两个对象的成员变量值都相同,则为同一个对象。
值:String
5.2, LinkedHashMap:
是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
由哈希表保证键的唯一性
由链表保证键盘的有序(存储和取出的顺序一致)
5.3,TreeMap:是基于红黑树的Map接口的实现。
TreeMap <String,String>
键:String
值:String
TreeMap<Student,String>
键:Student
值:String
举例:
需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
分析:
A:定义一个字符串(可以改进为键盘录入)
B:定义一个TreeMap集合
键:Character
值:Integer
C:把字符串转换为字符数组
D:遍历字符数组,得到每一个字符
E:拿刚才得到的字符作为键到集合中去找值,看返回值
是null:说明该键不存在,就把该字符作为键,1作为值存储
不是null:说明该键存在,就把值加1,然后重写存储该键和值
F:定义字符串缓冲区变量
G:遍历集合,得到键和值,进行按照要求拼接
H:把字符串缓冲区转换为字符串输出
录入:linqingxia
结果:result:a(1)g(1)i(3)l(1)n(2)q(1)x(1)
publicclass TreeMapDemo {
publicstatic void main(String[] args) {
定义一个字符串(可以改进为键盘录入)
Scanner sc= new Scanner(System.in);
System.out.println("请输入一个字符串:");
Stringline = sc.nextLine();
定义一个TreeMap集合
TreeMap<Character,Integer> tm = new TreeMap<Character, Integer>();
把字符串转换为字符数组
char[] chs= line.toCharArray();
遍历字符数组,得到每一个字符
for(charch : chs){
拿刚才得到的字符作为键到集合中去找值,看返回值
Integer i= tm.get(ch);
是null:说明该键不存在,就把该字符作为键,1作为值存储
if(i ==null){
tm.put(ch,1);
}else {
不是null:说明该键存在,就把值加1,然后重写存储该键和值
i++;
tm.put(ch,i);
}
}
定义字符串缓冲区变量
StringBuildersb= new StringBuilder();
遍历集合,得到键和值,进行按照要求拼接
Set<Character>set = tm.keySet();
for(Characterkey : set){
Integervalue = tm.get(key);
sb.append(key).append("(").append(value).append(")");
}
把字符串缓冲区转换为字符串输出
Stringresult = sb.toString();
System.out.println("result:"+result);
}
}
5.4,Hashtable和HashMap的区别?
Hashtable:线程安全,效率低。不允许null键和null值
HashMap:线程不安全,效率高。允许null键和null值
5.5, Properties
Properties是Hashtable的子类,是属性集合类。是一个可以和IO流相结合使用的集合类。
可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。
特殊功能:
publicObject setProperty(String key,String value):添加元素
publicString getProperty(String key):获取元素
publicSet<String> stringPropertyNames():获取所有的键的集合
publicvoid load(Reader reader):把文件中的数据读取到集合中
publicvoid store(Writer writer,String comments):把集合中的数据存储到文件
二、Collections类
是针对集合进行操作的工具类,都是静态方法。
要知道的方法
publicstatic <T> void sort(List<T> list):排序 默认情况下是自然顺序。
publicstatic <T> int binarySearch(List<?> list,T key):二分查找
publicstatic <T> T max(Collection<?> coll):最大值
publicstatic void reverse(List<?> list):反转
publicstatic void shuffle(List<?> list):随机置换
Collection和Collections的区别?
Collection:是单列集合的顶层接口,有子接口List和Set。
Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
案例:
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.HashMap;
importjava.util.TreeSet;
模拟斗地主洗牌和发牌
分析:
A:创建一个牌盒
B:装牌
C:洗牌
D:发牌
思路:
A:创建一个HashMap集合
B:创建一个ArrayList集合
C:创建花色数组和点数数组
D:从0开始往HashMap里面存储编号,并存储对应的牌
同时往ArrayList里面存储编号即可。
E:洗牌(洗的是编号)
F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
publicclass PokerDemo {
publicstatic void main(String[] args) {
创建一个HashMap集合
HashMap<Integer,String> hm = new HashMap<Integer, String>();
创建一个ArrayList集合
ArrayList<Integer>array = new ArrayList<Integer>();
创建花色数组和点数数组
定义一个花色数组
String[]colors = { "♠", "♥", "♣", "♦" };
定义一个点数数组
String[]numbers = { "3", "4", "5", "6","7", "8", "9", "10", "J","Q",
"K","A", "2", };
从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。
int index= 0;
for(String number : numbers) {
for(String color : colors) {
Stringpoker = color.concat(number);
hm.put(index,poker);
array.add(index);
index++;
}
}
hm.put(index,"小王");
array.add(index);
index++;
hm.put(index,"大王");
array.add(index);
洗牌(洗的是编号)
Collections.shuffle(array);
发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
TreeSet<Integer>fengQingYang = new TreeSet<Integer>();
TreeSet<Integer>linQingXia = new TreeSet<Integer>();
TreeSet<Integer>liuYi = new TreeSet<Integer>();
TreeSet<Integer>diPai = new TreeSet<Integer>();
for (int x= 0; x < array.size(); x++) {
if (x>= array.size() - 3) {
diPai.add(array.get(x));
} else if(x % 3 == 0) {
fengQingYang.add(array.get(x));
} else if(x % 3 == 1) {
linQingXia.add(array.get(x));
} else if(x % 3 == 2) {
liuYi.add(array.get(x));
}
}
看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
lookPoker("风清扬", fengQingYang, hm);
lookPoker("林青霞", linQingXia, hm);
lookPoker("刘意", liuYi, hm);
lookPoker("底牌", diPai, hm);
}
写看牌的功能
publicstatic void lookPoker(String name, TreeSet<Integer> ts,
HashMap<Integer,String> hm) {
System.out.print(name+ "的牌是:");
for(Integer key : ts) {
Stringvalue = hm.get(key);
System.out.print(value+ " ");
}
System.out.println();
}
}
- 黑马程序员——Java编程语言学习总结 –Map集合
- 黑马程序员——Java编程语言学习总结 – Collection集合框架
- 黑马程序员java学习—Map集合
- 黑马程序员—— Java编程语言学习总结--概述
- 黑马程序员——Map集合总结
- 黑马程序员——Java编程语言学习总结 – 网络编程
- 黑马程序员——Java学习日志之Map集合
- 黑马程序员——Java Map集合
- 黑马程序员——Java编程语言学习总结 – 循环与选择性语句
- 黑马程序员——Java编程语言学习总结– 函数与数组
- 黑马程序员——Java编程语言学习总结– 面向对象(上)
- 黑马程序员——Java编程语言学习总结 – 面向对象(下)
- 黑马程序员——Java编程语言学习总结 – API(上)
- 黑马程序员——Java编程语言学习总结– API(下)
- 黑马程序员——Java编程语言学习总结 –异常与File类
- 黑马程序员——Java编程语言学习总结 – IO流
- 黑马程序员——Java编程语言学习总结 – 多线程
- 黑马程序员——Java编程语言学习总结 – 反射与设计模式
- 数据延迟加载
- swift UITabBarItem修改字体颜色和图标颜色
- height、clientHeight、scrollHeight、offsetHeight区别
- ng-repeat
- 产品经理模型建设工具axure
- 黑马程序员——Java编程语言学习总结 –Map集合
- 算法(二进制数中1的个数)
- javascript学习之函数的参数和return语句
- 黑马程序员_java网络编程——UDP传输和TCP传输
- 为什么程序运行不了?求解
- 读取文本数据2.1
- Google C++ 编程风格指南资源
- POJ1845 Sumdiv【因数之和】【二分求等比数列】
- LeetCode 040 Combination SumII