JavaRush /Blog Jawa /Random-JV /10 Kesalahan sing Sering Digawe dening Pangembang Jawa
theGrass
tingkat
Саратов

10 Kesalahan sing Sering Digawe dening Pangembang Jawa

Diterbitake ing grup
10 kesalahan sing asring ditindakake dening pangembang Java - 1
Dhaptar iki kalebu 10 kesalahan sing asring ditindakake dening pangembang Jawa .
  1. Ngonversi array menyang ArrayList .

    Kanggo ngowahi array menyang ArrayList , pangembang kerep nggunakake cara iki:

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

    Arrays.asList()bakal bali obyek kelas ArrayListkang kelas statis pribadi internal (private static class)saka kelas Arrays, lan iki ora kelas java.util.ArrayList.Kelas java.util.Arrays.ArrayListngandhut cara set(), get(), contains(), nanging ora ngemot sembarang cara kanggo nambah unsur, ukuran tetep . Kanggo nggawe sing nyata java.util.ArrayList, tindakake iki:

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

    Konstruktor kelas java.util.ArrayListbisa njupuk minangka parameter kabeh obyek sing ngleksanakake antarmuka Collection, implementasine sing diwarisake dening kelas.java.util.Arrays.ArrayList

    (kelas statis pribadi ArrayList<E> ngluwihi AbstractList<E> ngleksanakake RandomAccess, java.io.Serializable).

  2. Priksa array kanggo nilai tartamtu.

    Pangembang asring nindakake iki:

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

    Kode kasebut bisa digunakake, nanging ora perlu diowahi Listdadi Set. Ngonversi menyang Setbakal njupuk wektu tambahan. Ing kasunyatan, kabeh iku prasaja:

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

    utawa

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

    Cara pisanan luwih cendhek.

  3. Mbusak unsur saka Listing daur ulang

    Coba kode ing ngisor iki sing mbusak unsur ing daur ulang:

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

    Kesimpulan:

    
    [b, d]

    Iki dadi kesalahan serius. Nalika unsur dibusak, ukuran Listsuda lan indeks unsur diganti.

    Supaya supaya cara iki yen sampeyan pengin mbusak sawetara unsur ing daur ulang nggunakake indeks.

    Sampeyan bisa uga ngerti sing nggunakake iterator solusi sing bener kanggo njabut unsur ing daur ulang, lan ngerti sing daur ulang gaya for-eachdianggo kaya iterator, nanging ora.

    Coba kode ing ngisor iki:

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

    Kita bakal nampa ConcurrentModificationException .

    Sing bener yaiku:

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

    Cara kasebut next()kudu diarani sadurunge remove().

    Ing gaya daur ulang for-each, kompiler bakal nelpon metode remove(), lan mung banjur next(), sing bakal nyebabake kesalahan ConcurrentModificationException. Sampeyan bisa ndeleng kode kasebut ArrayList.iterator().

  4. Hashtablenglawan HashMap.

    Amarga implementasine sing cocog, Hashtable minangka jeneng struktur data.

    Nanging ing basa Jawa jenenge struktur data yaiku HashMap. Salah sawijining prabédan utama ing antarane Hashtableyaiku HashMapsinkronisasi Hashtable, mula ora bisa digunakake Hashtableing ngendi HashMap.

    HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap .

    10 pitakonan dhasar babagan antarmuka Peta

  5. Gunakake koleksi tanpa watesan isi

    В 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 kesalahan sing asring ditindakake dening pangembang Java - 2

    Kesalahan kompilasi iki disebabake amarga kelas leluhur ora duwe konstruktor standar sing ditetepake. Ing Jawa , kajaba sampeyan nemtokake konstruktor kelas dhewe, kompiler bakal nggawe konstruktor standar sing ora mbutuhake argumen. Yen konstruktor diterangake ing kelas Superminangka Super(String s){}, compiler dhewe ora nambah apa-apa. Iki sing kita deleng ing conto kita.

    Konstruktor kelas Sub, ora ketompo sing siji, bakal nelpon konstruktor standar kelas Super, amarga ora ana sing ditemtokake. Amarga ora ana konstruktor standar ing kelas Super, iki bakal nyebabake kesalahan kompilasi.

    Solusi pisanan kanggo masalah iki yaiku nambah konstruktor standar ing kelas kasebutSuper

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

    Opsi kapindho yaiku mbusak konstruktor sing diterangake saka kelas Supersupaya kompiler nggawe konstruktor standar.

    Lan pilihan pungkasan yaiku nambah panggilan super(value)menyang konstruktor kelas Subsupaya konstruktor kelas sing ana diarani tinimbang konstruktor standar.Super

    Konstruktor Super lan Sub

  10. "" utawa konstruktor?

    Ana rong cara kanggo nggawe string:

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

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

    Apa bedane antarane wong-wong mau?

    Sampeyan bisa ngerti iki saka conto ing ngisor iki:

    
    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

    Kanggo mangerteni sing luwih lengkap babagan carane strings disimpen ing memori, maca Nggawe Java String Nggunakake "" utawa Constructor? .

rencana mangsa. Dhaptar iki adhedhasar analisis babagan akeh proyek Open Source saka GitHub, pitakonan saka Stack Overflow, lan pitakon populer ing Google. Aku ora nganggep mbuktekake manawa dheweke ana ing antarane sepuluh kesalahan sing paling serius, nanging pancen umum banget.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION