黑马程序员--集合知识点总结(二)

时间:2023-02-17 09:30:04



——- android培训java培训、期待与您交流! ———-

Map接口

Map接口概念:

Map并没有继承Collection接口,可用于保存具有映射关系的数据,其提供的是key到value的映射。因此,Map集合中保存这两组值,一组用于保存key,另一组用于保存value,key和value都可以是任何引用数据类型。
注意:Map集合中的key不允许重复,每一个key只能映射一个value。

Map和Collection的区别:

Collection一次存一个元素;Map一次存一对元素。
Collection是单列集合;Map是双列集合。
Map中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。

Map

|——Hashtable:是线程同步的,不允许存储null键和null值,底层是哈希表数据结构。

|——HashMap:线程是不同步的,允许存储null值好null值,底层是哈希表数据结构,替代了Hashtable。

|——TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。

Map中常用的方法:

//一对一模式
package MapDemo;

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

public class MapDemo {

    public static void main(String args[]){
        //demo1();
        //demo2();
        //demo3();
        demo4();
    }

    public static void demo1(){
        HashMap hm = new HashMap();
        hm.put("01", "java1");  //将指定的值与此映射中的指定键关联
        hm.put("02", "java2");
        hm.put("03", "java3");
        hm.put("04", "java4");
        hm.put("05", "java5");

        //hm.clear(); //从此映射中移除所有映射关系。

        sop(hm.size());  //返回此映射中的键-值映射关系数。

        sop(hm.values());  //返回此映射中包含的值的 Collection 视图。
    }

    public static void demo2(){
        HashMap hm = new HashMap();
        hm.put("01", "java1");  //将指定的值与此映射中的指定键关联
        hm.put("02", "java2");
        hm.put("03", "java3");
        hm.put("04", "java4");
        hm.put("05", "java5");

        Collection coll = hm.values();  //取出Map集合中的value值第一种方法

        Iterator it = coll.iterator();
        while(it.hasNext()){
            sop(it.next());
        }
    }

    public static void demo3(){
        HashMap hm = new HashMap();
        hm.put("01", "java1");  //将指定的值与此映射中的指定键关联
        hm.put("02", "java2");
        hm.put("03", "java3");
        hm.put("04", "java4");
        hm.put("05", "java5");

        Set keySet = hm.keySet();  //取出Map集合中的value值第二种方法

        Iterator it = keySet.iterator();
        while(it.hasNext()){
            String key = (String) it.next();
            String value = (String) hm.get(key);
            sop(value);
        }
    }

    public static void demo4(){
        HashMap hm = new HashMap();
        hm.put("01", "java1");  //将指定的值与此映射中的指定键关联
        hm.put("02", "java2");
        hm.put("03", "java3");
        hm.put("04", "java4");
        hm.put("05", "java5");

        Set me = hm.entrySet();      //取出Map集合中的value值第四种方法
        Iterator it = me.iterator();
        while(it.hasNext()){
            Map.Entry i = (Entry) it.next();
            String key = (String) i.getKey();
            String value = (String) i.getValue();
            sop(key+"………………"+value);
        }
    }

    public static void sop(Object obj){
        System.out.println(obj);
    }

}
//一对多模式
package MapDemo2;

import java.awt.List;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class MapDemo2 {

    public static void main(String[] args) {
        HashMap sdxx = new HashMap();

        ArrayList yiban = new ArrayList();
        ArrayList erban = new ArrayList();

        yiban.add(new Student("01","zhangsan"));
        yiban.add(new Student("02","lisi"));

        erban.add(new Student("01","zhaoliu"));
        erban.add(new Student("02","wangwu"));

        sdxx.put("key1", yiban);
        sdxx.put("key2", erban);

        Set keySet = sdxx.keySet();

        Iterator it = keySet.iterator();
        while(it.hasNext()){
            getInfo((ArrayList) sdxx.get(it.next()));
        }

    }

    public static void getInfo(ArrayList list){
        Iterator it = list.iterator();
        while(it.hasNext()){
            sop(it.next());
        }
    }

    public static void sop(Object obj){
        System.out.println(obj);
    }

}

