java:容器/集合(Map(HashMap,TreeMap)Collection和Collections,(Collection-value();)

 java:容器/集合(Map(HashMap,TreeMap)Collection和Collections,(Collection-value();)

*Map接口:采用是键值对的方式存放数据。无序

HashMap:
*常见的实现类:
*--HashMap:基于哈希表的 Map 接口的实现。
*常用的构造方法:
* HashMap()构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。
* HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap
*常用方法:
* put(K key, V value)在此映射中关联指定值与指定键。
* get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
* size() 返回此映射中的键-值映射关系数。
* remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。
* clear() 从此映射中移除所有映射关系。
* containsKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true。
* containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
*----LinkedHashMap
*--Hashtable
*--TreeMap

import java.util.HashMap;
import java.util.Map;

public class TestHashMap {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();
        //向容器中添加元素:以键值对的方式进行存放.
        map.put("jack", "成龙");
        map.put("jay", "周杰伦");
        map.put("eason", "陈奕迅");//添加元素
        //取:
//        map.remove("eason");//通过key移除元素
        System.out.println("是否包含eason:"+map.containsKey("eason"));
        System.out.println("是否包含成龙:"+map.containsValue("成龙"));
        System.out.println("容器中总共有"+map.size()+"个键值对元素");
        String name = map.get("jack");//根据key获取元素的值
        System.out.println(name);
        String name2 = map.get("jay");
        System.out.println(name2);
        
        
        
    }
}

 HashMap取值的两种方法:

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 *Map的遍历 
 *    Set<K> keySet() 返回此映射中所包含的键的 Set 视图。 
 *  Set<Map.Entry<K,V>> entrySet() 返回此映射所包含的映射关系的 Set 视图。 
 */
public class TestHashMap2 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();
        //向容器中添加元素:以键值对的方式进行存放.
        map.put("jack", "成龙");
        map.put("jay", "周杰伦");
        map.put("eason", "陈奕迅");//添加元素
        map.put("jack", "杰克");//键如果重复,将发生覆盖
        System.out.println(map);
        //方式1:先获取键的集合,通过键获取值
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            String value = map.get(key);
            System.out.println(key+"----"+value);
        }
        System.out.println("-------------------------------");
        //方式2:获取键值对的集合,然后从键值对获取键和值。(推荐)
        //Entry<String,String>:对键和值进行泛型,Set<Entry<String,String>>对Set集合中Entry(键值对)进行泛型
        Set<Entry<String,String>> entrySet = map.entrySet();
        for (Entry<String, String> entry : entrySet) {
            String key = entry.getKey();//获取键值对的键
            String value = entry.getValue();//获取键值对中值
            System.out.println(key+"****"+value);
        }
    }
}

 LinkedHashMap继承了HashMap:

import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map.Entry;
import java.util.Set;

/**
 * java.util.LinkedHashMap:哈希表+链表,有序(添加顺序其实就是摆放顺序),继承了HashMap类。
 * 常用的构造方法:
 *     LinkedHashMap()构造一个带默认初始容量 (16) 和加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例
 *      LinkedHashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。
 * 常用的方法:
 *  put(K key, V value)在此映射中关联指定值与指定键。    
 *  get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null。
 *  size() 返回此映射中的键-值映射关系数。
 *  remove(Object key) 从此映射中移除指定键的映射关系(如果存在)。
 *  clear() 从此映射中移除所有映射关系。
 *  containsKey(Object key)  如果此映射包含对于指定键的映射关系,则返回 true。
 *  containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。
 *  Set<K> keySet() 返回此映射中所包含的键的 Set 视图。 
 *  Set<Map.Entry<K,V>> entrySet() 返回此映射所包含的映射关系的 Set 视图。
 */
public class TestLinkedHashMap {
    public static void main(String[] args) {
        LinkedHashMap<String, String> map = new LinkedHashMap<String,String>();
        map.put("jack", "成龙");
        map.put("jay", "周杰伦");
        map.put("eason", "陈奕迅");//添加元素
        //方式1:通过先遍历键的集合获取键,然后通过键获取值
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            String value = map.get(key);
            System.out.println(key+"-----"+value);
        }
        //方式2:通过先遍历键值对的集合获取键值对,然后通过键值对获取键和值。
//        Set<Entry<String,String>> entrySet = map.entrySet();
//        for (Entry<String, String> entry : entrySet) {
//            System.out.println(entry.getKey()+"==="+entry.getValue());
//        }
        for(Iterator<Entry<String,String>> iter = map.entrySet().iterator();iter.hasNext();){
            Entry<String,String> entry = iter.next();
            System.out.println(entry.getKey()+"==="+entry.getValue());
        }
    }
}

 TreeMap:

*TreeMap:类似于TreeSet,采用二叉树的方式存储数据,有序(大小顺序)。
*常用的构造函数:
*TreeMap() 使用键的自然顺序构造一个新的、空的树映射。 插入该映射的所有键都必须实现 Comparable 接口.
*TreeMap(Comparator<? super K> comparator) 构造一个新的、空的树映射,该映射根据给定比较器进行排序。

(对象放前面,值放后面)

public class TestTreeMap {
    public static void main(String[] args) {
        TreeMap<String,String> map = new TreeMap<String,String>();
        map.put("a","aaa");
        map.put("c","ccc");
        map.put("b","bbb");
        System.out.println(map);
        System.out.println("------------");
        TreeMap<Student,String> map2 = new TreeMap<Student,String>();
        Student stu1 = new Student("zhangsan",20);
        Student stu2 = new Student("lisi",21);
        Student stu3 = new Student("wangwu",18);
        map2.put(stu1,"zhangsan");
        map2.put(stu2,"lisi");
        map2.put(stu3,"wangwu");
        System.out.println(map2);
    }
}

