Java基础语法(二十)

版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/82121421

一.Map接口

1.Map集合概述

我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同

  • Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储
  • Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值
  • Collection中的集合称为单列集合,Map中的集合称为双列集合
  • 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值
  • Map中常用的集合为HashMap

2.Map接口中的常用方法

这里写图片描述

  • 实例代码

    /*
    *  Map接口中的常用方法
    *  使用Map接口的实现类 HashMap
    */
    
    public class MapDemo {
      public static void main(String[] args) {
          function_2();
      }
      /*
       *  移除集合中的键值对,返回被移除之前的值
       *  V remove(K)
       */
      public static void function_2(){
          Map<Integer,String> map = new HashMap<Integer, String>();
          map.put(1, "a");
          map.put(2, "b");
          map.put(3, "c");
          System.out.println(map);
          String value = map.remove(3);
          System.out.println(value);
          System.out.println(map);
      }
    
      /*
         * 通过键对象,获取值对象
         * V get(K)
         * 如果集合中没有这个键,返回null
         */
      public static void function_1(){
          //创建集合对象,作为键的对象整数,值的对象存储字符串
          Map<Integer,String> map = new HashMap<Integer, String>();
          map.put(1, "a");
          map.put(2, "b");
          map.put(3, "c");
          System.out.println(map);
          String value = map.get(4);
          System.out.println(value);
      }
    
      /*
         *  将键值对存储到集合中
         *  V put(K,V) K 作为键的对象, V作为值的对象
         *  存储的是重复的键,将原有的值,覆盖
         *  返回值一般情况下返回null,
         *  存储重复键的时候,返回被覆盖之前的值
         */
      public static void function(){
          //创建集合对象,HashMap,存储对象,键是字符串,值是整数
          Map<String, Integer> map = new HashMap<String, Integer>();
          map.put("a", 1);
          map.put("b", 2);
          map.put("c", 3);
          System.out.println(map);
      }
    }

3.Map集合遍历方法keySet方法

Set<K> keySet() //返回此映射中包含的键的Set视图
  • 遍历流程

    • 获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键
    • 遍历键的Set集合,得到每一个键
    • 根据键利用get(key)去Map找所对应的值
  • 实例代码

    public class MapDemo1 {
      public static void main(String[] args) {
          /*
         *  1. 调用map集合的方法keySet,所有的键存储到Set集合中
         *  2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键)
         *  3. 调用map集合方法get,通过键获取到值
         */
          Map<String,Integer> map = new HashMap<String,Integer>();
          map.put("a", 11);
          map.put("b", 12);
          map.put("c", 13);
          map.put("d", 14);
          //1. 调用map集合的方法keySet,所有的键存储到Set集合中
          Set<String> set = map.keySet();
          //2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键)
          Iterator<String> it = set.iterator();
          while(it.hasNext()){
              //it.next返回是Set集合元素,也就是Map中的键
              //3. 调用map集合方法get,通过键获取到值
              String key = it.next();
              Integer value = map.get(key);
              System.out.println(key+"...."+value);
          }
          System.out.println("=======================");
          for(String key : map.keySet()){
              Integer value = map.get(key);
              System.out.println(key+"...."+value);
          }
      }
    }

4.Map集合Entry对象

  • 定义方式:

    interface Map{
      interface Entry{//Entry是Map的一个内部接口
          //由Map的子类的内部类实现
      }
    }
    class HashMap{
      static class Entry<K,V> implements Map.Entry<K,V> {//Entry对象指的就是该类的对象
          final K key;
          V value;
      }
    }
  • 在Map类设计时,提供了一个嵌套接口:Entry

5.Map集合遍历方式entrySet方法

  • Map使用entrySet方法遍历实现步骤

    • 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合Set<Entry<K,V>>
    • 迭代Set集合
    • 获取出的Set集合的元素是映射关系对象
    • 通过映射关系对象方法getKey()、getValue()获取键值对
  • 实例代码

    public class MapDemo2 {
      public static void main(String[] args) {
          Map<Integer,String> map = new HashMap<Integer, String>();
          map.put(1, "abc");
          map.put(2, "bcd");
          map.put(3, "cde");
          //1. 调用map集合方法entrySet()将集合中的映射关系对象,存储到Set集合
          Set<Map.Entry <Integer,String> >  set = map.entrySet();
          //2. 迭代Set集合
          Iterator<Map.Entry <Integer,String> > it = set.iterator();
          while(it.hasNext()){
              //  3. 获取出的Set集合的元素,是映射关系对象
              // it.next 获取的是什么对象,也是Map.Entry对象
              Map.Entry<Integer, String> entry = it.next();
              //4. 通过映射关系对象方法 getKet, getValue获取键值对
              Integer key = entry.getKey();
              String value = entry.getValue();
              System.out.println(key+"...."+value);
          }
          //使用增强for循环遍历
          for(Map.Entry<Integer, String> entry : map.entrySet()){
                System.out.println(entry.getKey()+"..."+entry.getValue());
            }
      }
    }
    //注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了

6.Map集合遍历方式增强for循环

/*
 *  使用HashMap集合,存储自定义的对象
 *  自定义对象,作为键出现,作为值出现
 */
public class HashMapDemo {
    public static void main(String[] args) {
        function_1();
    }
    /*
     * HashMap 存储自定义对象Person,作为键出现
     * 键的对象,是Person类型,值是字符串
     * 保证键的唯一性,存储到键的对象,重写hashCode equals
     */
    public static void function_1(){
        HashMap<Person, String> map = new HashMap<Person, String>();
        map.put(new Person("a",20), "里约热内卢");
        map.put(new Person("b",18), "索马里");
        map.put(new Person("b",18), "索马里");
        map.put(new Person("c",19), "百慕大");
        for(Person key : map.keySet()){
            String value = map.get(key);
            System.out.println(key+"..."+value);
        }
        System.out.println("===================");
        for(Map.Entry<Person, String> entry : map.entrySet()){
            System.out.println(entry.getKey()+"..."+entry.getValue());
        }
    }
    /*
     * HashMap 存储自定义的对象Person,作为值出现
     * 键的对象,是字符串,可以保证唯一性
     */
    public static void function(){
        HashMap<String, Person> map = new HashMap<String, Person>();
        map.put("beijing", new Person("a",20));
        map.put("tianjin", new Person("b",18));
        map.put("shanghai", new Person("c",19));
        for(String key : map.keySet()){
            Person value = map.get(key);
            System.out.println(key+"..."+value);
        }
        System.out.println("=================");
        for(Map.Entry<String, Person> entry : map.entrySet()){
            String key = entry.getKey();
            Person value = entry.getValue();
            System.out.println(key+"..."+value);
        }
    }
}

7.LinkedHashMap的特点

  • 继承自HashMap,都属于线程不安全集合
  • 保证了迭代顺序(有序)
/*
 *  LinkedHashMap继承HashMap
 *  保证迭代的顺序
 */
public class LinkedHashMapDemo {
    public static void main(String[] args) {
        LinkedHashMap<String, String> link = new LinkedHashMap<String, String>();
        link.put("1", "a");
        link.put("13", "a");
        link.put("15", "a");
        link.put("17", "a");
        System.out.println(link);
    }
}

8.Hashtable的特点

  • Map接口实现类 Hashtable

  • 底层数据结构哈希表,特点和HashMap是一样的

  • Hashtable 线程安全集合,运行速度慢

  • HashMap 线程不安全的集合,运行速度快

  • Hashtable命运和Vector是一样的,从JDK1.2开始,被更先进的HashMap取代

  • HashMap 允许存储null值,null键;Hashtable 不允许存储null值,null键

  • Properties是Hashtable的子类(活跃使用在io操作中)

  • 实例代码

    public class HashtableDemo {
      public static void main(String[] args) {  
          Map<String,String> map = new Hashtable<String,String>();
          map.put(null, null);//报错
          System.out.println(map);
      }
    }

