Java基础Day-Fifteen
Set集合体系及应用
-
Set集合代表一个元素无序、不可重复的集合
-
Set集合与List集合使用方法基本相同,只是处理行为略有不同
-
Set集合常用的实现类是:HashSet与TreeSet
Set<String> mobileSet=new HashSet<String>(); //通过add方法增加新的元素 mobileSet.add("13542866666"); mobileSet.add("15966666666"); mobileSet.add("15323666666"); System.out.println(mobileSet); //Set集合不允许出现重复,add方法返回值代表是否真正在集合中插入数据 boolean isChanged=mobileSet.add("15366666666"); System.out.println("Set集合是否发生改变:"+isChanged); //对于已有数据,再次调用add方法写入将返回false isChanged=mobileSet.add("15366666666"); System.out.println("Set集合是否发生改变:"+isChanged); System.out.println(mobileSet); //Set集合可以使用所有Collection接口定义的方法 int count=mobileSet.size(); boolean result = mobileSet.contains("15366666666"); System.out.println(result); //需要额外注意的是,get等以索引获取数据的方法属于List接口,因此Set实现类无法使用
-
Set集合如何确保数据的唯一性
Set集合在新增数据时先判断数据的hashCode()是否已存在,若hashCode()在Set集合存在再调用equals()进行值的比较;hashCode()与equals()都存在的情况下,Set集合才认为数据已存在,不予新增
-
为什么要用对象的hashCode(),直接用equals()判断不行吗
出于执行效率考虑
hashCode()返回的整数结果决定了Set集合中的存放位置,hashCode()计算速度很快,但可能出现哈希碰撞;equals()则对值进行比较,处理速度相对较慢
-
HashSet与TreeSet存储原理
-
HashSet
-
HashSet是Set接口的典型实现,大多数时候使用Set集合时就是使用这个实现类
-
HashSet按Hash算法来决定集合元素的顺序,具有很好查找性能
-
当向HashSet集合中存入一个元素时,根据该对象的hashCode值决定该对象在HashSet中的存储位置
-
Hash,一般翻译做散列,杂凑,或音译为哈希,是把任意长度的数据通过散列算法变换成固定的输出,该输出就是散列值
int h; int hash=(h="a".hashCode())^(h>>>16);//97
Set set=new HashSet(); set.add("d"); set.add("a"); set.add("b"); set.add("c"); System.out.println(set); 结果:[a,b,c,d]
-
-
LinkedHashSet
-
LinkedHashSet是HashSet的子类,除HashSet的特性外,它同时使用链表维护元素的次序,可以保障按插入顺序提取数据
-
LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet的性能
-
迭代访问Set里的全部元素时将有很好的性能,因为它以链表来维护内部顺序
-
-
TreeSet
-
TreeSet是SortedSet接口的实现类,TreeSet可以确保集合元素处于排序状态
-
TreeSet采用红黑树的数据结构来存储集合元素
-
TreeSet默认采用自然排序对元素升序排列,也可以实现Comparable接口自定义排序方式
-
-
-
掌握HashSet与TreeSet的应用
package com.imooc.collection.set; import java.util.Comparator; import java.util.Set; import java.util.TreeSet; public class TreeSetSample { static class IntegerComparator implements Comparator<Integer>{ @Override public int compare(Integer o1, Integer o2) { return o2-o1; } } public static void main(String[] args) { Set<Integer> set=new TreeSet<Integer>(new IntegerComparator()); set.add(100); set.add(568); set.add(152); set.add(105); System.out.println(set); } }
package com.imooc.collection.set; import java.util.LinkedHashSet; import java.util.Set; public class LinkedHashSetSample { public static void main(String[] args) { Set<String> mobileSet=new LinkedHashSet<String>(); mobileSet.add("112233444555"); mobileSet.add("002056554863"); mobileSet.add("564643222355"); mobileSet.add("137899655223"); System.out.println(mobileSet); } }
Map映射体系及应用
-
Map映射特点
-
Map用于保存具有映射关系的数据,每组映射都是Key(键)与Value(值)组合而成
-
Key与Value可以是任何引用类型数据,但是Key通常是String
-
Map中的Key不允许重复,重复为同一个Key设置Value,后者Value会覆盖前者Value
-
HashMap
-
HashMap是Map接口的典型实现类,对Key进行无序存储
-
HashMap不能保证数据按存储顺序读取,且Key全局唯一
-
HashMap与HashSet的关系
-
Java先有Map后有Set,HashSet从HashMap精简而来
-
-
HashMap与LinkedHashMap的区别
-
HashMap的使用方法
HashMap<String,Object> student=new HashMap(); student.put("name","张三"); //相同的key会覆盖内容 String name=(String) student.put("name","李四"); //先将李四进行赋值,再将张三返回给name System.out.println(name+"已被替换为李四"); student.put("age", 18); student.put("height", 182); student.put("weight", 60); System.out.println(student); //获取键值对的数量 System.out.println("当前kv的数量:"+student.size()); //获取key的数据 String n=(String)student.get("name"); //判断key是否存在 boolean r1=student.containsKey("name1"); //判断当前数据中是否有对应的值 boolean r2=student.containValue(61); //移除key值并把被移除的值赋值给w Integer w=(Integer)student.remove("weight"); //运行结果:张三已被替换为李四 //{name=李四, weight=60, age=18, height=182} //当前kv的数量:4
-
LinkedHashMap:放入的顺序和提取的顺序可以保持一致
LinkedHashMap<String, Object> student = new LinkedHashMap<>(); student.put("name","张三"); student.put("age", 18); student.put("height", 182); student.put("weight", 60); System.out.println(student); //运行结果:{name=张三, age=18, height=182, weight=60}
-
TreeMap
-
TreeMap存储key-value对时,需要根据key对节点进行排序
-
TreeMap支持两种Key排序:自然排序与定制排序
-
与TreeSet相同,TreeMap也是基于红黑树结构对数据进行排序
package com.imooc.collection.Map; import java.util.Comparator; import java.util.Map; import java.util.TreeMap; public class TreeMapSample { public void sort(){ //按自定义规则对TreeMap进行排序 class RecordComparator implements Comparator<String>{ @Override public int compare(String o1, String o2) { return o1.compareTo(o2);//升序排列 //o2.compareTo(o1);降序排列 } } Map<String, Object> record = new TreeMap<>(new RecordComparator()); record.put("A1", "1"); record.put("C1", "2"); record.put("B1", "3"); record.put("D9", "4"); record.put("G5", "5"); record.put("S6", "6"); record.put("Z1", "7"); record.put("P1", "8"); record.put("D8", "9"); System.out.println(record); } public static void main(String[] args) { TreeMapSample sample = new TreeMapSample(); sample.sort(); } }
Map集合的三种遍历方式
-
第一种方式:利用for循环
package com.imooc.collection.Map; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; public class LoopSample { public void doForLoop(Map map){ Set<String> keys=map.keySet(); for(String k:keys){ System.out.println(k+":"+map.get(k)); } } public static void main(String[] args) { Map<String, Object> student = new LinkedHashMap<>(); student.put("name","张三"); student.put("age", 18); student.put("height", 182); student.put("weight", 60); System.out.println(student); LoopSample loopSample=new LoopSample(); loopSample.doForLoop(student); } } /*运行结果: {name=张三, age=18, height=182, weight=60} name:张三 age:18 height:182 weight:60*/
-
第二种方式:
package com.imooc.collection.Map; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; public class LoopSample { public void doForEach(Map map){ map.forEach((key,value)->{ System.out.println(key+":"+value); }); } public static void main(String[] args) { Map<String, Object> student = new LinkedHashMap<>(); student.put("name","张三"); student.put("age", 18); student.put("height", 182); student.put("weight", 60); System.out.println(student); LoopSample loopSample=new LoopSample(); loopSample.doForEach(student); } } /*运行结果: {name=张三, age=18, height=182, weight=60} name:张三 age:18 height:182 weight:60*/
-
第三种方式:利用迭代器
package com.imooc.collection.Map; import java.util.*; public class LoopSample { public void doIterator(Map map){ Iterator<Map.Entry<String,Object>> itr=map.entrySet().iterator(); while(itr.hasNext()){ Map.Entry<String,Object> entry=itr.next(); System.out.println(entry.getKey()+":"+entry.getValue()); } } public static void main(String[] args) { Map<String, Object> student = new LinkedHashMap<>(); student.put("name","张三"); student.put("age", 18); student.put("height", 182); student.put("weight", 60); System.out.println(student); LoopSample loopSample=new LoopSample(); loopSample.doIterator(student); } } /*运行结果: {name=张三, age=18, height=182, weight=60} name:张三 age:18 height:182 weight:60*/