JavaRush /Blog Java /Random-ES /Análisis de preguntas y respuestas de entrevistas para de...

Análisis de preguntas y respuestas de entrevistas para desarrollador Java. parte 8

Publicado en el grupo Random-ES
¿Práctica o teoría? ¿Qué es más importante? Muchos dirán que, por supuesto, la práctica es más importante. Por ejemplo, practica tan duro como puedas y serás feliz. Me atrevo a no estar de acuerdo con esto. Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 1Durante las entrevistas, nadie sabrá qué tan bueno eres en la práctica. Se le preguntará detalladamente exactamente según la teoría. Y sólo entonces, cuando pases por todas las rondas de entrevistas y entres en el proyecto, podrás utilizar tus habilidades prácticas. Quizás objetes: a veces te dan una tarea de prueba y aún necesitas práctica. No discuto, a veces se dan, pero lo cierto es que A VECES, pero SIEMPRE se realiza una entrevista teórica. ¿Sientes la diferencia? Por tanto, es necesario tener bajo sus pies una base teórica sólida, que hoy seguiremos fortaleciendo. Es decir, continuaremos analizando las preguntas que se hacen a menudo durante las entrevistas.

71. ¿Qué sucede si no anulamos el método toString() para Enum?

Digamos que tenemos la siguiente enumeración :
public enum Role {
   STUDENT,
   TEACHER,
   DIRECTOR,
   SECURITY_GUARD;
}
Mostremos al estudiante en la consola llamando a toString() sobre él :
System.out.println(Role.STUDENT.toString());
Resultado en la consola:
ALUMNO
Es decir, de forma predeterminada, toString() para enum es el nombre de la constante misma.

72. ¿Es posible especificar un constructor dentro de un Enum?

Si seguro. Es a través del constructor que se establecen los valores de las variables de enumeración internas. Como ejemplo, agreguemos dos campos a la enumeración anterior ( ageFrom y ageTo ) para indicar el rango de edad para cada rol:
public enum Role {
   STUDENT(5,18),
   TEACHER(20,60),
   DIRECTOR(40,70),
   SECURITY_GUARD(18,50);

   int ageFrom;
   int ageTo;

   Role(int ageFrom, int ageTo) {
       this.ageFrom = ageFrom;
       this.ageTo = ageTo;
   }
}

73. ¿Cuál es la diferencia entre == e igual()?

Esta es una de las preguntas más comunes en las entrevistas para desarrolladores de Java. Comencemos con el hecho de que cuando comparamos valores simples ( int , char , double ...), lo hacemos usando == , ya que las variables contienen valores específicos y podemos compararlos. Y las variables primitivas no son objetos completos: no heredan de Object y no tienen un método igual () . Cuando hablamos de comparar variables que se refieren a objetos, == solo comparará el valor de las referencias, ya sea que se refieran al mismo objeto o no. E incluso si un objeto es idéntico a otro, la comparación mediante == dará un resultado negativo ( falso ), porque se trata de un objeto diferente. Como comprenderá, el método equals() se utiliza para comparar variables de referencia . Este es uno de los métodos estándar de la clase Objeto , que es necesario para una comparación completa de objetos. Pero vale la pena aclararlo de inmediato: para que este método funcione correctamente, es necesario redefinirlo escribiendo exactamente cómo se deben comparar los objetos de esta clase. A menos que anule el método, de forma predeterminada comparará objetos mediante == . En IntelliJ IDEA , puede anularlo automáticamente (usando las herramientas de IDEA) -> alt + insert , en la ventana que aparece, seleccione equals() y hashCode() -> seleccione qué campos de clase deben participar -> y listo, implementación automática de Los métodos están completos. A continuación se muestra un ejemplo de cómo se vería un método igual generado automáticamente para una clase Cat simple con dos campos: int age y String name :
@Override
public boolean equals(final Object o) {
   if (this == o) return true;
   if (o == null || this.getClass() != o.getClass()) return false;
   final Cat cat = (Cat) o;
   return this.age == cat.age &&
           Objects.equals(this.name, cat.name);
}
Si hablamos de la diferencia entre == e igual para enums , no hay mucho de eso. Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 2Después de todo, enum almacena constantes, e incluso al comparar valores similares usando == , obtendremos true , ya que las referencias siempre serán a los mismos objetos. Bueno, al usar iguales, también resolveremos la funcionalidad correctamente, especialmente si ingresas al cuerpo del método igual para un enum , verás que en la clase Enum la implementación del método es la siguiente: Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 3Es decir, adentro: ¡la vieja comparación por referencia! Para resumir: para enum , la comparación tanto a través de == como de igual a igual es correcta.Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 4

74. ¿Qué hace el método ordinal() en Enum?

Al llamar al método int ordinal() en un elemento enum , obtendremos el número ordinal a partir de cero de este valor en la serie general de enumeraciones. Usemos este método en un elemento de la enumeración anterior analizada : Rol :
System.out.println(Role.DIRECTOR.ordinal());
En consecuencia, la consola mostrará:
2

