CodeGym /Blog Java /Random-ES /Explorando preguntas y respuestas de una entrevista de tr...
John Squirrels
Nivel 41
San Francisco

Explorando preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java. Parte 6

Publicado en el grupo Random-ES
¡Hola Mundo! Es fundamental para cualquier desarrollador no dejar nunca de crecer. Después de todo, si deja de hacerlo, corre el riesgo de perder la demanda y quedar completamente fuera del mercado laboral. El mundo de la TI evoluciona y avanza constantemente; usted debe avanzar con él. Pero al mismo tiempo, no siempre se pueden utilizar las últimas tecnologías para no olvidarse de los "clásicos" (temas clásicos de desarrollo de software). Hoy quiero continuar mi discusión sobre "temas clásicos" para desarrolladores de Java. Explorando preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 6 - 1Señalaré que mis respuestas no son la última palabra. Son sólo mi opinión sobre las respuestas correctas; es posible que usted no esté de acuerdo con algunas de ellas. Eso está bien, así que no dudes en compartir tu opinión en los comentarios. Puede encontrar enlaces a las partes anteriores de la revisión al final del artículo. Explorando preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 6 - 2

Bibliotecas y estándares

52. ¿Qué es Hibernar? ¿Cuál es la diferencia entre JPA e Hibernate?

Para responder a esta pregunta, creo que primero debemos entender qué es JPA. Es una especificación que describe un mapeo objeto-relacional de objetos Java simples y proporciona una API para almacenar, recuperar y manipular dichos objetos. Es decir, las bases de datos relacionales (DB) se representan como un conjunto de tablas interconectadas. Y JPA es un estándar ampliamente adoptado que describe cómo los objetos pueden interactuar con bases de datos relacionales. Como puedes ver, JPA es algo abstracto e intangible. Es como la idea misma, el enfoque. Explorando preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 6 - 3Pero Hibernate es una biblioteca específica que implementa paradigmas JPA. En otras palabras, puede utilizar esta biblioteca para trabajar con una base de datos relacional a través de objetos que representan datos en la base de datos (Entidad). Se dice que esta biblioteca está muy cerca de los ideales de JPA. Quizás por eso se hizo popular. Como puedes imaginar, su popularidad justificó un mayor desarrollo y mejoras. Además, el uso generalizado proviene de una vasta comunidad que ya ha explorado todas las preguntas posibles e imposibles relacionadas con esta herramienta. Hibernate ha sido estudiado exhaustivamente y resulta que es confiable. Hay una buena razón por la cual incluso la implementación JPA ideal en Spring generalmente usa Hibernate bajo el capó.

53. ¿Qué es la cascada? ¿Cómo se usa en Hibernate?

Como dije antes, la comunicación en Hibernate ocurre a través de objetos de datos llamados entidades. Estas entidades representan tablas específicas en la base de datos y, como recordará, las clases Java pueden contener referencias a otras clases. Estas relaciones también se reflejan en la base de datos. Como regla general, son claves externas (para relaciones OneToOne, OneToMany, ManyToOne) o tablas intermedias (para relaciones ManyToMany). Cuando su entidad tiene referencias a otras entidades relacionadas, se colocan anotaciones encima de estas referencias para indicar el tipo de relación: @OneToOne, @OneToMany, @ManyToOne, @ManyToMany. Puede especificar el tipo de cascada para esta relación en la propiedad de cascada de las anotaciones. JPA tiene métodos específicos para interactuar con entidades (persistir, guardar, fusionar...). Los tipos de cascada se utilizan para mostrar cómo deben comportarse los datos relacionados; Estos métodos se utilizan en una entidad de destino. Entonces, ¿cuáles son las estrategias en cascada (tipos de cascada)? El estándar JPA prevé el uso de seis tipos de cascada:
  • PERSIST : las operaciones de guardado se producen en cascada (para los métodos save() y persist() ). En otras palabras, si guardamos una entidad que está asociada con otras entidades, entonces esas entidades también se guardan en la base de datos (si aún no están allí)

  • FUSIONAR : las operaciones de actualización se producen en cascada (para el método merge() )

  • ELIMINAR : las operaciones de eliminación se producen en cascada ( método remove() )

  • TODOS : contiene tres operaciones en cascada a la vez: PERSISTIR , FUSIONAR , ELIMINAR

JPA tiene el concepto de entidad persistente: una entidad asociada con sus datos en la base de datos y controlada por la sesión (conexión) actual. Si lo cambia sin guardar los cambios en la base de datos, los datos de la entidad en la base de datos aún se cambiarán.
  • DETACH : las entidades relacionadas no son administradas por la sesión ( método detach() ). Es decir, cuando se modifican los datos de las entidades relacionadas, los datos de la base de datos no se actualizan automáticamente: se convierten de persistentes a separados (es decir, JPA no administra la entidad).

  • ACTUALIZAR : cada vez que una entidad se actualiza con datos de la base de datos ( actualizar() : actualiza los objetos separados), sus entidades relacionadas también se actualizan. Por ejemplo, de alguna manera cambió los datos tomados de la base de datos y desea restaurar los valores originales. En este caso, esta operación le resultará útil.

Explorando preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 6 - 4Hibernate admite todas estas operaciones en cascada estándar y también presenta tres propias:
  • REPLICAR : se usa cuando tenemos más de una fuente de datos y queremos que los datos se sincronicen (método de replicación de Hibernate). Todas las entidades deben tener identificadores (id) para garantizar que se puedan crear sin problemas (para garantizar que una misma entidad no tenga diferentes id para diferentes bases de datos)

  • SAVE_UPDATE : guardar/eliminar en cascada (para el método saveOrUpdate de Hibernate )

  • BLOQUEO : lo opuesto a la operación DETACHED : convierte una entidad separada nuevamente al estado persistente, es decir, la sesión actual rastreará la entidad una vez más

Si no se selecciona ningún tipo de cascada, una operación en la entidad no afectará a otras entidades asociadas con ella.

54. ¿Puede una clase de Entidad ser abstracta?

Según 2.1 La clase de entidad de la especificación JPA , " Tanto las clases abstractas como las concretas pueden ser entidades ". Entonces, la respuesta es sí, una clase abstracta puede ser una entidad y puede marcarse con la anotación @Entity.

55. ¿Qué es un administrador de entidad? ¿De qué es responsable?

En primer lugar, me gustaría señalar que EntityManager es un componente crucial de JPA . Se utiliza para la interacción de las entidades con la base de datos. En general, los métodos para la interacción de la entidad con la base de datos se invocan en la entidad (persistir, fusionar, eliminar, separar)... Pero también observo que este componente no suele ser un singleton para toda la aplicación. A menudo es liviano, se elimina uno y se crea uno nuevo usando EntityManagerFactory . Si trazamos un paralelo con JDBC , donde EntityManagerFactory es análogo a DataSource , entonces EntityManager es análogo a Connection . Anteriormente mencioné que una entidad persistente es una entidad administrada por la conexión actual. Esta entidad es administrada por EntityManager , que está estrechamente relacionado con la conexión actual, y TransactionManager , que es responsable de abrir/cerrar transacciones. En la siguiente figura se puede ver el ciclo de vida de la entidad: Explorando preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 6 - 5El EntityManager administra la entidad cuando está en la etapa Administrada (cuando es persistente, ya que tiene conexión con el EntityManager ). Es decir, no es nuevo ni eliminado. Cuando una entidad es nueva o eliminada, podemos decir que también está desasociada, porque el EntityManager no la gestiona. Existen diferentes estrategias para el EntityManager . Puede tener un singleton de EntityManager para toda la aplicación o crear uno nuevo cada vez para cada conexión. Si está utilizando Spring, la creación/eliminación de EntityManager se administra automáticamente de forma interna (pero eso no significa que no pueda personalizarlo usted mismo ^^). Debo mencionar que uno o más EntityManagers forman un contexto de persistencia . Un contexto de persistencia es un entorno en el que instancias de entidades se sincronizan con entidades similares en la base de datos (como dije, esto solo funciona para entidades persistentes). Si profundiza en JPA (lo cual recomiendo encarecidamente), encontrará este concepto muy a menudo.

56. ¿Qué es la clase Assert? ¿Por qué se usa?

No he oído hablar de una clase de este tipo en JPA , por lo que asumiré que esta pregunta se refiere a una clase que se encuentra en la biblioteca JUnit y que se utiliza para pruebas unitarias. En esta biblioteca, la clase Assert se usa para verificar los resultados de la ejecución del código (aquí afirmar significa una afirmación de que tiene un estado/datos específicos en una ubicación específica del código). Por ejemplo, digamos que estás probando un método que se supone crea un gato. Ejecutas el método y obtienes algún resultado:
Cat resultOfTest = createCat();
Pero debes asegurarte de que se haya creado correctamente, ¿verdad? Por lo tanto, crea manualmente un gato específico ( esperadoCat ) con exactamente los parámetros que espera ver en el gato obtenido del método createCat() . Luego usas la clase Assert para verificar los resultados:
Assert.assertEquals(resultOfTest, expectedCat);
Si los gatos son diferentes, entonces se arrojará un AssertionError , que nos indica que no obtuvimos los resultados esperados. La clase Assert tiene muchos métodos diferentes que cubren una variedad de operaciones útiles para verificar los resultados esperados. Éstos son algunos de ellos:
  • afirmarTrue(<boolean>) — se espera que el valor pasado como argumento sea verdadero

  • afirmarFalse(<boolean>) — se espera que el valor pasado como argumento sea falso

  • afirmarNotEquals(<objeto1>, <objeto2>) — los objetos pasados ​​como argumentos deben ser diferentes cuando se comparan usando iguales ( falso )

  • afirmarThrows(<ClassNameOfException>.class, <exceptionObject>) — se espera que el segundo argumento sea una excepción lanzada por el primer argumento (es decir, el segundo argumento suele ser una llamada a un método que debería generar una excepción del tipo requerido)

Cadena

57. Describe la clase String de Java.

String es una clase estándar de Java responsable de almacenar y manipular valores de cadena (secuencias de caracteres). Es una clase inmutable (escribí sobre inmutable anteriormente aquí ), es decir, los datos de los objetos de esta clase no se pueden cambiar después de su creación. Me gustaría señalar de inmediato que las clases StringBuilder y StringBuffer son esencialmente idénticas; la única diferencia es que una de ellas está diseñada para usarse en un entorno multiproceso ( StringBuffer ). Estas clases son como String , pero se diferencian en que son mutables . Incluso después de crearlos, te permiten modificar las cadenas que representan, sin crear un nuevo objeto. Sus métodos difieren de los métodos String estándar y están diseñados para la manipulación de cadenas (hay una razón por la que lo llaman constructor).

58. ¿Cuáles son las formas de crear un objeto String? ¿Dónde se crea?

La forma más común de crear una cadena es especificar el valor que queremos entre comillas dobles simplemente:
String str = "Hello World!";
También puedes hacerlo explícitamente usando new :
String str = new String("Hello World!");
También puedes crear una cadena a partir de una serie de caracteres:
char[] charArr = {'H','e','l','l','o',' ', 'W','o','r','l','d','!'};
String str = new String(charArr);
Podemos hacerlo llamando al método toString en algún objeto:
String str = someObject.toString();
Podemos hacerlo llamando a cualquier otro método que devuelva una cadena. Ejemplo:
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = reader.readLine();
Entiendes que puede haber muchas, muchas formas de crear una cadena. Cuando se crea un objeto String , se almacena en un grupo de cadenas , que analizaremos con más detalle en una de las preguntas siguientes.

59. ¿Cómo se comparan dos cadenas de Java y cómo se ordenan?

Java utiliza un doble signo igual ( == ) para realizar comparaciones. Si necesitamos comparar valores simples como enteros, lo usaremos. Pero este método no es adecuado para comparar objetos completos. Sólo comparará referencias, es decir, si las referencias apuntan al mismo objeto o no. Esto significa que si comparamos dos objetos con los mismos valores de campo usando == , obtendremos false . Los campos tienen los mismos valores, pero los objetos mismos ocupan ubicaciones diferentes en la memoria. Los objetos de cuerda , a pesar de su engañosa simplicidad, siguen siendo objetos. Compararlos usando == tampoco es apropiado (a pesar de la presencia de un grupo de cadenas). La solución adecuada es el método igual estándar de la clase Objeto , que debe anularse para que funcione correctamente (de forma predeterminada, utiliza == para comparaciones). La clase String lo anula, por lo que solo usamos su implementación:
String firstStr = "Hello World!";
String secondStr = "Hello World!";
boolean isEquals = firstStr.equals(secondStr);
Explorando preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 6 - 6Hemos hablado de comparaciones para la igualdad. Ahora descubriremos comparaciones para ordenar. Después de todo, si vamos a ordenar algo, necesitamos saber qué principio usaremos para ordenar. Para hacer esto, puedes usar TreeSet , un conjunto ordenado estándar. Esta estructura de datos se basa en el algoritmo de árbol rojo-negro y ordena el conjunto según un principio de clasificación específico. Como dije antes, es necesario comprender cómo ordenar objetos de un determinado tipo. Para asignar el método de comparación para ordenar, use comparadores . Normalmente necesitas implementarlos para las clases que deseas ordenar, pero en el caso de String , ya están implementados. En consecuencia, simplemente agregamos nuestras cadenas al TreeSet y él las ordenará por nosotros:
TreeSet<String> sortedSet = new TreeSet<>();
sortedSet.add("B");
sortedSet.add("C");
sortedSet.add("A");
sortedSet.forEach(System.out::println);
Salida de consola:
A B C

60. Proporcione un algoritmo para convertir una cadena en caracteres. Escribe el código correspondiente.

Como dije antes, los objetos String tienen muchos métodos útiles diferentes. Uno de ellos es toCharArray . Este método convierte una cadena en una matriz de caracteres:
String str = "Hello world";
char[] charArr = str.toCharArray();
A continuación, tenemos una serie de caracteres a los que podemos hacer referencia por índice:
char firstChar = charArr[0]; // H

61. ¿Cómo se convierte una cadena en una matriz de bytes y viceversa? Escribe el código correspondiente.

La clase String tiene un método getBytes , que es similar al método toCharArray y devuelve la cadena como una matriz de bytes:
String str = "Hello world";
byte[] byteArr = str.getBytes();
byte firstChar = byteArr[6]; // 119
Hemos llegado a la conclusión lógica de nuestra revisión de hoy. ¡Gracias por leer!
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION