java里的map接口和python里的map函数完全不同。虽然都具有映射关系,但是java的map接口更贴近字典和集合这两个引用数据类型。这个接口是一个双列集合它的元素是由键和值组成的,也就是keys和values。这个接口有两个实现类:hashmap和treemap。hashmap内部维护一个hash顺序,所以和我们宏观里看到的顺序不太一样。下例是把这个集合里的所有的值遍历出来。
public class Example18 {
public static void main(String[] args) {
//直接获取map里的值
//map存储的值是collection集合
Map map = new HashMap();
map.put("1","javaScript");
map.put("2","Linux");
map.put("3","Unix");
Collection values = map.values();//把map对象里的值取出,转换成collection集合类
Iterator it = values.iterator();
while (it.hasNext()){
Object value = it.next();
System.out.println(value);
}
}
}
这里是通过一个java的迭代器把map里的所有元素迭代出来。这里的get方法是根据输入的键返回对应的值。这里是不允许出现重复的元素,如果输入了相同的键值对,则视为对该键对应的值修改。也就是如下例:
map.put("3","MacOS");
也就是把键为3的值修改了。简而言之就是键相同,值修改。
很多初学者不适应hashmap里的读取顺序不是按照存入顺序读出来的,所以总想按照宏观的顺序读取出来,我们可以使用LinkedHashMap类实现这一目的。它是用双向链表来维护内部元素的关系,与LinkedList一样。如下例:
public class Example19 {
public static void main(String[] args) {
//要想使得map对象里的存入时的值与读取出来的值顺序一致,则需要使用linkedhashmap类
//内部维护一个双向链表
Map map = new LinkedHashMap();//使用linkedhashmap类就实现了存入与读取顺序一致
map.put("1","Ubuntu");
map.put("2","CentOS");
map.put("3","SunOS");
map.put("4","MacOS");
Set keySet = map.keySet();//取出map对象里的键组成的集合
Iterator it = keySet.iterator();//为什么是keySet调用迭代器,因为是把键取出后存入keySet对象里的
while (it.hasNext()){
Object key = it.next();
Object value = map.get(key);
System.out.println(key+":"+value);
}
}
}
这样就是实现了读取与存放顺序一致了。
Treemap集合也是存储键值对映射关系,不允许出现重复的键,内部是通过二叉树原理实现的,所以就可以实现键不重复。它是由一个根组成的,往下划分两个子树,由左子树和右子树组成,左子树总是小于右子树。
public static void main(String[] args) {
//TreeMap集合
//是通过二叉树原理保证键的唯一性。TreeMap是按照某种顺序排列的
TreeMap tmap = new TreeMap();
tmap.put("1","java");
tmap.put("2","Linux");
tmap.put("3","MacOS");
tmap.put("4","Ubuntu");
Set keyset = tmap.keySet();
Iterator ior = keyset.iterator();
while (ior.hasNext()){
Object key = ior.next();
Object value = tmap.get(key);
System.out.println(key+":"+value);
}
}
它读取的元素的顺序和存储的顺序一致。因为编号是String类型,String类型实现了Comparable接口,因此默认会按照自然顺序进行排序。
当使用TreeMap集合时,也可以自定义比较法。下面的例子就实现了自定义比较器。
public class Example21 {
public static void main(String[] args) {
/*
* 实现自定义比较器,与二叉树集合默认排序规则相反的排序
* */
TreeMap tm = new TreeMap(new MyComparator());
tm.put("1","JavaScript");
tm.put("2","java虚拟机");
tm.put("3","Linux Kernel");
Set keySet = tm.keySet();
Iterator it = keySet.iterator();
while (it.hasNext()){
Object key = it.next();
Object value = tm.get(key);//获得键对应的值
System.out.println(key+":"+value);
}
}
}
//实现自定义比较器
class MyComparator implements Comparator {
public int compare(Object obj1,Object obj2){
String id1 = (String) obj1; //把obj1强制转换为String类型
String id2 = (String) obj2;
return id2.compareTo(id1);//把比较结果返回
}
}
jdk帮我们预留了一个接口叫Comparator,我们使用implements实现这个接口。因为在java里所有的类的父类都是Object是默认继承的。所以在集合中的数据类型都转成Object类型。那么我们要做的就是把Object类型转译成String类型。然后使用compareTo方法进行比较,这样就实现了字典逆序。
Properties集合是map接口的一个实现类Hashtable与hashMap相似,hashtable的线程是安全的,存取元素时速度慢。Properties主要存储字符串类型的键和值。
public static void main(String[] args) {
//Properties集合是map接口的一个实现类Hashtable与hashMap相似。
//hashtable的线程是安全的,存取元素时速度慢。
//Properties主要存储字符串类型的键和值
//按顺序存储的顺序读取结果
Properties p = new Properties();
p.setProperty("1","C");//写入Properties集合
p.setProperty("2","JavaScript");
p.setProperty("3","Node.js");
/*
* 通过调用propertyNames方法获得一个包含所有键的Enumeration对象,
* 在遍历时调用getProperty方法获取值
*
* */
Enumeration names = p.propertyNames();//获取Enumeration对象所有键的枚举
while (names.hasMoreElements()){
String key = (String) names.nextElement();
String value = (String) p.getProperty(key);//获取键对应的值
System.out.println(key+":"+value);
}
}
主要用于编写配置项的,这个我在学Spring Boot这么课的时候经常使用。它有getproperty()和setproperty()这两个方法,用于读写配置。再详细的就在代码里写的很完备了,直接看代码就可以了。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。