75. ¿Es posible utilizar Enum con TreeSet o TreeMap en Java?

El uso de tipos de enumeración en TreeSet y TreeMap es aceptable. Y podemos escribir:
TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
Y la consola mostrará:
ESTUDIANTE PROFESOR DIRECTOR GUARDIA_SEGURIDAD
Recibimos el resultado no en orden alfabético. El punto es que si usamos elementos enum para los valores de TreeSet o como claves para TreeMap , los elementos se ordenan en su orden natural (el orden en el que se especifican en el enum ). Comprender estas características nos ayuda a escribir un mejor código.Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 5

76. ¿Cómo se relacionan los métodos ordinal() y compareTo() en Enum?

Como se indicó anteriormente, ordinal() devuelve el número ordinal de un valor en una lista de enumeración general. Además, en el análisis de la pregunta anterior, viste que los elementos de las enumeraciones, una vez, por ejemplo, en un TreeSet (conjunto ordenado) toman el orden en que están declarados en enum . Y como sabemos, TreeSet y TreeMap clasifican elementos llamando a su método compareTo() de la interfaz Comparable . De esto podemos suponer que la clase Enum implementa la interfaz Comparable , implementándola en el método compareTo() , dentro del cual ordinal() se usa para establecer el orden de clasificación. Habiendo ingresado a la clase Enum , vemos la confirmación de esto: Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 6Y el cuerpo del método en sí: El Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 7método ordinal() no se llama aquí. En su lugar, se utiliza la variable ordinal : el número ordinal del elemento en la enumeración. El método ordinal() en sí no es Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 8más que un captador de la variable ordinal .

77. Escribe un ejemplo EnumM

En las preguntas discutidas anteriormente, ya di ejemplos de enumeraciones y no veo el sentido de duplicar el código (por ejemplo, la pregunta número 72 sobre el constructor en enum).

78. ¿Es posible utilizar Enum en una caja de interruptor?

¡Es posible y necesario! Mirando hacia atrás en mi práctica, observo que uno de los lugares más comunes para usar enum son construcciones lógicas como switch . En este caso, puede proporcionar todas las variaciones posibles de case y, después de escribir la lógica para todos los valores de enumeración , ¡puede que ni siquiera sea necesario usar el operador predeterminado ! Después de todo, si usa una cadena o un valor numérico, por ejemplo, de tipo int , puede recibir un valor inesperado, lo que a su vez es imposible usando una enumeración . ¿ Cómo se vería un interruptor en el ejemplo analizado anteriormente?
public void doSomething(Role role) {
   switch (role) {
       case STUDENT:
           // некая логика для STUDENT
           break;
       case TEACHER:
           // некая логика для TEACHER
           break;
       case DIRECTOR:
           // некая логика для DIRECTOR
           break;
       case SECURITY_GUARD:
           // некая логика для SECURITY_GUARD
           break;
   }
}

79. ¿Cómo obtener todos los valores disponibles en una instancia de Enum?

Si necesita obtener todas las instancias de una enumeración, existe un método de valores () que devuelve una matriz de todos los valores disponibles de una enumeración particular en orden natural (en el orden en que se especificaron en la enumeración ). Ejemplo:
Role[] roles = Role.values();
for (Role role : roles) {
   System.out.println(role);
}
La consola mostrará el siguiente resultado:
ESTUDIANTE PROFESOR DIRECTOR GUARDIA_SEGURIDAD

API de transmisión

80.¿Qué es Stream en Java?

Java Stream es una forma relativamente nueva de interactuar con un flujo de datos, que a su vez le permite procesar datos grandes de manera más conveniente y compacta, así como paralelizar el procesamiento de datos entre una cierta cantidad de subprocesos, lo que puede aumentar el rendimiento en el uso. funcionalidad. Este tema no se puede discutir más profundamente en pocas palabras, por lo que dejaré aquí un enlace a un artículo que puede ayudarlo a profundizar en este tema.Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 9

81. ¿Cuáles son las principales propiedades de las transacciones?

