11.22
Map集合
前面讲的Collection集合均属于单列集合,Map集合属于双列集合
键属于一个集合,通过键来get值;
键、值这种映射关系也可以组成一种集合;
但我们必须保证键的唯一性
Map集合的两种遍历方式
通过keySet方法返回由键组成的集合,迭代该集合的元素就拿到了所有的键,再调用get方法根据键拿到值
通过entrySet方法返回键值映射关系组成的集合,迭代该集合就拿到了一个个的键值映射关系,
通过getKey方法拿到键,通过getValue方法拿到值
先来说说Map接口下的两个集合类
一、HashMap
线程不安全,存取速度快,允许存放null键,null值。
通过HashSet原理保证键唯一性
public class Person {
private String name;
private String sex;
public Person(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return name + "--" + sex;
}
}
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import java.util.Map;
public class HashMapTest {
public static void main(String[] args) {
HashMap<Person, Integer> hm = new HashMap<Person, Integer>();
hm.put(new Person("zhao", "nan"), 28);
hm.put(new Person("qian", "nv"), 35);
hm.put(new Person("sun", "nv"), 19);
hm.put(new Person("li", "nan"), 23);
hm.put(new Person("liu", "nan"), 42);
/*遍历方式1
*通过keySet方法返回由键组成的集合,迭代该集合的元素就拿到了所有的键,
*再调用get方法根据键拿到值
*/
Set<Person> set = hm.keySet();
Iterator<Person> iter = set.iterator();
while(iter.hasNext()) {
Person key = iter.next();
int value = hm.get(key);
System.out.println(key + "--" + value);
}
/*遍历方式2
* 通过entrySet方法返回键值映射关系组成的集合,迭代该集合就拿到了一个个的键值映射关系,
*通过getKey方法拿到键,通过getValue方法拿到值
*/
Set<Map.Entry<Person, Integer>> set = hm.entrySet();
for(Map.Entry<Person, Integer> me : set) {
Person key = me.getKey();
int value = me.getValue();
System.out.println(key + "--" + value);
}
}
}
二、TreeMap
通过二叉树算法保证键唯一性,对键进行排序,排序原理与TreeSet相同。
借用hashMap中的Person类写如下代码:
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;
public class TreeMapTest {
public static void main(String[] args) {
TreeMap<Person, Integer> tm = new TreeMap<Person, Integer>(new Comparator<Person>(){
public int compare(Person p1, Person p2) {
int num = p1.getName().compareTo(p2.getName());
if(num!=0)
return num;
return p1.getSex().compareTo(p2.getSex());
}
});
tm.put(new Person("zhao", "nan"), 28);
tm.put(new Person("qian", "nv"), 35);
tm.put(new Person("sun", "nv"), 19);
tm.put(new Person("liu", "nv"), 23);
tm.put(new Person("liu", "nan"), 42);
Set<Person> set = tm.keySet();
for(Person key : set) {
int value = tm.get(key);
System.out.println(key + "--" + value);
}
}
}
三、properties
HashSet的子类,所以也是线程安全的
用于读写配置文件的,一般配置项等号两边都是String,所以该集合中的两列保存的都是String类型的数据
这个集合中只能存String,所以不需要定义泛型
1.首先创建一个properties类型的容器
单列集合多用add方法添加元素,双列集合用put方法,properties有自己的专门方法setProperty来添加
取元素和HashMap、TreeMap一样
public class PropertiesTest {
public static void main(String[] args) throws IOException {
//向Properties集合存放元素
Properties prop = new Properties();
prop.setProperty("zhang", "19");
prop.setProperty("li", "21");
prop.setProperty("zhang", "21");
prop.setProperty("wang", "27");
prop.setProperty("liu", "32");
//取元素,调用父类的方法
Set set = prop.keySet();
for(Object key : set)
System.out.println(key + "=" + prop.get(key));
//用枚举取元素
Enumeration<String> e = (Enumeration<String>) prop.propertyNames();
while(e.hasMoreElements()) {
String key = e.nextElement();
String value = prop.getProperty(key);
System.out.println(key + "=" + value);
}
}
}
关于properties,用的最多的还是读取配置文件,明天再写吧...