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 1

Publicado en el grupo Random-ES
¡Hola! Varias personas se reunieron en JavaRush. Algunos de nosotros solo queremos convertirnos en desarrolladores de Java e invertir mucho tiempo y esfuerzo en el desarrollo, mientras que otros ya son desarrolladores de Java. En un caso u otro, es necesario estar preparado para las pruebas: entrevistas técnicas. Esta prueba no es fácil y, además de la preparación moral, también se necesita preparación técnica. Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 1Recientemente me encontré con una gran lista de preguntas de la entrevista para desarrolladores de Java en dou. Estas preguntas se dividen en diferentes niveles: Junior, Middle y Senior. No te alarmes: no todas las preguntas son fáciles, pero las que llevan un asterisco rara vez se hacen. Las preguntas son buenas, pero me gustaría intentar responder a la mayoría de ellas. Está claro que no entraré en el alcance de un artículo, después de todo, hay muchas preguntas allí. Por lo tanto, esta será toda una serie de artículos que responderán a estas preguntas. Permítanme subrayar inmediatamente algunos puntos:
  1. Hay un excelente artículo con las principales preguntas y respuestas. Algunas preguntas se superponen con la lista presentada anteriormente (más de 250), por lo que se omitirán estas preguntas para no duplicar la información una vez más.

  2. Las preguntas se presentan en ucraniano, pero como la mayoría de los participantes de JavaRush hablan ruso (y en mayor medida yo también), las respuestas estarán en ruso.

  3. Las respuestas serán breves, ya que si escribes con mucho detalle, las respuestas a algunas preguntas pueden requerir un artículo aparte. Y durante las entrevistas, no se necesitan respuestas tan detalladas y voluminosas, porque su entrevistador solo tiene una hora para entrevistarlo sobre los temas necesarios (y, como recordará, es suficiente). Para aquellos que quieran profundizar más, dejaré enlaces.

Vamos a empezar.

Preguntas y respuestas de nivel junior

Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 2

Asuntos Generales

1. ¿Qué patrones de diseño conoces? Cuéntanos sobre las dos plantillas que utilizaste en tu trabajo.

Hay una gran variedad de plantillas: puedes empezar a familiarizarte con ellas a partir de este y este artículo. Bueno, para aquellos que quieran familiarizarse con ellos en detalle, les recomiendo leer el libro “Head First”. Patrones de diseño" . Con su ayuda, podrás estudiar los patrones de diseño más básicos en detalle y de forma sencilla. Cuando se trata de patrones de diseño que puedes usar como ejemplos en una entrevista, algunos que te vienen a la mente son:
  • Builder es una plantilla de uso frecuente, una alternativa a la creación de objetos clásica;
  • Patrón de estrategia , que inherentemente representa polimorfismo. Es decir, tenemos una interfaz, pero el comportamiento del programa cambiará dependiendo de qué implementación específica de esta interfaz se transfirió a la funcionalidad (ahora la estrategia se usa prácticamente en todas partes en las aplicaciones Java).
Si esto no es suficiente para usted, preste atención a Spring (si ya está familiarizado con él), porque es una plataforma completa de frameworks, que a su vez están plagados de patrones hacia arriba y hacia abajo. Aquí hay un par de ejemplos de lo que estoy hablando:
  • Fábrica : en ApplicationContext (o en BeanFactory);
  • Singleton : todos los beans son singleton de forma predeterminada;
  • Proxy : esencialmente todo en primavera usa este patrón de una forma u otra, por ejemplo, AOP;
  • La cadena de responsabilidad es un patrón basado en el concepto por el cual funciona Spring Security;
  • Plantilla : utilizada en Spring Jdbc.

Núcleo de Java

Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 3

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

Java tiene tipos de datos primitivos:
  • byte : números enteros en el rango de -128 a 127, pesa 1 byte;
  • short : números enteros en el rango de -32768 a 32767, pesa 2 bytes;
  • int : enteros -2147483648 a 2147483647, pesa 4 bytes;
  • long : números enteros en el rango 9223372036854775808 a 9223372036854775807, pesa 8 bytes;
  • float : números de coma flotante en el rango -3,4E+38 a 3,4E+38, pesa 4 bytes;
  • doble : números de punto flotante en el rango -1,7E+308 a 1,7E+308, pesa 8 bytes;
  • char : caracteres individuales en UTF-16, pesa 2 bytes;
  • Valores booleanos verdadero/falso , pesa 1 byte.
Y 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: la cantidad de memoria ocupada: las primitivas ocupan muy poca, porque solo contienen su propio valor, mientras que los objetos pueden contener muchísimos valores diferentes: tanto primitivas como referencias a otros objetos. La segunda diferencia: Java es un lenguaje orientado a objetos, por lo que todo en él funciona mediante la interacción entre objetos, y las primitivas no encajan muy bien (de hecho, es por eso que Java no es un lenguaje 100% orientado a objetos). En tercer lugar, siguiendo con el segundo: dado que Java se centra en la interacción entre objetos, estos objetos tienen muchos mecanismos diferentes para gestionarlos. Por ejemplo, constructores, métodos, excepciones (que operan principalmente sobre objetos), etc. En realidad, para que los primitivos pudieran involucrarse (trabajar) de alguna manera en este entorno orientado a objetos, se inventaron contenedores para tipos primitivos ( Integer , Character , Double , Boolean ...)

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

Los campos primitivos almacenan su valor: por ejemplo, si configuramos int i = 9; El campo i almacena el valor 9 . Cuando tenemos una referencia a un objeto, significa que tenemos un campo con una referencia al objeto, o en otras palabras, con el valor de la dirección del objeto en memoria.
Cat cat = new Cat();
Resulta que los campos con referencia a un objeto también almacenan valores , valores de direcciones de memoria. Es decir, cat almacena el valor de la dirección del nuevo objeto Cat() en la memoria. Cuando pasamos un parámetro a un método, se copia su valor. En el caso de una primitiva, se copiará el valor de la primitiva. En consecuencia, el método funcionará con una copia, cuyo cambio no afectará al original. En el caso de un tipo de referencia, se copiará el valor de la dirección de memoria, respectivamente, la dirección será la misma que la del objeto al que apunta. Y si cambiamos el objeto usando este nuevo enlace, se cambiará por el anterior (al fin y al cabo, ambos apuntan al mismo objeto).

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

JVM: Java Virtual Machine es una máquina virtual que ejecuta el código de bytes de Java pregenerado por el compilador. JRE (Java Runtime Environment ) es esencialmente un entorno para ejecutar aplicaciones Java, que contiene JVM , bibliotecas estándar y otros componentes para ejecutar subprogramas y aplicaciones escritas en el lenguaje de programación Java. En otras palabras , JRE es un paquete con todo lo necesario para ejecutar un programa Java compilado, pero no contiene herramientas ni utilidades como compiladores o depuradores para el desarrollo de aplicaciones. JDK (Java Development Kit) : un conjunto ampliado de JRE , es decir, un entorno no solo para ejecutar, sino también para desarrollar aplicaciones Java. El JDK contiene todo lo que hay en JRE, además de varias herramientas adicionales: compiladores y depuradores necesarios para crear aplicaciones en Java (también contiene documentos de Java).Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 4

6. ¿Por qué utilizar JVM?

Como se mencionó anteriormente, Java Virtual Machine es una máquina virtual que ejecuta código de bytes de Java pregenerado por el compilador. Es decir, la JVM no comprende el código fuente de Java. Por tanto, primero se compilan los archivos .java , que tras la compilación ya tienen extensión .class y que se presentan en forma del mismo código de bytes que entiende la JVM. Cada SO tiene su propia JVM, por lo que una vez recibidos los archivos de código de bytes, la JVM los ejecuta, adaptándolos al SO en el que ocurre. En realidad, debido a las diferentes JVM, las versiones de JDK (o JRE) difieren para diferentes sistemas operativos (cada uno de ellos requiere su propia JVM). Recordemos cómo funciona el desarrollo en otros lenguajes de programación. Usted desarrolla 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, es necesario escribir diferentes versiones del programa para cada sistema. Mientras que en Java, gracias al procesamiento de código dual (compilación y procesamiento de bytes de código JVM), puede disfrutar de los beneficios de la multiplataforma. Una vez creamos el código, lo volvimos a compilar en código de bytes, lo transferimos a cualquier sistema operativo y la JVM local ejecuta el código. Esta es la propiedad legendaria de Java: escribe una vez, ejecuta en cualquier lugar . Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 5Lea más sobre esto en el artículo " Compilar y ejecutar aplicaciones Java bajo el capó ".

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

Como dije anteriormente, el compilador convierte el código Java en código de bytes intermedio (archivos con la extensión .java en archivos con la extensión .class). Bytecode es en muchos aspectos similar al código de máquina, solo que utiliza un conjunto de instrucciones no de un procesador real, sino de uno virtual. Además, puede incluir secciones centradas en el uso de 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 utilizando código de bytes al compilar el código de bytes en una máquina u otro formato mientras el programa se está ejecutando. Como habrás adivinado, la JVM utiliza un compilador JIT cuando ejecuta código de bytes. Echemos un vistazo a un ejemplo de código de bytes: Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 6No es muy legible, ¿verdad? Bueno, esta no es una instrucción para nosotros, sino para la JVM. Aquí tienes un artículo que te ayudará a comprender mejor este problema.

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

JavaBeans es una clase Java con ciertas reglas. Aquí hay algunas reglas para escribir un JavaBean :
  1. La clase debe contener un constructor de acceso público vacío (sin parámetros) con el modificador de acceso público . Este constructor permite crear un objeto de esta clase sin problemas innecesarios (para que no haya problemas innecesarios con los parámetros).

  2. Se accede a los campos internos de una clase a través de los métodos get y set , que deberían ser estándar. Por ejemplo, si el campo es nombre , entonces getName y setName, etc. Esto, a su vez, permite que varias herramientas (marcos) determinen y actualicen automáticamente el contenido de los beans sin complicaciones.

  3. La clase debe contener versiones anuladas de los métodos iguales() hashCode() y toString() .

  4. La clase debe ser serializable, es decir, debe tener una interfaz marcadora - Serializable o implementar la interfaz Externalizable . Esto es necesario para que el estado del bean pueda guardarse, almacenarse y restaurarse de forma fiable.

Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 7Puede leer sobre los tipos de JavaBeans en este material .

9. ¿Qué es OutOfMemoryError?

OutOfMemoryError es uno de los errores críticos de tiempo de ejecución asociados con el funcionamiento de la máquina virtual Java (JVM). Se llama cuando la JVM no puede asignar un objeto porque no hay suficiente memoria disponible para él y el recolector de basura no puede asignar más memoria. Algunos tipos de OutOfMemoryError :
  • OutOfMemoryError: espacio en el montón de Java : el objeto no se puede asignar en el montón de Java debido a que no hay suficiente memoria. El error podría deberse a una pérdida de memoria o a que el tamaño del montón predeterminado no es lo suficientemente grande para la aplicación actual.

  • OutOfMemoryError: se excedió el límite de sobrecarga de GC : debido al hecho de que la cantidad de datos apenas cabe en el montón, el recolector de basura se ejecuta todo el tiempo y el programa Java se ejecuta muy lentamente y, como resultado, el límite de sobrecarga del recolector de basura se excede y la aplicación falla con este error.

  • OutOfMemoryError: el tamaño de la matriz solicitada excede el límite de VM : indica que la aplicación intentó asignar memoria para una matriz que es mayor que el tamaño del montón, lo que nuevamente puede deberse a una asignación de memoria predeterminada insuficiente.

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

  • OutOfMemoryError: solicita bytes de tamaño por motivo. Sin espacio de intercambio : se produjo algún error al intentar asignar memoria del montón y, como resultado, faltaba memoria en el montón.

10. ¿Qué es un seguimiento de pila? ¿Cómo conseguirlo?

Un Stack Trace es una lista de clases y métodos que se han llamado hasta este punto en la aplicación. Puede llamar a un seguimiento de pila en un punto específico de la aplicación de esta manera:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
De esta manera obtendremos una serie de elementos de seguimiento de la pila dispuestos en orden LIFO: último en entrar, primero en salir . Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 8En Java, por regla general, cuando hablan de seguimiento de pila, se refieren al seguimiento de pila que se muestra en la consola cuando ocurre un error (o excepción). Puede obtener el seguimiento de la pila de excepciones como esta:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
Bueno, si estamos hablando de generar el seguimiento de la pila de excepciones en la consola:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
Además, si tenemos un error, una excepción no marcada o una excepción marcada , que no procesaremos, sino que solo reenviaremos, cuando la aplicación falle recibiremos automáticamente un seguimiento de la pila de excepciones en la consola. Un pequeño ejemplo de una excepción de seguimiento de pila en la consola: Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 9Puede leer más sobre Stack Trace aquí . Nos centraremos en este tema hoy...Análisis de preguntas y respuestas de entrevistas.  Parte 1 - 10
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION