Вот пример, который демонстрирует разницу:
import java.util.*;
public class Test {
public static void main(String[] args) {
Properties defaults = new Properties();
defaults.setProperty("x", "x-default");
Properties withDefaults = new Properties(defaults);
withDefaults.setProperty("x", "x-new");
withDefaults.remove("x");
// Prints x-default
System.out.println(withDefaults.getProperty("x"));
Properties withCopy = new Properties();
withCopy.putAll(defaults);
withCopy.setProperty("x", "x-new");
withCopy.remove("x");
// Prints null
System.out.println(withCopy.getProperty("x"));
}
}
В первом случае мы добавляем новое нестандартное значение для свойства "x", а затем удаляем его; когда мы спросим «х», реализация обнаружит, что его нет, и вместо этого сверится со значениями по умолчанию.
Во втором случае мы копируем значения по умолчанию в свойство без указания, что они являются значениями по умолчанию - это просто значения для свойств. Затем мы заменяем значение на «х», затем удаляем его. Когда as запрашивает «x», реализация обнаружит, что его нет, но у него нет никаких настроек по умолчанию, поэтому возвращаемое значение равно нулю.