class Student{
    String num;
    String name;
    public Student(String num,String name){
        this.num = num;
        this.name=name;
    }
    public String toString(){
        return num+"------"+name;
    }
}

HashMap和Hashtable的区别

public static void main(String[] args) {
        /*HashMap和Hashtable的区别? * 1.HashMap和Hashtable都是哈希算法 * * 2.HashMap是jdk。1.2版本出来的,线程不安全,效率快; * Hashtable是jdk1.0版本出来的,线程安全,效率低 * * 3.HashMap中键,值都可以为null * Hasheable中键和值不能为null*/

        HashMap<String,String> hm = new HashMap<>();
        hm.put("abc", null);
        hm.put(null, "abc");
        System.out.println(hm);//{null=abc, abc=null}

        Hashtable<String,String> ht = new Hashtable<>();
        ht.put("abc", null);
        ht.put(null, "abc");
        System.out.println(ht);// java.lang.NullPointerException
    }

使用集合的技巧:
看到Array就是数组结构,有角标,查询速度很快。
看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast; removeFirst(); removeLast(); getFirst();getLast();
看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。
看到tree就是二叉树,就要想到排序,就想要用到比较。
比较的两种方式:
一个是Comparable:覆盖compareTo方法;
一个是Comparator:覆盖compare方法。
LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。

集合什么时候用?
当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。

保证唯一,就用Set。不保证唯一,就用List。

Collections:它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法。

Collections类常用的方法:

public class DemoCollections {

    /* * Collections和Collection的区别是 * Collection是集合的跟接口 * Collections是集合的工具类,,其中方法都是静态的可以直接Collections.调用其中的方法 * * public static <T> void sort(List<T> list) public static <T> int binarySearch(List<?> list,T key) public static <T> T max(Collection<?> coll) public static void reverse(List<?> list) public static void shuffle(List<?> list)*/
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("c");
        list.add("a");
        list.add("d");
        list.add("x");
        list.add("e");
        Collections.sort(list);
        System.out.println(list);//[a, c, d, e, x]sort 对集合中的方法进行排序

        int index = Collections.binarySearch(list, "e");
        System.out.println(index);//3 利用二分查找法对指定元素的索引

        String s = Collections.max(list);
        System.out.println(s);//x 找集合中最大的

        Collections.replaceAll(list, "x", "w");//替换集合中所有的指定元素
        System.out.println(list);//[a, c, d, e, w]

        Collections.reverse(list);
        System.out.println(list);//[w, e, d, c, a]将集合中的所用元素反转

        Collections.shuffle(list);
        System.out.println(list);//[w, a, d, e, c]使用默认随机源对集合中元素进行置换,此方法可用于模拟发牌
    }

}

Arrays:用于操作数组对象的工具类,里面都是静态方法。

Arrays工具类的asList()方法的使用

package cn.itcast.vector;

import java.util.Arrays;
import java.util.List;

public class DemoAsList {
    public static void main(String[] args) {
        //int[] arr = {11,22,22,33,44};
        //List<int[]> li = Arrays.asList(arr);
        //System.out.println(li);//此处输出是[[I@155e0bc]因为此方法把整个数组当成一个对象,
                                //与下面的字符串比较,所以aslist不能转基本数据类型,只能转化引用数据类型

        //基本数据类型可以用Integer进行转换
        Integer[] arr2 = {11,22,22,33,44};//Integer可以自动装箱,他把每一个数当成一个对象装箱
        List<Integer> li2 = Arrays.asList(arr2);
        System.out.println(li2);
        //String[] arr = {"44","55","66","77"};
        //List<String>list=Arrays.asList(arr);//调用Array中的aslist方法
        //System.out.println(list);

    }

}

Collection 和 Collections的区别:

Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。
Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。