JavaRush /Java блогы /Random-KK /Java әзірлеушілері жиі жіберетін 10 қате
theGrass
Деңгей
Саратов

Java әзірлеушілері жиі жіберетін 10 қате

Топта жарияланған
Java әзірлеушілері жиі жіберетін 10 қате – 1
Бұл тізім Java әзірлеушілері жиі жіберетін 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параметр ретінде интерфейсті жүзеге асыратын барлық 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Циклдан элементті жою

    Циклдегі элементтерді алып тастайтын келесі codeты қарастырыңыз:

    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итератор сияқты жұмыс істейтінін білесіз, бірақ олай емес.

    Келесі codeты қарастырыңыз:

    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қолданбау керек .HashtableHashMap

    HashMap қарсы TreeMap қарсы Хэштабельге қарсы 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

    Java әзірлеушілері жиі жіберетін 10 қате – 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 жолын жасау бөлімін оқыңыз. .

Болашақ жоспарлар. Бұл тізім GitHub сайтындағы ашық бастапқы жобалардың үлкен санын, Stack Overflow сұрақтарын және Google-дағы танымал сұрауларды талдауыма негізделген. Мен олардың шын мәнінде ең күрделі он қателіктердің қатарына кіретінін дәлелдеймін деп ойламаймын, бірақ олар өте жиі кездеседі.
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION