1.Map及其实现类对比
java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1)、(x2,y2) --> y=f(x),类似于高中的函数)
HashMap:主要实现类;线程不安全的,效率高;可以添加nuLl的key和value值;底层使用数组+单向链表+红黑树结构存储(jdk8)
LinkedHashMap;是HashMap的子类,在HashMap使用的数据结构的基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而我们在遍历元素时,就可以按照添加的顺序显示。开发中,对于频繁的遍历操作,建议使用此类。
TreeMap:底层使用红黑树存储;可以按照添加的key-valve中的key元素的指定的属性的大小顺序进行历。需要考虑使用 自然排序、定制排序。
Hashtable:古老实现类;线程安全的,效率低;不可以添加nuLL的key或valve值;底层使用数组+单向表结构存储(jdk8)
Properties:其key和value都是String类型。常用来处理属性文件。
2. HashMap中元素的特点
HashMap中的所有的key彼此之间是不可重复的、无序的。所有的key就构成一个Set集合。--->key所在的类要重写hashcode()和equals()方法
HashMap中的所有的value彼此之间是可重复的、无序的。所有的valve就构成一个CoLLection集合。--->VaLue所在的类要重写equals()方法
HashMap中的一个key-value,就构成了一个entry。HashMap中的所有的entry彼此之间是不可重复的、无序的。所有的entry就构成了一个Set集合。
3. Map中的常用方法
- 添加、修改操作:
Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
void putALL(Map m):将m中的所有key-value对存放到当前map中
- 删除操作:
0bject 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集合
public void test0(){
HashMap map = new HashMap();
// put(Object key,Object value)
map.put("AA",11);
map.put("BB",22);
map.put("CC",33);
map.put(new Person("Tom",51),44);
System.out.println(map);//{Person {name='Tom', age=51}=44, AA=11, BB=22, CC=33}
//size()
System.out.println(map.size());//4
//remove()
map.remove("BB");
System.out.println(map);//{Person {name='Tom', age=51}=44, AA=11, CC=33}
//get()
System.out.println(map.get("CC")); //33
System.out.println();
//Set keySet():返回所有key构成的Set集合
Set keyset = map.keySet();
Iterator iterator = keyset.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next()); //AA
//CC
//Person {name='Tom', age=51}
}
//Collection values():返回所有value构成的ColLection集合
Collection values = map.values();
for (Object obj:values) {
System.out.println(obj); //11
//33
//44
}
//Set entrySet():返回所有key-vaLue对构成的Set集合
Set entrySet = map.entrySet();
Iterator iterator1 = entrySet.iterator();
while (iterator1.hasNext()){
System.out.println(iterator1.next()); //Person {name='Tom', age=51}=44
//AA=11
//CC=33
}
Set entrySet1 = map.entrySet();
Iterator iterator2 = entrySet1.iterator();
while (iterator2.hasNext()){
Map.Entry entry = (Map.Entry) iterator2.next();
System.out.println(entry.getKey() + "----" + entry.getValue());
}
//AA----11
//CC----33
//Person {name='Tom', age=51}----44
}
4. TreeMap的使用
底层使用红黑树存储
可以按照添加的key-value中的key元素的指定的属性的大小顺序进行遍历
需要考虑使用 自然排序、定制排序
要求:向TreeMap中添加的key必须是同一个类型的对象
@Test
public void test01(){
TreeMap map = new TreeMap();
map.put("AA",11);
map.put("BB",22);
map.put("CC",33);
map.put("DD",66);
//自然排序
Set entryset = map.entrySet();
for (Object obj:entryset) {
System.out.println(obj);
//AA=11
//BB=22
//CC=33
//DD=66
}
}
//自然排序
@Test
public void test02(){
TreeMap map = new TreeMap();
map.put(new Person("Tom",20),11);
map.put(new Person("Sam",52),22);
map.put(new Person("James",62),33);
map.put(new Person("Curry",41),44);
map.put(new Person("Jorge",53),55);
Set entryset = map.entrySet();
for (Object obj:entryset) {
System.out.println(obj);
}
//Person {name='James', age=62}=33
//Person {name='Jorge', age=53}=55
//Person {name='Sam', age=52}=22
//Person {name='Curry', age=41}=44
//Person {name='Tom', age=20}=11
}
//定制排序
@Test
public void test03(){
Comparator comparator = new Comparator() {
@Override
public int compare(Object o1, Object o2) {
if(o1 instanceof Person && o2 instanceof Person){
Person p1 = (Person) o1;
Person p2 = (Person) o2;
return p1.getAge() - p2.getAge();
}
throw new RuntimeException("类型不匹配");
}
};
TreeMap map = new TreeMap(comparator);
map.put(new Person("Tom",20),11);
map.put(new Person("Sam",52),22);
map.put(new Person("James",62),33);
map.put(new Person("Curry",41),44);
map.put(new Person("Jorge",53),55);
Set entryset = map.entrySet();
for (Object obj:entryset) {
System.out.println(obj);
}
//Person {name='Tom', age=20}=11
//Person {name='Curry', age=41}=44
//Person {name='Sam', age=52}=22
//Person {name='Jorge', age=53}=55
//Person {name='James', age=62}=33
5. Properties的使用
其key和value都是String类型。常用来处理属性文件。
File file = new File("info.properties"); //注意,要提前创建好
System.out.printin(file.getAbsolutePath());
FileInputStream fis = new FileInputStream(file);
Properties pros = new Properties();
pros.Load(fis); //加载流中的文件中的数据
//读取数据
String name = pros.getProperty("name");
String pwd = pros.getProperty("password");
System.out.println(name +“:"+ pwd);
fis.close();
6. 一个key添加多个value
public void test01(){
HashMap map = new HashMap();
String name = "山西";
List list = new ArrayList();
list.add("醋文化");
list.add("关帝庙");
list.add("晋祠");
list.add("汾河");
list.add("煤炭");
map.put(name,list);
Set entrySet = map.entrySet();
for (Object obj : entrySet) {
System.out.println(obj);
}
}