Map
Map用于保存具有映射关系(Key-Value)的数据, key 和 value都可以是任何引用类型的数据,我们常用String类型来做Key值。
Map 中的 key 用Set来存放,不允许重复,允许有一个null值的key,即同一个Map对象所对应的类,须重写hashCode()和equals()方法。key 和 value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的 value。
Map常用方法
①Object put(Object key,Object value):像Map中添加一个key-value
②Object remove(Object key):通过key值删除对应的键值对
③void putAll(Map t):将指定的Map中全部元素添加到此Map中
④void clear():删除Map中全部键值对
⑤Set keySet():返回keySet
⑥Collection values():返回value的值集合
⑦Set entrySet():返回一个entrySet
⑧Object get(Object key):通过key值取出value值,若没有这个key则返回null
⑨boolean containsKey(Object key):判断是否包含指定的key值
⑩boolean containsValue(Objectv alue):判断是否包含指定的value
⑪int size():返回Map的元素数量
⑫boolean isEmpty():判断Map内元素的个数是否为0,为0返回true
⑬boolean equals(Object obj):判断Map与指定的对象是否相等
使用示例
@Test
public void test1(){
Map map = new HashMap();
//添加一个元素
map.put("AA", 123);
map.put("BB", 234);
map.put(123, "AA");
map.put("AA", 1234);
map.put(new Person(1,"jack",21), 1);
map.put(new Person(2,"tom",21), 2);
map.put(new Person(1,"jack",21), 3);
//判断Map是否为空
boolean b1 = map.isEmpty();
System.out.println(b1);
//判断map是否存在AA的key值
boolean b2 = map.containsKey("AA");
System.out.println(b2);
//判断map是否存在AA的value值
boolean b3 = map.containsValue("AA");
System.out.println(b3);
//输出map的元素的个数
int size = map.size();
System.out.println(size);
//删除key为123的键值对
Object obj = map.remove(123);
System.out.println(obj);
//获取key为BB的value值
Object obj2 = map.get("BB");
System.out.println(obj2);
Map map2 = new HashMap();
map2.put("aa", "aa");
map2.put("bb", "bb");
//判断两个map是否相等
boolean b4 = map.equals(map2);
System.out.println(b4);
map.putAll(map2);
//遍历map
/*
* 方式一:通过Map.keySet遍历key和value
*/
for (Object o : map.keySet()) {
//map.keySet()返回的是所有key的值
Object value = map.get(o);//得到每个key多对用value的值
System.out.println(o + ":" + value);
}
/*
* 方式二:通过Map.entrySet使用iterator遍历key和value
*/
System.out.println("==========================");
Iterator it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Entry) it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
/*
* 方式三:通过Map.entrySet遍历key和value
* 推荐,尤其是容量大时,效率相对较快
*/
System.out.println("=========================");
Set entrySets = map.entrySet();
for (Object o : entrySets) {
Map.Entry entry = (Map.Entry)o;
System.out.println("key= " + entry.getKey() + " and value= "
+ entry.getValue());
}
/*
* 方式四:通过Map.values()遍历所有的value,但不能遍历key
*/
System.out.println("=========================");
for (Object value : map.values()) {
System.out.println("value= " + value);
}
//清空
map.clear();
System.out.println(map.size());
}
输出结果
false
true
true
5
AA
234
false
AA:1234
BB:234
Person [id=2, name=tom, age=21]:2
aa:aa
Person [id=1, name=jack, age=21]:3
bb:bb
==========================
key= AA and value= 1234
key= BB and value= 234
key= Person [id=2, name=tom, age=21] and value= 2
key= aa and value= aa
key= Person [id=1, name=jack, age=21] and value= 3
key= bb and value= bb
=========================
key= AA and value= 1234
key= BB and value= 234
key= Person [id=2, name=tom, age=21] and value= 2
key= aa and value= aa
key= Person [id=1, name=jack, age=21] and value= 3
key= bb and value= bb
=========================
value= 1234
value= 234
value= 2
value= aa
value= 3
value= bb
0
注意:像HashMap里添加元素时,因为key是用Set存储的,所以会调用key所在类的equals()方法和hashCode()方法,如果相同,则把第二个元素添加进去,顶掉已经存在的那个。
HashMap
HashMap与HashSet一样,不保证映射的顺序,是非线程安全的。HashMap 判断两个 key 相等的标准是:两个 key 通过 equals()方法返回 true,hashCode 值也相等。HashMap 判断两个 value相等的标准是:两个 value通过 equals()方法返回 true。
如果HashMap想实现线程同步,可以使用Collections. synchronizedMap或ConcurrentHashMap 。
HashMap键无序,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,在Map 中插入、删除和定位元素,HashMap 是最好的选择。
LinkedHashMap
LinkedHashMap 是 HashMap 的子类,与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与Key-Value 对的插入顺序一致。
TreeMap
TreeMap存储 Key-Value对时,需要根据 key-value对进行排序。TreeMap 可以保证所有的Key-Value对处于有序状态。
TreeMap 的 Key 的排序:
①自然排序:TreeMap 的所有的 Key 必须实现 Comparable接口,而且所有的Key应该是同一个类的对象,否则将会抛出ClasssCastException
②定制排序:创建 TreeMap 时,传入一个Comparator对象,该对象负责对TreeMap 中的所有 key 进行排序。此时不需要Map的 Key 实现 Comparable接口。
其原理和具体实现类似TreeSet,可以参照我的上篇博文:点击打开链接
Hashtable
Hashtable是个古老的 Map 实现类,线程安全。
与HashMap不同,Hashtable 不允许使用null作为 key 和 value
与HashMap一样,Hashtable 也不能保证其中Key-Value对的顺序,
Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。由于Hashtable效率太慢,不建议使用。
Properties
Properties 类是 Hashtable 的子类,该对象用于处理属性文件。
由于属性文件里的 key、value都是字符串类型,所以
Properties
里的
key
和
value
都是字符串类型。
存取数据时,建议使用setProperty(Stringkey,Stringvalue)方法和getProperty(Stringkey)方法
Properties pros = new Properties();
pros.load(new FileInputStream("jdbc.properties"));
String user = pros.getProperty("user");
System.out.println(user);
user=root
password=123456