CodeGym/Blog Java/Random-ES/Exploración de preguntas y respuestas de una entrevista d...
John Squirrels
Nivel 41
San Francisco

Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java. Parte 1

Publicado en el grupo Random-ES
¡Hola! CodeGym ha reunido a un grupo diverso de personas. Algunos de nosotros no queremos nada más que convertirnos en desarrolladores de Java, y estamos invirtiendo mucho tiempo y esfuerzo en el desarrollo. Otros ya son desarrolladores de Java. En cualquier caso, debe estar listo para ser evaluado en entrevistas técnicas. Estos no son fáciles. Requieren preparación tanto emocional como técnica. Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 1Recientemente me encontré con algunas listas grandes de preguntas de entrevistas para puestos de desarrollador de Java. Las preguntas se dividen en diferentes niveles: junior, mid-level y senior. No se alarme: no todas las preguntas son fáciles, pero las que tienen un asterisco rara vez se hacen. Las preguntas son buenas y me gustaría tratar de responder a la mayoría de ellas. Claramente, esto no cabrá todo en un solo artículo. Después de todo, hay muchas preguntas allí. Eso significa que habrá toda una serie de artículos con respuestas a estas preguntas de la entrevista. Permítanme enfatizar algunos puntos de inmediato: las respuestas serán breves, porque las respuestas escritas con gran detalle pueden incluirse en un artículo separado. Además, en las entrevistas no se buscan respuestas súper detalladas y voluminosas, porque su entrevistador solo tiene una hora para entrevistarlo sobre temas esenciales (y,

Preguntas y respuestas para un puesto de desarrollador junior

Preguntas generales

1. ¿Qué patrones de diseño conoces? Cuéntenos sobre dos patrones de diseño que haya utilizado en su trabajo.

Hay una gran variedad de estampados. Para aquellos que quieran familiarizarse a fondo con los patrones de diseño, les recomiendo leer el libro "Head First. Design Patterns". Le ayudará a aprender fácilmente los detalles de los patrones de diseño más básicos. En cuanto a los patrones de diseño que podrías mencionar en una entrevista de trabajo, me vienen a la mente los siguientes:
  • Builder : una plantilla de uso frecuente, una alternativa al enfoque clásico para la creación de objetos;
  • Estrategia : un patrón que representa esencialmente el polimorfismo. Es decir, tenemos una interfaz, pero el comportamiento del programa cambia según la implementación de la interfaz específica que se pasa a la función (el patrón de estrategia ahora se usa prácticamente en todas partes en las aplicaciones Java).
Si eso no es suficiente para ti, presta atención a Spring (si ya lo conoces), porque es toda una plataforma de marcos que, a su vez, están impregnados de patrones de principio a fin. Aquí hay un par de ejemplos de lo que estoy hablando:
  • Fábrica : este patrón se puede encontrar en ApplicationContext (o en BeanFactory);
  • Singleton : todos los beans son singletons por defecto;
  • Proxy : básicamente, todo en Spring usa este patrón de una forma u otra, por ejemplo, AOP;
  • Cadena de responsabilidad : un patrón que sustenta Spring Security;
  • Plantilla : utilizada en Spring JDBC.

Núcleo de Java

Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 2

2. ¿Qué tipos de datos hay en Java?

Java tiene los siguientes tipos de datos primitivos:
  • byte : números enteros que van de -128 a 127, ocupan 1 byte;
  • corto : números enteros que van desde -32768 a 32767, ocupa 2 bytes;
  • int : números enteros que van desde -2147483648 hasta 2147483647, ocupa 4 bytes;
  • long : números enteros que van desde 9223372036854775808 hasta 9223372036854775807, ocupan 8 bytes;
  • float — números de punto flotante que van desde -3.4E+38 a 3.4E+38, ocupa 4 bytes;
  • doble : números de coma flotante que van desde -1.7E+308 a 1.7E+308, ocupa 8 bytes;
  • char : caracteres individuales en UTF-16, ocupa 2 bytes;
  • valores booleanos verdadero/falso, ocupa 1 byte.
Y hay tipos de datos de referencia que apuntan a objetos en el montón.

3. ¿En qué se diferencia un objeto de los tipos de datos primitivos?

La primera diferencia es la cantidad de memoria ocupada: las primitivas ocupan muy poco porque contienen solo su propio valor, pero los objetos pueden contener muchos valores diferentes, tanto primitivas como referencias a otros objetos. Una segunda diferencia es esta: Java es un lenguaje orientado a objetos, por lo que todo lo que funciona en Java es una interacción entre objetos. Los primitivos no encajan muy bien aquí. De hecho, es por eso que Java no es un lenguaje 100% orientado a objetos. La tercera diferencia, que se deriva de la segunda, es que debido a que Java se enfoca en las interacciones de objetos, existen muchos mecanismos diferentes para administrar objetos. Por ejemplo, constructores, métodos, excepciones (que funcionan principalmente con objetos), etc. Y para permitir que las primitivas funcionen de alguna manera en este entorno orientado a objetos, a los creadores de Java se les ocurriócontenedores para los tipos primitivos ( Integer , Character , Double , Boolean ...)

4. ¿Cuál es la diferencia entre pasar argumentos por referencia y por valor?

Los campos primitivos almacenan su valor: por ejemplo, si establecemos int i = 9; , entonces el campo i almacena el valor 9. Cuando tenemos una referencia a un objeto, eso significa que tenemos un campo con una referencia al objeto. En otras palabras, tenemos un campo que almacena la dirección del objeto en la memoria.
Cat cat = new Cat();
Esto significa que los campos con una referencia a un objeto también almacenan valores . Sus valores son direcciones de memoria. Es decir, cat almacena la dirección de memoria del nuevo objeto Cat() . Cuando pasamos un argumento a un método, se copia su valor. En el caso de una primitiva, se copia el valor de la primitiva. En consecuencia, el método funciona con la copia. Cuando se cambia la copia, el original no se ve afectado. En el caso de un tipo de referencia, se copia el valor de la dirección de memoria. En consecuencia, ambas variables de referencia almacenarán direcciones que apuntan al mismo objeto. Y si usamos esta nueva referencia para cambiar el objeto, encontraremos que también se cambia por la referencia anterior. Después de todo, ambos apuntan al mismo objeto.

5. ¿Qué es JVM, JDK y JRE?

JVM significa Java Virtual Machine , que ejecuta el código de bytes de Java generado previamente por el compilador. JRE significa Java Runtime Environment . Básicamente, es un entorno para ejecutar aplicaciones Java. Incluye JVM, bibliotecas estándar y otros componentes para ejecutar applets y aplicaciones escritas en el lenguaje de programación Java. En otras palabras, el JRE es un paquete de todo lo necesario para ejecutar un programa Java compilado, pero no incluye herramientas y utilidades como compiladores o depuradores para desarrollar aplicaciones. JDK significa Java Development Kit , que es una extensión de JRE. Es decir, es un entorno no solo para ejecutar aplicaciones Java, sino también para desarrollarlas. El JDK contiene todo lo que hay en JRE, además de varias herramientas adicionales (compiladores y depuradores) necesarias para crear aplicaciones Java (incluye documentación Java). Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 3

6. ¿Por qué usar la JVM?

Como se indicó anteriormente, la máquina virtual de Java es una máquina virtual que ejecuta el código de bytes de Java que ha sido generado previamente por el compilador. Esto significa que la JVM no comprende el código fuente de Java. Entonces, primero, compilamos archivos .java . Los archivos compilados tienen la clase .extensión y ahora están en forma de código de bytes, que la JVM entiende. La JVM es diferente para cada sistema operativo. Cuando la JVM ejecuta archivos de código de bytes, los adapta para el sistema operativo en el que se ejecuta. De hecho, debido a que existen diferentes JVM, el JDK (o JRE) también difiere para diferentes sistemas operativos (cada versión necesita su propia JVM). Recordemos cómo funciona el desarrollo en otros lenguajes de programación. Usted escribe un programa, luego su código se compila en código de máquina para un sistema operativo específico y luego puede ejecutarlo. En otras palabras, debe escribir diferentes versiones del programa para cada plataforma. Pero el doble procesamiento del código de Java (compilación del código fuente en código de bytes y luego procesamiento del código de bytes por la JVM) le permite disfrutar de los beneficios de una solución multiplataforma. Creamos el código una vez y lo compilamos en bytecode. Luego podemos llevarlo a cualquier sistema operativo, y la JVM nativa puede ejecutarlo. Y este es precisamente el legendario Javaescriba una vez, ejecute la función en cualquier lugar. Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 4

7. ¿Qué es el código de bytes?

Como dije anteriormente, el compilador convierte el código Java en un bytecode intermedio (pasamos de archivos con la extensión .java a archivos con la extensión .class). En muchos sentidos, el código de bytes es similar al código de máquina, excepto que su conjunto de instrucciones no es para un procesador real, sino uno virtual. Dicho esto, puede incluir secciones diseñadas para un compilador JIT, que optimiza la ejecución de comandos para el procesador real en el que se ejecuta el programa. La compilación JIT, también llamada compilación sobre la marcha, es una tecnología que aumenta el rendimiento de un programa de código de bytes al compilar el código de bytes en código de máquina u otro formato mientras se ejecuta el programa. Como habrás adivinado, la JVM usa el compilador JIT cuando ejecuta bytecode. Echemos un vistazo a un código de bytes de muestra: Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 5No demasiado legible, ¿eh? La buena noticia es que esta instrucción no es para nosotros. Es para la JVM.

8. ¿Cuáles son las características de un JavaBean?

Un JavaBean es una clase de Java que sigue ciertas reglas. Estas son algunas de las reglas para escribir un JavaBean :
  1. La clase debe contener un constructor vacío (sin argumentos) con el modificador de acceso público . Este constructor hace posible crear un objeto de la clase sin problemas innecesarios (para que no haya que jugar con los argumentos).

  2. Se accede a los campos internos a través de los métodos de instancia get y set , que deberían tener la implementación estándar. Por ejemplo, si tenemos un campo de nombre , entonces deberíamos tener getName y setName , etc. Esto permite que varias herramientas (marcos) obtengan y configuren automáticamente el contenido de beans sin ninguna dificultad.

  3. La clase debe anular los métodos equals() , hashCode() y toString() .

  4. La clase debe ser serializable. Es decir, debe tener la interfaz de marcador Serializable o implementar la interfaz Externalizable . Esto es para que el estado del bean se pueda guardar, almacenar y restaurar de manera confiable.

Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 6

9. ¿Qué es un OutOfMemoryError?

OutOfMemoryError es un error de tiempo de ejecución crítico relacionado con Java Virtual Machine (JVM). Este error ocurre cuando la JVM no puede asignar un objeto porque no hay suficiente memoria para él y el recolector de elementos no utilizados no puede asignar más memoria. Algunos tipos de OutOfMemoryError :
  • OutOfMemoryError: espacio de almacenamiento dinámico de Java : el objeto no se puede asignar en el almacenamiento dinámico de Java debido a que no hay suficiente memoria. Este error puede ser causado por una pérdida de memoria o por un tamaño de montón predeterminado que es demasiado pequeño para la aplicación actual.

  • OutOfMemoryError: se excedió el límite de gastos generales de GC : debido a que los datos de la aplicación apenas caben en el montón, el recolector de basura se ejecuta todo el tiempo, lo que hace que el programa Java se ejecute muy lentamente. Como resultado, se supera el límite de sobrecarga del recolector de elementos no utilizados y la aplicación se bloquea con este error.

  • OutOfMemoryError: el tamaño de la matriz solicitada excede el límite de VM ; esto indica que la aplicación intentó asignar memoria para una matriz que excede el tamaño del almacenamiento dinámico. Una vez más, esto puede significar que se asignó memoria insuficiente de forma predeterminada.

  • OutOfMemoryError: Metaspace : el montón se quedó sin espacio asignado para los metadatos (los metadatos son instrucciones para clases y métodos).

  • OutOfMemoryError: bytes de tamaño de solicitud por motivo. Sin espacio de intercambio : se produjo un error al intentar asignar memoria desde el montón y, como resultado, el montón no tiene espacio suficiente.

10. ¿Qué es un seguimiento de pila? ¿Como lo consigo?

Un seguimiento de pila es una lista de las clases y métodos que se han llamado hasta este punto en la ejecución de una aplicación. Puede obtener el seguimiento de la pila en un punto específico de la aplicación haciendo esto:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
Esto nos da una matriz de StackTraceElements dispuestos en el orden Último en entrar, primero en salir (LIFO) . Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 7En Java, cuando la gente habla de un seguimiento de la pila, por lo general se refiere a un seguimiento de la pila que se muestra en la consola cuando se produce un error (o una excepción). Puede obtener el seguimiento de la pila de excepciones como esta:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
Y si queremos mostrar el seguimiento de la pila de una excepción en la consola:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
Además, si ocurre un error, una excepción no verificada o una excepción verificada no controlada , obtenemos automáticamente el seguimiento de la pila de la excepción en la consola cuando la aplicación falla. Aquí hay un pequeño ejemplo de un seguimiento de pila en la consola: Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 8Y con esa nota, concluiremos nuestra discusión de este tema hoy.Exploración de preguntas y respuestas de una entrevista de trabajo para un puesto de desarrollador de Java.  Parte 1 - 9
Comentarios
  • Populares
  • Nuevas
  • Antiguas
Debes iniciar sesión para dejar un comentario
Esta página aún no tiene comentarios