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

来源:互联网 发布:淘宝客发单机器人 编辑:程序博客网 时间:2024/06/06 09:08

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"); // AAAmap.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");  // AAAmap.put(new Iplong("li", "jiaa"), "second");// BBB 这里的键值比较也是equals,如果这里重写了equals,则此处map结果只有一条map.put(new Iplong("li", "ji"), "third");   // CCCSystem.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, lijiaa=second, li jia=first}


完成任务


0 0
原创粉丝点击