Java中的集合框架-Map

  前两篇《Java中的集合框架-Commection(一)》《Java中的集合框架-Commection(二)》把集合框架中的Collection开发常用知识点作了一下记录,从本篇开始,对集合框架里的另外一部分Map作一下记录。

一,集合框架的Map接口

  Map与Collection不同之处在于它是以键值对来存储数据;

  Map比较常用的实现类有四个:HashTable,HashMap,LinkedHashMap,TreeMap;

  Map的方法也可以分为四类,增删改查,大致如下:

  新增的方法:

      put(k,v)  此方法将一对Key:Value形式的数据添加到容器中,并返回此Key所对应的旧值的结果(如果Key已存在的话),若此Key是一个新的Key则返回一个null

      put(Map)  此方法的作用是把一个Map中的元素复制到此Map中

  删除的方法:

      clear()  清除容器中的所有元素

      remove()  此方法移除一对Key:Value,返回的是被移除的键所对应的值

  修改的方法:

      put(k,v)  键相同,值不同便起到了修改的作用

  查询的方法:

      containsKey(key)  是否包含指定的Key,若包含则返回true

      containsValue(value)  是否包含指定的Value,若包含则返回true

      get(key)  返回指定的键所对应的值

      isEmpty()  查询Map是不是为空,若为空则返回true

      size()  返回Map中Key:Value的数量

      keySet()  返回Map中所有Key所组成的一个Set集合

      values()  返回Map中所有Value对应的Collection集合

      entrySet()  返回键值对所对应的Map.entry的Set集合

  其它的equals方法,hashcode方法便不再罗列。方法的使用还是到它的实现类中去演示,在此不作演示。

二,HashTable与HashMap

  HashTable是1.0出现的,后来它被HashSet所取代;

  HashTable内部结构是哈希表,它是线程安全的,另外HashTable不可存储null键以及null值;

  HashMap功能与HashTable基本相同,只是它非线程安全,另外它可存储null健以及null值;

  虽然HashMap内部是哈希表的结构,但是它真正的存储结构是数组+链表的形式,当一个元素被put进来的时候,它会先计算该元素的hashcode,当hashcode冲突的时候,它会使用链表进行挂载;

  当HashMap存储null键和null值的时候,它会存储到数组下标0的位置,若该位置有元素存在则进行挂载。

  HashMap在存储自定义对象的时候和HashSet一样(其实HashSet里面维护的就是一个HashMap),也会先调用该元素的hashcode方法,当hashcode相同是再去调用该元素的equals方法去判断两个元素是否为同一个元素,若是同一个元素则修改其原来的值为新值并返回原来的值;若元素的hashcode不同,则直接判断为不同的元素进行存储;演示如下:

 1 public class Person {
 2     private String name;
 3     private int age;
 4
 5     public Person(String name, int age) {
 6         this.name = name;
 7         this.age = age;
 8     }
 9
10     public String getName() {
11         return name;
12     }
13
14     public void setName(String name) {
15         this.name = name;
16     }
17
18     public int getAge() {
19         return age;
20     }
21
22     public void setAge(int age) {
23         this.age = age;
24     }
25
26 }

  主程序:

1     private static void fun_demo2() {
2         HashMap hm = new HashMap();
3         hm.put(new Person("张三", 32), "程序员");
4         hm.put(new Person("张三", 12), "项目经理");
5         hm.put(new Person("王五", 22), "老板");
6         System.out.println(hm);
7     }

  程序运行结果:

        

  可见三个元素都被存储进去了,这个原因很好理解,每new出来一个Person,它的hashcode是不一样的,所以存储了三个元素。下面我们改一下Person类,重写一下hashcode和equals方法

 1 public class Person {
 2     private String name;
 3     private int age;
 4
 5     public Person(String name, int age) {
 6         this.name = name;
 7         this.age = age;
 8     }
 9
10     public String getName() {
11         return name;
12     }
13
14     public void setName(String name) {
15         this.name = name;
16     }
17
18     public int getAge() {
19         return age;
20     }
21
22     public void setAge(int age) {
23         this.age = age;
24     }
25
26     @Override
27     public int hashCode() {
28         return this.getName().hashCode();
29     }
30
31     @Override
32     public boolean equals(Object obj) {
33         return true;
34     }
35
36 }

  程序运行结果:

        

  可见我们把hashcode直接返回Person的name的hashcode,由于Person对象有两个叫张三的,所以它会调用equals方法再进一步比较这两个对象是否为同一个元素,我们的equals方法又返回了true,它就认定这两个元素是同一个元素,所以拿第二个“张三”的Value值“项目经理”把第一个“张三”的Value值“程序员”给覆盖掉了。

  其它的关于HashMap的方法不再一一演示。

三,LinkedHashMap

  LinkedHashMap与HashMap的区别是LinkedHashMap内部维护着一个所有元素的双向链表,它能保证存储进容器的元素与取出元素的顺序一致;请看以下操作:

 1     private static void fun_demo3() {
 2         HashMap lhm = new HashMap();
 3         lhm.put(2, "z");
 4         lhm.put(3, "a");
 5         lhm.put(1, "b");
 6         lhm.put(0, "z");
 7         lhm.put(null, "t");
 8         Iterator iterator = lhm.entrySet().iterator();
 9         while (iterator.hasNext()) {
10             Map.Entry entry = (Entry) iterator.next();
11             System.out.println(entry.getKey() + ":" + entry.getValue());
12         }
13     }

  程序运行结果:

        

  它对元素的Key进行了自然顺序的排序,之所以null元素在0元素的后面,就是因为null元素会自动存储到数组0的位置,若0的位置有了元素便进行链式存储进行挂载;

  我们把上面的程序的第一行改为LinkedHashMap lhm=new LinkedHashMap();则程序运行结果如下:

        

  可见和我们存储元素的位置是一样的。

