به منظور درک این ساختار داده ای ، در اینجا از آن برای پیاده سازی یک cashساده استفاده خواهیم کرد. با این حال به خاطر داشته باشید که پیاده سازی یک cashبرای خودتان، عمدتا یک ایده بد است.
ساختار داده Weak hashMap یک پیادهسازی بر اساس hashTable از اینترفیس Map در جاوا است که به کاربر امکان استفاده از weak refrence (اشارهگرهای ضعیف) برای کلیدها میدهد. Weak References در جاوا نوعی از اشارهگر است که از حذف آبجکت اشاره شده توسط garbage collector جلوگیری نمیکند. در یک WeakHashMap ، کلیدها به عنوان اشارهگرهای ضعیف ذخیره میشوند، به این معنی که اگر کلیدها در هیچجای دیگری در برنامه استفاده نشوند، ممکن است توسط garbage collectorحذف شوند. این میتواند در مواردی مفید باشد که شما میخواهید اطلاعات اضافی را با آبجکتها مرتبط کنید بدون اینکه جلوی حذف آنها توسط garbage collector را بگیرد.
یک کاربرد شایع برایWeakHashMap در سناریوهای cashing است که میخواهید دادههای اضافی مربوط به آبجکتها را cash نمایید بدون جلوگیری از حذف آنها توسط garbage collector وقتی دیگر نیازی به آنها نیست. با استفاده از weak refrence، برای کلیدها در یک WeakHashMap، میتوانید اطمینان حاصل کنید که حافظه استفاده شده توسط cash به طور خودکار توسط garbage collector بازیابی خواهد شد.
احتیاط هایی وجود دارد که باید هنگام استفاده از WeakHashMap آنرا در نظر بگیرید. یکی از مهمترین ملاحظهها این است که رفتار Weak References ممکن است کمی پیشبینی ناپذیر باشد.
کلاس Soft Reference
به طور ساده، یک شیء که یک SoftReference به آن اشاره دارد تا زمانی که JVM به طور مطلق نیاز به حافظه دارد، توسط GC از بین نخواهد رفت. به بیان دیگر این شی واجد شرایط GC میباشد اما فقط زمانی جمع آوری میشود که JVM به طور مطلق به حافظه نیاز داشته باشد.
کلاس Weak Reference
آن object هایی که فقط به وسیله weak refrence ها ارجاع داده میشوند، واجد شرایط برای GC میباشند و GC منتظر JVM برای نیازمندی به حافظه نمی ماند و در cycle بعدی garbage collector، اگر مورد استفاده نباشند، جمع آوری میشوند.
خوب، میخواهیم یک حافظه cash بسازیم که تصاویر با حجم بزرگ را به عنوان مقادیر نگهداری کند و نام تصاویر را به عنوان کلیدها.استفاده از یک HashMap ساده یک انتخاب خوب نخواهد بود زیرا تصاویر ممکن است حافظه زیادی را اشغال کنند. علاوه بر این، آنها هرگز توسط یک فرآیند GC از حافظه حذف نخواهند شد، حتی زمانی که دیگر در برنامه ما استفاده نمیشوند.
وقتی که از WeakHashMap ، استفاده کنیم، زمانی که یک کلید (نام تصویر) از یک entry، درهیچ جای برنامهی ما استفاده نمیشود، آن entry از آن object از حافظه حذف خواهد شد.
public class LargeImageCache { private static WeakHashMap<File, BufferedImage> imageCache = new WeakHashMap<>(); public static BufferedImage getCachedImage(File imageFile) { BufferedImage cachedImage = imageCache.get(imageFile); if (cachedImage == null) { try { cachedImage = ImageIO.read(imageFile); imageCache.put(imageFile, cachedImage); } catch (IOException e) { e.printStackTrace(); } } return cachedImage; } public static void clearCache() { imageCache.clear(); } }
public class Main { public static void main(String[] args) { File imageFile = new File("path/to/large/image.jpg"); BufferedImage cachedImage = LargeImageCache.getCachedImage(imageFile); // Use cachedImage in your application // ... LargeImageCache.clearCache(); // Clear the cache when no longer needed } }