这取决于构造函数的作用。如果构造函数只是将 Map 存储在实例变量中:
public class Library {
private final Map<String, String> books;
public Library(Map<String, String> books) {
this.books = books;
}
public int size() {
return books.size();
}
public static void main(String[] args) {
Map<String, String> myBooks = new HashMap<String,String>();
myBooks.put("Jonathan Swift", "Gullivers Travels");
myBooks.put("Robert Louis Stevenson", "Treasure Island");
myBooks.put("William Shakespeare", "Hamlet");
myBooks.put("J R R Tolkein", "The Hobbit");
myBooks.put("Mary Shelley", "Frankenstein");
Library library = new Library(myBooks);
myBooks.put("J K Rowling", "Harry Potter and the Philosophers stone");
System.out.println("Library contains" + library.size() + " books");
}
}
然后库包含对传递给它的映射的引用,它将看到对该映射内容的任何更改。上面的代码应该打印出图书馆有 6 本书。
另一方面,如果构造函数复制地图:
public class Library {
private final Map<String, String> books;
public Library(Map<String, String> books) {
this.books = new HashMap<String, String>(books);
}
public int size() {
return books.size();
}
public static void main(String[] args) {
Map<String, String> myBooks = new HashMap<String,String>();
myBooks.put("Jonathan Swift", "Gullivers Travels");
myBooks.put("Robert Louis Stevenson", "Treasure Island");
myBooks.put("William Shakespeare", "Hamlet");
myBooks.put("J R R Tolkein", "The Hobbit");
myBooks.put("Mary Shelley", "Frankenstein");
Library library = new Library(myBooks);
myBooks.put("J K Rowling", "Harry Potter and the Philosophers stone");
System.out.println("Library contains" + library.size() + " books");
}
}
那么图书馆有自己的地图副本,不会看到对原始地图的任何更改,所以上面的代码应该打印图书馆里有5本书。