java中的***p接口和python中的***p函数完全不同。虽然都有映射关系,但是java的***p接口更接近于dictionary和set这两种引用数据类型。这个接口是一个双列***,其元素由键和值组成,即键和值。这个接口有两个实现类:hash***p和tree***p。Hash***p在内部维护一个散列顺序,所以它与我们在宏中看到的顺序不太一样。以下示例将遍历该***中的所有值。
public class example 18 { public static void ***in(String [] args) {//直接获取***p中的值//Map中存储的值是***Map Map = new HashMap();***p.put("1 "," javaScript ");***p.put("2 "," Linux ");***p.put("3 "," Unix ");***值= ***p . values();//取出***p对象中的值,转换成******类迭代器it = values . Iterator();while(it . has next()){ Object value = it . next();System.out.println(值);}}}这里,***p中的所有元素都通过一个java迭代器进行迭代。这里的get方法根据输入键返回相应的值。这里,不允许重复的元素。如果输入了相同的键-值对,它将被视为对键的相应值的修改。也就是下面的例子:
***p.put("3","MacOS");
也就是说,键3的值已被修改。简而言之,键是相同的,值是修改的。
很多初学者不适应hash***p中的读取顺序不是按照存储的顺序,所以总想按照宏的顺序读出来。我们可以使用LinkedHashMap类来实现这个目标。它使用一个双向链表来维护内部元素的关系,就像链表一样。示例:
public class Example19 { public static void ***in(String[] args) { //要想使得***p对象里的存入时的值与读取出来的值顺序一致,则需要使用linkedhash***p类 //内部维护一个双向链表 Map ***p = new LinkedHashMap();//使用linkedhash***p类就实现了存入与读取顺序一致 ***p.put("1","Ubuntu"); ***p.put("2","CentOS"); ***p.put("3","SunOS"); ***p.put("4","MacOS"); Set keySet = ***p.keySet();//取出***p对象里的键组成的*** Iterator it = keySet.iterator();//为什么是keySet调用迭代器,因为是把键取出后存入keySet对象里的 while (it.hasNext()){ Object key = it.next(); Object value = ***p.get(key); System.out.println(key+":"+value); } }}
因此,读取和存储的顺序是一致的。
Tree***p***也是键值对的映射关系,不允许有重复的键。内部是用二叉树原理实现的,所以密钥不能重复。它由一个根组成,分为两个子树,由左子树和右子树组成。左边的子树总是比右边的子树小。
public static void ***in(String[] args) { //TreeMap*** //是通过二叉树原理保证键的唯一性。TreeMap是按照某种顺序排列的 TreeMap t***p = new TreeMap(); t***p.put("1","java"); t***p.put("2","Linux"); t***p.put("3","MacOS"); t***p.put("4","Ubuntu"); Set keyset = t***p.keySet(); Iterator ior = keyset.iterator(); while (ior.hasNext()){ Object key = ior.next(); Object value = t***p.get(key); System.out.println(key+":"+value); } }
它读取元素的顺序与存储元素的顺序相同。因为数字是字符串类型,实现了Comparable接口,所以默认情况下会按自然顺序排序。
使用TreeMap***时,还可以自定义比较方法。下面的示例实现了一个自定义比较器。
public class Example21 { public static void ***in(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,默认继承。因此,***中的数据类型都被转换为对象类型。然后我们要做的就是把对象类型转换成字符串类型。然后使用compareTo方法进行比较,从而实现字典的逆序。
Properties是***p接口的实现类。hashtable类似于hashMap。Hashtable的线程是安全的,访问元素比较慢。Properties主要存储字符串类型的键和值。
public static void ***in(String[] args) { //Properties***是***p接口的一个实现类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(),用于读写配置。细节写在代码里。直接看代码就行了。
本文来自Rose情調※投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/482652.html