双列集合Map及实现该接口的类的常用方法

为什么要学双列集合?

因为单列集合无法处理映射关系,会有成对出现的数据

Map接口  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复

  Map接口的方法:
      添加:
         put(K key, V value)
         putAll(Map<? extends K,? extends V> m) 
      删除
         remove(Object key)
         clear()

      获取:
         get(Object key)
         size() 
      判断:
         containsKey(Object key)
         containsValue(Object value)
         isEmpty()

    迭代:
        keySet()
        values()
        entrySet()

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

public class Demo1 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();
        //添加
        map.put("李杰","李英");
        map.put("黎晨辉","王成娟");
        map.put("蛮王","艾希");
        map.put("zhangsan", "999999");
        System.out.println(map.put("蛮王", "寡妇"));//寡妇把艾希替换了返回艾希,被替换的
        System.out.println(map.put("zhangsan", "value"));//如果前面没有添加就返回null
        System.out.println(map);
        Map<String,String> map1 = new HashMap<String,String>();
        map1.put("文章", "马伊琍");
        map1.put("谢霆锋","张柏芝");
        map1.put("成龙", "林凤娇");
        map.putAll(map1);
        System.out.println(map);
        //删除
        //System.out.println("被删除的数据:  "+map.remove("蛮王"));//根据键值删除数据,返回的是删除的建对应的值
        //System.out.println(map);
        //map.clear();
        //System.out.println(map);

        //获取
        System.out.println(map.get("蛮王"));//根据指定的建获取值
        System.out.println(map.size());//键值对个数

        //判断
        System.out.println(map.containsKey("蛮王"));//判断集合是否包含指定的建
        System.out.println(map.containsValue("张柏芝"));//判断集合是否包含指定的值
        System.out.println(map.isEmpty());
    }

}
//双列集合没有迭代器,所以在遍历双列集合的时候要返回单列集合,然后借用单列集合的迭代器
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 Demo2 {
    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String,String>();
        map.put("李杰","李英");
        map.put("黎晨辉","王成娟");
        map.put("蛮王","艾希");
        /*
        //map集合中遍历方式一: 使用keySet方法进行遍历       缺点: keySet方法只是返回了所有的键,没有值
        Set<String> keysView = map.keySet();
        System.out.println(keysView);

        //keySet() 把Map集合中的所有键都保存到一个Set类型 的集合对象中返回。
        Iterator<String> it = keysView.iterator();
        while(it.hasNext()) {
            //System.out.println(it.next());
            String list = it.next();
            System.out.print("{键:"+list+",值:"+map.get(list)+"}");
            System.out.println();
        }

        //map集合的遍历方式二: 使用values方法进行 遍历    缺点: values方法只能返回所有 的值,没有键
        Collection<String> valuesView = map.values();
        System.out.println(valuesView);
        Iterator<String> ir = valuesView.iterator();
        while(ir.hasNext()) {
            System.out.print(ir.next()+"   ");
        }
        */
        //map集合的遍历方式三: entrySet方法遍历
        Set<Map.Entry<String,String>> entrylist = map.entrySet();
        Iterator<Map.Entry<String,String>> io = entrylist.iterator();
        while(io.hasNext()){
            Map.Entry<String,String> entry = io.next();
            System.out.println("键:"+ entry.getKey()+" 值:"+ entry.getValue());
        }
    }
}

HashMap和TreeMap和Hashtable(了解)

  HashMap  底层也是基于哈希表实现 的。
    HashMap的存储原理:
       往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该
       元素在哈希表中的存储位置
       情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中

      情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较
       ,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为
       重复元素,不允存储

import java.util.HashMap;

class person{
     int id;
     String name;

     public person(int id, String name) {
            super();
            this.id = id;
            this.name = name;
     }

    public String toString() {
        return  "[编号:"+this.id+" 姓名:"+ this.name+"]";
    }

    @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return this.id;
    }
    @Override
    public boolean equals(Object obj) {
        person p = (person) obj;
        // TODO Auto-generated method stub
        return this.id == p.id;
    }
}

