1、Java HashMap
HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。HashMap 是无序的,即不会记录插入的顺序。HashMap 继承于AbstractMap,实现了 Map、Cloneable、java.io.Serializable 接口。
例如,
创建HashMap对象,该对象将存储String类型key和String类型的value:
import java.util.HashMap; // import the HashMap class
HashMap<String, String> langs = new HashMap<String, String>();2、HashMap中添加key和value
HashMap类具有许多有用的方法。例如,要向其中添加项目,请使用put()方法:
例如:
// Import the HashMap class
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
// 创建 HashMap 对象
HashMap<String, String> langs = new HashMap<String, String>();
// Add keys and values (Country, City)
langs.put("c", "c c++ c#");
langs.put("java", "Java");
langs.put("python", "Python");
langs.put("cjavapy", "cjavapy.com");
System.out.println(langs);
}
}
3、通过key访问HashMap中的value
要访问HashMap中的值,需要使用get()方法通过key来获取:
例如:
langs.get("c");4、通过key删除HashMap中key和value键值对
要删除key和value对,需要使用remove()方法通过key来删除:
例如:
langs.remove("cjavapy");要删除所有key和value对,请使用clear()方法:
例如:
langs.clear();
检查键或值是否存在:
containsKey检查指定的键是否存在。
boolean hasApple = map.containsKey("apple"); // 返回 true
containsValue检查指定的值是否存在。
boolean hasOrange = map.containsValue(2); // 返回 false
5、HashMap size
要找出有多少个key和value键值对,请使用size方法:
例如:
langs.size();
6、循环遍历hashmap中的key和value
通过for-each循环遍历HashMap的各项。keySet() 获取所有的键。values()获取所有的值。
注意:
如果只需要遍历key,使用keySet()方法,如果仅需要value,使用values()方法:
例如:
// Print keys
// 创建 HashMap 对象
HashMap<String, String> langs = new HashMap<String, String>();
// Add keys and values (Country, City)
langs.put("c", "c c++ c#");
langs.put("java", "Java");
langs.put("python", "Python");
langs.put("cjavapy", "cjavapy.com");
for (String i : langs.keySet()) {
System.out.println(i);
}例如:
// Print values
// 创建 HashMap 对象
HashMap<String, String> langs = new HashMap<String, String>();
// Add keys and values (Country, City)
langs.put("c", "c c++ c#");
langs.put("java", "Java");
langs.put("python", "Python");
langs.put("cjavapy", "cjavapy.com");
for (String i : langs.values()) {
System.out.println(i);
}
例如:
// Print keys and values
// 创建 HashMap 对象
HashMap<String, String> langs = new HashMap<String, String>();
// Add keys and values (Country, City)
langs.put("c", "c c++ c#");
langs.put("java", "Java");
langs.put("python", "Python");
langs.put("cjavapy", "cjavapy.com");
for (String i : langs.keySet()) {
System.out.println("key: " + i + " value: " + capitalCities.get(i));
}7、其它类型
HashMap中的key和value键值对实际上是对象。 在上面的示例中,我们使用了String类型的对象。 Java中的String是一个对象(不是原始类型)。 要使用其他类型,例如,int,必须指定等效的包装类:Integer。 对于其他基本类型,请使用:Boolean表示布尔值,Character表示char,Double表示double,等等。
基本类型对应的包装类表如下:
基本类型 | 引用类型 |
boolean | Boolean |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
例如:
创建一个名为people的HashMap对象,该对象将存储String类型的key和Integer类型的value:
// Import the HashMap class
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
HashMap langs = new HashMap();
// Add keys and values (Name, Age)
langs.put("c", 32);
langs.put("java", 30);
langs.put("python", 33);
for (String i : langs.keySet()) {
System.out.println("key: " + i + " value: " + langs.get(i));
}
}
}
8、HashMap和HashSet的区别
1) HashSet实现了Set接口, 仅存储对象; HashMap实现了 Map接口, 存储的是键值对.
2) HashSet底层其实是用HashMap实现存储的, HashSet封装了一系列HashMap的方法. 依靠HashMap来存储元素值,(利用hashMap的key键进行存储), 而value值默认为Object对象. 所以HashSet也不允许出现重复值, 判断标准和HashMap判断标准相同, 两个元素的hashCode相等并且通过equals()方法返回true。
HashMap | HashSet |
HashMap实现了Map接口 | HashSet实现了Set接口 |
HashMap储存键值对 | HashSet仅仅存储对象 |
使用put()方法将元素放入map中 | 使用add()方法将元素放入set中 |
HashMap中使用键对象来计算hashcode值 | HashSet使用成员对象来计算hashcode值, 对于两个对象来说hashcode可能相同, 所以equals()方法用来判断对象的相等性, 如果两个对象不同的话,那么返回false |
HashMap比较快,因为是使用唯一的键来获取对象 | HashSet较HashMap来说比较慢 |