HashMap อนุญาตให้ใช้คีย์ null หนึ่งคีย์และค่า null จำนวนเท่าใดก็ได้ การใช้งานคืออะไร?
ConcurrentHashMap
ไม่รองรับคีย์ว่างในขณะที่HashMap
ทำ
HashMap อนุญาตให้ใช้คีย์ null หนึ่งคีย์และค่า null จำนวนเท่าใดก็ได้ การใช้งานคืออะไร?
ConcurrentHashMap
ไม่รองรับคีย์ว่างในขณะที่HashMap
ทำ
คำตอบ:
ฉันไม่คิดบวกกับสิ่งที่คุณกำลังถาม แต่ถ้าคุณกำลังมองหาตัวอย่างว่าเมื่อใดที่ต้องการใช้คีย์ว่างฉันมักจะใช้มันในแผนที่เพื่อแสดงกรณีเริ่มต้น (เช่นค่าที่ควรใช้ หากไม่มีคีย์ที่ระบุ):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
จัดการคีย์ null เป็นพิเศษ (เนื่องจากไม่สามารถเรียก.hashCode()
ใช้วัตถุว่างได้) แต่ค่า null ไม่ได้มีอะไรพิเศษมันถูกเก็บไว้ในแผนที่เหมือนอย่างอื่น
HashMap
( putForNullKey
) ที่จัดการกับมัน เก็บไว้ในตาราง 0
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
ฉันคิดว่าเราสามารถเรียกเมธอดในคีย์การค้นหาซึ่งจะได้ผลลัพธ์เหมือนกัน B val = foo.get(search);
คุณช่วยแก้ไขฉันได้ไหมถ้าฉันทำอะไรผิดพลาด
val
เป็นnull
ถ้าไม่มีคีย์ ของฉันตั้งค่าเป็นnull
แผนที่ใดก็ได้ในแผนที่ นั่นคือประเด็นฉันเก็บค่าเริ่มต้นที่ไม่ใช่ค่าว่างไว้ที่null
คีย์ในแผนที่และใช้หากไม่มีคีย์จริง
ตัวอย่างหนึ่งสำหรับการสร้างแบบจำลองต้นไม้ หากคุณใช้ HashMap เพื่อแสดงโครงสร้างแบบทรีโดยที่คีย์คือพาเรนต์และค่าคือรายชื่อเด็กค่าของnull
คีย์จะเป็นโหนดรูท
ตัวอย่างหนึ่งของการใช้งานสำหรับnull
ค่าคือเมื่อใช้HashMap
เป็นแคชสำหรับผลการดำเนินงานที่มีราคาแพง (เช่นการเรียกร้องให้บริการเว็บภายนอก) null
ซึ่งอาจจะกลับมา
การใส่null
ค่าในแผนที่จะช่วยให้คุณสามารถแยกความแตกต่างระหว่างกรณีที่การดำเนินการไม่ได้ถูกดำเนินการสำหรับคีย์ที่กำหนด ( cache.containsKey(someKey)
ส่งคืนfalse
) และตำแหน่งที่ดำเนินการแล้ว แต่ส่งคืนnull
ค่า ( cache.containsKey(someKey)
ส่งคืนtrue
, cache.get(someKey)
ส่งคืนnull
)
หากไม่มีnull
ค่าคุณจะต้องใส่ค่าพิเศษบางอย่างในแคชเพื่อระบุการnull
ตอบสนองหรือไม่ก็แคชการตอบสนองนั้นเลยและดำเนินการทุกครั้ง
คำตอบจนถึงตอนนี้จะพิจารณาเพียงคุณค่าของการมีnull
กุญแจเท่านั้น แต่คำถามก็ถามถึงany number of null values
เช่นกัน
ประโยชน์ของการจัดเก็บค่าnull
กับคีย์ใน HashMap นั้นเหมือนกับในฐานข้อมูล ฯลฯ - คุณสามารถบันทึกความแตกต่างระหว่างการมีค่าที่ว่างเปล่า (เช่นสตริง "") และไม่มีค่าเลย (null) .
ต่อไปนี้เป็นตัวอย่างกรณีที่มีการกำหนดnull
ไว้เพียงอย่างเดียวของฉันซึ่งกุญแจจะมีประโยชน์:
public class Timer {
private static final Logger LOG = Logger.getLogger(Timer.class);
private static final Map<String, Long> START_TIMES = new HashMap<String, Long>();
public static synchronized void start() {
long now = System.currentTimeMillis();
if (START_TIMES.containsKey(null)) {
LOG.warn("Anonymous timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(null).longValue()) +"ms");
}
START_TIMES.put(null, now);
}
public static synchronized long stop() {
if (! START_TIMES.containsKey(null)) {
return 0;
}
return printTimer("Anonymous", START_TIMES.remove(null), System.currentTimeMillis());
}
public static synchronized void start(String name) {
long now = System.currentTimeMillis();
if (START_TIMES.containsKey(name)) {
LOG.warn(name + " timer was started twice without being stopped; previous timer has run for " + (now - START_TIMES.get(name).longValue()) +"ms");
}
START_TIMES.put(name, now);
}
public static synchronized long stop(String name) {
if (! START_TIMES.containsKey(name)) {
return 0;
}
return printTimer(name, START_TIMES.remove(name), System.currentTimeMillis());
}
private static long printTimer(String name, long start, long end) {
LOG.info(name + " timer ran for " + (end - start) + "ms");
return end - start;
}
}
throw Exception
อยู่ใกล้ ๆ นอกจากนี้การพยายามหยุดตัวจับเวลาที่ไม่มีอยู่จริงหรือหยุดไปแล้วเป็นสิ่งที่ผู้โทรสามารถกู้คืนได้โดยทั่วไป
อีกตัวอย่างหนึ่ง: ฉันใช้เพื่อจัดกลุ่มข้อมูลตามวันที่ แต่บางข้อมูลไม่มีวันที่ ฉันสามารถจัดกลุ่มโดยใช้ส่วนหัว "NoDate"
คีย์ว่างยังมีประโยชน์เมื่อแผนที่เก็บข้อมูลสำหรับการเลือก UI โดยที่คีย์แผนที่แสดงถึงฟิลด์บีน
ตัวอย่างเช่นค่าช่องว่างที่เกี่ยวข้องจะแสดงเป็น "(โปรดเลือก)" ในการเลือก UI