博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap
阅读量:4482 次
发布时间:2019-06-08

本文共 6537 字,大约阅读时间需要 21 分钟。

主要实现计数

java.util.Map

   ------->java.util.HashMap
   ------->java.util.TreeMap
   ------->java.util.Hashtable
java.util.HashMap(key/value)
1.基本操作
直接打印Map对象会打印key的toString=value的toString
get(key)得到value
containsKey(key) 是否包含key
遍历方式1:

把Map中所有的key都放入了Set集合,然后遍历Set

得到key,通过key获取value
Set set = map对象.keySet()
遍历方式2:放入HashMap集合中的key,value其实都会被包装成
Map.Entry这个内部类的属性,有一个健值对就存在一个
Map.Entry的实例对象,通过entrySet()方法就可以把
这些实例对象都放入Set集合中,遍历Set获取每个对象
Set set = Map对象.entrySet(); 
2.用HashMap的泛型实现基本操作避免强制类型转换
3.map.put(keyvalue) 如果key相同,那么value会覆盖之前的value
 (如何才能判定key是否相同,注意equals和hashCode的实现)
 这个特点特别适合用来做计数
 案例:计算每个字符出现的次数
 String s = "wwqajegjasrhgoihasijgolihaseg";
 思路:拿到每个字符,作为key放入HashMap中
如果map中不存在,那么put(key,1)
如果已经存在那么put(key,value+1)

4.HashMap的数据结构(数组+链表的结构)

分析源代码
  1).HashMap包含了一个Entry(key,value,next,hash)的内部类
    key/value放入HashMap的时候会被包装秤Entry对象
  2).HashMap成员就有Entry的数组,该数组的大小默认是12,永远是2的次防暑,如果自己
      给的不是2的次方数,会转换成大于并最接近自己给出的2的次方数
      put(key,value)时就是转换成Entry对象并放入数组中
  3).put(key,value)方法的时下
      a.根据key的hashCode进行hash运算(该算法不用关心)得到值hash
      b.根据hash值去确定数组的位置 hash & (table.length-1)等价于hash%table.length 
length是2的次方数。正好获取了数组的位置

 

一、未加泛型的HashMap

HashMap的元素添加和遍历

1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Set; 4  5  6 public class HashMapDemo { 7   public static void main(String[] args) { 8     HashMap aa=new HashMap(); 9     User1 user=new User1("0001","zhangsan",10);10     User1 user1=new User1("0002","lisi",11);11     User1 user2=new User1("0003","wangmazi",12);12     User1 user3=new User1("0004","xiaowang",13);13     aa.put(user.id, user);14     aa.put(user1.id, user1);15     aa.put(user2.id, user2);16     aa.put(user3.id, user3);17     //打印元素数量18     System.out.println(aa.size());19     /*遍历20      * 方法一21     */22     User1 user4=(User1)aa.get("0001");23     /*方法二24      * */25     Set  jj=aa.keySet();26     for (Object object : jj) {27         User1 user5=(User1)aa.get(object);28         System.out.println(user5);29     }30     /*方法三31      * */32     Set set=aa.entrySet();33     for (Object object : set) {34         Map.Entry as=(Map.Entry)object;35         System.out.println(as.getKey()+" "+as.getValue());36     }37 }38 }39 class User1{40     String id;41     String name;42     int age;43     public String getId() {44         return id;45     }46     public void setId(String id) {47         this.id = id;48     }49     public String getName() {50         return name;51     }52     public void setName(String name) {53         this.name = name;54     }55     public int getAge() {56         return age;57     }58     public void setAge(int age) {59         this.age = age;60     }61     62     public User1() {}63     public User1(String id, String name, int age) {64         super();65         this.id = id;66         this.name = name;67         this.age = age;68     }69     @Override70     public String toString() {71         // TODO Auto-generated method stub72         return this.name;73     }74 } 打印结果:

4

xiaowang
zhangsan
wangmazi
lisi
0004 xiaowang
0001 zhangsan
0003 wangmazi
0002 lisi

二、加入泛型的HashMap

 

1 import java.util.HashMap; 2 import java.util.Map; 3 import java.util.Set; 4 public class dg { 5    public static void main(String[] args) { 6     HashMap
student=new HashMap
(); 7 Student a=new Student("001","zhangsan",10); 8 Student a1=new Student("002","lisi",11); 9 Student a2=new Student("003","wangmazi",12);10 student.put(a.getId(), a);11 student.put(a1.getId(), a1);12 student.put(a2.getId(), a2);13 14 //遍历:方法一15 Student s=student.get("001");16 System.out.println(s);17 // 方法二18 Set
set=student.keySet();19 for (String string : set) {20 Student s1=student.get(string);21 System.out.println(s1);22 }23 // 方法三24 Set
> a11= student.entrySet();25 for (Map.Entry
entry : a11) {26 System.out.println(entry.getValue());27 }28 }29 }30 class Student{31 String id;32 String name;33 int age;34 public String getId() {35 return id;36 }37 public void setId(String id) {38 this.id = id;39 }40 public String getName() {41 return name;42 }43 public void setName(String name) {44 this.name = name;45 }46 public int getAge() {47 return age;48 }49 public void setAge(int age) {50 this.age = age;51 }52 53 public Student() {}54 public Student(String id, String name, int age) {55 super();56 this.id = id;57 this.name = name;58 this.age = age;59 }60 @Override61 public String toString() {62 63 return this.id+"=="+this.name;64 }65 } 打印结果

001==zhangsan

001==zhangsan
002==lisi
003==wangmazi
001==zhangsan
002==lisi
003==wangmazi

 

三、计数器

 

1 import java.util.HashMap; 2 public class jsq { 3      public static void main(String[] args) { 4         String s="aaaaaabbbbbbbbbbbbbcccccccccccccjjjjjjjjjj"; 5         HashMap
sd=new HashMap
(); 6 7 for (int i = 0; i < s.length(); i++) { 8 String dd=s.substring(i,i+1); 9 if(sd.containsKey(dd)){10 sd.put(dd, sd.get(dd)+1);11 }else{12 sd.put(dd, 1);13 }14 }System.out.println(sd);15 }16 } 打印结果:{b=13, c=13, a=6, j=10}

 四、计数排序

要求:记录String类中的字母个数,并将个数从小到大排序

 

1 import java.util.Comparator; 2 import java.util.HashMap; 3 import java.util.Set; 4 import java.util.TreeSet; 5 public class jsq { 6      public static void main(String[] args) { 7         String s="aaaaaabbbbbbbbbbbbbbcccccccccccccjjjjjjjjjj"; 8         HashMap
sd=new HashMap
(); 9 10 for (int i = 0; i < s.length(); i++) {11 String dd=s.substring(i,i+1);12 if(sd.containsKey(dd)){13 sd.put(dd, sd.get(dd)+1);14 }else{15 sd.put(dd, 1);16 }17 }System.out.println(sd.toString());18 TreeSet
aag=new TreeSet
(new aa());19 Set
aa=sd.keySet();20 System.out.println(aa);21 Integer a=sd.get("b");22 System.out.println(a);23 for (String string : aa) {24 Integer ay=sd.get(string);25 aag.add(ay);26 }27 System.out.println(aag);28 }29 }30 class aa implements Comparator
{31 32 public int compare(Integer o1, Integer o2) {33 if(!o1.equals(o2)){34 return o1-o2;35 }36 return 0;37 }38 } 输出结果:

{b=14, c=13, a=6, j=10}

[6, 10, 13, 14]

 

转载于:https://www.cnblogs.com/lgshiwoo/p/5566197.html

你可能感兴趣的文章
C#压缩文件为zip格式
查看>>
HDU 3861 The King’s Problem(tarjan连通图与二分图最小路径覆盖)
查看>>
媒体播放器三大底层架构
查看>>
如何在win10+vs2013上配置MPI并行编程环境
查看>>
Python学习第二十一节(继承顺序,super)
查看>>
KH4 删除字典数据
查看>>
socket.io,远程控制你的幻灯片
查看>>
Android窃取用户信息新思路
查看>>
leetcode 8. String to Integer (atoi)
查看>>
快速笔记02-MySQL主从复制原理半同步操作步骤及原理
查看>>
water mark
查看>>
文件属性的设置
查看>>
C# using 用法
查看>>
网易2018校园招聘编程题真题集合之重排序列
查看>>
php导出excel
查看>>
xml中报错,验证是否是xml报错
查看>>
Apache 下载+安装
查看>>
第七周总结CoreIDRAW
查看>>
Java ScriptEngine 解析js
查看>>
dubbo启动消费者报错:No provider available for the service
查看>>