JavaRush /جاوا بلاگ /Random-UR /10 غلطیاں جو اکثر جاوا ڈویلپرز کے ذریعہ کی جاتی ہیں۔
theGrass
سطح
Саратов

10 غلطیاں جو اکثر جاوا ڈویلپرز کے ذریعہ کی جاتی ہیں۔

گروپ میں شائع ہوا۔
10 غلطیاں جو اکثر جاوا ڈویلپرز کرتی ہیں - 1
اس فہرست میں 10 غلطیاں شامل ہیں جو جاوا ڈویلپرز اکثر کرتے ہیں۔
  1. ایک صف کو ایک ArrayList میں تبدیل کرنا ۔

    ایک صف کو ArrayList میں تبدیل کرنے کے لیے ، ڈویلپر اکثر یہ طریقہ استعمال کرتے ہیں:

    List<String> list = Arrays.asList(arr);

    Arrays.asList()کلاس آبجیکٹ کو واپس کرے گا جو کلاس کی ArrayListاندرونی نجی جامد کلاس ہے ، اور یہ کلاس نہیں ہے کلاس میں طریقوں ، ,، پر مشتمل ہے لیکن عناصر کو شامل کرنے کا کوئی طریقہ نہیں ہے، اس کا سائز مقرر ہے ۔ ایک حقیقی بنانے کے لیے ، یہ کریں:(private static class)Arraysjava.util.ArrayList.java.util.Arrays.ArrayListset()get()contains()java.util.ArrayList

    ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));

    کلاس کنسٹرکٹر java.util.ArrayListان تمام اشیاء کو پیرامیٹر کے طور پر لے سکتا ہے جو ایک انٹرفیس کو نافذ کرتے ہیں Collection، جس کا نفاذ کلاس کو وراثت میں ملتا ہے۔java.util.Arrays.ArrayList

    (نجی جامد کلاس ArrayList<E> توسیع کرتا ہے AbstractList<E> RandomAccess کو لاگو کرتا ہے، java.io.Serializable)۔

  2. ایک مخصوص قدر کے لیے ایک صف کی جانچ کرنا۔

    ڈویلپر اکثر یہ کرتے ہیں:

    Set<String> set = new HashSet<String>(Arrays.asList(arr));
    return set.contains(targetValue);

    کوڈ کام کرتا ہے، لیکن اسے Listمیں تبدیل کرنے کی ضرورت نہیں ہے Set۔ میں تبدیل ہونے میں Setاضافی وقت لگے گا۔ اصل میں، سب کچھ آسان ہے:

    Arrays.asList(arr).contains(targetValue);

    یا

    for(String s: arr){
    	if(s.equals(targetValue))
    		return true;
    }
    return false;

    پہلا طریقہ بہت مختصر ہے۔

  3. Listلوپ میں سے کسی عنصر کو ہٹانا

    مندرجہ ذیل کوڈ پر غور کریں جو لوپ میں عناصر کو ہٹاتا ہے:

    ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
    for (int i = 0; i < list.size(); i++) {
    	list.remove(i);
    }
    System.out.println(list);

    نتیجہ:

    [b, d]

    یہ ایک سنگین غلطی نکلتی ہے۔ جب ایک عنصر کو ہٹا دیا جاتا ہے، تو سائز Listکم ہو جاتا ہے اور عنصر کے اشاریے بدل جاتے ہیں۔

    لہذا اگر آپ انڈیکس کا استعمال کرتے ہوئے ایک لوپ میں متعدد عناصر کو ہٹانا چاہتے ہیں تو اس طریقہ سے گریز کریں۔

    آپ کو معلوم ہوگا کہ آئٹریٹر کا استعمال لوپ میں موجود عناصر کو ہٹانے کا صحیح حل ہے، اور آپ جانتے ہیں کہ اسٹائل لوپ for-eachایک تکرار کرنے والے کی طرح کام کرتا ہے، لیکن ایسا نہیں ہوتا ہے۔

    درج ذیل کوڈ پر غور کریں:

    ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
    
    for (String s : list) {
    	if (s.equals("a"))
    		list.remove(s);
    }

    ہمیں ایک ConcurrentModificationException موصول ہوگا ۔

    کرنے کا صحیح کام یہ ہے:

    ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d"));
    Iterator<String> iter = list.iterator();
    while (iter.hasNext()) {
    	String s = iter.next();
    
    	if (s.equals("a")) {
    		iter.remove();
    	}
    }

    طریقہ next()کار سے پہلے بلایا جانا چاہئے remove()۔

    لوپ سٹائل میں for-each، مرتب کرنے والا طریقہ کو کال کرے گا remove()، اور تب ہی next()، جو ایک غلطی پیدا کرے گا ConcurrentModificationException۔ آپ کوڈ کو دیکھ سکتے ہیں ArrayList.iterator()۔

  4. Hashtableخلاف HashMap.

    متعلقہ نفاذ کی وجہ سے، ہیش ٹیبل ڈیٹا ڈھانچے کا نام ہے۔

    لیکن جاوا میں ڈیٹا ڈھانچے کا نام ہے HashMap۔ Hashtableاور کے درمیان ایک اہم فرق HashMapیہ ہے کہ یہ مطابقت پذیر ہے ۔ اس لیے اسے کہاں Hashtableاستعمال نہیں کیا جانا چاہیے ۔HashtableHashMap

    HashMap بمقابلہ TreeMap بمقابلہ ہیش ٹیبل بمقابلہ لنکڈ ہیش میپ

    نقشہ انٹرفیس کے بارے میں 10 بنیادی سوالات

  5. مواد کی پابندیوں کے بغیر مجموعوں کا استعمال کریں۔

    В Java часто путают коллекции без ограничений по содержимому, и коллекции с маской по типу содержимого. К примеру, для множеств - Set это коллекция без ограничений по содержимому, а Set<?> — коллекция у которой все-таки есть ограничения, но эти ограничения ничего на самом деле не ограничивают. Рассмотрим следующий code, где List без ограничений используется в качестве параметра метода:

    public static void add(List list, Object o){
    	list.add(o);
    }
    public static void main(String[] args){
    	List<String> list = new ArrayList<String>();
    	add(list, 10);
    	String s = list.get(0);
    }

    Данный code выбросит исключение:

    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    	at …

    Использование коллекций без ограничений по содержимому очень опасно, потому что вы не можете быть уверенными в том что там лежит внутри. А для того чтобы понять всю глубину разницы между Set, Set<?> и Set<Object> — почитайте вот эту и эту ссылки.

  6. Уровень доступа

    Очень часто для полей класса разработчики используют модификатор доступа public. Так проще получить meaning поля напрямую. Правильнее использовать How можно более ограниченный доступ к членам класса.

    public, default, protected, and private.

  7. ArrayList против LinkedList

    Когда разработчики не знают чем отличается ArrayList от LinkedList, они используют первый в силу его большей известности. Однако, есть огромная разница в производительности между ними. На самом деле, выбор между ними должен быть продиктован их внутренними особенностями — ArrayList позволяет быстро производить доступ к произвольному элементу массива, а LinkedList — быстро добавлять/удалять элементы в массиве. Почитайте статью по ссылке ArrayList vs. LinkedList чтобы понять причины их разной производительности.

  8. Mutable (Изменяемый) против Immutable (Неизменяемый)

    Неизменяемый an object имеет много преимуществ: простота, безопасность и т.д. Но он требует отдельного an object для каждого нового значения, и за слишком большое количество an objectов придется заплатить понижением производительности. Должен быть баланс при выборе между изменяемым и неизменяемым обьектом.

    В основном чтобы избежать подготовки промежуточных an objectов используется изменяемый an object. Один из классических примеров это конкатенация большого количества строк. Если вы используете неизменяемый an object типа String, то вы создаете много an objectов, которые сразу попадут в сборщик мусора. Это тратит время и энергию процессора, поэтому правильное решение это использование изменяемых обьектов (например StringBuilder).

    String result="";
    for(String s: arr){
    	result = result + s;
    }

    Еще один пример использования изменяемых an objectов — передача такого an object в метод. Это позволит вернуть результат в нем же, без создания лишних an objectов. При работе с an objectми большого размера, к примеру коллекциями, передача коллекции в метод для сортировки и возвращение результата в другой коллекции приводит к совершенно излишнему расходу ресурсов. (Ответ пользователя dasblinkenlight на Stack Overflow).

    Почему an object класса String неизменяем?

  9. Конструкторы классов Super и Sub

    10 غلطیاں جو اکثر جاوا ڈویلپرز کرتی ہیں - 2

    یہ تالیف کی خرابی اس حقیقت کی وجہ سے ہوئی ہے کہ اینسٹر کلاس میں ڈیفالٹ کنسٹرکٹر کی وضاحت نہیں ہوتی ہے۔ جاوا میں ، جب تک کہ آپ خود کلاس کنسٹرکٹر کی وضاحت نہیں کرتے، کمپائلر ایک ڈیفالٹ کنسٹرکٹر بنائے گا جس کے لیے کسی دلیل کی ضرورت نہیں ہے۔ اگر کنسٹرکٹر کو کلاس میں Superاس طرح بیان کیا گیا ہے Super(String s){}تو، مرتب کرنے والا خود کچھ بھی شامل نہیں کرے گا۔ یہ وہی ہے جو ہم اپنی مثال میں دیکھتے ہیں.

    کلاس کا کنسٹرکٹر Sub، چاہے کوئی بھی ہو، کلاس کا ڈیفالٹ کنسٹرکٹر کہے گا Super، کیونکہ اس کے علاوہ کچھ نہیں بتایا گیا ہے۔ چونکہ کلاس میں کوئی ڈیفالٹ کنسٹرکٹر نہیں ہے Super، اس سے تالیف کی خرابی پیدا ہوگی۔

    اس مسئلے کا پہلا حل کلاس میں ڈیفالٹ کنسٹرکٹر کو شامل کرنا ہے۔Super

    public Super(){
        System.out.println("Super");
    }

    دوسرا آپشن اس کنسٹرکٹر کو ہٹانا ہے جسے ہم نے کلاس سے بیان کیا ہے Superتاکہ کمپائلر ڈیفالٹ کنسٹرکٹر بنا سکے۔

    super(value)اور آخری آپشن کلاس کنسٹرکٹرز کو کال شامل کرنا ہے Subتاکہ پہلے سے طے شدہ کنسٹرکٹر کی بجائے موجودہ کلاس کنسٹرکٹر کو بلایا جائے۔Super

    سپر اور سب کا کنسٹرکٹر

  10. "" یا کنسٹرکٹر؟

    سٹرنگ بنانے کے دو طریقے ہیں:

    //1. использовать двойные кавычки
    String x = "abc";

    //2. использовать конструктор
    String y = new String("abc");

    ان میں کیا فرق ہے؟

    آپ اسے درج ذیل مثالوں سے سمجھ سکتے ہیں۔

    String a = "abcd";
    String b = "abcd";
    System.out.println(a == b);  // True
    System.out.println(a.equals(b)); // True
    
    String c = new String("abcd");
    String d = new String("abcd");
    System.out.println(c == d);  // False
    System.out.println(c.equals(d)); // True

    اس بارے میں مزید جاننے کے لیے کہ سٹرنگز کو میموری میں کیسے اسٹور کیا جاتا ہے، "" یا کنسٹرکٹر کا استعمال کرتے ہوئے جاوا سٹرنگ بنائیں؟ .

مستقبل کے منصوبے. یہ فہرست GitHub کے اوپن سورس پروجیکٹس کی ایک بڑی تعداد، اسٹیک اوور فلو کے سوالات، اور گوگل پر مقبول سوالات کے میرے تجزیے پر مبنی ہے۔ میں یہ ثابت کرنے کے لیے نہیں سمجھتا کہ وہ واقعی دس سنگین ترین غلطیوں میں سے ہیں، لیکن وہ دراصل بہت عام ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION