HashMap集合本身基于哈希表
它可以保证键的唯一性(Map都是针对键有效)
HashMap<String,String>
举例:
String:学号
键:是一种自定义类型
Student:学生:年龄和姓名
String:唱歌类型
如果对象的成员变量值一样,认为同一个人.
HashMap底层哈希表
TreeMap<Student,String>
jc(基础班)
曾轶可 28
李荣浩 30
jy(就业班)
毛不易 29
每一个ArrayList集合的值是字符串。
元素我已经完成,请遍历。
结果:
三国演义
吕布
周瑜
笑傲江湖
令狐冲
林平之
神雕侠侣
郭靖
HashMap集合和Hashtable的区别?
共同点:都是map接口的实现类,都是基于哈希表的实现类
HashMap集合线程不安全的类,不同步,执行效率高(允许键和值是null的)
Hashtable集合线程安全的类,同步,执行效率低(不允许有null键和null值)
线程安全的类:
StringBuffer :字符串缓冲区
Vector :List集合
它可以保证键的唯一性(Map都是针对键有效)
HashMap<String,String>
举例:
public class Demo1 { public static void main(String[] args) { HashMap<String,String> map=new HashMap<String,String>(); map.put("1", "one"); map.put("2", "two"); map.put("3", "three"); map.put("4", "fif"); map.put("1", "two"); Set<String> set = map.keySet(); for(String key:set) { String value = map.get(key); System.out.println(key+"---"+value); } } }
注释:主键相同的话,会替代掉的一个之间以及他们的值。
HashMap<Integer,String>
Integer:年龄
String:姓名
举例
public class Demo2 { public static void main(String[] args) { HashMap<Integer,String> map=new HashMap<Integer,String>(); map.put(25,"曾轶可"); map.put(20,"毛不易"); map.put(23,"李荣浩"); map.put(21,"张嘉译"); Set<Integer> keySet = map.keySet(); for(Integer key:keySet) { String value = map.get(key); System.out.println(key+"---"+value); } } }HashMap<String,Student>
String:学号
Student:学号对应一个学生:有姓名和年龄
举例:
public class Demo3 { public static void main(String[] args) { Student s1=new Student("曾轶可",28); Student s2=new Student("李荣浩",30); Student s3=new Student("毛不易",25); Student s4=new Student("张嘉译",40); HashMap<String,Student> map=new HashMap<String,Student>(); map.put("001", s1); map.put("002", s2); map.put("003", s3); map.put("004", s4); Set<String> k = map.keySet(); for(String key:k) { Student value = map.get(key); System.out.println(key+"---"+value); } } }HashMap<Student,String>
键:是一种自定义类型
Student:学生:年龄和姓名
String:唱歌类型
如果对象的成员变量值一样,认为同一个人.
HashMap底层哈希表
哈希表:依赖于两个方法 hashCode() ,equals()方法
举例:
public class Demo4 { public static void main(String[] args) { HashMap<Student,String> map=new HashMap<Student,String>(); Student s1=new Student("曾轶可",28); Student s2=new Student("李荣浩",30); Student s3=new Student("曾轶可",28); Student s4=new Student("曾轶可",18); map.put(s1, "随意"); map.put(s2, "豪放"); map.put(s3, "随意"); map.put(s4, "呆萌"); Set<Student> k = map.keySet(); for(Student key:k) { String value = map.get(key); System.out.println(key+"---"+value); } } }
注释:主键相同的话,是不会被代替的。
LinkedHashMap<K,V> :
是Map接口基于哈希表和链接列表实现的
哈希表保证键的唯一性
链接列表保证元素有序性(存储和取出一致)
public class Demo1 { public static void main(String[] args) { LinkedHashMap<String,String> map=new LinkedHashMap<String,String>(); map.put("1", "hello"); map.put("2", "world"); map.put("3", "retain"); map.put("1", "hello"); Set<String> k = map.keySet(); for(String key:k) { String value = map.get(key); System.out.println(key+"---"+value); } } }
TreeMap基于红黑树结构的Map接口的实现
TreeMap<String,String>
举例:
public class Demo1 { public static void main(String[] args) { TreeMap<String,String> map=new TreeMap<String,String>(); map.put("hello", "nihao"); map.put("world", "shijie"); map.put("retain", "jiaoji"); map.put("hello", "nihao"); Set<String> k = map.keySet(); for(String key:k) { String value = map.get(key); System.out.println(key+"---"+value); } } }TreeMap存储自定义类型
TreeMap<Student,String>
主要条件:年龄从小到大
举例:
public class Demo2 { public static void main(String[] args) { TreeMap<Student,String> map=new TreeMap<Student,String>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { int num=s1.getAge()-s2.getAge(); int num2=num==0?s1.getName().compareTo(s2.getName()):num; return num2; } }); Student s1=new Student("曾轶可",28); Student s2=new Student("李荣浩",30); Student s3=new Student("毛不易",25); Student s4=new Student("张嘉译",40); Student s5=new Student("李荣浩",29); Student s6=new Student("李荣浩",30); map.put(s1, "随性"); map.put(s2, "豪放"); map.put(s3, "伤感"); map.put(s4, "帅气"); map.put(s5, "帅气"); map.put(s6, "帅气"); Set<Student> k = map.keySet(); for(Student key:k) { String value = map.get(key); System.out.println(key+"--"+value); } } }
注释:如果学生对象完全一样则会看成一个人,所以会被代替。
Map子实现类的应用
HashMap集合嵌套HashMap集合
西部开源jc(基础班)
曾轶可 28
李荣浩 30
jy(就业班)
毛不易 29
张嘉译 30
举例:
public class Demo2 { public static void main(String[] args) { HashMap<String,HashMap<String,Integer>> map=new HashMap<String,HashMap<String,Integer>>(); HashMap<String,Integer> map1=new HashMap<String,Integer>(); map1.put("曾轶可", 28); map1.put("李荣浩", 30); map.put("jc(基础班)", map1); HashMap<String,Integer> map2=new HashMap<String,Integer>(); map2.put("毛不易",29); map2.put("张嘉译",30); map.put("jy(就业班)",map2); Set<String> k1 = map.keySet(); for(String key:k1) { System.out.println(key); HashMap<String, Integer> value = map.get(key); Set<String> k2 = value.keySet(); for(String key1:k2) { Integer value1 = value.get(key1); System.out.println("\t"+key1+"---"+value1); } } } }假设HashMap集合的元素是ArrayList。有3个。
每一个ArrayList集合的值是字符串。
元素我已经完成,请遍历。
结果:
三国演义
吕布
周瑜
笑傲江湖
令狐冲
林平之
神雕侠侣
郭靖
杨过
举例:
public class Demo3 { public static void main(String[] args) { HashMap<String,ArrayList<String>> map=new HashMap<String,ArrayList<String>>(); ArrayList<String> arr1=new ArrayList<String>(); arr1.add("吕布"); arr1.add("周瑜"); map.put("三国演义", arr1); ArrayList<String> arr2=new ArrayList<String>(); arr2.add("令狐冲"); arr2.add("林平之"); map.put("笑傲江湖", arr2); ArrayList<String> arr3=new ArrayList<String>(); arr3.add("郭靖"); arr3.add("杨过 "); map.put("神雕侠侣", arr3); Set<String> k = map.keySet(); for(String key:k) { System.out.println(key); ArrayList<String> value = map.get(key); for(String s:value) { System.out.println("\t"+s); } } } }面试题:
HashMap集合和Hashtable的区别?
共同点:都是map接口的实现类,都是基于哈希表的实现类
HashMap集合线程不安全的类,不同步,执行效率高(允许键和值是null的)
Hashtable集合线程安全的类,同步,执行效率低(不允许有null键和null值)
线程安全的类:
StringBuffer :字符串缓冲区
Vector :List集合
Hashtable :Map集合的
需求:
字符串:比如: aaaaabbbbcccddddee ,最终控制台要出现的结果:a(5)b(4)c(3)d(3)e(2)
思路:
1)改进:键盘录入一个字符串
2)创建一个HashMap集合key:Character,Value:Integer
3)将录入的字符串转换成字符数组
4)遍历可以获取每一个字符
* 5)将元素添加到对应的HashMap集合中
使用的put(key,value): 通过判断值是否null ,如果是null表示第一次存储
集合对象.put(ch,1) ;
否则,不是null
Integer那个值++;
集合对象.put(ch,变量Integer值) ;
6)遍历HashMap集合即可
public class Demo5 { public static void main(String[] args) { Scanner sc=new Scanner (System.in); HashMap<Character,Integer> map=new HashMap<Character,Integer>(); System.out.println("请输入一个字符串:"); String s=sc.nextLine(); char[] arr = s.toCharArray(); for(char ch:arr) { Integer i = map.get(ch); if(i==null) { map.put(ch, 1); }else { i++; map.put(ch, i); } } StringBuffer sb=new StringBuffer(); Set<Character> k = map.keySet(); for(Character key:k) { Integer value = map.get(key); sb.append(key).append("(").append(value).append(")"); } String ss = sb.toString(); System.out.println(ss); } }