import java.util.*;
class MapTest
{
public static void main(String[] args)
{
Tools ts=new Tools();
ts.put(1,"zhangsan");
ts.put(2,"lisi");
System.out.println(ts.get(1));
System.out.println(ts.get(2));
}
}
class Tools
{
ArrayList al1=new ArrayList();
ArrayList al2=new ArrayList();
public void put(Object obj1,Object obj2)
{
al1.add(obj1);
al2.add(obj2);
}
public Object get(Object key)
{
return al2.get(al1.indexOf(key));
}
}
打印结果:
zhangsan
lisi
表面上看这样是没有问题的,但是我们看到put函数有一句话写的很清楚:在此映射中关联指定值与指定键。如果该映射以前包含了一个该键的映射关系,则旧值被替换。
下面的代码可以说明这个问题
class MapTest
{
public static void main(String[] args)
{
HashMap hm=new HashMap();
hm.put(1,"num1");
hm.put(2,"num2");
hm.put(1,"num3");
hm.put(4,"num3");
//第二种遍历方法
Set<Map.Entry<Integer,String>> set=hm.entrySet() ;
for (Map.Entry<Integer,String> me:set )
{
System.out.println(me.getKey()+"---"+me.getValue());
}
}
}
打印结果为:
1---num3
2---num2
4---num3
打印结果告诉我们有相同键的添加,后面一个会覆盖前面一个。而我们自定义的put函数显然不具备这个特点。
看下面代码
import java.util.*;
class MapTest
{
public static void main(String[] args)
{
Tools ts=new Tools();
ts.put(1,"zhangsan");
ts.put(2,"lisi");
ts.put(1,"zhangsan");
for (int i=0;i<ts.size();i++ )
{
System.out.println(ts.get(i));
}
}
}
class Tools
{
ArrayList al1=new ArrayList();
ArrayList al2=new ArrayList();
public void put(Object obj1,Object obj2)
{
al1.add(obj1);
al2.add(obj2);
}
public Object get(int index)
{
return al2.get(index);
}
public int size()
{
return al1.size();
}
}
打印结果为:
zhangsan
lisi
zhangsan
显然ArrayList将两个相同的键和值存了进去。
改进方法为:在Tools中进行判断
代码为:
class Tools
{
ArrayList al1=new ArrayList();
ArrayList al2=new ArrayList();
public void put(Object obj1,Object obj2)
{
if (al1.contains(obj1)&&al2.contains(obj2))
return ;
al1.add(obj1);
al2.add(obj2);
}
public Object get(int index)
{
return al2.get(index);
}
public int size()
{
return al1.size();
}
}
这样的话打印结果为:
zhangsan
lisi