您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
【第13章:Java类集】_Map接口使用的注意事项
发布时间:2021-01-03 15:51:05编辑:雪饮阅读()
map接口可以通过entrySet方法结合Iterator进行迭代
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
public class TestJava{
public static void main(String args[]){
Map<String,String> map=new HashMap<String,String>();
map.put("kasumi","霞");
map.put("ayane","凌音");
map.put("momiji","红叶");
map.put("snowDrink","雪饮");
Set<Map.Entry<String,String>> allset=map.entrySet();
Iterator<Map.Entry<String,String>> iter=allset.iterator();
while(iter.hasNext()){
Map.Entry<String,String> me=iter.next();
System.out.println(me.getKey()+" --> "+me.getValue());
}
}
}
基于此又可以foreach输出
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Iterator;
public class TestJava{
public static void main(String args[]){
Map<String,String> map=new HashMap<String,String>();
map.put("kasumi","霞");
map.put("ayane","凌音");
map.put("momiji","红叶");
map.put("snowDrink","雪饮");
for(Map.Entry<String,String> me:map.entrySet()){
System.out.println(me.getKey()+" --> "+me.getValue());
}
}
}
D:\>javac TestJava.java
D:\>java TestJava
snowDrink --> 雪饮
momiji --> 红叶
ayane --> 凌音
kasumi --> 霞
Map接口应用在自定义类中
import java.util.HashMap;
import java.util.Map;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+" 年龄:"+this.age;
}
}
public class TestJava{
public static void main(String args[]){
Map<String,Person> map=new HashMap<String,Person>();
map.put("kasumi",new Person("霞",24));
System.out.println(map.get("kasumi"));
}
}
D:\>javac TestJava.java
D:\>java TestJava
姓名:霞 年龄:24
但是自定义类型若做为key的参数传值则会有问题,如
import java.util.HashMap;
import java.util.Map;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+" 年龄:"+this.age;
}
}
public class TestJava{
public static void main(String args[]){
Map<Person,String> map=new HashMap<Person,String>();
map.put(new Person("霞",24),"kasumi");
System.out.println(map.get(new Person("霞",24)));
}
}
D:\>javac TestJava.java
D:\>java TestJava
null
其实这里很显而易见就能看出问题所在,首先每次new肯定就是开辟一个新的堆内存地址,那么肯定都是唯一的,除非只new一次,然后第二次查找的时候直接用第一次new的引用,如:
import java.util.HashMap;
import java.util.Map;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+" 年龄:"+this.age;
}
}
public class TestJava{
public static void main(String args[]){
Map<Person,String> map=new HashMap<Person,String>();
Person kasumi=new Person("霞",24);
map.put(kasumi,"kasumi");
System.out.println(map.get(kasumi));
}
}
D:\>javac TestJava.java
D:\>java TestJava
kasumi
这样虽然能实现自定义类的对象做为key传递,但是如果我非要使用匿名对象来进行key传递呢?其实也是有办法的,只需要在该匿名对象所属类中实现equals和hashCode这两个方法的覆写即可。如:
import java.util.HashMap;
import java.util.Map;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name=name;
this.age=age;
}
public String toString(){
return "姓名:"+this.name+" 年龄:"+this.age;
}
public boolean equals(Object obj){
if(obj==this){
return true;
}
if(!(obj instanceof Person)){
return false;
}
Person p=(Person)obj;
if(p.name.equals(this.name) && p.age==this.age){
return true;
}
return false;
}
public int hashCode(){
return this.name.hashCode()*this.age;
}
}
public class TestJava{
public static void main(String args[]){
Map<Person,String> map=new HashMap<Person,String>();
map.put(new Person("霞",24),"kasumi");
System.out.println(map.get(new Person("霞",24)));
}
}
D:\>javac TestJava.java
D:\>java TestJava
kasumi
关键字词:java,Map