El tema se llama Stream API, pero la pregunta es sobre la transacción. Hmm... Primero, averigüemos qué es una transacción. Una transacción es un grupo de operaciones secuenciales de una base de datos que representa una unidad lógica de trabajo con datos. Una transacción se puede completar completa y exitosamente, manteniendo la integridad de los datos e independientemente de otras transacciones que se ejecuten en paralelo, o no se puede completar en absoluto, en cuyo caso no tiene ningún efecto. Entonces, las transacciones tienen cuatro propiedades principales, que se denominan abreviadamente ACID . Veamos cómo significa cada letra de esta abreviatura: A - Atomicidad - atomicidad - esta propiedad garantiza que ninguna transacción quedará parcialmente registrada en el sistema. O se realizarán todas sus suboperaciones o no se realizará ninguna ( todo o nada ). C - Coherencia: la coherencia es una propiedad que garantiza que cada transacción exitosa registre solo resultados válidos. Es decir, esta es una garantía de que, en caso de una transacción exitosa, se cumplirán todas las reglas y restricciones que el sistema impone a datos específicos; de lo contrario, la transacción no se completará y los datos en el sistema volverán a su estado anterior. estado. I - Aislamiento - el aislamiento es una propiedad que dice que durante la ejecución de una transacción, las transacciones paralelas no deberían afectar su resultado. Esta propiedad requiere muchos recursos, por lo que normalmente se implementa en parte permitiendo ciertos niveles de aislamiento que resuelven ciertos problemas de aislamiento. Discutiremos esto con más detalle en la siguiente pregunta. Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 10D - Durabilidad - esta propiedad asegura que si el usuario ha recibido confirmación del sistema de que la transacción se ha completado, puede estar seguro de que los cambios que ha realizado no serán cancelados debido a alguna falla. Es decir, puedes estar seguro de que algún tipo de fallo del sistema operativo no afectará nada a tus datos si ya has recibido la confirmación de la finalización exitosa de tu transacción.

82. ¿Cuáles son los niveles de aislamiento de transacciones?

Como dije antes, proporcionar aislamiento ACID es un proceso que requiere muchos recursos. Por tanto, esta propiedad se cumple parcialmente. Hay diferentes niveles de aislamiento y cuanto mayor sea el nivel, mayor será el impacto en la productividad. Antes de pasar a los niveles de aislamiento de transacciones, debemos analizar los diversos problemas de aislamiento de transacciones insuficiente :
  • lectura fantasma : cuando se llama repetidamente a la misma muestra (la misma consulta) dentro de la misma transacción, los datos recibidos difieren, lo que ocurre debido a las inserciones de datos por parte de otra transacción;

  • lectura no repetitiva : cuando se llama repetidamente a la misma muestra (la misma consulta) dentro de la misma transacción, los datos recibidos difieren, lo que ocurre debido a cambios (actualizaciones) y eliminaciones de datos por parte de otra transacción;

  • lectura sucia : el proceso de lectura de datos agregados o modificados por una transacción que posteriormente no se confirma (revierte), es decir, leer datos no válidos;

  • Actualización perdida : cuando diferentes transacciones cambian los mismos datos al mismo tiempo, todos los cambios excepto el último se pierden (que recuerda al problema de la "condición de carrera" en un entorno de subprocesos múltiples).

Los niveles de aislamiento de transacciones se caracterizan por los problemas de aislamiento contra los que protegen. Consideremos en forma de tabla los niveles de aislamiento y de qué problemas protegen:
Nivel de aislamiento lectura fantasma Lectura no repetitiva lectura sucia Actualización perdida
SERIALIZABLE + + + +
LECTURA REPETIBLE - + + +
LEER COMPROMETIDO - - + +
LEER SIN COMPROMISO - - - +
NINGUNO - - - -
Y no olvide la otra cara de la moneda: cuanto mayor sea el nivel de aislamiento, más tardarán en procesarse las transacciones (si se ejecutan varias transacciones en paralelo). Si desea profundizar en este tema, aquí tiene un excelente artículo para comenzar.

83. ¿Cuál es la diferencia entre Declaración y Declaración Preparada?

Y aquí no hay una transición muy fluida a las características de la tecnología JDBC . Entonces, primero, averigüemos qué es realmente la Declaración . Este es un objeto que se utiliza para generar consultas SQL. JDBC utiliza tres tipos : Statement , PreparedStatement y CallableStatement . No veremos CallableStatement hoy: hablemos de la diferencia entre Statement y PreparedStatement .
  1. La declaración se utiliza para ejecutar consultas SQL simples sin parámetros entrantes insertados dinámicamente. PrepareStatement se utiliza con la capacidad de insertar dinámicamente parámetros de entrada.

  2. Para establecer parámetros en PreparedStatement, los parámetros de entrada en la solicitud se escriben como signos de interrogación, para luego insertar algún valor en lugar de ellos usando varios establecedores, como setDouble() , setFloat() , setInt() , setTime() .. .. Como resultado, no insertará el tipo de datos incorrecto en su consulta.

  3. PreparedStatement está "precompilado" y utiliza almacenamiento en caché, por lo que su ejecución puede ser un poco más rápida que consultar desde objetos Statement . Como resultado, las consultas SQL que se ejecutan con frecuencia se escriben como objetos PreparedStatement para mejorar el rendimiento .

  4. La declaración es vulnerable a las inyecciones de SQL, mientras que PreparedStatement las previene. Lea más sobre la eliminación de inyecciones SQL y otras mejores prácticas en seguridad de Java en este artículo .

Si está comenzando a estudiar la tecnología para conectar una aplicación Java a una base de datos (JDBC), le aconsejo que comience con este artículo . Bueno, en este punto nos detendremos hoy.Análisis de preguntas y respuestas de entrevistas para desarrollador Java.  Parte 8 - 11
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION