JavaRush /Java блогу /Random-KY /Java иштеп чыгуучулары көп кетирген 10 ката
theGrass
Деңгээл
Саратов

Java иштеп чыгуучулары көп кетирген 10 ката

Группада жарыяланган
Java иштеп чыгуучулары көп кетирген 10 ката - 1
Бул тизме Java иштеп чыгуучулары көп кетирген 10 катаны камтыйт .
  1. Массивди ArrayListке айландыруу .

    Массивди ArrayListке айландыруу үчүн , иштеп чыгуучулар көбүнчө бул ыкманы колдонушат:

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

    Arrays.asList()класстын ArrayListички жеке статикалык классы болгон класс an objectисин кайтарат жана бул класс эмес Класста , , ыкмалары бар , бирок элементтерди кошуу үчүн эч кандай методдор жок, анын өлчөмү белгиленген . Чыныгы түзүү үчүн , муну жасаңыз:(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().

    Цикл стorнде for-eachкомпилятор методду чакырат remove(), андан кийин гана next()ката кетирет ConcurrentModificationException. Сиз codeду карасаңыз болот ArrayList.iterator().

  4. Hashtableкаршы HashMap.

    Тиешелүү ишке ашыруудан улам, Hashtable маалымат структурасынын аталышы.

    Бирок Javaда маалымат структурасынын аталышы HashMap. Hashtableжана ортосундагы негизги айырмачылыктардын бири синхрондоштуруу HashMapболуп саналат . Ошондуктан аны кайда Hashtableколдонбоо керек .HashtableHashMap

    HashMap vs. TreeMap vs. Hashtable 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

    Java иштеп чыгуучулар көп кетирген 10 ката - 2

    Бул компиляция катасы ата-баба классында аныкталган демейки конструктордун жоктугунан келип чыгат. Javaда класстын конструкторун өзүңүз көрсөтпөсөңүз, компилятор аргументтерди талап кылбаган демейки конструкторду түзөт . Эгерде конструктор класста Superкатары сүрөттөлсө Super(String s){}, компилятордун өзү эч нерсе кошпойт. Бул биздин мисалдан көрүп турган нерсе.

    Класстын конструктору Sub, кайсынысы болбосун, класстын демейки конструкторун чакырат Super, анткени башка эч нерсе көрсөтүлгөн эмес. Класста демейки конструктор жок болгондуктан Super, бул компиляция катасына алып келет.

    Бул маселенин биринчи чечими класска демейки конструкторду кошуу болуп саналатSuper

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

    Экинчи вариант - биз сүрөттөгөн конструкторду класстан алып салуу Super, андыктан компилятор демейки конструкторду түзөт.

    super(value)Жана акыркы вариант - класстын конструкторлоруна чакыруу кошуу, Subандыктан демейки конструктордун ордуна учурдагы класс конструктору чакырылат.Super

    Super and 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