String类已经重写了hashCode()和equals()方法,如果将Student对象存入HashSet结果又如何呢,观看下面案例:
View Code import java.util.HashSet; public class c6_10 { public static void main(String[] args) { HashSet hs=new HashSet(); Student s1=new Student("1","Jack"); Student s2=new Student("2","Rose"); Student s3=new Student("2","Rose"); hs.add(s1); hs.add(s2); hs.add(s3); System.out.println(hs); } } class Student{ String id; String name; public Student(String id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return id+":"+name; } //运行结果:[2:Rose, 1:Jack, 2:Rose] //之所以会打印两个Rose,是因为Student类中没有对hashCode()和equals()方法进行重写 }接下来我们对Student类中的hashCode()和equals()方法进行重写,案例如下:
View Code import java.util.HashSet; public class c6_11 { public static void main(String[] args) { HashSet hs=new HashSet(); Stu s1=new Stu("1","Jack"); Stu s2=new Stu("2","Rose"); Stu s3=new Stu("2","Rose"); hs.add(s1); hs.add(s2); hs.add(s3); System.out.println(hs); } } class Stu{ String id; String name; public Stu(String id, String name) { super(); this.id = id; this.name = name; } @Override public String toString() { return id+":"+name; } public int hashCode() { return id.hashCode(); } public boolean equals(Object obj) { if(this==obj) { return true; } Stu s=(Stu) obj; boolean b=this.id.equals(s.id); return b; } } //重写了hashCode()和equals()方法,当HashSet调用add()方法添加s3对象时,发现它的哈希值与s2相同,且s2.equals(s3)返回true,HashSet集合两个对象相同,因此重复的对象就被去除了输出:[1:Jack, 2:Rose]
Map Map接口简介:是一种双列集合, 每个元素包含一对键值,键值直接一一对应。
Map集合常用的方法表:
void put(Object key,Object value) 将指定的值与映射中的指定键关联
Object get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null
boolean containsKey(Object key) 如果此映射包含指定键的映射关系,返回true
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回true
Set keySet 返回此映射中包含的键的Set视图
Collection values() 返回此映射关系中包含的值的Collectiono视图
Set<Map.Entry<K,V>>entrySet() 返回此映射包含的映射关系的Set视图
HashMap
案例如下:
import java.util.HashMap; import java.util.Map; public class c6_15 { public static void main(String[] args) { Map map=new HashMap(); map.put("1", "Jack"); map.put("2", "Rose"); map.put("3", "Lucy"); System.out.println(map.get("1")); System.out.println(map.get("2")); System.out.println(map.get("3")); } }输出:
Jack
Rose
Lucy
如果再添加map.put("3", "Marry");,那么Lucy会被Marry覆盖(键相同,值覆盖)
遍历Map集合中所有的键值对,有两种方式,方式一:先遍历Map集合中的所有键,再根据键获取对应的值,案例:
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class c6_16 { public static void main(String[] args) { Map map=new HashMap();//创建Map集合 map.put("1", "Jack");//存储键和值 map.put("2", "Rose"); map.put("3", "Lucy"); Set ks=map.keySet();//获取键的集合 Iterator it=ks.iterator();//迭代键的集合 while(it.hasNext()) { Object key=it.next(); Object value=map.get(key);//获取每个键所对应的值 System.out.println(key+":"+value); } } }遍历键值对,方式二:先获取集合中所有的映射关系, 然后从映射关系中取出键和值,案例:
import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class c6_17 { public static void main(String[] args) { Map map=new HashMap(); map.put("1", "Jack"); map.put("2", "Rose"); map.put("3", "Lucy"); Set entrySet=map.entrySet(); Iterator it=entrySet.iterator(); while(it.hasNext()) { Map.Entry entry=(Map.Entry) (it.next());//获取键值对映射 Object key=entry.getKey();//获取Entry中的键 Object value=entry.getValue();//获取Entry中的值 System.out.println(key+":"+value); } } }在Map中还提供了一个values()方法,通过这个方法可以直接获取Map中存储的所有值的Collection集合,案例:
import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class c6_18 { public static void main(String[] args) { Map map=new HashMap(); map.put("5", "Jack"); map.put("2", "Rose"); map.put("3", "Lucy"); Collection values=map.values(); Iterator it=values.iterator(); while(it.hasNext()){ Object value=it.next(); System.out.println(value); } } }输出:
Rose
Lucy
Jack
根据观察,输出的值的顺序是根据键从小到大排序的,如果要按添加顺序进行输出那么可以使用LinkedHashMap