四,TreeMap

  TreeMap是基于二叉树的结构来存储数据的,它会按照键的自然顺序进行存储数据;

  当TreeMap存储自定义对象时,此对象需要实现Comparable接口并重写compareTo方法;

  也可接收一个Comparator比较器对象来实例化TreeMap;

  其操作方法与TreeSet相类似,便不再演示了(TreeSet内部便是TreeMap);

原文地址:https://www.cnblogs.com/zw971084570/p/10125362.html

时间: 2024-10-16 05:43:51

Java中的集合框架-Map的相关文章

java中的集合框架

由于数组具有属性单一,长度不可改变的缺点,于是在程序中我们使用集合来代替它. 集合中不可放入基本数据类型,基本数据类型都是通过自动拆包和自动装箱功能才能放入和取出集合. 分类:Collection接口和Map接口 Collection:存放单一值元素,又可分为list接口类型和set接口类型 list接口类型:存放元素是有序的可重复的,可通过循环来取出其中的元素,实现类ArrayList() set接口类型:hash值排列,存放元素是无序不可重复的,通过指针取出其中元素,实现类HashSet()

菜鸟日记之 java中的集合框架

java中的集合框架图 如图所示:java中的集合分为两种Collection和Map两种接口 可分为Collection是单列集合和Map的双列集合 Collection单列集合:继承了Iterator接口所以具有了iterator()方法 ,该方法返回一个Iterator<T>,这个接口具有 HasNext (),next(),remove()3个方法可以在实现类里完成实现. hasNext():判断是否有下一个元素 cusor是当前的操作下标 next():读取下一个元素 remove(

Java中的集合框架(上)

Java中的集合框架概述 集合的概念: Java中的集合类:是一种工具类,就像是容器,存储任意数量的具有共同属性的对象. 集合的作用: 1.在类的内部,对数据进行组织: 2.简单的快速的搜索大数据量的条目: 3.有的集合接口,提供了一系列排列有序的元素,并且 可以在序列中间快速的插入或删除有关的元素. 4.有的集合接口,提供了映射关系,可以通过 关键字(key)去快速查找到对应的唯一对象,而这个关键字可以是任意类型. 与数组的对比一为何选择集合而不是数组 1.数组的长度固定,集合长度可变 2.数

Java中的集合框架大总结

直接上图: 从上面的集合框架图可以看到:Java集合框架主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合:另一种是图(Map),存储键/值对映射.Collection接口又有两个子接口,List和Set,再下面是一些抽象类,最后是具体实现类,常用的有ArrayList.LinkedList.HashSet.LinkedHashSet.HashMap.LinkedHashMap等等. 集合框架是一个用来代表和操纵集合的统一框架.所有的集合框架都包含如下内容: 接口:是代

JAVA学习--java中的集合框架

与数组相比:1.数组的长度固定,而集合的长度可变2.数组只能通过下表访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象 java集合框架:collection(list序列,queue队列,set集)和map(映射存储数据),红色为常用

Java中的集合框架(中)

Map和HashMap Map接口 1.Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value 2.Map中的键值对以Entry类型的对象实例形式存在 3.键(key值)不可重复,value可以 4.每个键最多只能映射到一个值 5.Map接口提供了分别返回key值集合,value值集合以及Entry(键值对)集合的方法 6.Map支持泛型,形式如:Map<K,V> HashMap类 1.HashMap是Map 的一个重要实现类,也

java中三大集合框架

一.List集合 1.List实现的超级父类接口:Collection 存储一组不唯一(允许重复),有序的对象. 2.了解ArrayList类 A):定义的格式:ArrayList<具体类型> 集合名 =  new ArrayList<具体类型>(); B):数据的存储方式:底层还是用数组存储 C):对象的类型:在List集合中,如果定义集合对象时没有定义定义对象的类型,就表示什么类型的对象都可以直接存储到List集合中,如果想要运用里面的元素,则需要用instanceof来判断元

Java中的集合(Map)

标准库中包含了几种Map的基本实现,包括:HashMap.TreeMap.LinkedHashMap.WeekHashMap.ConcurrentHashMap.IdentityHashMap.它们都有同样的基本接口Map,但是行为特性各不相同,这表现在效率,键值对的保存及呈现次序.对象的保存周期.映射表如何在多线程程序中工作和判定"键"等价的策略等方面. Map可以将键映射到值.一个映射不能包含重复的键:每个键最多只能映射到一个值.Map 接口提供三种collection 视图,允许

JAVA基础之集合框架

集合框架(collections framework) 首先要明确,集合代表了一组对象(和数组一样,但数组长度不能变,而集合能).Java中的集合框架定义了一套规范,用来表示.操作集合,使具体操作与实现细节解耦. 其实说白了,可以把一个集合看成一个微型数据库,操作不外乎"增删改查"四种操作,我们在学习使用一个具体的集合类时,需要把这四个操作的时空复杂度弄清楚了,基本上就可以说掌握这个类了. 设计理念 主要理念用一句话概括就是:提供一套"小而美"的API.API需要对