JavaRush /Java blogi /Random-UZ /Java dasturchilari tomonidan tez-tez sodir bo'ladigan 10 ...
theGrass
Daraja
Саратов

Java dasturchilari tomonidan tez-tez sodir bo'ladigan 10 ta xato

Guruhda nashr etilgan
Java dasturchilari tomonidan tez-tez yo'l qo'yiladigan 10 ta xato - 1
Ushbu ro'yxatga Java dasturchilari tez-tez yo'l qo'yadigan 10 ta xato kiradi.
  1. Massivni ArrayList ga aylantirish .

    Massivni ArrayList ga aylantirish uchun ishlab chiquvchilar ko'pincha ushbu usuldan foydalanadilar:

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

    Arrays.asList()sinfning ArrayListichki xususiy statik klassi bo'lgan sinf ob'ektini qaytaradi va bu sinf emas Sinfda , , usullari mavjud , lekin elementlarni qo'shish uchun hech qanday usullar mavjud emas, uning o'lchami belgilangan . Haqiqiy yaratish uchun quyidagilarni bajaring:(private static class)Arraysjava.util.ArrayList.java.util.Arrays.ArrayListset()get()contains()java.util.ArrayList

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

    Sinf konstruktori java.util.ArrayListinterfeysni amalga oshiradigan barcha ob'ektlarni parametr sifatida qabul qilishi mumkin Collection, ularning amalga oshirilishi sinf tomonidan meros qilib olinadi.java.util.Arrays.ArrayList

    (xususiy statik sinf ArrayList<E> AbstractList kengaytiradi<E> RandomAccess, java.io.Serializable-ni qo'llaydi).

  2. Muayyan qiymat uchun massivni tekshirish.

    Ko'pincha ishlab chiquvchilar buni qilishadi:

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

    ListKod ishlaydi, lekin uni ga aylantirishning hojati yo'q Set. Oʻzgartirish Setqoʻshimcha vaqt oladi. Aslida, hamma narsa oddiy:

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

    yoki

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

    Birinchi usul ancha qisqaroq.

  3. Elementni Listtsikldan olib tashlash

    Loopdagi elementlarni olib tashlaydigan quyidagi kodni ko'rib chiqing:

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

    Xulosa:

    [b, d]

    Bu jiddiy xato bo'lib chiqadi. Element olib tashlanganida, hajmi Listkamayadi va element indekslari o'zgaradi.

    Shunday qilib, indeks yordamida tsikldagi bir nechta elementlarni olib tashlamoqchi bo'lsangiz, bu usuldan qoching.

    Siz iteratordan foydalanish tsikldagi elementlarni olib tashlash uchun to'g'ri echim ekanligini bilishingiz mumkin va uslublar tsikli for-eachiterator kabi ishlashini bilasiz, lekin unday emas.

    Quyidagi kodni ko'rib chiqing:

    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 olamiz .

    To'g'ri qilish kerak:

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

    Usul next()dan oldin chaqirilishi kerak remove().

    Loop uslubida for-eachkompilyator usulni chaqiradi remove()va shundan keyingina next()xatolik yuzaga keladi ConcurrentModificationException. Siz kodni ko'rishingiz mumkin ArrayList.iterator().

  4. Hashtableqarshi HashMap.

    Tegishli amalga oshirish tufayli Hashtable ma'lumotlar strukturasining nomidir.

    Lekin Java -da ma'lumotlar strukturasi nomi HashMap. Hashtableva o'rtasidagi asosiy farqlardan biri HashMapshundaki, u sinxronlashtiriladi, shuning uchun uni qaerda Hashtableishlatmaslik kerak .HashtableHashMap

    HashMap va boshqalar. TreeMap va boshqalar. Hashtable vs. LinkedHashMap .

    Xarita interfeysi haqida 10 ta asosiy savol

  5. To'plamlardan kontent cheklovlarisiz foydalaning

    В 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 dasturchilari tomonidan tez-tez yo'l qo'yiladigan 10 ta xato - 2

    Ushbu kompilyatsiya xatosi ajdodlar sinfida standart konstruktor aniqlanmaganligi sababli yuzaga keladi. Java -da , agar siz sinf konstruktorini o'zingiz belgilamasangiz, kompilyator hech qanday argument talab qilmaydigan standart konstruktor yaratadi. Agar konstruktor sinfda Supersifatida tasvirlangan bo'lsa Super(String s){}, kompilyatorning o'zi hech narsa qo'shmaydi. Buni biz misolimizda ko'ramiz.

    Qaysi biri bo'lishidan qat'i nazar, sinf konstruktori Subsinfning standart konstruktorini chaqiradi Super, chunki boshqa hech narsa belgilanmagan. Sinfda standart konstruktor yo'qligi sababli Super, bu kompilyatsiya xatosiga olib keladi.

    Ushbu muammoning birinchi yechimi sinfga standart konstruktorni qo'shishdirSuper

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

    Ikkinchi variant esa biz tavsiflagan konstruktorni sinfdan olib tashlashdir, Supershunda kompilyator standart konstruktor yaratadi.

    super(value)Va oxirgi variant - sinf konstruktorlariga qo'ng'iroqni qo'shish Sub, shunda standart konstruktor o'rniga mavjud sinf konstruktori chaqiriladi.Super

    Super va Sub konstruktori

  10. "" yoki konstruktormi?

    String yaratishning ikki yo'li mavjud:

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

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

    Ularning orasidagi farq nima?

    Buni quyidagi misollardan tushunishingiz mumkin:

    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

    Satrlar xotirada qanday saqlanishi haqida ko'proq ma'lumot olish uchun "" yoki Konstruktor yordamida Java satrini yaratish bo'limini o'qing. .

Kelajak rejalari. Bu roʻyxat mening GitHub’dan juda koʻp Ochiq manba loyihalari, Stack Overflow savollari va Google’dagi mashhur soʻrovlar tahlilimga asoslangan. Men ular haqiqatan ham eng jiddiy o'nta xatolardan biri ekanligini isbotlashga o'ylamayman, lekin ular juda keng tarqalgan.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION