Map接口
Map及其实现类对比
- java.util.Map 存储一对一对的数据(类似于函数)
- HashMap 主要实现类 线程不安全、执行效率高 可以添加null的key和value值 底层使用数组+单向链表+红黑树结构存储(jdk8)
- LinkedHashMap: 是HashMap的子类,在HashMap使用的数据结构基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而在遍历元素时,可以按照添加的顺序显示。对于频繁的遍历操作,建议使用LinkedHashMap
- TreeMap:底层使用红黑树存储,可以按照添加的
key-value
中的key元素的指定的属性的大小顺序进行遍历。需要考虑使用自然排序
或定制排序
- Hashtable : 古老实现类 线程安全、执行效率低、不可添加null的key和value值(二者都不可)、底层使用数组+单向链表结构存储
- Properties Hashtable的子类 其key和value都是String类型.常用来处理属性文件
- HashMap 主要实现类 线程不安全、执行效率高 可以添加null的key和value值 底层使用数组+单向链表+红黑树结构存储(jdk8)
HashMap中元素的特点
- HashMap中所有的
key
彼此之间是不可重复的 无序的.所有的key就构成一个set
集合(Key所在的类要重写hashCode()和equals()方法) - HashMap中的所有
value
彼此之间是可重复的,无序的.所有的value就构成了一个Collection集合.(value所在的类要重写equals()方法) - HashMap中的一个
key-value
就构成了一个Entry
. - HashMap中的所有的
entry
彼此之间是不可重复,无序的.所有的entry
就构成了一个set
集合
Map中常用方法
- 添加、修改操作:
- Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
- void putAll(Map m):将m中的所有key-value对存放到当前map中
- 删除操作:
- Object remove(Object key):移除指定key的key-value对,并返回value
- void clear():清空当前map中的所有数据
- 元素查询的操作:
- Object get(Object key):获取指定key对应的value
- boolean containsKey(Object key):是否包含指定的key
- boolean containsValue(Object value):是否包含指定的value
- int size():返回map中key-value对的个数
- boolean isEmpty():判断当前map是否为空
- boolean equals(Object obj):判断当前map和参数对象obj是否相等
- 元视图操作的方法:
- Set keySet():返回所有key构成的Set集合
- Collection values():返回所有value构成的Collection集合
- Set entrySet():返回所有key-value对构成的Set集合
增: put(Object key,Object value)
putAll(Map m)
删: Object remove(Object value)
改: put(Object key,Object value)
查: Object get(Object key)
长度: size()
遍历:
遍历key集 Set keySet()
遍历value集 Collection values()
遍历entry集 Set entrySet()
public class MapTest {
@Test
public void test1(){
HashMap map = new HashMap();
//put
map.put("AA",56);
map.put("BB",78);
map.put(new Person("Tom",12),78);
System.out.println(map);
//size() 长度
System.out.println(map.size());
//remove() 移除
Object value = map.remove("AA");
System.out.println(value);
System.out.println(map);
//修改 put
//如果要修改Person类,则要重写hashCode()和 equals()方法
Object oldValue = map.put("BB",99);
System.out.println(oldValue); //oldValue存放原来的value值
System.out.println(map);
//get(Object key)
Object value1 = map.get(99);
System.out.println(value1);
}
}
//输出
{AA=56, BB=78, Person{name='Tom', age=12}=78}
3
56
{BB=78, Person{name='Tom', age=12}=78}
78
{BB=99, Person{name='Tom', age=12}=78}
null
public void test2(){
//map的遍历操作
//keySet()
HashMap map = new HashMap();
map.put("AA",56);
map.put("BB",78);
map.put(new Person("Tom",12),12);
System.out.println(map.keySet());
//或
Set keySet = map.keySet();
//使用迭代器
Iterator iterator = keySet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println();
//遍历value集 Collection values()
//方式1
Collection values = map.values();
//使用增强for遍历
for(Object obj : values){
System.out.println(obj);
}
System.out.println();
//方式2
Set keySet1 = map.keySet();
for(Object obj : keySet1){
System.out.println(map.get(obj));
}
}
//输出结果
[AA, BB, Person{name='Tom', age=12}]
AA
BB
Person{name='Tom', age=12}
56
78
12
56
78
12
public void test3(){
HashMap map = new HashMap();
map.put("AA",32);
map.put("BB",213);
map.put(new Person("Tom",12),45);
//遍历entry
Set entrySet = map.entrySet();
Iterator iterator = entrySet.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
//输出结果
AA=32
BB=213
Person{name='Tom', age=12}=45
TreeMap的使用
- 底层使用红黑树存储
- 可以按照添加的
key-value
中的key元素的指定的属性的大小顺序进行遍历. - 需要考虑使用
自然排序
和定制排序
- 要求,向TreeMap中添加的key必须是同一个类型的对象
//定制排序
public class TreeMapTest{
public static void main(String []args){
Comparator comparator = new Comparator(){
public int compare(Object o1,Object o2){
if(o1 instanceof User && o2 instanceof User){
User u1 = (User)o1;
User u2 = (User)o2;
int value = u1.getName().compareTo(u2.getName());
if(value != 0){
return value;
}
return u1.getAge() - u2.getAge();
}
throw new RuntimeException("类型不匹配");
}
}
TreeMap map = new TreeMap(comparator); //使用定制排序
}
}
Hashtable与Properties的使用
- Properties是Hashtable的子类,其
key
和value
是String类型的,常用来处理属性文件