Java 为什么UIManager.getDefaults().keySet()返回的值与UIManager.getDefaults().keys()不同?

Java 为什么UIManager.getDefaults().keySet()返回的值与UIManager.getDefaults().keys()不同?,java,swing,key,uimanager,Java,Swing,Key,Uimanager,我正在使用中的代码,它符合我的预期: Enumeration<Object> keys = UIManager.getDefaults().keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); Object value = UIManager.get(key); if (value instanceof FontUIResour

我正在使用中的代码,它符合我的预期:

    Enumeration<Object> keys = UIManager.getDefaults().keys();
    while (keys.hasMoreElements()) {
        Object key = keys.nextElement();
        Object value = UIManager.get(key);
        if (value instanceof FontUIResource) {
            FontUIResource orig = (FontUIResource) value;
            Font font = new Font(orig.getFontName(), orig.getStyle(), orig.getSize());
            UIManager.put(key, new FontUIResource(font));
        }
    }

你知道为什么第一个代码块循环并更改所有字体资源,而第二个代码块只循环几个项目吗?

这是一个很好的问题,答案是你使用的方法返回完全不同的对象

UIManager.getDefaults().keys();返回一个枚举。枚举并不担心集合上的repited对象要迭代

UIManager.getDefaults().keySet()返回一个集合,因此它不能包含重复的对象。当要在集合中插入元素时,使用对象的que equals方法检查集合中的对象是否已准备就绪。您正在查找FontUIResource类型的对象,此对象具有以下os equals方法的实现:

因此,在集合中,所有具有描述相同字体的参数的FontUIResource类型的键都不会插入到集合中,而是插入其中一个。连续地,集合在地图上只有一个子集的关键点

有关java集的更多信息,请访问:


另请参见相关内容。谢谢,@nrodriguez。我熟悉枚举和集合之间的区别,但我没有意识到FontUIResource是以这种方式定义的!
    for(Object key : UIManager.getDefaults().keySet()){
        Object value = UIManager.get(key);
        if(value instanceof FontUIResource){
            FontUIResource orig = (FontUIResource) value;
            Font font = new Font(orig.getFontName(), orig.getStyle(), orig.getSize());
            UIManager.put(key, new FontUIResource(font));
        }
    }
public boolean equals(Object obj)
    Compares this Font object to the specified Object.
Overrides:
    equals in class Object
Parameters:
    obj - the Object to compare
Returns:
    true if the objects are the same or if the argument is a Font object describing the same font as this object; false otherwise.