JavaRush /Java Blogu /Random-AZ /Java Tərtibatçıları tərəfindən Tez-tez edilən 10 Səhv
theGrass
Səviyyə
Саратов

Java Tərtibatçıları tərəfindən Tez-tez edilən 10 Səhv

Qrupda dərc edilmişdir
Java tərtibatçıları tərəfindən tez-tez edilən 10 səhv - 1
Bu siyahıya Java tərtibatçılarının tez-tez yol verdiyi 10 səhv daxildir .
  1. Massivin ArrayList -ə çevrilməsi .

    Massivi ArrayList -ə çevirmək üçün tərtibatçılar tez-tez bu üsuldan istifadə edirlər:

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

    Arrays.asList()sinfin ArrayListdaxili özəl statik sinfi olan sinif obyektini qaytaracaq və bu sinif deyil Sinifdə , , metodları var , lakin elementlərin əlavə edilməsi üçün heç bir üsul yoxdur, ölçüsü sabitdir . Həqiqi bir yaratmaq üçün bunu edin:(private static class)Arraysjava.util.ArrayList.java.util.Arrays.ArrayListset()get()contains()java.util.ArrayList

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

    Sinif konstruktoru java.util.ArrayListinterfeysi həyata keçirən bütün obyektləri parametr kimi qəbul edə bilər Collection, onun həyata keçirilməsi sinfə miras qalmışdır.java.util.Arrays.ArrayList

    (özəl statik sinif ArrayList<E> AbstractList-i genişləndirir<E> RandomAccess, java.io.Serializable tətbiq edir).

  2. Müəyyən bir dəyər üçün massiv yoxlanılır.

    Tərtibatçılar tez-tez bunu edirlər:

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

    ListKod işləyir, lakin onu -a çevirməyə ehtiyac yoxdur Set. Çevirmək Setəlavə vaxt aparacaq. Əslində hər şey sadədir:

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

    və ya

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

    Birinci üsul daha qısadır.

  3. ListDöngədən elementin çıxarılması

    Döngədə elementləri silən aşağıdakı kodu nəzərdən keçirin:

    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);

    Nəticə:

    [b, d]

    Bunun ciddi bir səhv olduğu ortaya çıxır. Element çıxarıldıqda ölçüsü Listazalır və element indeksləri dəyişir.

    Beləliklə, indeksdən istifadə edərək bir döngədə çoxlu elementləri silmək istəyirsinizsə, bu üsuldan qaçın.

    Siz bilə bilərsiniz ki, iteratordan istifadə etmək döngədə elementləri silmək üçün düzgün həll yoludur və siz bilirsiniz ki, stil döngəsi for-eachiterator kimi işləyir, lakin o deyil.

    Aşağıdakı kodu nəzərdən keçirin:

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

    Biz ConcurrentModificationException alacağıq .

    Ediləcək düzgün şey:

    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();
    	}
    }

    Metoddan next()əvvəl çağırılmalıdır remove().

    Döngü üslubunda for-eachkompilyator metodu çağıracaq remove()və yalnız bundan sonra next()xəta yaradacaq ConcurrentModificationException. Koda baxa bilərsiniz ArrayList.iterator().

  4. Hashtableqarşı HashMap.

    Müvafiq icraya görə Hashtable verilənlər strukturunun adıdır.

    Lakin Java -da verilənlər strukturunun adı HashMap. Hashtablevə arasındakı əsas fərqlərdən biri sinxronizasiya HashMapolmasıdır.Ona görə də harada Hashtableistifadə edilməməlidir .HashtableHashMap

    HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap .

    Xəritə interfeysi ilə bağlı 10 əsas sual

  5. Kolleksiyaları məzmun məhdudiyyəti olmadan istifadə edin

    В 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

    Java tərtibatçıları tərəfindən tez-tez edilən 10 səhv - 2

    Bu kompilyasiya xətası, əcdad sinfində müəyyən edilmiş standart konstruktorun olmaması ilə əlaqədardır. Java - da siz özünüz sinif konstruktoru təyin etməsəniz, kompilyator heç bir arqument tələb etməyən standart konstruktor yaradacaq. Konstruktor sinifdə Superkimi təsvir edilirsə Super(String s){}, kompilyator özü heç nə əlavə etməyəcək. Bizim nümunəmizdə gördüyümüz budur.

    Sinfin konstruktoru Sub, hansının olmasından asılı olmayaraq, sinfin standart konstruktorunu çağıracaq Super, çünki başqa heç nə göstərilməyib. Sinifdə standart konstruktor olmadığı üçün Superbu kompilyasiya xətasına gətirib çıxaracaq.

    Bu problemin ilk həlli sinifə standart konstruktor əlavə etməkdirSuper

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

    İkinci seçim, təsvir etdiyimiz konstruktoru sinifdən çıxarmaqdır Superki, kompilyator standart konstruktor yaratsın.

    super(value)Və son seçim sinif konstruktorlarına zəng əlavə etməkdir Subki, standart konstruktor əvəzinə mövcud sinif konstruktoru çağırılsın.Super

    Super və Sub konstruktoru

  10. " " yoxsa konstruktor?

    Bir sətir yaratmağın iki yolu var:

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

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

    Onların arasındakı fərq nədir?

    Bunu aşağıdakı nümunələrdən başa düşə bilərsiniz:

    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

    Sətirlərin yaddaşda necə saxlanması haqqında daha çox öyrənmək üçün oxuyun "" və ya Konstruktordan istifadə edərək Java sətrini yaradın? .

Gələcək planlar. Bu siyahı, GitHub-dan çoxlu sayda Açıq Mənbə layihələri, Stack Overflow-un sualları və Google-da populyar sorğuları təhlilimə əsaslanır. Onların həqiqətən də ən ciddi on səhvdən biri olduğunu sübut etməyi güman etmirəm, amma əslində çox yaygındır.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION