在Java中集合除了有Collection
还有Map
。
Collection包括:List(ArrayList、LinkedList、Vector)、Queue、Set
Map包括:HashMap、HashTable、TreeMap、WeakHashMap。
HashMap
线程不安全
Map<String,String> map = new HashMap<String,String >();
map.put("name","zhangsan");
map.put("name","jack"); // 同一个key,后面的会覆盖前面的
System.out.println(map.get("name"));
// 遍历集合
map.put("age","19");
Set<String> set = map.keySet(); // 使用map.keySet()来遍历
for (String s : set){
System.out.println(s); // 打印key值
}
也是在import java.util.*
包里。
HashSet
Set<String> set = new HashSet<String>();
set.add("jack");
的内部也是调用的HashMap
的方法,可以说没有HashMap就没有HashSet。
与HashMap不同的地方:
set.add("jack"); //相同的值不会再加入
set.add("jack"); //相同的值不会再加入
相同的字符串不会再次加入,所以只有一个”jack”值存在。
那么添加对象呢?
set.add(new Product(101,"java"));
set.add(new Product(102,"php"));
set.add(new Product(101,"java"));
for (Product p :set){
System.out.println(p.getId()+"=="+p.getName());
}
尝试添加3个Product
对象,其中2个对象数据是相同的,但还是添加进去了。
因为对象的内存地址是不同的。
hashCode
是通过一定的算法计算出一个散列值。
上面3个Product对象,其最后的hashCode值是不一样的,这个hashCode
值是用来作为key保存HashSet的add()
方法的数据的。
更多内部原理,可以去看源码。^_^
看了源码我们知道,如果要判断2个对象内容是否相等,可以重写2个方法。
我们重写Product
类下面2个方法:
@Override
public int hashCode() {
return (this.getName()+String.valueOf(this.getId())).hashCode();
}
@Override
public boolean equals(Object obj) {
Product product = (Product)obj;
if (this.getId()==product.getId() && this.getName().equals(product.getName())){
return true;
}
return false;
}
现在加入相同的数据,就不会重复了:
Set<Product> set = new HashSet<Product>();
set.add(new Product(101,"java"));
set.add(new Product(102,"php"));
set.add(new Product(101,"java"));
for (Product p :set){
System.out.println(p.getId()+"=="+p.getName());
//打印:
// 102==php
//101==java
}