Java面向对象第十一天( --集合区别--Map集合--Collections包装类-- )

集合区别

  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()方法;

扫描二维码关注公众号,回复: 1742340 查看本文章

   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();
	}

}


猜你喜欢

转载自blog.csdn.net/a18755425397/article/details/80424716