JAVA的Map的API等知识

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.获取key hashcode值,通过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;
}
@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

 


你可能感兴趣的:(java,map,HashCode)