JavaRush /جاوا بلاگ /Random-SD /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> Extracts 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.

    لاڳاپيل عمل جي ڪري، Hashtable ڊيٽا جي جوڙجڪ جو نالو آهي.

    پر جاوا ۾ ڊيٽا جي جوڙجڪ جو نالو آهي HashMap. Hashtable۽ جي وچ ۾ هڪ اهم فرق HashMapاهو آهي ته اهو هم وقت سازي آهي ، تنهنڪري اهو ڪٿي Hashtableاستعمال نه ڪيو وڃي .HashtableHashMap

    HashMap بمقابلہ. TreeMap vs. هيش ٽيبل بمقابلہ LinkedHashMap _

    نقشي جي انٽرفيس بابت 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

    وڌيڪ سکڻ لاءِ ته تارون ڪيئن ميموري ۾ محفوظ ڪيون وڃن ٿيون، پڙهو Create Java String Using "" or Constructor؟ .

مستقبل جا منصوبا. هي فهرست GitHub کان اوپن سورس پروجيڪٽ جي وڏي تعداد جي منهنجي تجزيي تي ٻڌل آهي، اسٽيڪ اوور فلو کان سوال، ۽ گوگل تي مشهور سوالن. مان اهو ثابت ڪرڻ جو فرض نه ٿو ڪريان ته اهي واقعي ڏهن سنگين غلطين مان آهن، پر اهي اصل ۾ تمام عام آهن.
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION