Map接口
-->Map接口 定义的集合又称查找表,用于存储所谓“key-Value”的映射对,Key可以看作为Value的索引,作为Key的对象在集合中不可以重复,根据内部数据结构的不同,Map接口有多种实现类,其中常用的内部为Hash表实现的HashMap和内部为排序二叉树实现的TreeMap
-->方法
put()
map接口中定义了Map中存放元素put方法:V put(K key,V value ),如果在集合中已经包含该Key ,则做替换操作value,返回值为原来的key原;来所对应的value。Map要求Key不允许重复的:Map中不能出现两个key的equals判断为true.
get()
-->map接口中定义了从map中获取元素的get方法:V get(Object key),返回参数key所对应的value对象,如果不存在则返回null.
remove()
--> V remove(K k):将给定的key所对应的key-value对map中删除 返回值为对应的value,v=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.获取key 的hashcode值,通过hash算法确定将要存储或者检索的空间
2 调用equals方法依次比较和空间中key比较,以链表的方式存入对应的空间,鉴于hashmap的存储原理,要妥善重写hashcode 的方法:
3 重写hashocode 方法
-->定义私有属性
—>在IDE中右键->源码—>构建hashcode和equals
/**
* 当一个类作为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; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + x; result = prime * result + y; return result; } @Override public 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; } @Override public int hashCode() { return i%10; } @Override public 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 数学 87 87 96 87