您的位置:首页 > 编程语言 > Java开发

java 集合(6) 选择集合类标准 / Map 接口用法

2015-12-29 20:30 465 查看
1. 如何选择集合(数据结构)

衡量标准:读的效率和改的效率

现在用的:就是list set map

Array打头的  : 读快改(删结构)慢

Linked打头的   : 改快读慢

Hash打头的 : 两者之间 ——这些类是,以前遗留的比较古老的数据结构实现,不推荐使用,hashtable内部是锁定的,效率极低(不论是读还是写)

Vector:——这些类是,以前遗留的比较古老的数据结构实现 ,不推荐使用, vector内部是锁定的,效率极低(不论是读还是写)

2.Map 接口用法

Map接口的函数:



实现Map 接口的类用来存储键值对

Map接口的实现类有HashMap和TreeMap

Map类中存储的键值对通过键来标识,所以键不能重复(说的是equals() )。这里的键就相当于索引。

HashMap 用哈希表实现(用哈希表做索引),TreeMap 用二叉树(红黑树)实现(用二叉树做索引)。

Map map = new HashMap();
map.put(new Iplong("li", "jia"), "first");
map.put(new Iplong("li", "jia"), "second");//这里的键值比较也是equals,如果这里重写了equals,则此处map结果只有一条
System.out.println(map);
结果是:{li jia=second, lijia=first}

如果两个key 是不同的对象,还想覆盖,必须重写hashcode / equals方法

public class Iplong {

public String firstName;
public String lastName;

public Iplong(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public boolean equals(Object obj) {
System.out.println("equals");
if (obj instanceof Iplong) {
Iplong iplong = (Iplong) obj;
return firstName.equals(iplong.firstName)
&& lastName.equals(iplong.lastName);
}
return super.equals(obj);
}

public int hashCode() {
System.out.println("hashcode "+firstName.hashCode());
return firstName.hashCode();//(int)(Math.random()*10) 0~9随机数
}

public static void main(String[] args)
{
// 只有当比较key 的hashcode 相等时,才继续比较key 的equals ,否则不比。如果equals 也相等,则替换已存在key 。具体过程如下两句。
//先比较Map 的key的hashcode,调用hashcode 方法如果相等,再比较equals,如果相等则替换键值对,否则不替换都插入保留。
//在比较Map 的key的hashcode,调用hashcode 方法的时候,如果不相等,则不调用equals,直接不替换都插入保留
Map map = new HashMap();
map.put(new Iplong("li", "jia"), "first"); // AAA
map.put(new Iplong("li", "jia"), "second");// BBB 这里的键值比较也是equals,如果这里重写了equals,则此处map结果只有一条
System.out.println(map);
}
}

结果:

hashcode 3453     这个是执行AAA语句调用的hashcode 方法

hashcode 3453 这个是执行BBB语句调用的hashcode 方法  

equals

{li jia=second}

对上面结果进一步解释是

Map map = new HashMap();
map.put(new Iplong("li", "jia"), "first"); // AAA
map.put(new Iplong("li", "jiaa"), "second");// BBB 这里的键值比较也是equals,如果这里重写了equals,则此处map结果只有一条
map.put(new Iplong("li", "ji"), "third"); // CCC
System.out.println(map);结果:
hashcode 3453       这个是执行AAA语句调用的hashcode 方法

hashcode 3453       这个是执行BBB语句调用的hashcode 方法  

equals    这个是执行BBB语句后,和AAA元素比较,调用的equals 方法

hashcode 3453       这个是执行CCC语句调用的hashcode 方法  

equals    这个是执行CCC语句后,和AAA(或BBB)元素比较,调用的equals 方法

equals    这个是执行CCC语句后,和BBB(或AAA)元素比较,调用的equals 方法

{li ji=third, li
jiaa=second, li jia=first}

完成任务
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: