JavaRush /Java Blog /Random-TL /10 Mga Pagkakamali na Madalas Nagagawa ng Mga Nag-develop...
theGrass
Antas
Саратов

10 Mga Pagkakamali na Madalas Nagagawa ng Mga Nag-develop ng Java

Nai-publish sa grupo
10 pagkakamali na madalas gawin ng mga developer ng Java - 1
Kasama sa listahang ito ang 10 pagkakamali na kadalasang ginagawa ng mga developer ng Java .
  1. Pag-convert ng isang array sa isang ArrayList .

    Upang i-convert ang isang array sa isang ArrayList , kadalasang ginagamit ng mga developer ang paraang ito:

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

    Arrays.asList()ay magbabalik ng class object ArrayListna isang panloob na pribadong static na klase (private static class)ng klase Arrays, at ito ay hindi isang klase java.util.ArrayList.Ang klase java.util.Arrays.ArrayListay naglalaman ng mga pamamaraan set(), get(), contains(), ngunit hindi naglalaman ng anumang mga pamamaraan para sa pagdaragdag ng mga elemento, ang laki nito ay naayos na . Upang lumikha ng isang tunay java.util.ArrayList, gawin ito:

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

    Maaaring kunin ng isang tagabuo ng klase java.util.ArrayListbilang isang parameter ang lahat ng mga bagay na nagpapatupad ng isang interface Collection, ang pagpapatupad nito ay minana ng klasejava.util.Arrays.ArrayList

    (Ang pribadong static na klase na ArrayList<E> ay nagpapalawak ng AbstractList<E> na nagpapatupad ng RandomAccess, java.io.Serializable).

  2. Sinusuri ang isang array para sa isang partikular na halaga.

    Madalas itong ginagawa ng mga developer:

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

    Gumagana ang code, ngunit hindi na kailangang i-convert ito Listsa Set. Ang pag-convert sa Setay magtatagal ng karagdagang oras. Sa katunayan, ang lahat ay simple:

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

    o

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

    Ang unang paraan ay mas maikli.

  3. Pag-alis ng isang elemento mula Listsa isang loop

    Isaalang-alang ang sumusunod na code na nag-aalis ng mga elemento sa isang loop:

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

    Konklusyon:

    [b, d]

    Ito ay lumalabas na isang malubhang pagkakamali. Kapag inalis ang isang elemento, Listmababawasan ang laki at nagbabago ang mga indeks ng elemento.

    Kaya iwasan ang pamamaraang ito kung gusto mong mag-alis ng maraming elemento sa isang loop gamit ang isang index.

    Maaaring alam mo na ang paggamit ng isang iterator ay ang tamang solusyon para sa pag-alis ng mga elemento sa isang loop, at alam mo na ang isang style loop for-eachay gumagana tulad ng isang iterator, ngunit ito ay hindi.

    Isaalang-alang ang sumusunod na code:

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

    Makakatanggap kami ng ConcurrentModificationException .

    Ang tamang gawin ay:

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

    Ang pamamaraan next()ay dapat na tawagan bago ang remove().

    Sa isang loop style for-each, ang tagatala ay tatawag sa pamamaraan remove(), at pagkatapos lamang next(), na kung saan ay magtataas ng isang error ConcurrentModificationException. Maaari mong tingnan ang code ArrayList.iterator().

  4. Hashtablelaban sa HashMap.

    Dahil sa kaukulang pagpapatupad, Hashtable ang pangalan ng istraktura ng data.

    Ngunit sa Java ang pangalan para sa isang istraktura ng data ay HashMap. Isa sa mga pangunahing pagkakaiba sa pagitan Hashtableng at HashMapay na ito ay Hashtablenaka-synchronize. Kaya hindi ito dapat gamitin Hashtablekung saan HashMap.

    HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap .

    10 pangunahing tanong tungkol sa interface ng Map

  5. Gumamit ng mga koleksyon nang walang mga paghihigpit sa nilalaman

    В 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

    10 pagkakamali na madalas gawin ng mga developer ng Java - 2

    Ang error sa compilation na ito ay sanhi ng katotohanan na ang ancestor class ay walang default na constructor na tinukoy. Sa Java , maliban kung ikaw mismo ang tumukoy ng class constructor, gagawa ang compiler ng default na constructor na hindi nangangailangan ng mga argumento. Kung ang constructor ay inilarawan sa klase Superbilang Super(String s){}, ang compiler mismo ay hindi magdadagdag ng kahit ano. Ito ang nakikita natin sa ating halimbawa.

    Ang constructor ng class Sub, kahit alin, ay tatawag sa default na constructor ng class Super, dahil wala nang iba pang tinukoy. Dahil walang default na constructor sa class Super, hahantong ito sa isang error sa compilation.

    Ang unang solusyon sa problemang ito ay ang magdagdag ng default na tagabuo sa klaseSuper

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

    Ang pangalawang opsyon ay alisin ang constructor na inilarawan namin mula sa klase Superupang ang compiler ay lumikha ng default na constructor.

    At ang huling pagpipilian ay magdagdag ng isang tawag super(value)sa mga konstruktor ng klase Subupang ang umiiral na tagabuo ng klase ay tinawag sa halip na ang default na tagabuoSuper

    Constructor ng Super at Sub

  10. " " o tagabuo?

    Mayroong dalawang paraan upang lumikha ng isang string:

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

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

    Ano ang pagkakaiba sa pagitan nila?

    Maiintindihan mo ito mula sa mga sumusunod na halimbawa:

    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

    Upang matuto nang higit pa tungkol sa kung paano iniimbak ang mga string sa memorya, basahin ang Lumikha ng Java String Gamit ang "" o Constructor? .

Mga plano sa hinaharap. Ang listahang ito ay batay sa aking pagsusuri sa isang malaking bilang ng mga Open Source na proyekto mula sa GitHub, mga tanong mula sa Stack Overflow, at mga sikat na query sa Google. Hindi ko ipinapalagay na patunayan na sila ay talagang kabilang sa sampung pinakamalubhang pagkakamali, ngunit ang mga ito ay talagang karaniwan.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION