黑马程序员技术交流社区

标题: Map集合取出问题 [打印本页]

作者: 袁錦泰    时间: 2012-5-6 21:26
标题: Map集合取出问题
看到这段代码,突然想不起Map集合的取出方式,记得需要转换为Set集合,然后进行迭代
默认打印输出的是键,其他什么都想不起来了,有那位仁兄可以帮我解惑,谢谢...


import java.util.Properties;
import java.util.Set;

public class propertiesDemo {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        propertiesDemo();
    }

    private static void propertiesDemo() {
        // TODO Auto-generated method stub
        Properties prop = new Properties();
        prop.setProperty("zhangsan", "25");
        prop.setProperty("lisi","27");
        prop.setProperty("wangwu","29");
        prop.setProperty("zhaoliu","31");
        Set<String> names = prop.stringPropertyNames();
        for(String name : names){
            String value = prop.getProperty(name);//为什么传入的是参数内传入的是name,写了这句话之后值会被打印
            System.out.println(name+","+value);
        }
    }

}

作者: 程旦    时间: 2012-5-6 21:34
for(String name : names) 楼主看到这句话没  这里的name 就是names集合里面取出来的单个  而names集合是prop里面的键的集合  所以就能取到对应的值
作者: 谭景宾    时间: 2012-5-6 21:42
Set<String> names = prop.stringPropertyNames(); //首先这段代码会把Properties集合里的键全部取出来并转成set集合。
for(String name : names) //循环遍历set集合里的值,这些值就是Properties集合里的键
String value = prop.getProperty(name); //通过遍历出来的键,取出Properties集合里对应键的值并赋给value变量
这样就打印了,键对应的值
作者: 袁錦泰    时间: 2012-5-6 21:43
程旦 发表于 2012-5-6 21:34
for(String name : names) 楼主看到这句话没  这里的name 就是names集合里面取出来的单个  而names集合是p ...

我白天大概看了看增强for循环,并不是很仔细,当时的理解就是那个name是个自定义的名字,我取任何名字都可以,然后就没有再深入去研究.刚刚看到这段代码中的那句话之后我唯一能与之联系上的就是这个增强for循环里面的name,按照你说的那个name在集合中代表的是值? 之前我没想明白他们之间的联系,其实现在我仍然没想明白,你能不能解释得再稍微详细一点,我现在就好像从来没学过一样,什么都想不起来了...
作者: 袁錦泰    时间: 2012-5-6 21:47
谭景宾 发表于 2012-5-6 21:42
Set names = prop.stringPropertyNames(); //首先这段代码会把Properties集合里的键全部取出来并转成set集 ...

明白了,是通过键获取值,存储的时候是全部存储的,但取出时只取出值,想要获取值就要通过键来获取对应的值.. 谢谢你!
作者: 廖理    时间: 2012-5-6 22:07
本帖最后由 廖理 于 2012-5-6 22:08 编辑

Properties是HashTable的子类,HashTable的取出方式有两种:
第一种是过KeySet()方法先将所有键转成Set集合,在通过对set集合的迭代通过get(Object  key)方法取出键对应的值。
第二种方法是将键值对的映射关系转换成通过entrySet()方法存入一个Set集合,此映射是一个实现了 Map.Entry<K,V>接口的类的对象,然后通过此对上述Set集合对象的getKey() 和getValue()方法获相应的键和值

很明显Properties是可以通过上述两种方式获取键值对的

但是Properties中由定义了自己将键都存入Set集合的方法,即stringPropertyNames() ,并且也还有通过键获得相应值的方法getProperty(String key),所以此处与HashTable的第一种取得元素的方法是一样的 ,只不过把keySet()方法和get(Object  key)方法换成了stringPropertyNames()和getProperty(String key)
(注意:Properties是HashTable的子类,并且它没有定义泛型,Properties中的键和值都只能是String类型的值。)

作者: 袁錦泰    时间: 2012-5-6 22:16
廖理 发表于 2012-5-6 22:07
Properties是HashTable的子类,HashTable的取出方式有两种:
第一种是过KeySet()方法先将所有键转成Set集 ...

补充的很及时,现在更加清楚其中的细节了.谢谢你! 我总是会忽略子父类和接口的关系,所以代码总是会写错,这个是不是看得多了就能记住?
作者: 隋营营    时间: 2012-5-6 22:36
很简单的问题,直接看Properties类的源代码:
public synchronized Object setProperty(String key, String value) {
        return put(key, value);    //此处调用Hashtable的public synchronized V put(K key, V value){……}
}   //相当于把key、value存入Hashtable

public Set<String> stringPropertyNames() {
        Hashtable<String, String> h = new Hashtable<>();
        enumerateStringProperties(h);
        return h.keySet();    //返回key值的集合
}

public String getProperty(String key) {
        Object oval = super.get(key);       //此处调用Hashtable的public synchronized V get(Object key) {……}
        String sval = (oval instanceof String) ? (String)oval : null;    //相当于从Hashtable中取值
        return ((sval == null) && (defaults != null)) ? defaults.getProperty(key) : sval;
}
就算下面的return语句看不懂,也能加深对Properties类的理解,这就是源代码的作用!

作者: 袁錦泰    时间: 2012-5-6 22:57
隋营营 发表于 2012-5-6 22:36
很简单的问题,直接看Properties类的源代码:
public synchronized Object setProperty(String key, String ...

谢谢! 哥们儿能给个QQ号码不?
作者: 隋营营    时间: 2012-5-7 07:12
袁錦泰 发表于 2012-5-6 22:57
谢谢! 哥们儿能给个QQ号码不?

1971634546
作者: 廖理    时间: 2012-5-7 10:50
袁錦泰 发表于 2012-5-6 22:16
补充的很及时,现在更加清楚其中的细节了.谢谢你! 我总是会忽略子父类和接口的关系,所以代码总是会写错,这 ...

多谢几个几个程序练练 就有感觉了,没事的时候 多复习复习啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2