集合框架(HashSet,HashMap,HashTable)

来源:互联网 发布:智能语音聊天软件 编辑:程序博客网 时间:2024/06/08 18:03

一,Map集合的基本操作

package fighting;import java.util.Collection;import java.util.HashMap;import java.util.Map;public class MapDemo {/** * Map:存储一组成对的键值对象,key不要求有序,但不能重复;value也不要求有序,但允许重复。 *  * Collection是单列集合,Map是双列集合。 *  * 1,添加 *    put(k,v) *    pubAll() * 2,删除 *    clear() *    remove(k) * 3,判断 *    containsKey() *    containsValue() *    isEmpty() * 4,获取 *    get() *    size() *    values() *     *    entrySet() *    keySet() *     * Map *  |-HashTable:底层是哈希表数据结构,不可以存入null键和null值,线程同步,效率低。 *              用作键的对象必须实现hashCode方法和equals方法。 *  |-HashMap:底层是哈希表数据结构,允许使用null键和null值,该集合是不同步,效率高。 *  |-TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序。 *   *  TreeMap和Set很想,其实,Set底层就是使用了Map集合。 */public static void main(String[] args) {Map<String,String> map=new HashMap<String,String>();//添加元素map.put("01", "zhangsan001");map.put("02", "zhangsan002");map.put("03", "zhangsan003");System.out.println("containsKey:"+map.containsKey("02"));//containsKey:true//remove方法返回值:与 key 关联的旧值;如果 key 没有任何映射关系,则返回 null。(返回 null 还可能表示该映射之前将 null 与 key 关联。)System.out.println("remove:"+map.remove("022"));//remove:nullSystem.out.println("remove:"+map.remove("02"));//remove:zhangsan002//可以通过get方法的返回值来判断一个键是否存在。System.out.println("get:"+map.get("02"));//get:nullSystem.out.println("get:"+map.get("03"));//get:zhangsan003//下面这两种特殊情况map.put(null, "aaa");System.out.println("get:"+map.get(null));//get:aaamap.put("04", null);System.out.println("get:"+map.get("04"));//get:null                                         //这行代码说明,使用get方法获取的null为空,不能说明没有这个键,也可能是映射之前将null和key关联//获取map集合中所有的值Collection<String> coll = map.values();//这里不要Collection<V> coll,实际使用中,要把V变成具体的类型。System.out.println(coll);//[zhangsan001, zhangsan003, null, aaa]//注意:添加元素时,如果出现相同的key,后添加的值会覆盖原有的键对应的值,并且返回原来的这个值。System.out.println(map.put("ch", "中国"));//nullSystem.out.println(map.put("ch", "中华人民共和国"));//中国System.out.println(map);//{ch=中华人民共和国, 01=zhangsan001, 03=zhangsan003, 04=null, null=aaa}}}


二,Map集合的两种取出方式:

package fighting;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class MapKeySet {/** * map集合的两种取出方式: * 1,keySet:将map集合中所有的键存入到Set集合,因为Set具备迭代器, *           所以可以使用迭代方式取出所有的键,再根据get方法,获取每一个键对应的值 *           map集合没有迭代器,map集合的取出原理:将map集合转成Set,利用Set的迭代器迭代取出。 * 2,entrySet:返回映射中包含的映射关系的Set视图--Map.Entry<K,V> * Map.Entry  其实Entry也是一个接口,他是Map接口中的一个内部接口。 * interface Map  * { * public static interface Entry{ *  public abstract Object getKey(); *  public abstract Object getValue(); *  } * } * class HashMap implements implements Map{ *  * class xxx implements Map.Entry{ *  public Object getKey(){}; *  public Object getValue(){}; *  } * } */public static void main(String[] args) {Map<String,String> map=new HashMap<String,String>();//添加元素map.put("01", "zhangsan001");map.put("02", "zhangsan002");map.put("04", "zhangsan004");map.put("03", "zhangsan003");//获取map集合中所有键的Set集合Set<String> keySet = map.keySet();//获取迭代器Iterator<String> it = keySet.iterator();while(it.hasNext()){String key = it.next();System.out.println("key:"+key+" value:"+map.get(key));}/*输出结果 * key:01 value:zhangsan001 * key:03 value:zhangsan003 * key:04 value:zhangsan004 * key:02 value:zhangsan002 */Set<Map.Entry<String, String>> entryset = map.entrySet();Iterator<Map.Entry<String, String>> it1 = entryset.iterator();while(it1.hasNext()){Map.Entry<String, String> me = it1.next();String key = me.getKey();String value = me.getValue();System.out.println(key+":"+value);}/*输出结果 * 01:zhangsan001 * 03:zhangsan003 * 04:zhangsan004 * 02:zhangsan002 */}}


三,有关Map的一个小练习:

package fighting;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;import com.itheima.Student;public class MapDemo2 {/** * 练习:每一个学生都有对应的归属地。 * 学生Student,地址String * 学生属性:姓名,年龄 * 注意:姓名和年龄相同的视为同一个学生 * 保证学生的唯一性。 *  * 1,描述学生。 * 2,定义map容易,将学生作为键,地址作为值,存入。 * 3,获取map集合中的元素。 *  */public static void main(String[] args) {HashMap<Student0627,String> hm = new HashMap<Student0627,String>();hm.put(new Student0627("zhangsan001",22), "北京");hm.put(new Student0627("zhangsan002",23), "河北");hm.put(new Student0627("zhangsan003",24), "内蒙古");hm.put(new Student0627("zhangsan004",25), "天津");//第一种取出方式:keySetSet<Student0627> keySet =hm.keySet();Iterator<Student0627> it = keySet.iterator();while(it.hasNext()){Student0627 stu = it.next();System.out.println(stu+hm.get(stu));}/* * zhangsan001...22北京 * zhangsan004...25天津 * zhangsan003...24内蒙古 * zhangsan002...23河北 *///第二种取出方式:entrySetSet<Map.Entry<Student0627, String>> entrySet = hm.entrySet();Iterator<Map.Entry<Student0627, String>> it1 = entrySet.iterator();while(it1.hasNext()){Map.Entry<Student0627, String> me= it1.next();System.out.println(me.getKey()+"..."+me.getValue());}/* * zhangsan001...22...北京 *zhangsan004...25...天津 *zhangsan003...24...内蒙古 *zhangsan002...23...河北 *///再添加一条记录,key已经存在,值不同hm.put(new Student0627("zhangsan001",22), "广东");Set<Map.Entry<Student0627, String>> entrySet2 = hm.entrySet();Iterator<Map.Entry<Student0627, String>> it2 = entrySet.iterator();while(it2.hasNext()){Map.Entry<Student0627, String> me= it2.next();System.out.println(me.getKey()+"..."+me.getValue());}/* * zhangsan001...22...广东   ----注意zhangsan001这一条归属地变成了"广东" * zhangsan004...25...天津 * zhangsan003...24...内蒙古 * zhangsan002...23...河北 */}}//注意:类的对象不确定要存到什么集合中去,所以要保证保存到任何集合中都不会出错//①要覆盖hashCode方法和equals方法,//②还要实现Comparable接口,实现compareTo方法。class Student0627 implements Comparable<Student0627>{private String name;private int age;public Student0627(String name,int age){this.name=name;this.age=age;}public int compareTo(Student0627 o) {int num = new Integer(this.age).compareTo(new Integer(o.age));if(num==0)return this.name.compareTo(o.name);return num;}public int hashCode(){return name.hashCode()+age*34;}public boolean equals(Object obj){if(!(obj instanceof Student0627)){throw new ClassCastException("类型不匹配"); }Student0627 s =(Student0627)obj;return this.name.equals(s.name)&&this.age==s.age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString(){return this.name+"..."+this.age;}}

四,上一个小练习(MapDemo2)的需求升级:

package fighting;import java.util.Comparator;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;public class TreeMapDemo {/** * MapDemo2的续: * 需求:对学生对象的年龄进行升序排序。 * 需求2:按照学生对象的姓名升序排序 * 因为数据是以键值对形式存在的,所以要使用可以排序的Map集合--TreeMap *  */public static void main(String[] args) {//需求1TreeMap<Student0627,String> tm = new TreeMap<Student0627,String>();tm.put(new Student0627("bzhangsan003",23), "北京");tm.put(new Student0627("zhangsan001",21), "河北");tm.put(new Student0627("azhangsan004",24), "内蒙古");tm.put(new Student0627("zhangsan002",22), "天津");Set<Map.Entry<Student0627,String>> entrySet =tm.entrySet();Iterator<Map.Entry<Student0627,String>> it = entrySet.iterator();while(it.hasNext()){Map.Entry<Student0627,String> me =it.next();Student0627 stu = me.getKey();String addr = me.getValue();System.out.println(stu+"..."+addr);}/* * zhangsan001...21...河北 * zhangsan002...22...天津 * bzhangsan003...23...北京 * azhangsan004...24...内蒙古 *///需求2:如果想按照姓名升序进行排序,可以自定义比较器,传入TreeMap构造方法TreeMap<Student0627,String> tm2 = new TreeMap<Student0627,String>(new StuNameComparator());tm2.put(new Student0627("bzhangsan003",23), "北京");tm2.put(new Student0627("zhangsan001",21), "河北");tm2.put(new Student0627("azhangsan004",24), "内蒙古");tm2.put(new Student0627("zhangsan002",22), "天津");Set<Map.Entry<Student0627,String>> entrySet2 =tm2.entrySet();Iterator<Map.Entry<Student0627,String>> it2 = entrySet2.iterator();while(it2.hasNext()){Map.Entry<Student0627,String> me =it2.next();Student0627 stu = me.getKey();String addr = me.getValue();System.out.println(stu+"..."+addr);}/* * azhangsan004...24...内蒙古 * bzhangsan003...23...北京 * zhangsan001...21...河北 * zhangsan002...22...天津 */}}class StuNameComparator implements Comparator<Student0627>{public int compare(Student0627 s1, Student0627 s2) {int num  =s1.getName().compareTo(s2.getName());if(num==0){return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));}return num;}}


五,有关Map的第二个小练习--字母出现的次数:

package fighting;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;public class TreeMapDemo1 {/** * 练习: * "adsgljrgsgjfdgf"获取该字符串中的字母出现的次数。 * 希望打印结果:a(1)c(2)... *  * 通过结果发现,每一个字母都有对应的次数, * 说明字母和次数之间都有映射关系。 *  * 注意了,当发现有映射关系时,就可以选择Map集合, * 因为Map集合中存放就是映射关系。 *  * 思路: * 1,将字符串转换成字符数组,因为要对每一个字符进行操作。 * 2,定义一个map集合,因为打印结果的字母有顺序,所以使用TreeMap集合, * 3,遍历字符数组,将每一个字母作为键,去查map集合, *    如果返回null,就将该字母和1存入map集合; *    如果返回不是null,说明该字母在map集合内已经存在,并有对应的次数, *    那么就获取该次数并自增,让后让该字母和自增后的次数覆盖到集合中,覆盖到原来的键和对应的值 * 4,将Map集合的数据指定的字符串形式返回 */public static void main(String[] args) {String str = carCount("adsgljrgsgjfdgf");System.out.println(str);}public static String carCount(String str){char[] chs = str.toCharArray();TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();int count=0;for(int x=0;x<chs.length;x++){if(chs[x]>='a'&&chs[x]<='z'||chs[x]>='A'&&chs[x]<='Z'){//非字母不用计算个数continue;}Integer value = tm.get(chs[x]);//方法二if(value!=null){//不等于空,说明已经存在这个key,那么把key对应的值赋给count,再加一count = value;}count++;tm.put(chs[x], count);count =0;//方法一/*if(value==null){value = 1;tm.put(chs[x], 1);}else{value++;tm.put(chs[x], value);}*/}StringBuilder sb = new StringBuilder();Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();while(it.hasNext()){Map.Entry<Character,Integer> me= it.next();Character ch = me.getKey();Integer value = me.getValue();sb.append(ch+"("+value+")");}return sb.toString();//把sb转换成字符串类型返回,这里toString不能省略}}


六,Map扩展知识:大集合嵌套小集合、一对多映射

package fighting;import java.util.ArrayList;import java.util.HashMap;import java.util.Iterator;import java.util.List;public class MapDemo1 {/** * Map扩展知识: * map集合被使用是因为具备映射关系。。 *  * 需求:一个学校有多个班级,每个班级有多名学生,利用Map遍历所有学生 * 比如:学校有预热班和就业班 * "预热班","1号","张三" * "预热班","2号","李四" * "就业班","1号","张三" * "就业班","2号","李四" *  * 需求2:把学号和学生姓名封装成学生对象进行操作。 *  * 大集合里嵌套小集合 * 一对多映射 */public static void main(String[] args) {//分别定义学校、预热班、就业班HashMap<String,HashMap<String,String>> school = new HashMap<String,HashMap<String,String>>();HashMap<String,String> yure=new HashMap<String,String>();HashMap<String,String> jiuye =new HashMap<String,String>();//把班级信息添加到学校集合school.put("预热班", yure);school.put("就业班", jiuye);//把学生信息添加到班级集合yure.put("1号", "张三");yure.put("2号", "李四");//把学生信息添加到班级集合jiuye.put("1号", "张三er");jiuye.put("2号", "李四er");//遍历输出,Iterator<String> it = school.keySet().iterator();//获取学校的所有班级信息while(it.hasNext()){String roomName = it.next();//班级名称--预热班、就业班HashMap<String,String> room = school.get(roomName);//班级对应的集合--yure、jiuyeIterator<String> it1 = room.keySet().iterator();//班级里学生信息的学号集合while(it1.hasNext()){String id = it1.next();//学号System.out.println(roomName+id+"::"+room.get(id));}}System.out.println("---------------------------把学生封装成对象(Student27)实现如下--------------------------------");demo();}public static void demo(){//把学生信息保存到List集合里,就是说每一个班级对应一个学生的List集合,//获取班级信息后,就可以获取学生的一个List集合,再迭代这个List集合就可以得到所有学生信息。HashMap<String,List<Student27>> hm = new HashMap<String,List<Student27>>();List<Student27> yure = new ArrayList<Student27>();List<Student27> jiuye = new ArrayList<Student27>();hm.put("预热班", yure);hm.put("就业班", jiuye);yure.add(new Student27("1号", "张三"));yure.add(new Student27("2号", "李四"));jiuye.add(new Student27("1号", "张三er"));jiuye.add(new Student27("2号", "李四er"));Iterator<String> it = hm.keySet().iterator();while(it.hasNext()){String roomName = it.next();List<Student27> room = hm.get(roomName);Iterator<Student27> it1 = room.iterator();while(it1.hasNext()){Student27 stu = it1.next();System.out.println(roomName+stu.getId()+"::"+stu.getName());}}}}//把学号和学生姓名封装成学生对象--学生类class Student27 {private String id;private String name;public Student27(String id,String name){this.id=id;this.name=name;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}


 

 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 驾照分卖了12分怎么办 一年12分扣完了怎么办 滴滴车管所信息不同步怎么办 驾驶证过期两个月了怎么办 科目二考试第一次不合格怎么办 科目二不想考了怎么办 科二有事考不了怎么办 科四有事去不了怎么办 社保卡发了密码怎么办 不知道社保卡号怎么办 科目三未到30天怎么办 户口地址变了驾照怎么办 拿了驾照没开车怎么办 免检的车在外地怎么办 2018年b2证扣3分怎么办 科一考试没去怎么办 上海房子卖了户口怎么办 贷款买房买房人不是贷款人怎么办 行驶证驾驶证都遗失了怎么办 c1增驾b2没考过怎么办 没驾照买车怎么办行驶证 广州车辆年审加装踏板怎么办 租车感觉违章了 怎么办 武汉驾照扣12分怎么办 驾驶证照片泡水不清楚怎么办 驾驶证过了180天怎么办 天津有公司执照怎么办落户 温州车在上海年审手续怎么办 广东小高考考了d怎么办 深圳开摩托抓到怎么办 深圳车卖了车牌怎么办 a1驾照时期过了怎么办 b1驾照扣了12分怎么办 北京的驾照换证怎么办 b2汽车驾驶证年审过期几天怎么办 上海驾照到期人在外地怎么办 交警开的罚单交不了怎么办 珠海交警微信交罚单扣分怎么办 驾驶证违法罚款单子没有了怎么办 转账密码输错3次怎么办 汽车违章扣6分怎么办