-------android培训、java培训、期待与您交流! ----------
一、Map
1:特点
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
2:Map
|—Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。
|—Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合.
|—HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值,
|—TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。替代了Hashtable。
3:Map集合和Collection集合的区别?
a: Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。
可以把这个理解为:夫妻对。也称为双列集合
b: Collection集合存储元素是单独出现的,Collection的子Set是唯一的,List是可重复的。
可以把这个理解为:光棍(11.11)。也称为单列集合
注意事项:Map集合的数据结构值针对键有效,跟值无关。Collection集合的数据结构是针对元素有效。
4:功能
A:添加功能
V put(K key,V value):添加元素。如果键是第一次存储,就直接存储元素,返回null;
如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值
B:删除功能
void clear():移除所有的键值对元素
V remove(Object key):根据键删除键值对元素,并把值返回
C:判断功能
boolean containsKey(Object key):判断集合是否包含指定的键
boolean containsValue(Object value):判断集合是否包含指定的值
boolean isEmpty():判断集合是否为空
D:获取功能
Set<Map.Entry<K,V>> entrySet():返回Map所包含的键值对对象所组成的Set集合,
每个集合都是Map.Entry对象(Entry是Map内部类)。
V get(Object key):根据键获取值
Set<K> keySet():获取集合中所有键的集合
Collection<V> values():获取集合中所有值的集合
E:长度功能
int size():返回集合中的键值对的对数
5: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(String key : set) { String value = 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(); String value = me.getValue(); System.out.println(key+"---"+value); }
二、HashMap & TreeMap
1:HashMap是基于哈希表的Map接口实现。 哈希表的作用是用来保证键的唯一性的。
// 创建集合对象
HashMap<Integer, String> hm = new HashMap<Integer, String>();
hm.put(27, "Donald");
hm.put(30, "Joy");
hm.put(28, "Lukas");
hm.put(29, "Joy");
hm.put(27, "Donald");
// 遍历
Set<Integer> set = hm.keySet();
for (Integer key : set) {
String value = hm.get(key);//根据键获取值
System.out.println(key + "---" + value);//27---Donald 28---Lukas 29---Donald 30---Joy //<span style="font-family: Arial, Helvetica, sans-serif;">无序无重复</span>
}
2:
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
由哈希表保证键的唯一性;由链表保证键盘的有序(存储和取出的顺序一致)。
// 创建集合对象
LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();
// 创建并添加元素
hm.put("2345", "hello");
hm.put("1234", "world");
hm.put("3456", "java");
hm.put("1234", "javaee");
hm.put("3456", "android");
// 遍历
Set<String> set = hm.keySet();
for (String key : set) {
String value = hm.get(key);
System.out.println(key + "---" + value);//有序输出
3:TreeMap
是基于红黑树的Map接口的实现。
获取字符串中每一个字母出现的次数
public static void main(String[] args) {
// 定义一个字符串(可以改进为键盘录入)
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String line = sc.nextLine();
// 定义一个TreeMap集合
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
//把字符串转换为字符数组
char[] chs = line.toCharArray();
//遍历字符数组,得到每一个字符
for(char ch : chs){
//拿刚才得到的字符作为键到集合中去找值,看返回值
Integer i = tm.get(ch);
//是null:说明该键不存在,就把该字符作为键,1作为值存储
if(i == null){
tm.put(ch, 1);
}else {
//不是null:说明该键存在,就把值加1,然后重写存储该键和值
i++;
tm.put(ch,i);
}
}
//定义字符串缓冲区变量
StringBuilder sb= new StringBuilder();
//遍历集合,得到键和值,进行按照要求拼接
Set<Character> set = tm.keySet();
for(Character key : set){
Integer value = tm.get(key);
sb.append(key).append("(").append(value).append(")");
}
//把字符串缓冲区转换为字符串输出
String result = sb.toString();
System.out.println("result:"+result);
}
录入:aababcabcdabcde
结果:a(5)b(4)c(3)d(2)e(1)
三、Collections
是针对集合进行操作的工具类,都是静态方法。
1:常见方法
public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
public static <T> int binarySearch(List<?> list,T key):二分查找
public static <T> T max(Collection<?> coll):最大值
public static void reverse(List<?> list):反转
public static void shuffle(List<?> list):随机置换
2:Collection和Collections的区别?
A: Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。
B: Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。
3:模拟发牌
思路:
A:创建一个HashMap集合
B:创建一个ArrayList集合
C:创建花色数组和点数数组
D:从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。
E:洗牌(洗的是编号)
F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)
G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)
//创建一个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){
String poker = 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<Integer> firstPerson = new TreeSet<Integer>();
TreeSet<Integer> secondPerson = new TreeSet<Integer>();
TreeSet<Integer> thirdPerson = 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){
firstPerson.add(array.get(x));
}else if(x%3 == 1){
secondPerson.add(array.get(x));
}else if(x%3 == 2){
thirdPerson.add(array.get(x));
}
}
//看牌
lookPoker("Donald",firstPerson,hm);
lookPoker("Joy",secondPerson,hm);
lookPoker("Lucy",thirdPerson,hm);
lookPoker("底牌",diPai,hm);
}
//看牌的功能
public static void lookPoker(String name,TreeSet<Integer> ts,
HashMap<Integer, String> hm){
System.out.print(name + "的牌是:");
for(Integer key : ts){
String value = hm.get(key);
System.out.print(value + " ");
}
System.out.println();
四、使用集合的技巧
1:看到Array就是数组结构,有角标,查询速度很快。
2:看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast;removeFirst(); removeLast();getFirst();getLast();
3:看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。
4:看到tree就是二叉树,就要想到排序,就想要用到比较。
比较的两种方式:
一个是Comparable:覆盖compareTo方法;
一个是Comparator:覆盖compare方法。
5:LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。
6:当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。
7:保证唯一,就用Set。不保证唯一,就用List。
8:用Collection接口中的方法:toArray()可以将集合变数组。好处:限定了对集合中的元素进行增删操作,只要获取这些元素即可。