它可以保证键的唯一性(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);
}
}