JAVA的Map的API等知识

来源:互联网 发布:c语言如何打开文件 编辑:程序博客网 时间:2024/05/29 10:44

Map接口

-->Map接口 定义的集合又称查找表,用于存储所谓“key-Value”的映射对,Key可以看作为Value的索引,作为Key的对象在集合中不可以重复,根据内部数据结构的不同,Map接口有多种实现类,其中常用的内部为Hash表实现的HashMap和内部为排序二叉树实现的TreeMap

-->方法

put()

map接口中定义了Map中存放元素put方法:V put(K key,V value ),如果在集合中已经包含该Key ,则做替换操作value,返回值为原来的key原;来所对应的valueMap要求Key不允许重复的:Map中不能出现两个keyequals判断为true.

get()

-->map接口中定义了从map中获取元素的get方法:V get(Object key),返回参数key所对应的value对象,如果不存在则返回null.

remove()

-->  V remove(K k):将给定的key所对应的key-valuemap中删除 返回值为对应的valuev=map.remove()

containsKey()方法:Map接口中定义了判断某个key是否在Map中存在:

-->boolean containskey(Object key)

测试代码:

import java.util.HashMap;import java.util.Map; /** * java.util.Map * Map 是一个接口,查找表 * Map是以Key-value对的形式保存数据的 * Map的常用实现类:HashMap(散列表,散列算法实现) * @author soft01 * /* public class Demo7 {public static void main(String[] args) {Map<String,Integer> map=new HashMap<String,Integer>();Integer value=map.put("生物",56);System.out.println(value);map.put("语文", 50);map.put("数学", 50);map.put("英语", 50);System.out.println(map);Integer value1=map.get("生物");System.out.println(value1);Integer value2=map.remove("语文");System.out.println(value2);System.out.println(map);}} 

HashMap:

Hash表原理:

1.获取keyhashcode值,通过hash算法确定将要存储或者检索的空间

2 调用equals方法依次比较和空间中key比较,以链表的方式存入对应的空间,鉴于hashmap的存储原理,要妥善重写hashcode的方法:

3 重写hashocode方法

 -->定义私有属性

 —>IDE中右键->源码—>构建hashcodeequals

/**

 * 当一个类作为HashMap中的Key使用是,它的equals方法与hashcode

 * 方法的结果直接影响散列表的查询性能

 * APIs手册中明确说明:当我们重写一个类的equals方法是就应

 * 当连同重写hashCode方法

 * 重写hashcode方法是应遵循:

 * 1:稳定性:当参与equal比较的属性的值没有发生改变的情况下,

 * 多次调用hashCode方法返回的数字应当相同

 * 2:一致性:当两个对象equals比较为true

 * 那么hashcode方法放回的数字必须相同,反过来

 * 虽然不强制,但也尽量保证一致

 * 因为:若两个hashcode值相同

 * 但是equals方法比较的是false,在散列表中会产生链表

 * 影响查询性能

 *

 * @author soft01

 *

 */

public class Key {     public Key(int x, int y) {super();this.x = x;this.y = y;}private int x;private int y;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + x;result = prime * result + y;return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Key other = (Key) obj;if (x != other.x)return false;if (y != other.y)return false;return true;}}

测试代码:

import java.util.HashSet;import java.util.Set; public class Hashcode {private int i;public int getI() {return i;} public void setI(int i) {this.i = i;}@Overridepublic int hashCode() {return i%10;} @Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Hashcode other = (Hashcode) obj;if (i != other.i)return false;return true;}public static void main(String[] args) {Hashcode a=new Hashcode();Hashcode b=new Hashcode();a.setI(1);b.setI(1);Set<Hashcode> st=new HashSet<Hashcode>();st.add(a);st.add(b);System.out.println(a.hashCode()==b.hashCode());System.out.println(a.equals(b));}

 

1 hashCode 的存在主要是用于查找的快捷性

如 在Hashtable HashMap等,hashcode的用来在散列存储结构确定对象的存储位置的

2 如果两个对象相同,就是适用于equals()方法,那么这两个对象的hashcode一定相同

3 如果equlas被重写,那么相应的hashcode也应该被重写

4 hashcode 相同,并不表示对象相同,还要有equals()比较相同,这样他们就存储一个“篮子”

5 详细的知识点可以参考 -数觉结构 -里面的"哈希函数"一章的知识。

Map的遍历

使用keyset()方法

1 Map提供了三种遍历方式:

-遍历所有的Key

-遍历所有的Key-value

-遍历所有的value(不常用)

-->遍历各个检测点

Public void testkeyset(){

Set<String> keySet=ap.keySet();

for(String key:keySet){

System.out.println("检测点:"+key)

}

-->遍历所有的键值对的方法:

Set<Entry<K,V>> entrySet()

-该方法将当前每一组key-value对封装为一个Entry对象并存入一个Set集合中返回

Public void testEntrySet(){

Set<Entry<String,Integer>> entry=map.entrySet();

for(Entry<String,Integer> entry:entrySet){

System.out.println(entry.getKey()+":"+entry.getValue());}

}

 

测试代码:

import java.security.KeyStore.Entry;import java.util.Collection;import java.util.HashMap;import java.util.Map;import java.util.Set; public class Demo6 {public static void main(String[] args) {Map<String,Integer> map=new HashMap<String,Integer>();map.put("语文", 87);map.put("数学", 87);map.put("英语", 96);Set<String> myset=map.keySet();for(String key:myset){System.out.println(key);}Set<java.util.Map.Entry<String,Integer>> entry=map.entrySet();for(java.util.Map.Entry<String,Integer> e:entry){System.out.println(e.getKey()+" "+e.getValue());}/** Collection<V> values()         * 将Map中所有的Value存入一个集合 */Collection<Integer> com=map.values();for(Integer c:com){System.out.println(c);} }}测试结果:语文英语数学语文 87英语 96数学 87879687

 


0 0