*TreeMap(Comparator<? super K> comparator)   构造一个新的、空的树映射,该映射根据给定比较器进行排序。

import java.util.Comparator;

public class AgeComparator implements Comparator<Student> {

    @Override
    public int compare(Student o1, Student o2) {
        return -(o1.getAge()-o2.getAge());
    }

}
public class TestTreeMap2 {
    public static void main(String[] args) {
        TreeMap<Student,String> map = new TreeMap<Student,String>(new AgeComparator());
        Student stu1 = new Student("zhangsan",20);
        Student stu2 = new Student("lisi",21);
        Student stu3 = new Student("wangwu",18);
        map.put(stu1,"zhangsan");
        map.put(stu2,"lisi");
        map.put(stu3,"wangwu");
        System.out.println(map);
    }
}

* Collection和Collections的区别:


* Collection是List和Set的父接口,而Collections是操作Collection集合的工具类。
* Collections(对Collection集合进行操作的工具类),类似Arrays类(对数组进行操作的工具类),提供了若干个静态的方法以方便操作集合。
* 常用的方法:
* addAll(Collection<? super T> c, T... elements) 将所有指定元素添加到指定 collection 中。
* sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。
* reverse(List<?> list)反转指定列表中元素的顺序。
* max(Collection<? extends T> coll) 根据元素的自然顺序,返回给定 collection 的最大元素。
* min(Collection<? extends T> coll) 根据元素的自然顺序 返回给定 collection 的最小元素。
* binarySearch(List<? extends Comparable<? super T>> list, T key)
* 使用二分搜索法搜索指定列表,以获得指定对象,必须根据列表元素的自然顺序对列表进行升序排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class TestCollections {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(10);
        list.add(1);
        list.add(18);
        list.add(6);
        list.add(9);
        System.out.println("排序前:"+list);
        Collections.sort(list);//排序,默认按照升序进行排列
        System.out.println("排序后:"+list);
        Collections.reverse(list);//反转:倒序输出
        System.out.println("反转后:"+list);
        int index = Collections.binarySearch(list, 9);//二分查找:待查找的集合中元素必须有大小顺序
        
        System.out.println("index="+index);
        Integer max = Collections.max(list);
        System.out.println("max="+max);
        Integer min = Collections.min(list);
        System.out.println("min="+min);
    }
}

 Collection-value();

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**
 *3、定义一个Worker类,属性:name:String,age:int,salary:double 
    a).把若干Worker对象放在List中,排序并遍历输出,按照age升序排列
    b).把若干Worker对象放在Set中并遍历,要求没有重复元素
    c).把若干Worker对象放在Map中并按照三种方式分别遍历,要求以Worker的姓名作为key。
 *
 */
public class Homework3 {
    //1.把若干Worker对象放在List中,排序并遍历输出,按照age升序排列
    public void saveAsList(){
        List<Worker> list = new ArrayList<Worker>();
        Worker w1 = new Worker("zhangsan",20,5000);
        Worker w2 = new Worker("lisi",22,6000);
        Worker w3 = new Worker("wangwu",18,3000);
        list.add(w1);
        list.add(w2);
        list.add(w3);
        Collections.sort(list,new AgeComparator());//排序
        for (Worker worker : list) {
            System.out.println(worker.getName()+"---"+worker.getAge()+"---"+worker.getSalary());
        }
    }
    
    //2.把若干Worker对象放在Set中并遍历,要求没有重复元素
    public void saveAsSet(){
        Set<Worker> set = new HashSet<Worker>();
        Worker w1 = new Worker("zhangsan",20,5000);
        Worker w2 = new Worker("lisi",22,6000);
        Worker w3 = new Worker("wangwu",18,3000);
        Worker w4 = new Worker("wangwu",18,3000);
        set.add(w1);
        set.add(w2);
        set.add(w3);
        set.add(w4);
        //遍历Set
        for (Worker worker : set) {
            System.out.println(worker.getName()+"---"+worker.getAge()+"---"+worker.getSalary());
        }
        
    }
    
    //3.把若干Worker对象放在Map中并按照三种方式分别遍历,要求以Worker的姓名作为key。
    public void saveAsMap(){
        Map<String,Worker> map = new HashMap<String,Worker>();
        Worker w1 = new Worker("zhangsan",20,5000);
        Worker w2 = new Worker("lisi",22,6000);
        Worker w3 = new Worker("wangwu",18,3000);
        map.put(w1.getName(), w1);
        map.put(w2.getName(), w2);
        map.put(w3.getName(), w3);
        System.out.println("第一种遍历:");
        Set<String> keySet = map.keySet();
        for (String key : keySet) {
            Worker worker = map.get(key);
            System.out.println(worker.getName()+"---"+worker.getAge()+"---"+worker.getSalary());
        }
        System.out.println("第二种遍历:");
        Set<Entry<String,Worker>> entrySet = map.entrySet();
        for (Entry<String, Worker> entry : entrySet) {
            Worker worker = entry.getValue();
            System.out.println(worker.getName()+"---"+worker.getAge()+"---"+worker.getSalary());
        }
        System.out.println("第三种遍历:");
        Collection<Worker> values = map.values();//获取值的集合
        for (Worker worker : values) {
            System.out.println(worker.getName()+"---"+worker.getAge()+"---"+worker.getSalary());
        }
    }

    
    public static void main(String[] args) {
        Homework3 homework3 = new Homework3();
//        homework3.saveAsList();
//        homework3.saveAsSet();
        homework3.saveAsMap();
    }
}