集合区别
HashMap 和 HashTable 的区别 HashMap可以保存null值 HashTable 不可以保存null值 HashMap 是线程不安全的 HashTable 是线程安全的(效率低) ArrayList 数组实现 线程不安全的 常用 查询快 增删慢 LinkedList 链表实现 线程不安全 不常用 查询慢 增删快 Vector 数组实现 线程安全的 被ArrayList替代了 HashSet 哈希算法 线程不安全的 作用:去重 LinkedHashSet 线程不安全 有序(怎么存的怎么取出来) TreeSet 线程不安全的 作用:排序(两种方法) HashMap 线程不安全的 作用:键位可以去去重 LinkedHashMap 线程不安全的 特点:有序(怎么存的怎么取) TreeMap 线程不安全的 作用:键位可以排序 HashTable 线程安全的 被HashMap取代 不能保存null值
1. Map集合
概述: Map 集合是双列集合, 是以键值对的形式保存数据 key 和 value .key是唯一的也可以为空
value值可以重复, 主要实现类. HashMap , LinkedHashMap, TreeMap.
1 . 1 : 实现类 HashMap:无序的, 去除重复, 这里的去重是指key 这列;
1 . 1 .1 子类 LinkedHashMap 有序的( 怎样放进去,怎样打印出来就是有序的 )
1. 2 实现类 TreeMap: 排序 指的是 key这列的排序;
2. Map集合中的方法.
0. 清空集合: map.clear( ); 打印的结果是 { };
1. 通过key找到对应的value: value = map.get( key );
2. 添加 : put( key , value ); 返回值value 返回的是被覆盖的value值;
3. 包含: 1. 包含key : map.containKey( key ); 2. 包含value : map.containValue( value );
4. 除重 : 系统类自带除重方法, 自己创建的类要重写hashCode()和equals()方法;
5. 获取Map中的key的set集合 : Set<String>set = map.keySet( ); 获取到的是无序不重复的;
6.获取所有value的collection集合: Collection <>values = map .values( );
7.根据key值可以删除键值对: 返回值是删除的value, Integer remove = map.remove( key );
8 .遍历键值对: 1.获取key 的set集合 2. 使用set的迭代器( iterator) 3.用获取的每一个key找到对应的value;4.打印key+value
第二种方法; 使用增强for循环;for( String string : set ) { <>value = map.get(string) } //打印string +value;
9.Entry接口: Map内部接口中保存的是键值对;相当于把map中的key 和 value封装成了一个对象;
用于遍历: 1 . 获取Map.entrySet( ); 2. 获取迭代器 3.再分别或取key和value next.getValue( ); next.getKey( ); 在打印出来;
1.添加
//创建hashMap对象.年龄用基本类型的包装类; HashMap<String,Integer> map = new HashMap<>(); //put 返回值是value,返回的是被覆盖的value值, Integer n1 = map.put("鹏前",12); Integer n2 = map.put("鹏后",13); Integer n3 = map.put("鹏左",14); Integer n4 = map.put("鹏右",15); Integer n5 = map.put("鹏右",15); System.outprintln(map);//打印结果{鹏左=14, 鹏右=15, 鹏后=13, 鹏前=84}//打印的是无序的,
2. 包含的使用
HashMap<String, Integer> map = new HashMap<>(); map.put("彭倩", 13); map.put("彭后", 14); map.put("彭左", 15); map.put("彭右", 16); //判断是否包含key和value;返回值是boolean类型的; boolean c1 = map.containsKey("彭前"); boolean c2 = map.containValue(12); 打印c1结果是true;c2d的结果是true; System.out println(n5)//84覆盖的值是12所以打印出来的值是12;
3.获取Map中的key的set集合
Set<String> set = map.keySet(); 打印结果是: [彭左, 彭倩, 彭后, 彭右] //获取到的元素都是无序而且不重复的;
4.获取所有value的collection集合
Collection <Integer> values = map.values(); //打印的结果是: [15, 13, 14, 16];
5.根据key值可以删除键值对
//返回值是删除键值对的value值; Integer remove = map.remove("彭后"); 打印remove的结果是: 16 打印map 的结果是: {彭左=15, 彭倩=13, 彭右=16}
6. 除重 :
//创建一个map 保存是哪个学生;户籍(String)去重 //学生有姓名(String)和年龄(integer);和set集合一样,出重时候需要重写 hashCode 和equals方法; HashMap<Student,string> map = new HashMap<>(); map.put(new Student("张三",18),"北京"); map.put(new Student("张三",18),"上海"); map.put(new Student("张四",18),"苏州"); map.put(new Student("张三",18),"北京"); 打印的map的结果是{Student [name=张四, age=18]=苏州, Student [name=张三, age=18]=北京}; 在打印结果之前需要重写,HashCode和equals方法.不然系统怎么会知道你怎么比较的Student类型
7.遍历键值对:
HashMap<String,Integer> map = new HashMap<>(); map.put("彭倩",13); map.put("彭后",14); map.put("彭左",15); map.put("彭右",16); Set <String> set = map.keySet(); Iterator it = set.Iterator(); while (it.hasNext()){ String key = it.next(); value = map.get(key); 打印 key + value;结果是彭左15彭倩13彭后14彭右16 //这里也可以用曾强for循环; for(String string:set){ value = map.get(string) 打印:value + set 也能得到一样的结果 } }
8.Entry接口,遍历map
// Entry接口(Map内部接口)中保存的 是键值对对象; // 相当于把map中的key 和Value封装成为一个对象; HashMap<String, Integer> map = new HashMap<>(); map.put("彭倩", 13); map.put("彭后", 14); map.put("彭左", 15); map.put("彭右", 16); // 利用entrySet遍历集合(迭代器) // 利用增强for循环; set<map.Entry<String,Integer>> entry =map.entrySet(); //获取迭代器 Iterator< map.Entry<String,Integer>>it= entry.iterator(); while(it.hasNext()){ Entry<String,Integer> next = it.Next(); //从集合中获取 Key 和 value ; String key = next.getKey(); Integeter value = next.getValue(); 打印value+key ;也可以进行集合的遍历; }
9例题
要求: 键盘输入一个字符串 统计字符串中每个字符出现的次数;
使用Map集合完成;
Scanner scanner = new Scanner(System.in); String string = scanner.nextLine(); //将字符串转化字符数组; char[] array = string.toCharArray(); //创建一个Map集合保存这个数组里面的每一项; HashMap<String,Integer> map = new HashMap<>(); for(i=0;i<array.length();i++){ if(!map.containsKey()){ //判断字符是否在Map中存在; map.put(array[i],1); //自动装箱; }else{ Integer value = map.get(array[i]);//存在重复的,通过key 将value取出来. value进行++; value = value+1; //value值是会被覆盖的;key值是不可以改变的; map.put(array[i],value); } }
2 TreeMap 排序功能;参考TreeSet;
private static void fun1map排序() {
//使用TreeMap 进行排序;(跟Treeset一样)
//保存三个学生;
TreeMap<Student, String> map = new TreeMap<>();
map.put(new Student("张三", 12),"马");
map.put(new Student("张三", 12),"马");
map.put(new Student("张四", 17),"养");
map.put(new Student("张五", 14),"羊");
System.out.println(map);//必须实现comparable 接口,然后
//按年龄排序 ClassCastException(类型转换异常)(需要实现comparable)
}
}
3.集合工具类Collections
private static void collections中的方法() { //collections 集合的工具类(都是静态方法,直接使用类名去掉,操作自己本身). //Arraylist是有序的,怎么存进去怎么取出来. ArrayList<Integer>list = new ArrayList<>(); list.add(11); list.add(13); list.add(14); list.add(10); //随机打乱集合的顺序,洗牌, //Collections.shuffle(list); //System.out.println(list); //反转 reverse Collections.reverse(list); System.out.println(list); //排序;(给集合排序)sort; Collections.sort(list); System.out.println(list); //二分查找 int index = Collections.binarySearch(list, 11); System.out.println(index); }
游戏打牌:
/* * 1.洗牌 * 2.发牌 * 3.看牌---(排序); */ public class Dem04模拟斗地主 { public static void main(String[] args) { String[] s1 = { "3", "4", "5", "6", "7", "8", "9", "10", "j", "q", "k", "A", "2" }; String[] s2 = { "♠️", "♥️", "♦️", "♣️" }; // 创建map保存牌 HashMap<Integer, String> hashMap = new HashMap<>(); // 保存索引的list(0-53); ArrayList<Integer> list = new ArrayList<>(); int index = 0; for (int i = 0; i < s1.length; i++) { for (int j = 0; j < s2.length; j++) { String string = s2[j] + s1[i]; hashMap.put(index, string); // 放到准备洗牌的list中去 list.add(index); // 让索引增加 index++; } } hashMap.put(index, "小王"); list.add(index); index++; hashMap.put(index, "大王"); list.add(index); // 洗牌 Collections.shuffle(list); // 发牌发list中的索引 TreeSet<Integer> set1 = new TreeSet<>(); TreeSet<Integer> set2 = new TreeSet<>(); TreeSet<Integer> set3 = new TreeSet<>(); TreeSet<Integer> set4 = new TreeSet<>(); // 发list遍历list可以遍历,有size可以用; for (int i = 0; i < list.size(); i++) { Integer num = list.get(i); if (i >= list.size() - 3) { set4.add(num); } else if (i % 3 == 0) { set3.add(num); } else if (i % 2 == 0) { set2.add(num); } else { set1.add(num); } } // 写一个看牌的方法利用 索引去map中找出对应的牌; kp(hashMap, set1, "阿晨"); kp(hashMap, set2, "阿晨1"); kp(hashMap, set3, "阿晨2"); kp(hashMap, set4, "底牌"); } public static void kp(HashMap<Integer, String> hashMap, TreeSet<Integer> set, String name) { System.out.println(name + "的牌"); // 遍历set for (Integer key : set) { // 从map中找对应的牌 key 找value; String value = hashMap.get(key); System.out.print(value + " "); } //换行 System.out.println(); } }