集合类中的Set和Map
Set和Map
HashSet和HashMap
- HashSet依赖于HashMap的实现
- HashMap中可以存放key为null的key-value键值对
- hashMap如何判定key值重复?
if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))
- jdk1.7和jdk1.8中的HashMap实现不同在于hash值相同的元素存放的数据结构1.7用的是普通的单链表,而1.8用的是红黑树(长度为8就用红黑树,小于8还是单链表)
TreeSet
- TreeSet自带排序接口int compareTo(T o);返回值为负数、正数和0;
- 如果是自定义的类,又要将其放入treeSet中,就需要向TreeSet指明排序规则;
- 通过Comparable指明自定义对象的比较规则有两种方式
- 1、直接将该规则告诉TreeSet(重写compareTo接口)
- 2、让放入TreeSet中的元素自己指明自己的比较规则(见如下代码)
TreeSet<Student> tree = new TreeSet<>(new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int ret = o1.getName().compareTo(o2.getName());
if(ret == 0) {
return o1.getAge() - o2.getAge();
} else {
return ret;
}
}
});
- 总而言之,要使用TreeSet,必须能够比较严肃。这些元素必须实现Comparable接口或者构造Set时提供一个Comparator
- 在将元素添加进TreeSet中之后再去修改元素的值不会重新对元素进行排序!
Student fir=tree.first()
fir.setName("haha")
System.out.println()
for (Student haha:tree
) {
System.out.println(haha + " ")
}
Map中的API含义和实例
//V put(K key,V value)
map.put(1,"zhangsan")
map.put(2,"lisi")
map.put(3,"wangwu")
//System.out.println(map)
//V remove(Object key)
map.remove(1)
System.out.println(map)
//boolean containsKey(Object key)
System.out.println(map.containsKey(4))
//V get(Object key)
System.out.println("value ="+map.get(4))
//Set<K>keySet()返回此映射中包含的键的 set 视图,因为map中key值不能重复,
//所以返回的是Set而不是List
System.out.println(map.keySet())
两种遍历Map的方法
第一种:利用KeySet遍历整个map输出所有的键值对
Set<Integer> haha = map.keySet();
for (Integer haha2:haha) {
System.out.println("key ="+haha2);
String value=map.get(haha2);
System.out.println("key = " + haha2 + " && " + " value = " + value);
}
第二种:使用entrySet();返回此映射中包含的映射关系的 Set 视图;entrySet中存放的是键值对
Set<Map.Entry<Integer,String>>ent=map.entrySet()
for (Map.Entry<Integer,String> haha3:ent) {
System.out.println("entry.key = "+haha3.getKey()+" && "+" entry.value = "+haha3.getValue())
}