1、HashMap和Hashtable的区别:
- 共同点:底层都是哈希算法,都是双列集合
- 不同点:
HashMap是线程不安全的,效率高,JDK1.2版本,可以存储null键和值
HashMap是线程安全的,效率低,JDK1.0版本,不可以存储null键和值
2、用集合模拟扑克牌斗地主分发与查看:
描述:四个花色 54张牌,三个人,叫地主
思路:既然是集合的最后一篇,自然要做全套(我是说用到全部的集合类,list、set、map)
1、创建牌:用双列集合hashmap存储牌;
2、洗牌:用arraylist存储索引,用collections.shuffer()打乱;
3、看牌:用treeSet来存储索引或者hashmap的值,可以自动排序(为什么要排序,因为好看)
代码:
package cn.xinhua;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.TreeSet;
public class PorkTest {
public static void main(String[] args) {
HashMap<Integer, String> hmap = new HashMap<>();// 双列集合存储牌
ArrayList<Integer> arr = new ArrayList<>(); // 洗牌,就洗索引
TreeSet<String> one = new TreeSet<>(); // 三个人和底牌
TreeSet<String> two = new TreeSet<>();
TreeSet<String> three = new TreeSet<>();
TreeSet<String> dipai = new TreeSet<>();
// 创建牌
String[] num = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
String[] color = { "红心", "方块", "黑桃", "梅花" };
int index = 0;
for (int i = 0; i < color.length; i++) {
for (int j = 0; j < num.length; j++) {
hmap.put(index, num[j].concat(color[i]));
arr.add(index);
index++;
}
}
int a = index++;
int b = index++;
hmap.put(a, "小鬼");
hmap.put(b, "大鬼");
arr.add(a);
arr.add(b);
System.out.println("----------------创建牌局---------------");
System.out.println(hmap);
System.out.println(arr);
// 洗牌
System.out.println("----------------洗牌---------------");
Collections.shuffle(arr);
System.out.println(arr);
// 看牌
System.out.println("----------------看牌---------------");
for (int i = 0; i < arr.size(); i++) {
if (i >= arr.size() - 3) {
dipai.add(hmap.get(arr.get(i)));
// }else if(i % 3 == 0){
} else if (i % 3 == 0) {
one.add(hmap.get(arr.get(i)));
// }else if(i % 2 == 0) {
// 为什么能这么做?因为set是不能重复的,重复的被干掉了,然后剩下得正好不想关,但是最好别这么做,还是用下面这种的
} else if (i % 3 == 1) {
two.add(hmap.get(arr.get(i)));
} else {
three.add(hmap.get(arr.get(i)));// treeSet是按照字典顺序排列的,也可以将打乱后的索引放进去,再按照索引从hashmap里面拿牌
}
}
System.out.println(one);
System.out.println(two);
System.out.println(three);
System.out.println(dipai);
}
}
输出:
----------------创建牌局---------------
{0=A红心, 1=2红心, 2=3红心, 3=4红心, 4=5红心, 5=6红心, 6=7红心, 7=8红心, 8=9红心, 9=10红心, 10=J红心, 11=Q红心, 12=K红心, 13=A方块, 14=2方块, 15=3方块, 16=4方块, 17=5方块, 18=6方块, 19=7方块, 20=8方块, 21=9方块, 22=10方块, 23=J方块, 24=Q方块, 25=K方块, 26=A黑桃, 27=2黑桃, 28=3黑桃, 29=4黑桃, 30=5黑桃, 31=6黑桃, 32=7黑桃, 33=8黑桃, 34=9黑桃, 35=10黑桃, 36=J黑桃, 37=Q黑桃, 38=K黑桃, 39=A梅花, 40=2梅花, 41=3梅花, 42=4梅花, 43=5梅花, 44=6梅花, 45=7梅花, 46=8梅花, 47=9梅花, 48=10梅花, 49=J梅花, 50=Q梅花, 51=K梅花, 52=小鬼, 53=大鬼}
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53]
----------------洗牌---------------
[40, 25, 30, 24, 41, 6, 47, 51, 50, 42, 4, 26, 19, 28, 33, 36, 5, 31, 8, 46, 10, 48, 22, 18, 23, 15, 12, 16, 20, 37, 14, 3, 45, 17, 7, 21, 2, 39, 53, 29, 13, 44, 43, 11, 49, 38, 9, 32, 35, 1, 27, 0, 34, 52]
----------------看牌---------------
[10梅花, 10黑桃, 2方块, 2梅花, 3红心, 4方块, 4梅花, 4黑桃, 5方块, 5梅花, 7方块, 9梅花, 9红心, J方块, J黑桃, K黑桃, Q方块]
[10方块, 10红心, 2红心, 3方块, 3梅花, 3黑桃, 4红心, 5红心, 6红心, 8方块, 8梅花, 8红心, A方块, A梅花, K方块, K梅花, Q红心]
[2黑桃, 5黑桃, 6方块, 6梅花, 6黑桃, 7梅花, 7红心, 7黑桃, 8黑桃, 9方块, A黑桃, J梅花, J红心, K红心, Q梅花, Q黑桃, 大鬼]
[9黑桃, A红心, 小鬼]
3、集合总结:
Collection:
-
List(存取有序、有索引、可重复)
【ArrayList(底层是数组;查找快,增删慢;线程不安全,效率高)重写子类equals方法】
【LinkList(底层是链表;查找慢,增删快;线程不安全,效率高)】
【Vector(底层是数组;查找慢,增删慢;线程安全,效率低)】 -
Set(存取无序、无索引、不可重复)
【HashSet(底层是hash算法)重写子类hash算法和equalsTo()算法】【linkedHashSet(底层是链表,输入和输出顺序一样)】
【TreeSet(底层是二叉树(0、+1、-1),输出有序)自然排序加选择器排序】 -
Map(双列集合,键值对)
【HashMap(底层是hash算法)】【linkedHashMap(底层是链表,输入和输出顺序一样)】
【TreeMap(底层是二叉树,输出有序)】