public class Demo3 {
    public static void main(String[] args) {
        HashMap<person,String> map = new HashMap<person,String>();
        map.put(new person(110,"李杰"), "lalala");
        map.put(new person(120,"李英"), "hahaha");
        map.put(new person(119,"李汉斯"), "xixixi");
        map.put(new person(119,"李汉斯"), "qiqiqi");
        System.out.println(map);
    }
}

  TreeMap  TreeMap也是基于红黑树(二叉树)数据结构实现的    特点:会对元素的键进行排序存储

    TreeMap 要注意的事项:
       1.往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储
       2.往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键
        的比较规则定义在CompareTo方法上

      3. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须
          在创建TreeMap对象的时候传入比较器

import java.util.Comparator;
import java.util.TreeMap;

class Person {
    String name;
    int salary;
    public Person( String name,int salary) {
        super();
        this.name = name;
        this.salary = salary;
    }
    @Override
    public String toString() {
        return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
    }
}

class mycompare implements Comparator<Person>{

    @Override
    public int compare(Person o1, Person o2) {
        // TODO Auto-generated method stub
        return o1.salary - o2.salary;
    }

}

public class Demo3 {
    public static void main(String[] args) {

        /*TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();
        tree.put(‘c‘,10);
        tree.put(‘b‘,2);
        tree.put(‘a‘,5);
        tree.put(‘h‘,12);
        System.out.println(tree);*/
        TreeMap<Person,Integer> tree = new TreeMap<Person,Integer>(new mycompare());
        tree.put(new Person("李杰",110), 001);
        tree.put(new Person("李英",120), 002);
        tree.put(new Person("李汉斯",119), 003);
        System.out.println(tree);        

    }
}
import java.util.Comparator;
import java.util.TreeMap;

class Person implements Comparable{
    String name;
    int salary;
    public Person( String name,int salary) {
        super();
        this.name = name;
        this.salary = salary;
    }
    @Override
    public String toString() {
        return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
    }

    @Override
    public int compareTo(Object o) {
        Person a = (Person) o;
        return this.salary - a.salary;
    }

}

public class Demo3 {
    public static void main(String[] args) {

        /*TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();
        tree.put(‘c‘,10);
        tree.put(‘b‘,2);
        tree.put(‘a‘,5);
        tree.put(‘h‘,12);
        System.out.println(tree);*/
        TreeMap<Person,Integer> tree = new TreeMap<Person,Integer>();
        tree.put(new Person("李杰",110), 001);
        tree.put(new Person("李英",120), 002);
        tree.put(new Person("李汉斯",119), 003);
        System.out.println(tree);        

    }
}

作业: 定义一个TreeMap,键存储的是书对象,值存储的是字符串。 根据书的出版出版日期排序

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TreeMap;

class Book<T> implements Comparable<Book>{

    String name;
    String date;
    public Book(String name,String string) {
        super();
        this.name = name;
        this.date = string;
    }
    /*
    @Override
    public int compareTo(Book o) {

        return this.date.compareTo(o.date);
    }
    */
    public int compareTo(Book o) {
        SimpleDateFormat dataformat = new SimpleDateFormat("yyyy-mm-dd");
        Date date1 = null;
        Date date2 = null;
        try {
            date1 = dataformat.parse(this.date);
            date2 = dataformat.parse(o.date);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return date1.compareTo(date2);
    }
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return "{书名:"+this.name+"出版日期:"+this.date+",出版社:}";
    }
}

public class Demo4 {

    public static void main(String[] args) {
        TreeMap<Book, String>  map = new TreeMap<Book, String>();  //值存储书名
        map.put(new Book("《红楼梦》","2018-7-25"), "商务出版社");
        map.put(new Book("《西游记》","2018-7-26"), "商务出版社");
        map.put(new Book("《水浒传》","2018-7-27"), "商务出版社");
        map.put(new Book("《三国演义》","2018-7-28"), "商务出版社");
        System.out.println(map);
    }

}

HashTable  底层依赖哈希表存在的,实现方式与HashMap一直,但是他是线程安全的,操作效率低





