zoukankan      html  css  js  c++  java
  • map集合和可变参数总结

     *① Map集合是所有双列集合的根接口,有如下特点:

     * 1. 是以键值对的形式存储对象

     * 2. 并且key值需要唯一

     * 3. 值可以是多个

     * 4. 是无序的, 存取的顺序不能保证

     * 

     * 场景成员方法:

     1. public V put(K key, V value);// 添加一组键值对,返回被替换的值.

     2.public V get(K key);// 根据给定的key获取值

     3.public V remove(K key);// 根据key删除键值对.

     4.public void clear();//清除所有的键值对

     5.public int size();// 获取集合的长度

     6.public boolean containerKey(K key);//判断集合是否包含指定的key

     7.public boolean containerValue(V value);// 判断集合是否包含指定的value

     Map集合中常见的实现类: HashMap, LinkedHashMap, Properties

      * 如何遍历Map集合?

     * 由于Map集合并没有继承自java.lang.Iterable接口,所以不能使用迭代器和增强for;

     * 但是, Map集合中提供了一个方法,keySet, 可以获取到所有key的Set集合.

     * 

     * 获取到所有键的集合方法:

     * public set<K> keySet();

     * 

     * Map集合的遍历步骤:

     * 1. 使用ketSet方法获取到所有的键的Set集合

     * 2. 获取到Set集合的迭代器

     * 3. 遍历迭代器,根据key获取到对应的value

      * Map集合中提供了第二种遍历方式, 使用Entry内部接口的方式来实现.

     * Entry<K, V>: Map集合的内部接口

     * 有两个常用成员方法:

     * public K getKey();

     * public V getValue();

     * 

     * 使用Entry的方式来遍历Map集合的步骤:

     * 1. 创建Map集合

     * 2. 添加元素, put

     * 3. 调用map集合中的entrySet(), 获取到映射关系对象(结婚证)的Set集合 

     * 4. 获取到Set集合的迭代器

     * 5. 使用增强for循环遍历

      *② HashMap集合是Map集合的实现类,特点:

     * 1. 完全符合map集合特点(无序,键唯一,值可以多个)

     * 2. 可以存储null和null值, 比较少使用

     * 3. 底层是通过哈希表实现

     * 4. 线程不安全,效率高

      1  package cn.itcast.demo01;
      2 
      3  
      4 
      5 import java.util.HashMap;
      6 
      7 import java.util.Iterator;
      8 
      9 import java.util.Map;
     10 
     11 import java.util.Map.Entry;
     12 
     13 import java.util.Set;
     14 
     15  
     16 
     17 public class Demo05HashMap {
     18 
     19  
     20 
     21 public static void main(String[] args) {
     22 
     23  
     24 
     25 HashMap<String, Integer>map = new HashMap<String, Integer>();
     26 
     27 //map.put(null, null);// 不能只有key为null
     28 
     29  
     30 
     31 // 添加元素到hashMap集合中
     32 
     33 map.put("AA", 100);
     34 
     35 map.put("BB", 200);
     36 
     37 map.put("EE", 500);
     38 
     39 map.put("CC", 300);
     40 
     41 map.put("DD", 400);
     42 
     43  
     44 
     45 //methodLoop1(map);
     46 
     47 methodLoop2(map);
     48 
     49 }
     50 
     51  
     52 
     53 /*
     54 
     55 * 使用entrySet方式遍历
     56 
     57 */
     58 
     59 public static void methodLoop2(Map<String, Integer>map){
     60 
     61 //1.获取到所有的映射关系对象的Set集合
     62 
     63 Set<Entry<String, Integer>> set = map.entrySet();
     64 
     65  
     66 
     67 //2.获取到Set集合的迭代器
     68 
     69 Iterator<Entry<String, Integer>> iter = set.iterator();
     70 
     71  
     72 
     73 //3.遍历迭代器
     74 
     75 while(iter.hasNext()){
     76 
     77 Entry<String, Integer> next = iter.next();
     78 
     79  
     80 
     81 // 获取到结婚证的key,value
     82 
     83 String key = next.getKey();
     84 
     85 Integer value = next.getValue();
     86 
     87 System.out.println(key + "	"+value);
     88 
     89 }
     90 
     91 }
     92 
     93  
     94 
     95 // 使用keyset方式进行遍历
     96 
     97 public static void methodLoop1(Map<String, Integer>map){
     98 
     99  
    100 
    101 //1.获取到所有的key的Set集合, 使用keySet方法
    102 
    103 Set<String> set = map.keySet();
    104 
    105  
    106 
    107 //2.获取到迭代器
    108 
    109 Iterator<String> iter = set.iterator();
    110 
    111  
    112 
    113 //3.遍历迭代器
    114 
    115 while(iter.hasNext()){
    116 
    117 String key = iter.next();// 获取到key
    118 
    119 Integer value = map.get(key);// 获取到value
    120 
    121  
    122 
    123 System.out.println(key + "	" + value);
    124 
    125 }
    126 
    127  
    128 
    129 }
    130 
    131 }
    132 

     *③ LinkedHashMap是Map集合的一个实现类, 继承自HashMap;

     * 特点:

     * 1. 符合Map接口的特点(除了无序之外的特点都有)

     * 2. 有序, 存取的顺序一致

     * 3. 双向链表和哈希表

     * 4. 线程不安全,效率高

     public class Demo06LinkedHashMap {
    
     
    
    public static void main(String[] args) {
    
     
    
    //创建Linkedhashmap对象
    
    Map<Cat, Integer>map = new LinkedHashMap<Cat, Integer>();
    
     
    
    //添加元素
    
    map.put(new Cat("Tom"), 100);
    
    map.put(new Cat("Jack"), 200);
    
    map.put(new Cat("Rose"), 300);
    
     
    
    //使用增强for遍历出来
    
    Set<Cat> set = map.keySet();
    
     
    
    for (Cat cat : set) {
    
    Integer value = map.get(cat);
    
     
    
    System.out.println(cat + "	" + value);
    
    }
    
     
    
    }
    
    }

     * 为什么使用Map集合存储对象的时候key不能重复.

     * key依赖了: hashCode和equals方法

     * 

     * 因为JDK中的String类已经覆盖了Object中的 equals方法和hashCode

     * 如果自定义的对象,需要通过内容去判断对象是否是同一个对象,也需要覆盖Object中的equals方法和hashCode方法

      *④ Properties类是Map集合的实现类, 继承自HashTable;

     * HashTable是JDK1.0的一个集合,线程安全,目前已经弃用;

     * 

     * 但是他的子类Properties依然活跃在开发舞台;

     * Properties特点:

     * 1. 拥有Map集合的特点

     * 2. 类中并没有在创建对象的时候指定泛型, 默认的泛型是String

     * 3. 可以配合IO流, 来读取或者存储文件的内容到集合.

     * 4. 以后的时候场景: 主要是读取配置文件中的信息到集合中

     * 

     * 提供了常用的成员方法:

    1. public String getProperty(String key);// 通过key获取值

    2. public Object setProperty(String key, String value);// 设置键值,返回被替换的元素

    3. public Set<String> stringPropertyNames();// 获取所有键的集合

    4. public void load(InputStream is);// 使用字节流读取文件内容集合

    5. public void load(Reader reader);// 使用字符流读取文件内容到集合

    package cn.itcast.demo01;
    
     
    
    import java.io.FileNotFoundException;
    
    import java.io.FileReader;
    
    import java.io.IOException;
    
    import java.io.Reader;
    
    import java.util.Properties;
    
    import java.util.Set;
    /*
    
     * 将文件中的内容读取到集合中Properties
    
     * public void load(Reader reader);// 使用字符流读取文件内容到集合
    
     */
    
    public class Demo09LoadFileToProperties {
    
     
    
    public static void main(String[] args) throws IOException {
    
    //1.创建Properties对象
    
    Properties p = new Properties();
    
     
    
    //2.调用load方法加载IO的内容到集合中
    
    Reader r = new FileReader("abc.properties");
    
    p.load(r);
    
     
    
    //3.遍历集合, stringPropertyName();获取到所有键的Set集合
    
    Set<String> set = p.stringPropertyNames();
    
     
    
    for (String key : set) {
    
    // 通过key获取到value
    
    String value = p.getProperty(key);
    
    System.out.println(key + "	" + value);
    
    }
    
     
    
    //关闭流释放资源
    
    r.close();
    
     
    
    }
    
    }
    
     
    package cn.itcast.demo01;
    
     
    
    import java.io.FileWriter;
    
    import java.io.IOException;
    
    import java.io.Writer;
    
    import java.util.Properties;
    
     
    
    /*
    
     * 将集合Properties中的内容,存储到文件中;
    
     * public void store(Writer writer, String comments);
    
     * writer: 表示需要传入一个字符输出流
    
     * comments: 就是一个描述信息
    
     */
    
    public class Demo10StorePropertiesToFile {
    
     
    
    public static void main(String[] args) throws IOException {
    
    //1.创建Properties对象
    
    Properties p = new Properties();
    
     
    
    //2.添加元素
    
    p.setProperty("name", "Tom");
    
    p.setProperty("age", "13");
    
    p.setProperty("address", "BeiJing");
    
     
    
    //3.将集合中的内容存储到文件中
    
    Writer w = new FileWriter("abc2.properties");
    
    p.store(w, "welcome to Here");
    
     
    
    //4.关闭流,释放资源
    
    w.close();
    
    }
    
    }

    * 可变参数: 写在方法参数当中的类型, 本质上就是一额数组

    package cn.itcast.demo01;

    /*

     * 

     * 特点:

     * 1. 格式: 数据类型 ... 变量名;// 必须是三个点, 

     * 2. 使用的使用, 传入的是同种数据类型的多个元素, 可以是0-n个

     * 3. 作用: 就是对数组的简化使用

     * 

     * 注意点:

     * 1. 不能在同一个方法中写两个可变参数

     * 2. 如果有多个参数需要传递, 那么可变参数需要写在最后面

     */

    public class Demo11VariablePara {
    
     
    
    public static void main(String[] args) {
    
     
    
    // 可以传入0-n个数字
    
    //method();
    
    //method(10);
    
    method(10,20,30);
    
     
    
    //method2(10,20,30);
    
     
    
    method3(10,20,30);
    
     
    
    int[]array = {1,2,3,4};
    
    method3(100,array);
    
    }
    
     
    
    public static void method(int...a){// 等价于  int[]a
    
    for (int i = 0; i < a.length; i++) {
    
    System.out.println(a[i]);
    
    }
    
    }
    
     
    
    // 1. 不能在同一个方法中写两个可变参数
    
    //public static void method2(int...a, int ...b){
    
    //}
    
     
    
    //2. 如果有多个参数需要传递, 那么可变参数需要写在最后面
    
    public static void method3(int a,int...array){
    
    }
    
    }

    * Collections类

    package cn.itcast.demo01;
    
     
    
    import java.util.ArrayList;
    
    import java.util.Collections;
    
    import java.util.Comparator;
    
    import java.util.List;
    
     
    
    /*
    
     * Collections类, 工具类, 构造方法已经被私有化了
    
     * 所以提供了一些常见的静态方法:
    
     * public static void shuffle(List<?> list);// 将List集合乱序
    
     * public static void sort(List<T> list);// 排序List集合, 默认升序, 使用的是ASCII/Unicode
    
     * 
    
     * 补充如何降序:
    
     * 需要使用方法: public static void sort(List<?>list, Comparator c);
    
     * 
    
     */
    
    public class Demo12Collections {
    
     
    
    public static void main(String[] args) {
    
    //methodShuffle();
    
    //methodSort();
    
    methodDesSort();
    
    }
    
     
    
    // 扩展降序: ort(List<?>list, Comparator c);
    
    public static void methodDesSort() {
    
    // 1.定义List集合
    
    List<String> list = new ArrayList<String>();
    
     
    
    // 2.添加元素
    
    list.add("BBB");
    
    list.add("AAA");
    
    list.add("DDD");
    
    list.add("CCC");
    
     
    
    //3.降序
    
    Comparator<String> c = new Comparator<String>() {
    
    @Override
    
    public int compare(String o1, String o2) {
    
    return o2.compareTo(o1);
    
    }
    
    };
    
     
    
    Collections.sort(list, c);
    
     
    
    System.out.println(list);
    
     
    
    }
    
     
    
    // sort(List<T> list);// 排序List集合, 默认升序
    
    public static void methodSort() {
    
    // 1.定义List集合
    
    List<String> list = new ArrayList<String>();
    
     
    
    // 2.添加元素
    
    list.add("BBB");
    
    list.add("AAA");
    
    list.add("DDD");
    
    list.add("CCC");
    
     
    
    Collections.sort(list);
    
     
    
    System.out.println(list);
    
    }
    
     
    
    //shuffle(List<?> list);// 将List集合乱序
    
    public static void methodShuffle(){
    
    //1.定义List集合
    
    List<String>list = new ArrayList<String>();
    
     
    
    //2.添加元素
    
    list.add("AAA");
    
    list.add("BBB");
    
    list.add("CCC");
    
    list.add("DDD");
    
     
    
    System.out.println(list);//[AAA, BBB, CCC, DDD]
    
     
    
    Collections.shuffle(list);// 打乱顺序
    
     
    
    System.out.println(list);//[AAA, BBB, DDD, CCC]
    
     
    
    }
    
    }
    
     
    人生就像一场路途,尝遍酸甜苦辣,方知人生苦甜.
  • 相关阅读:
    012——matlab判断变量是否存在
    011——MATLAB清除工作控件变量
    014——C#新建文件夹
    征服django的关键内容
    Django中session的使用
    RabbitMq与Redis的使用
    python的命名规则
    python类的深层次理解
    python类总结
    python之paramiko模块
  • 原文地址:https://www.cnblogs.com/zennon/p/8192844.html
Copyright © 2011-2022 走看看