9.静态导入

  • 静态导入(jdk1.5新特性):如果本类中有和静态导入的同名方法会优先使用本类的。如果还想使用静态导入的,依然需要类名来调用。

  • 特点

    • 减少开发的代码量
    • 标准的写法,导入包的时候才能使用
  • 实例代码

    import static java.lang.System.out;//最末尾,必须是一个静态成员
    import static java.util.Arrays.sort;
    public class StaticImportDemo {
      public static void main(String[] args) {
          out.println("hello");
          int[] arr = {1,4,2};
          sort(arr);//直接使用
      }
    }

10.方法的可变参数

  • 方法的可变参数(JDK1.5新的特性)

    • 前提: 方法参数数据类型确定,参数的个数任意
    • 可变参数语法: 数据类型...变量名
    • 可变参数,本质就是一个数组
    • 注意:一个方法中,可变参数只能有一个;且可变参数必须写在参数列表的最后一位
  • 实例代码

    public class VarArgumentsDemo {
      public static void main(String[] args) {
          //调用一个带有可变参数的方法,传递参数,可以任意
          //    getSum();
          int sum = getSum(5,34,3,56,7,8,0);
          System.out.println(sum);
      }
      /*
     * 定义方法,计算10个整数和
     * 方法的可变参数实现
     */
      public static int getSum(int...a){
          int sum = 0 ;
          for(int i : a){
              sum = sum + i;
          }
          return sum;
      }
    }

11.Collections集合工具类

这里写图片描述

  • Collections是集合工具类,用来对集合进行操作

    • public static <T> void sort(List<T> list) 集合元素排序
    • public static void shuffle(List<?> list) 集合元素存储位置打乱
  • 实例代码

    /*
    *  集合操作的工具类
    *    Collections
    */
    public class CollectionsDemo {
      public static void main(String[] args) {
          function_2();
      }
      /*
     * Collections.shuffle方法
       * 对List集合中的元素,进行随机排列
       */
      public static void function_2(){
          List<Integer> list = new ArrayList<Integer>();
          list.add(1);
          list.add(5);
          list.add(9);
          list.add(11);
          list.add(8);
          list.add(10);
          list.add(15);
          list.add(20); 
          System.out.println(list);
          //调用工具类方法shuffle对集合随机排列
          Collections.shuffle(list);
          System.out.println(list);
      }
    
      /*
         * Collections.binarySearch静态方法
         * 对List集合进行二分搜索,方法参数,传递List集合,传递被查找的元素
         */
      public static void function_1(){
          List<Integer> list = new ArrayList<Integer>();
          list.add(1);
          list.add(5);
          list.add(8);
          list.add(10);
          list.add(15);
          list.add(20);
          //调用工具类静态方法binarySearch
          int index = Collections.binarySearch(list, 16);
          System.out.println(index);
      }
    
      /*
         *  Collections.sort静态方法
         *  对于List集合,进行升序排列
         */
      public static void function(){
          //创建List集合
          List<String> list = new ArrayList<String>();
          list.add("ewrew");
          list.add("qwesd");
          list.add("Qwesd");
          list.add("bv");
          list.add("wer");
          System.out.println(list);
          //调用集合工具类的方法sort
          Collections.sort(list);
          System.out.println(list);
      }
    }

12.集合的嵌套

集合嵌套并不是一个新的知识点,仅仅是集合内容又是集合,如Collection集合嵌套、Collection集合与Map集合相互嵌套、Map集合嵌套。

13.集合继承体系的面向对象思想

这里写图片描述

  • 接口:用来明确所有集合中该具有的功能,相当于在定义集合功能标准;
  • 抽象类:把多个集合中功能实现方式相同的方法,抽取到抽象类实现,具体集合不再编写,继承使用即可;
  • 具体类:继承抽象类,实现接口,重写所有抽象方法,达到具备指定功能的集合。每个具体集合类,根据自身的数据存储结构方式,对接口中的功能方法,进行不同方式的实现。

猜你喜欢

转载自blog.csdn.net/qq_34829447/article/details/82121421