原文地址:https://www.cnblogs.com/JYDesigner/p/9365891.html

时间: 2024-11-08 14:27:21

双列集合Map及实现该接口的类的常用方法的相关文章

java018.双列集合Map

day18双列集合MapMap接口和Collection接口的区别: * Map是双列的,Collection是单列的 * Map的键唯一,Collection的子体系Set是唯一的,List体系可以存储重复值 * Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效 * a:添加功能  * V put(K key,V value):添加元素.   * 如果键是第一次存储,就直接存储元素,返回null   * 如果键不是第一次存在,就用值把以前的值替换掉,

集合面试题之双列集合Map

一.了解Map集合吗?Map集合都有哪些实现 HashMap .HashTable.    LinkedHashMap .TreeMap.   ConcurrentHashMap HashMap底层数据结构是哈希表,所以其特点是元素无序且唯一(自定义对象需要重写hashCode和equals方法保证他的唯一性) Hashtable它和HashMap类很相似,但是它支持同步,Hashtable在哈希表中存储键/值对,当使用一个哈希表,要指定用作键的对象,以及要链接到该键的值. 然后,该键经过哈希处

Map集合(双列集合)

Map集合(双列集合)Map集合是键值对集合. 它的元素是由两个值组成的,元素的格式是:key=value. Map集合形式:{key1=value1 , key2=value2 , key3=value3 , .. } * Map集合系列: Map<K,V>(接口) / HashMap<K,V>(实现类) / LinkedHashMap<K,V>注意:Map集合只支持引用数据类型的元素存储. Map集合特点: 键是无序不重复的. 重复的键,后面加入的会直接覆盖前面.

双列集合框架:Map(个人理解)

双列集合框架:Map1.常用实现类结构|----Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x)* |----HashMap:作为Map的主要实现类:线程不安全的,效率高:存储null的key和value* |----LinkedHashMap:保证在遍历map元素时,可以照添加的顺序实现遍历.* 原因:在原的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素.* 对于频繁的遍历操作,此类执行效率高于HashMap.* |----Tre

JAVA双列集合HashMap

HashMap 双列集合HashMap是属于java集合框架3大类接口的Map类,   Map接口储存一组成对的键-值对象,提供key(键)到value(值)的映射.Map中的key不要求有序,不允许重复.value同样不要求有序,但允许重复. Iterator接口是负责定义访问和遍历元素的接口 1. 使用Iterator迭代器缺点: 1. ListIterator有add()方法,可以向List中添加对象,而Iterator不能 2. ListIterator和Iterator都有hasNex

集合(三)------双列集合

所谓双列集合就是存在映射关系并且是成对存在的. 双列集合体系: -------------| Map  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复.----------------| HashMap  底层也是基于哈希表实现 的.----------------| TreeMap   TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储.----------------| Hashtable 和ha

获取单列集合,双列集合,数组的Stream流对象以及简单操作

获取流对象 获取单列集合,双列集合,数组的流对象 单列集合获取流对象: 1.java.util.Collection接口中加入了default方法stream()获取流对象,因此其所有实现类均可通过此方式获取流. public class StreamTest01 { List<String> list = new ArrayList<>(); Stream<String> stream1 = list.stream(); Set<String> set =

java基础35 双例集合Map及其常用方法

单例集合的体系: ---------| collection  单例集合的根接口--------------| List  如果实现了list接口的集合类,具备的特点:有序,可重复       注:集合中的有序不是指自然顺序,而是指添加进去的顺序与出来的顺序是一致的------------------| ArrayList  ArrayList底层维护了一个object数组的实现的.(线程不安全),特点:查询速度快,增删速度慢.(有序,可重复)------------------| Linked

Collection单列集合 Map双列集合

Map集合:该集合存储键值对,一对一对往里存.而且要保证键的唯一性. 1.添加 put(K key, V value) putAll(Map<? extends K,? extends V> m) 2.删除 clear() remove(Object key) 3.判断 containsKey(Object key) containsValue(Object value) isEmpty() 4.获取 get(Object key) :获取值 size() values() entrySet(