হ্যাশম্যাপ একটি নাল কী এবং যে কোনও নাল মানকে অনুমতি দেয়। এর ব্যবহার কী?
ConcurrentHashMap
নাল-কীগুলি সমর্থন করে না, যখন HashMap
তা করে।
হ্যাশম্যাপ একটি নাল কী এবং যে কোনও নাল মানকে অনুমতি দেয়। এর ব্যবহার কী?
ConcurrentHashMap
নাল-কীগুলি সমর্থন করে না, যখন HashMap
তা করে।
উত্তর:
আপনি যা জিজ্ঞাসা করছেন তা আমি ইতিবাচক নই, তবে আপনি যখন কোনও নাল কী ব্যবহার করতে চান তার উদাহরণ সন্ধান করেন, আমি ডিফল্ট কেসটি উপস্থাপন করতে মানচিত্রে প্রায়শই এগুলি ব্যবহার করি (যেমন মানটি ব্যবহার করা উচিত) যদি প্রদত্ত কীটি উপস্থিত না থাকে):
Map<A, B> foo;
A search;
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
HashMap
নাল কীগুলি বিশেষভাবে পরিচালনা করে (যেহেতু এটি .hashCode()
কোনও নাল বস্তুর উপরে কল করতে পারে না ), তবে নাল মানগুলি বিশেষ কিছু নয়, সেগুলি অন্য কোনও মতো মানচিত্রে সঞ্চিত রয়েছে
HashMap
( putForNullKey
) এর একটি বিশেষ পদ্ধতি রয়েছে যা এটি পরিচালনা করে; এটি এটি টেবিল 0 এ সঞ্চয় করে
B val = foo.containsKey(search) ? foo.get(search) : foo.get(null);
আমি মনে করি যে আমরা অনুসন্ধান কীতে সহজ পদ্ধতিটি কল করতে পারি যার ফলস্বরূপ ফলাফল হবে। B val = foo.get(search);
আমি কিছু ভুল হয়ে থাকলে দয়া করে আমাকে সংশোধন করতে পারেন?
val
থেকে null
যদি চাবি অস্তিত্ব নেই; খনি null
মানচিত্রে যা মানচিত্রে সেট করে । এটিই ছিল, আমি 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
একটি হ্যাশম্যাপে একটি কীটির সাথে মান সংরক্ষণ করার সুবিধা ডাটাবেস ইত্যাদির মতোই - আপনি খালি (যেমন স্ট্রিং "") থাকা এবং একটি মান না রাখার মধ্যে পার্থক্য রেকর্ড করতে পারেন (নাল) ।
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
। তদুপরি, এটি অস্তিত্বহীন বা ইতিমধ্যে বন্ধ হওয়া টাইমারকে থামানোর চেষ্টা করার মতো নয় যা কলকারী সাধারণত পুনরুদ্ধার করতে পারে।