JavaRush /Java-Blog /Random-DE /10 Fehler, die Java-Entwickler oft machen
theGrass
Level 24
Саратов

10 Fehler, die Java-Entwickler oft machen

Veröffentlicht in der Gruppe Random-DE
10 Fehler, die Java-Entwickler häufig machen - 1
Diese Liste enthält 10 Fehler, die Java- Entwickler häufig machen.
  1. Konvertieren eines Arrays in eine ArrayList .

    Um ein Array in eine ArrayList zu konvertieren , verwenden Entwickler häufig diese Methode:

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

    Arrays.asList()gibt ein Klassenobjekt zurück ArrayList, das eine interne private statische Klasse (private static class)der Klasse ist Arrays, und dies ist keine Klasse . java.util.ArrayList.Die Klasse java.util.Arrays.ArrayListenthält Methoden set(),,, aber keine Methoden zum Hinzufügen von Elementen, ihre Größe ist fest . Um ein echtes zu erstellen , gehen Sie wie folgt vor:get()contains()java.util.ArrayList

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

    Ein Klassenkonstruktor java.util.ArrayListkann als Parameter alle Objekte übernehmen, die eine Schnittstelle implementieren Collection, deren Implementierung von der Klasse geerbt wirdjava.util.Arrays.ArrayList

    (private statische Klasse ArrayList<E> erweitert AbstractList<E> implementiert RandomAccess, java.io.Serializable).

  2. Überprüfen eines Arrays auf einen bestimmten Wert.

    Entwickler machen oft Folgendes:

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

    Der Code funktioniert, es ist jedoch keine Konvertierung Listerforderlich Set. Die Konvertierung in Setwird zusätzliche Zeit in Anspruch nehmen. Eigentlich ist alles einfach:

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

    oder

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

    Die erste Methode ist viel kürzer.

  3. Entfernen eines Elements aus Listeiner Schleife

    Betrachten Sie den folgenden Code, der Elemente in einer Schleife entfernt:

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

    Abschluss:

    [b, d]

    Dies stellt sich als schwerwiegender Fehler heraus. Wenn ein Element entfernt wird, Listverringert sich die Größe und die Elementindizes ändern sich.

    Vermeiden Sie diese Methode also, wenn Sie mehrere Elemente in einer Schleife mithilfe eines Index entfernen möchten.

    Sie wissen vielleicht, dass die Verwendung eines Iterators die richtige Lösung zum Entfernen von Elementen in einer Schleife ist, und Sie wissen, dass eine Stilschleife for-eachwie ein Iterator funktioniert, aber das ist nicht der Fall.

    Betrachten Sie den folgenden Code:

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

    Wir erhalten eine ConcurrentModificationException .

    Das Richtige ist:

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

    Die Methode next()muss vor dem aufgerufen werden remove().

    In einem Schleifenstil for-eachruft der Compiler die Methode auf remove(), und zwar nur dann next(), was einen Fehler auslöst ConcurrentModificationException. Sie können sich den Code ansehen ArrayList.iterator().

  4. Hashtablegegen HashMap.

    Aufgrund der entsprechenden Implementierung ist Hashtable der Name der Datenstruktur.

    Aber in Java lautet der Name für eine Datenstruktur HashMap. Einer der Hauptunterschiede zwischen Hashtableund HashMapbesteht darin, dass es Hashtablesynchronisiert ist. Daher sollte es nicht verwendet werden, Hashtablewo HashMap.

    HashMap vs. TreeMap vs. Hashtable vs. LinkedHashMap .

    10 grundlegende Fragen zur Kartenoberfläche

  5. Nutzen Sie Sammlungen ohne Inhaltseinschränkungen

    В 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. Так проще получить Bedeutung поля напрямую. Правильнее использовать Wie можно более ограниченный доступ к членам класса.

    public, default, protected, and private.

  7. ArrayList против LinkedList

    Когда разработчики не знают чем отличается ArrayList от LinkedList, они используют первый в силу его большей известности. Однако, есть огромная разница в производительности между ними. На самом деле, выбор между ними должен быть продиктован их внутренними особенностями — ArrayList позволяет быстро производить доступ к произвольному элементу массива, а LinkedList — быстро добавлять/удалять элементы в массиве. Почитайте статью по ссылке ArrayList vs. LinkedList чтобы понять причины их разной производительности.

  8. Mutable (Изменяемый) против Immutable (Неизменяемый)

    Неизменяемый ein Objekt имеет много преимуществ: простота, безопасность и т.д. Но он требует отдельного ein Objektа для каждого нового значения, и за слишком большое количество ein Objektов придется заплатить понижением производительности. Должен быть баланс при выборе между изменяемым и неизменяемым обьектом.

    В основном чтобы избежать подготовки промежуточных ein Objektов используется изменяемый ein Objekt. Один из классических примеров это конкатенация большого количества строк. Если вы используете неизменяемый ein Objekt типа String, то вы создаете много ein Objektов, которые сразу попадут в сборщик мусора. Это тратит время и энергию процессора, поэтому правильное решение это использование изменяемых обьектов (например StringBuilder).

    String result="";
    for(String s: arr){
    	result = result + s;
    }

    Еще один пример использования изменяемых ein Objektов — передача такого ein Objektа в метод. Это позволит вернуть результат в нем же, без создания лишних ein Objektов. При работе с ein Objektами большого размера, к примеру коллекциями, передача коллекции в метод для сортировки и возвращение результата в другой коллекции приводит к совершенно излишнему расходу ресурсов. (Ответ пользователя dasblinkenlight на Stack Overflow).

    Почему ein Objekt класса String неизменяем?

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

    10 Fehler, die Java-Entwickler häufig machen - 2

    Dieser Kompilierungsfehler wird dadurch verursacht, dass für die Vorgängerklasse kein Standardkonstruktor definiert ist. Sofern Sie in Java nicht selbst einen Klassenkonstruktor angeben, erstellt der Compiler einen Standardkonstruktor, der keine Argumente erfordert. Wenn der Konstruktor in der Klasse Superals beschrieben wird Super(String s){}, fügt der Compiler selbst nichts hinzu. Das sehen wir in unserem Beispiel.

    Der Konstruktor der Klasse Sub, egal welcher, ruft den Standardkonstruktor der Klasse auf Super, da nichts anderes angegeben ist. Da es in der Klasse keinen Standardkonstruktor gibt Super, führt dies zu einem Kompilierungsfehler.

    Die erste Lösung für dieses Problem besteht darin, der Klasse einen Standardkonstruktor hinzuzufügenSuper

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

    Die zweite Möglichkeit besteht darin, den von uns beschriebenen Konstruktor aus der Klasse zu entfernen, Supersodass der Compiler einen Standardkonstruktor erstellt.

    super(value)Und die letzte Option besteht darin, den Klassenkonstruktoren einen Aufruf hinzuzufügen, Subsodass der vorhandene Klassenkonstruktor anstelle des Standardkonstruktors aufgerufen wirdSuper

    Konstrukteur von Super und Sub

  10. " " oder Konstruktor?

    Es gibt zwei Möglichkeiten, eine Zeichenfolge zu erstellen:

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

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

    Was ist der Unterschied zwischen ihnen?

    Sie können dies anhand der folgenden Beispiele verstehen:

    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

    Um mehr darüber zu erfahren, wie Zeichenfolgen im Speicher gespeichert werden, lesen Sie Java-Zeichenfolge mit „“ oder Konstruktor erstellen? .

Zukunftspläne. Diese Liste basiert auf meiner Analyse einer großen Anzahl von Open-Source-Projekten von GitHub, Fragen von Stack Overflow und beliebten Suchanfragen bei Google. Ich erhebe nicht den Anspruch zu beweisen, dass sie wirklich zu den zehn schwerwiegendsten Fehlern gehören, aber sie kommen tatsächlich sehr häufig vor.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION