JavaRush /Blog Java /Random-ES /Diez errores que suelen cometer los desarrolladores de Ja...
theGrass
Nivel 24
Саратов

Diez errores que suelen cometer los desarrolladores de Java

Publicado en el grupo Random-ES
10 errores que suelen cometer los desarrolladores de Java - 1
Esta lista incluye 10 errores que suelen cometer los desarrolladores de Java .
  1. Convertir una matriz en una ArrayList .

    Para convertir una matriz en ArrayList , los desarrolladores suelen utilizar este método:

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

    Arrays.asList()devolverá un objeto de clase ArrayListque es una clase estática privada interna (private static class)de la clase Arrays, y esta no es una clase . java.util.ArrayList.La clase java.util.Arrays.ArrayListcontiene métodos set(), pero no contiene ningún método para agregar elementos, su tamaño es fijo . Para crear uno real , haga esto:get()contains()java.util.ArrayList

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

    Un constructor de clase java.util.ArrayListpuede tomar como parámetro todos los objetos que implementan una interfaz Collection, cuya implementación es heredada por la clase.java.util.Arrays.ArrayList

    (La clase estática privada ArrayList<E> extiende AbstractList<E> implementa RandomAccess, java.io.Serializable).

  2. Comprobando una matriz para un valor específico.

    Los desarrolladores suelen hacer esto:

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

    El código funciona, pero no es necesario convertirlo Lista Set. La conversión a Setllevará más tiempo. De hecho, todo es sencillo:

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

    o

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

    El primer método es mucho más corto.

  3. Eliminar un elemento de Listun bucle

    Considere el siguiente código que elimina elementos en un bucle:

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

    Conclusión:

    [b, d]

    Esto resulta ser un grave error. Cuando se elimina un elemento, el tamaño Listse reduce y los índices del elemento cambian.

    Evite este método si desea eliminar varios elementos en un bucle utilizando un índice.

    Es posible que sepa que usar un iterador es la solución correcta para eliminar elementos en un bucle y que un bucle de estilo for-eachfunciona como un iterador, pero no es así.

    Considere el siguiente código:

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

    Recibiremos una excepción ConcurrentModificationException .

    Lo correcto es:

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

    El método next()debe llamarse antes del remove().

    En un estilo de bucle for-each, el compilador llamará al método remove(), y sólo entonces next(), lo que generará un error ConcurrentModificationException. Puedes mirar el código ArrayList.iterator().

  4. Hashtablecontra HashMap.

    Debido a la implementación correspondiente, Hashtable es el nombre de la estructura de datos.

    Pero en Java el nombre de una estructura de datos es HashMap. Una de las diferencias clave entre Hashtabley HashMapes que está Hashtablesincronizado, por lo que no debe usarse Hashtabledonde HashMap.

    HashMap vs. Mapa de árbol vs. Tabla hash vs. LinkedHashMap .

    10 preguntas básicas sobre la interfaz del Mapa

  5. Utilice colecciones sin restricciones de contenido

    В Java часто путают коллекции без ограничений по содержимому, и коллекции с маской по типу содержимого. К примеру, для множеств - Set это коллекция без ограничений по содержимому, а Set<?> — коллекция у которой все-таки есть ограничения, но эти ограничения ничего на самом деле не ограничивают. Рассмотрим следующий código, где 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);
    }

    Данный código выбросит исключение:

    Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
    	at …

    Использование коллекций без ограничений по содержимому очень опасно, потому что вы не можете быть уверенными в том что там лежит внутри. А для того чтобы понять всю глубину разницы между Set, Set<?> и Set<Object> — почитайте вот эту и эту ссылки.

  6. Уровень доступа

    Очень часто для полей класса разработчики используют модификатор доступа public. Так проще получить significado поля напрямую. Правильнее использовать Cómo можно более ограниченный доступ к членам класса.

    public, default, protected, and private.

  7. ArrayList против LinkedList

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

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

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

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

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

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

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

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

    10 errores que suelen cometer los desarrolladores de Java - 2

    Este error de compilación se debe al hecho de que la clase ancestral no tiene definido un constructor predeterminado. En Java , a menos que usted mismo especifique un constructor de clase, el compilador creará un constructor predeterminado que no requiere argumentos. Si el constructor se describe en la clase Supercomo Super(String s){}, el compilador en sí no agregará nada. Esto es lo que vemos en nuestro ejemplo.

    El constructor de la clase Sub, no importa cuál, llamará al constructor predeterminado de la clase Super, ya que no se especifica nada más. Dado que no hay un constructor predeterminado en la clase Super, esto provocará un error de compilación.

    La primera solución a este problema es agregar un constructor predeterminado a la clase.Super

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

    La segunda opción es eliminar el constructor que describimos de la clase Superpara que el compilador cree un constructor predeterminado.

    Y la última opción es agregar una llamada super(value)a los constructores de clases Subpara que se llame al constructor de clases existente en lugar del constructor predeterminado.Super

    Constructor de Super y Sub

  10. " " o constructor?

    Hay dos formas de crear una cadena:

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

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

    ¿Cuál es la diferencia entre ellos?

    Puedes entender esto a partir de los siguientes ejemplos:

    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

    Para obtener más información sobre cómo se almacenan las cadenas en la memoria, lea ¿ Crear una cadena Java usando "" o Constructor? .

Planes futuros. Esta lista se basa en mi análisis de una gran cantidad de proyectos de código abierto de GitHub, preguntas de Stack Overflow y consultas populares en Google. No pretendo demostrar que realmente estén entre los diez errores más graves, pero en realidad son muy comunes.
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION