1.HashMap与HashSet联系
1)底层都是利用Hash算法
2)HashSet底层依赖HashMap实现的
3)都有去重功能,无序的
TreeMap :有排序的功能,根据键
一、HashMap例题
1.当Map集合中添加了两个相同的元素(键一样,值不一样)的时候,后加入的会覆盖掉前面的值(put的添加方法返回的是你覆盖了集合里面的元素)
HashMap<String,Integer>map = new HashMap<>();
Integer i1 = map.put("a",12);
Integer i2 = map.put("b",13);
Integer i3 = map.put("c",14);
Integer i4 = map.put("d",15);
Integer i5 = map.put("a",16);
System.out.println(i1);
System.out.println(i2);
System.out.println(i3);
System.out.println(i4);
System.out.println(i5);
system.out.println(map);
null
null
null
null
12
{a=16,b=13,c=14,d=15}
2.
1)使用map中的containsKey方法输入键,查看里面是否存在这个键
2)使用map中的containsValue方法输入值,查看值里面是否存在这个值
HashMap<String,Integer> map = new HashMap<>();
Integer i1 = map.put("振北", 19);
Integer i2 = map.put("振西", 20);
Integer i3 = map.put("振南", 32);
Integer i4 = map.put("振东", 13);
boolean containsKey = map.containsKey("振南");
boolean containsValue = map.containsValue(19);
System.out.println(containsKey);
System.out.println(containsValue);
true
false
3.HashMap<String,Integer> map = new HashMap<>();
Integer i1 = map.put("振北", 19);
Integer i2 = map.put("振西", 20);
Integer i3 = map.put("振南", 32);
Integer i4 = map.put("振东", 13);
1)使用get方法,输入键获取对应的value值,没有,则输出null
Integer integer = map.get("振北");
Integer integer2 = map.get("振中");
System.out.println(integer);
System.out.println(integer2);
19
null
2)使用Map中的keySet方法,获取所有key对应的集合
Set<String>keySet = map.keySet();
System.out.println(keySet);
[振东, 振北, 振南, 振西]
3)使用values方法,获取所有value对应的集合
Collection<Integer>values = map.values();
System.out.println(values);
[13, 19, 32, 20]
4)使用remove方法,输入键值,删除整个键值对,不存在,打印null,存在删除,对应的键值对
Integer remove = map.remove("振东");
System.out.println(remove);
Integer remove1 = map.remove("振中");
System.out.println(remove1);
{振北=19, 振南=32, 振西=20}
null
5)使用clear方法,清除整个集合
map.clear();
System.out.println(map);
{}
4.键是引用数据类型的题
在我们创建以引用数据类型为键值类型的时候,我们需要,去自定义对象的类中去重写hashCode和equals方法,这样我们才能保持键的唯一性
创建一个map,key保存学生,value是户籍
HashMap<Student, String> map = new HashMap<>();
map.put(new Student("鹏鹏", 21), "安徽");
map.put(new Student("振北", 23), "河南");
map.put(new Student("振北", 23), "河西");
map.put(new Student("轩轩", 23), "江苏");
System.out.println(map);
{[name=轩轩, age=23]=江苏, [name=振北, age=23]=河西, [name=鹏鹏, age=21]=安徽}
Student类
package com.lanou3g.map;
public class Student {
private String name;
private int age ;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
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;
}
@Override
public String toString() {
return "[name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
5.遍历
HashMap<String, Integer> map = new HashMap<>();
map.put("振北", 20);
map.put("振西", 20);
map.put("振南", 21);
map.put("振东", 22);
1)通过keySet遍历
Set<String> keySet = map.keySet();
System.out.println(keySet);
[振东, 振北, 振南, 振西]
Iterator<String>iterator = keySet.iterator;
while(iterator.hasNext()){
String key = iterator.next();
Integer integer = map.get(key);
System.out.println(integer);
22
20
21
20
2)使用增强for循环遍历Map集合
HashMap<String, Integer> map = new HashMap<>();
map.put("振北", 20);
map.put("振西", 20);
map.put("振南", 21);
map.put("振东", 22);
Set<String>keySet = map.keySet();
for(String key : keySet){
Integer value = map.get(key);
System.out.print(value);
}
}
}
22
20
21
20
3)获取键值对的对象的set集合,进行遍历
HashMap<String, Integer> map = new HashMap<>();
map.put("振北", 20);
map.put("振西", 20);
map.put("振南", 21);
map.put("振东", 22);
Set<Entry<String,Integer>> entrySet = map.entrySet();
Iterator<Map.Entry<String,integer>>iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry<String,Integer> entry = iteator.next();
Integer value = entry.getValue();
System.out.println(value);
}
22
20
21
20
4)增强for循环遍历
HashMap<String, Integer> map = new HashMap<>();
map.put("振北", 20);
map.put("振西", 20);
map.put("振南", 21);
map.put("振东", 22);
Set<Entry<String,Integer>> entrySet = map.entrySet();
for(Entry<String,Integer> entry :entrySet){
Integer value = entry.getValue();
System.out.println(value);
}
22
20
21
20
6.例题
从键盘输入字符串并统计字符串中每个字符出现的次数 比如:asdadadsasdasdasdasd 使用map完成
System.out.println("输入字符串");
Scanner scanner = new Scanner(System.in);
String string = scanner.nextLine();
HashMap<Character,Integer>map = new HashMap<>();
char[] charArray = string.toCharArray();
int num = 1;
for(int i= 0;i< charArray.length;i++){
char key = charArray[i];
if(!map.containsKey(key)){
map.put(key,1);
}else{
Integer value = map.get(key);
value = value +1;
map.put(key,value);
}
}
System.out.println(map);
输入字符串
asdadadsasdasdasdasd
{a=7, s=6, d=7}
二、LinkedHashMap和TreeMap
1.使用LinkedHashMap创建集合
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
map.put("丁鹏", 11);
map.put("水水", 11);
map.put("茜茜", 11);
map.put("忠忠", 11);
System.out.println(map);
}
{丁鹏=11, 水水=11, 茜茜=11, 忠忠=11}
2.使用TreeMap创建集合
创建一个TreeMap,key保存学生value保护户籍,按年龄排序
我们这里如果想要排序,就需要去键值类中去实现Comparable接口中的,comparTo方法,去重新编写比较规则,而传入键值如果是系统类类型,就不需要了,因为该系统类中已经实现过了这个接口,而我们自己所定义的类,就要去实现。
TreeMap<Student,String> map = new TreeMap<>();
map.put(new Student("丁鹏", 11), "安徽");
map.put(new Student("水水", 11), "浙江");
map.put(new Student("振北", 11), "河南");
map.put(new Student("轩轩", 11), "江苏");
System.out.println(map);
{[name=丁鹏, age=11]=安徽, [name=水水, age=11]=浙江, [name=振北, age=11]=河南, [name=轩轩, age=11]=江苏}
Student类
package com.lanou3g.map;
public class Student implements Comparable<Student> {
private String name;
private int age ;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
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;
}
@Override
public String toString() {
return "[name=" + name + ", age=" + age + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
//排序,这里编写根据年龄比较排序的规则
@Override
public int compareTo(Student o) {
int num = this.age - o.getAge();
return num ==0 ? 1:num ;
}
}