JavaRush /Блоги Java /Random-TG /10 хатогие, ки аксар вақт аз ҷониби таҳиягарони Java соди...
theGrass
Сатҳи
Саратов

10 хатогие, ки аксар вақт аз ҷониби таҳиягарони Java содир мешаванд

Дар гурӯҳ нашр шудааст
10 хатогие, ки аксар вақт таҳиягарони Java содир мекунанд - 1
Ин рӯйхат 10 хатогиеро дар бар мегирад, ки таҳиягарони Java аксар вақт содир мекунанд.
  1. Табдил додани массив ба ArrayList .

    Барои табдил додани массив ба ArrayList , таҳиягарон аксар вақт ин усулро истифода мебаранд:

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

    Arrays.asList()an objectи синфро бармегардонад ArrayList, ки синфи статикии дохorи (private static class)синф аст Arraysва ин синф нестjava.util.ArrayList. Синф java.util.Arrays.ArrayListдорои усулҳои set(), get(), contains(), аммо ягон усул барои илова кардани элементҳо мавҷуд нест, андозаи он собит аст . Барои сохтани як воқеӣ java.util.ArrayList, ин корро кунед:

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

    Созандаи синф java.util.ArrayListметавонад ҳамчун параметр ҳама an objectҳоеро қабул кунад, ки интерфейсро амалӣ мекунанд 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. Шумо метавонед ба code нигаред ArrayList.iterator().

  4. Hashtableзидди HashMap.

    Аз сабаби татбиқи мувофиқ, Hashtable номи сохтори додаҳост.

    Но в Java название для структуры данных это HashMap. Одно из ключевых отличий между Hashtable и HashMap это то, что Hashtable синхронизирован.Так что не стоит использовать Hashtable там где больше подходит HashMap.

    HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap.

    10 основных вопросов про интерфейс Map

  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ҳои калон, аз қабor коллексияҳо, ба усули ба навъҳо ҷудо кардан ва баргардонидани натиҷа ба коллексияи дигар сарфи тамоман нодаркори захираҳо мебошад. ( Ҷавоб аз dasblinkenlight дар Stack Overflow ).

    Чаро an objectи синфи String тағирнопазир аст?

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

    10 ошибок зачастую допускаемых Java разработчиками - 2

    Ин хатои компиляция аз он сабаб ба амал меояд, ки синфи аҷдодӣ конструктори пешфарзро муайян накардааст. Дар Java , агар шумо конструктори синфро худатон муайян накунед, компилятор конструктори пешфарзро эҷод мекунад, ки далелҳоро талаб намекунад. Агар конструктор дар синф Superҳамчун , тавсиф карда шавад Super(String s){}, худи компилятор чизе илова намекунад. Ин аст он чизе ки мо дар мисоли худ мебинем.

    Созандаи синф Sub, новобаста аз он, ки кадоме аз он, конструктори пешфарзии синфро мехонад Super, зеро ҳеҷ чизи дигаре муайян нашудааст. Азбаски дар синф ягон созандаи пешфарз вуҷуд надорад Super, ин ба хатогии компиляция оварда мерасонад.

    Ҳалли аввалини ин мушкилот ин илова кардани конструктори пешфарз ба синф мебошадSuper

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

    Варианти дуюм ин аст, ки конструктореро, ки мо тавсиф кардем, аз синф хориҷ кунем Super, то компилятор конструктори пешфарзро эҷод кунад.

    Ва варианти охирин ин илова кардани занг super(value)ба созандагони синф аст Sub, то ба ҷои созандаи пешфарз созандаи синфи мавҷуда даъват шавадSuper

    Созандаи Super ва Sub

  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

    Барои гирифтани маълумоти бештар дар бораи чӣ гуна сатрҳо дар хотира нигоҳ дошта мешаванд, хонед Сохтани сатри Java бо истифода аз "" ё Конструктор? .

Нақшаҳои оянда. Ин рӯйхат ба таҳлor ман дар бораи шумораи зиёди лоиҳаҳои кушодаасос аз GitHub, саволҳои Stack Overflow ва дархостҳои маъмул дар Google асос ёфтааст. Ман гумон намекунам, ки исбот кунам, ки онҳо воқеан дар байни даҳ хатоҳои ҷиддитарин ҳастанд, аммо онҳо воқеан хеле маъмуланд.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION