JavaRush /جاوا بلاگ /Random-UR /جاوا میں ہیش سیٹ
渚古河
سطح
Москва

جاوا میں ہیش سیٹ

گروپ میں شائع ہوا۔
کلاس HashSetانٹرفیس کو لاگو کرتی ہے Set، ایک ہیش ٹیبل پر مبنی ہے، اور اسے ایک مثال کے ذریعے بھی حمایت حاصل ہے HashMap۔ چونکہ HashSetعناصر کا حکم نہیں ہے، اس بات کی کوئی ضمانت نہیں ہے کہ عناصر کچھ عرصے کے بعد اسی ترتیب میں ہوں گے۔ شامل کرنے، حذف کرنے اور تلاش کرنے کی کارروائیاں مستقل وقت میں انجام دی جائیں گی، بشرطیکہ ہیش فنکشن عناصر کو "بالٹی" میں صحیح طریقے سے تقسیم کرے، جس پر بعد میں بات کی جائے گی۔ جاوا میں ہیش سیٹ - 1کے بارے میں چند اہم نکات HashSet:
  • کیونکہ کلاس انٹرفیس کو لاگو کرتی ہے Set، یہ صرف منفرد اقدار کو ذخیرہ کر سکتا ہے؛
  • NULL اقدار کو ذخیرہ کر سکتے ہیں؛
  • جس ترتیب میں عناصر کو شامل کیا جاتا ہے اس کا حساب ہیش کوڈ کے ذریعے کیا جاتا ہے۔
  • HashSetSerializableاور کو بھی لاگو کرتا ہے Cloneable۔
کارروائیوں کے مستقل نفاذ کے وقت کو برقرار رکھنے کے لیے، کے ساتھ کارروائیوں پر خرچ ہونے والا وقت بلٹ ان مثال ("ٹوکریوں" کی تعداد) کی "صلاحیت" + HashSetمیں عناصر کی تعداد کے براہ راست متناسب ہونا چاہیے ۔ لہذا، کارکردگی کو برقرار رکھنے کے لیے، یہ ضروری ہے کہ ابتدائی صلاحیت کو بہت زیادہ (یا بوجھ کا عنصر بہت کم) متعین نہ کیا جائے۔ ابتدائی صلاحیت - ہیش ٹیبل میں خلیوں کی ابتدائی تعداد ("بن")۔ اگر تمام سیلز بھر جائیں تو ان کی تعداد خود بخود بڑھ جائے گی۔ لوڈ فیکٹر اس بات کا ایک پیمانہ ہے کہ اس کی صلاحیت خود بخود بڑھنے سے پہلے یہ کتنا بھرا ہو سکتا ہے۔ جب میں عناصر کی تعداد ابتدائی صلاحیت اور لوڈ فیکٹر کی پیداوار سے زیادہ ہو جاتی ہے، تو ہیش ٹیبل کو دوبارہ ہیش کیا جاتا ہے (عناصر کے ہیش کوڈز کا دوبارہ حساب لگایا جاتا ہے اور ٹیبل کو حاصل شدہ اقدار کے مطابق دوبارہ بنایا جاتا ہے) اور نمبر اس میں خلیات کی تعداد دوگنی ہو جاتی ہے۔ لوڈ فیکٹر = ٹیبل / ہیش ٹیبل سائز میں ذخیرہ شدہ عناصر کی تعداد مثال کے طور پر، اگر ٹیبل میں سیلز کی ابتدائی تعداد 16 ہے، اور لوڈ فیکٹر 0.75 ہے، تو یہ اس کے بعد ہوتا ہے جب بھرے ہوئے سیلز کی تعداد 12 تک پہنچ جاتی ہے، خلیوں کی تعداد خود بخود بڑھ جائے گی۔ لوڈ فیکٹر اور ابتدائی صلاحیت دو اہم عوامل ہیں جو کی کارکردگی کو متاثر کرتے ہیں ۔ 0.75 کا بوجھ عنصر اوسطاً اچھی کارکردگی فراہم کرتا ہے۔ اگر اس پیرامیٹر کو بڑھایا جاتا ہے، تو میموری کا بوجھ کم ہو جائے گا (کیونکہ یہ دوبارہ ہیش اور دوبارہ تعمیر کرنے کی تعداد کو کم کر دے گا)، لیکن یہ اپنڈ اور تلاش کے کاموں کو متاثر کرے گا۔ دوبارہ ہیشنگ پر خرچ ہونے والے وقت کو کم کرنے کے لیے، آپ کو صحیح ابتدائی صلاحیت پیرامیٹر کا انتخاب کرنا ہوگا۔ اگر ابتدائی صلاحیت لوڈ فیکٹر سے تقسیم کردہ عناصر کی زیادہ سے زیادہ تعداد سے زیادہ ہے، تو دوبارہ ہیشنگ آپریشن بالکل نہیں ہوگا۔ HashSetHashMapHashSetHashSetHashSetاہم: HashSetبلٹ ان سنکرونائزیشن کے ساتھ ڈیٹا کا ڈھانچہ نہیں ہے، لہذا اگر ایک ہی وقت میں متعدد تھریڈز اس پر کام کر رہے ہیں، اور ان میں سے کم از کم ایک تبدیلی کرنے کی کوشش کر رہا ہے، تو اسے باہر سے مطابقت پذیر رسائی فراہم کرنا ضروری ہے۔ یہ اکثر کسی اور مطابقت پذیر شے کی قیمت پر کیا جاتا ہے جو HashSet. اگر ایسی کوئی چیز نہیں ہے، تو Collections.synchronizedSet(). یہ اس وقت کے ساتھ مطابقت پذیری سے باہر ہونے والی کارروائیوں کو روکنے کا بہترین طریقہ ہے HashSet۔
Set s = Collections.synchronizedSet(new HashSet(...));
ہیش سیٹ کنسٹرکٹرز:
  1. HashSet h = new HashSet(); - ڈیفالٹ کنسٹرکٹر۔ پہلے سے طے شدہ ابتدائی گنجائش 16 ہے، لوڈ فیکٹر 0.75 ہے۔
  2. HashSet h = new HashSet(int initialCapacity)- دی گئی ابتدائی صلاحیت کے ساتھ کنسٹرکٹر۔ لوڈ فیکٹر – 0.75۔
  3. HashSet h = new HashSet(int initialCapacity, float loadFactor);- دی گئی ابتدائی صلاحیت اور بوجھ کے عنصر کے ساتھ ایک کنسٹرکٹر۔
  4. HashSet h = new HashSet(Collection C)- ایک کنسٹرکٹر جو دوسرے مجموعہ سے عناصر کو شامل کرتا ہے۔
ذیل کا کوڈ کچھ طریقوں کو ظاہر کرتا ہے HashSet:
import java.util.*;

class Test
{
    public static void main(String[]args)
    {
        HashSet<String> h = new HashSet<String>();

        // Add elements to the HashSet using the add() method
        h.add("India");
        h.add("Australia");
        h.add("South Africa");
        h.add("India");// try to add another same element

        // Print the elements of the HashSet to the console
        System.out.println(h);
        System.out.println("List contains India or not:" +
                           h.contains("India"));

        // Remove elements from the set using the remove() method
        h.remove("Australia");
        System.out.println("List after removing Australia:"+h);

        // Loop through the elements of the HashSet using an iterator:
        System.out.println("Iterating over list:");
        Iterator<String> i = h.iterator();
        while (i.hasNext())
            System.out.println(i.next());
    }
}
نتیجہ:
[South Africa, Australia, India]
List contains India or not:true
List after removing Australia:[South Africa, India]
Iterating over list:
South Africa
India
تمام کلاسز جو انٹرفیس کو لاگو کرتی ہیں Setاندرونی طور پر نفاذ کے ذریعہ تعاون یافتہ ہیں Map۔ HashSetکا استعمال کرتے ہوئے عناصر کو ذخیرہ کرتا ہے HashMap۔ اگرچہ HashMapکسی عنصر کو شامل کرنے کے لیے ایک عنصر کو کلیدی قدر کے جوڑے کے طور پر پیش کیا جانا چاہیے، لیکن HashSetصرف قدر کو شامل کیا جاتا ہے۔ درحقیقت، ہم جس قدر کو پاس کرتے ہیں HashSetوہ آبجیکٹ کی کلید ہے HashMap، اور ایک مستقل کو قدر کے طور پر استعمال کیا جاتا ہے HashMap۔ اس طرح، ہر کلیدی قدر کے جوڑے میں، تمام کلیدوں کی قدر ایک جیسی ہوگی۔ میں نفاذ :HashSetjava doc
private transient HashMap map;

// Constructor - 1
// All constructors implicitly create a HashMap object.
public HashSet()
{
    // Create an implicit HashMap object
    map = new HashMap();
}

// Constructor- 2
public HashSet(int initialCapacity)
{
    // Create an implicit HashMap object
    map = new HashMap(initialCapacity);
}

// An object of the Object class, each time acting as a value in the HashMap
private static final Object PRESENT = new Object();
اگر آپ طریقہ دیکھیں add()y HashSet:
public boolean add(E e)
{
   return map.put(e, PRESENT) == null;
}
آپ دیکھ سکتے ہیں کہ طریقہ add()y اندرونی آبجیکٹ پر HashSetطریقہ کو کال کرتا ہے ، اسے کلید کے طور پر شامل کیے جانے والے عنصر کو پاس کرتا ہے، اور PRESENT مستقل کو قدر کے طور پر۔ طریقہ اسی طرح کام کرتا ہے ۔ اسے اندرونی آبجیکٹ کا طریقہ کہتے ہیں : put()HashMapremove()remove()HashMap
public boolean remove(Object o)
{
  return map.remove(o) == PRESENT;
}
HashSetایک ہیش ٹیبل پر مبنی ہے، اور شامل کرنے، حذف کرنے، یا تلاش کرنے کی کارروائیاں، اوسطاً، مستقل (O(1)) وقت میں مکمل ہوں گی ۔ طریقے HashSet:
  1. boolean add(E e): میں ایک عنصر جوڑتا ہے HashSet، اگر کوئی نہیں ہے، لیکن اگر ایسا عنصر پہلے سے موجود ہے، تو طریقہ غلط لوٹاتا ہے ۔
  2. void clear():سیٹ سے تمام عناصر کو ہٹاتا ہے۔
  3. boolean contains(Object o)اگر دیا ہوا عنصر سیٹ میں موجود ہو تو درست لوٹاتا ہے ۔
  4. boolean remove(Object o): اگر موجود ہو تو سیٹ سے دیئے گئے عنصر کو ہٹا دیتا ہے۔
  5. Iterator iterator(): سیٹ کے عناصر کے لیے ایک تکرار کرنے والا لوٹاتا ہے۔
  6. boolean isEmpty(): اگر سیٹ میں کوئی عناصر نہ ہوں تو درست لوٹاتا ہے۔
  7. Object clone(): سطح کی کلوننگ کرتا ہے HashSet۔
Javadoc: https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION