En este artículo, discutiremos varios tipos de preguntas de entrevistas en entrevistas con Java que permiten a los empleadores probar la Java de los candidatos y las capacidades de programación orientadas a objetos comunes. Los siguientes capítulos se dividen en dos artículos anteriores y próximos. El primer artículo discutirá la programación orientada a objetos y sus características, preguntas comunes sobre Java y sus funciones, clases de recolección de Java, recolectores de basura y el segundo artículo discutirá principalmente el manejo de excepciones, los applets de Java, Swing, JDBC, llamadas de métodos remotos (RMI), Servidores y JSP.
¡comenzar!
Tabla de contenido
Programación orientada a objetos (OOP)
Problemas comunes de Java
Hilos de java
Clase de colección de Java
Colector de basura
Programación orientada a objetos (OOP)
Java es un lenguaje de programación de computadoras que admite la concurrencia, basada en clases y orientado a objetos. Las ventajas del desarrollo de software orientado a objetos se enumeran a continuación:
La programación orientada a objetos tiene muchas características importantes, como: encapsulación, herencia, polimorfismo y abstracción. En los siguientes capítulos, analizaremos estas características una por una.
Paquete
La encapsulación proporciona a los objetos la capacidad de ocultar características y comportamientos internos. Un objeto proporciona algunos métodos a los que pueden acceder a otros objetos para cambiar los datos dentro de él. En Java, hay 3 modificadores: público, privado y protegido. Cada modificador ofrece diferentes derechos de acceso a otros objetos ubicados en el mismo paquete o en diferentes paquetes.
Estos son algunos de los beneficios del uso de encapsulación:
Consulte este documento para obtener más detalles y ejemplos sobre encapsulación.
Polimórfico
El polimorfismo es una capacidad de los lenguajes de programación para demostrar las mismas interfaces para diferentes tipos de datos subyacentes. Las operaciones en un tipo polimórfico se pueden aplicar a otros tipos de valores.
heredar
La herencia proporciona a los objetos la capacidad de obtener campos y métodos de las clases base. La herencia proporciona líneas de código reutilizadas, y también puede agregar nuevas características a las clases existentes sin modificarlas.
abstracto
La abstracción es el paso de separar ideas de instancias concretas, por lo que crea clases basadas en su funcionalidad en lugar de los detalles de implementación. Java admite la creación de clases abstractas que solo exponen interfaces pero no incluyen implementaciones de métodos. El objetivo principal de esta técnica abstracta es separar el comportamiento de la clase de los detalles de implementación.
La diferencia entre abstracción y encapsulación
La abstracción y la encapsulación son conceptos complementarios. Por un lado, el resumen se centra en el comportamiento de los objetos. Por otro lado, la encapsulación se centra en los detalles del comportamiento del objeto. En general, la encapsulación se logra ocultando la información del estado interno del objeto. Por lo tanto, la encapsulación puede considerarse como una estrategia para proporcionar abstracción.
Problemas comunes de Java
1. ¿Qué es una máquina virtual Java? ¿Por qué Java se llama un "lenguaje de programación independiente de la plataforma"?
Una máquina virtual Java es un proceso de máquina virtual que puede ejecutar Java bytecode. El archivo de origen Java se compila en un archivo Bytecode que puede ser ejecutado por una máquina virtual Java.
Java está diseñado para permitir que las aplicaciones se ejecuten en cualquier plataforma sin requerir que los programadores reescriban o recompire cada plataforma por separado. Las máquinas virtuales Java hacen esto posible porque conoce la longitud de la instrucción y otras características de la plataforma de hardware subyacente.
2. ¿Cuál es la diferencia entre JDK y JRE?
El entorno de tiempo de ejecución de Java (JRE) es una máquina virtual Java que ejecutará programas Java. También incluye complementos de navegador necesarios para ejecutar applets. Java Development Toolkit (JDK) es un paquete de desarrollo de software Java completo que incluye JRE, compilador y otras herramientas (como Javadoc, Java Debugger), que permite a los desarrolladores desarrollar, compilar y ejecutar aplicaciones Java.
3. ¿Qué significa la palabra clave "estática"? ¿Puedo anular un método privado o estático en Java?
La palabra clave "estática" indica que se puede acceder a una variable de miembro o método miembro sin una variable de instancia de la clase a la que pertenece.
El método estático en Java no se puede sobrescribir porque el método sobrescribido se basa en la unión dinámica de tiempo de ejecución, mientras que el método estático es unión estática en el tiempo de compilación. El método estático no está relacionado con ninguna instancia de la clase, por lo que no se aplica conceptualmente.
4. ¿Es posible acceder a variables no estáticas en un entorno estático?
La variable estática pertenece a la clase en Java, y su valor en todos los casos es el mismo. Cuando la clase está cargada por una máquina virtual Java, se inicializará la variable estática. Si su código intenta acceder a variables no estáticas sin instancias, el compilador informará un error porque estas variables aún no se han creado y no se han asociado con ninguna instancia.
5. ¿Cuáles son los tipos de datos compatibles con Java? ¿Qué es el desmontaje automático?
Los tipos de datos básicos compatibles con Java Language son:
El boxeo automático es una conversión realizada por el compilador Java entre el tipo de datos básicos y el tipo de envoltura de objetos correspondiente. Por ejemplo: convertir int en entero, doble en doble, etc. De lo contrario, es un desempeño automático.
6. ¿Qué significan la anulación de métodos y la sobrecarga de métodos en Java?
La sobrecarga de métodos en Java ocurre cuando dos o más métodos tienen los mismos nombres de métodos pero diferentes parámetros en la misma clase. Por el contrario, la anulación del método significa que la subclase redefine el método de la clase principal. Las anulaciones de métodos deben tener el mismo nombre de método, lista de parámetros y tipo de retorno. El sobrenadrador no puede restringir el acceso a los métodos que cubre.
7. ¿Qué es un constructor en Java? ¿Qué es la sobrecarga del constructor? ¿Qué es un constructor de copias?
Cuando se crea un nuevo objeto, se llama al constructor. Cada clase tiene un constructor. Cuando el programador no proporciona un constructor a la clase, el compilador Java creará un constructor predeterminado para la clase.
La sobrecarga de constructor y la sobrecarga de métodos en Java son muy similares. Se pueden crear múltiples constructores para una clase. Cada constructor debe tener su propia lista única de parámetros.
Java no admite constructores de copias como en C ++. Esta diferencia es porque si no escribe el constructor usted mismo, Java no creará el constructor de copia predeterminado.
8. ¿Java admite la herencia múltiple?
No es compatible, Java no admite la herencia múltiple. Cada clase solo puede heredar una clase, pero puede implementar múltiples interfaces.
9. ¿Cuál es la diferencia entre una interfaz y una clase abstracta?
Java proporciona y admite la creación de clases e interfaces abstractas. Sus implementaciones tienen similitudes, y las diferencias son:
También puede consultar la diferencia entre clases abstractas e interfaces en JDK8
10. ¿Qué es el paso de valor y el paso de referencia?
El objeto se pasa por un valor, lo que significa que se pasa una copia del objeto. Por lo tanto, incluso si se cambia la copia del objeto, el valor del objeto de origen no se verá afectado.
Se pasa un objeto por referencia, lo que significa que no es el objeto real aprobado, sino la referencia del objeto. Por lo tanto, los cambios externos al objeto referenciado se reflejarán en todos los objetos.
Hilos de java
11. ¿Cuál es la diferencia entre un proceso y un hilo?
Un proceso es una aplicación de ejecución, y un hilo es una secuencia de ejecución dentro del proceso. Un proceso puede tener múltiples hilos. Los hilos también se llaman procesos livianos.
12. ¿Cuántas maneras diferentes hay para crear hilos? ¿Cuál te gusta? ¿Por qué?
Hay tres formas de crear hilos:
Implementar la interfaz Runnable es más popular porque no requiere heredar la clase de subprocesos. Cuando otros objetos se han heredado en el diseño de la aplicación, esto requiere una herencia múltiple (mientras que Java no admite la herencia múltiple), solo puede implementar interfaces. Al mismo tiempo, los grupos de subprocesos también son muy eficientes y fáciles de implementar y usar.
13. Una explicación resumida de varios estados disponibles de hilos.
Durante la ejecución, los hilos pueden estar en los siguientes estados:
14. ¿Cuál es la diferencia entre el método de sincronización y el bloque de código de sincronización?
En el idioma Java, cada objeto tiene un bloqueo. Los hilos pueden usar la palabra clave sincronizada para obtener bloqueos en los objetos. La palabra clave sincronizada se puede aplicar en el nivel de método (bloqueo de grano grueso) o en el nivel de bloque de código (bloqueo de grano fino).
15. ¿Cómo sincronizar los hilos dentro del monitor? ¿Qué nivel de sincronización debe hacer el programa?
Los monitores y las cerraduras se usan juntos en máquinas virtuales Java. El monitor monitorea un bloque de código sincrónico, asegurando que solo un hilo ejecute el bloque de código sincrónico a la vez. Cada monitor está asociado con una referencia de objeto. Los hilos no permiten que se ejecute el código de sincronización antes de adquirir el bloqueo.
16. ¿Qué es el punto muerto?
Cuando ambos procesos esperan que la otra parte complete la ejecución antes de continuar ejecutándose, se produce un punto muerto. El resultado es que ambos procesos están atrapados en una espera infinita.
17. ¿Cómo garantizar que N hilos puedan acceder a N recursos sin causar puntos muertos?
Cuando se usa múltiples lecturas, una forma muy simple de evitar los estlocks es especificar el orden en que se adquieren los bloqueos y obligar al hilo a adquirir los bloqueos en el orden especificado. Por lo tanto, si todos los hilos bloquean y liberan bloqueos en el mismo orden, no habrá un punto muerto.
Clase de colección de Java
18. ¿Cuáles son las interfaces básicas del marco de la clase de colección Java?
Las clases de colección Java proporcionan un conjunto bien diseñado de interfaces y clases que admiten operaciones en un conjunto de objetos. Las interfaces más básicas en las clases de colección Java son:
19. ¿Por qué la clase de recolección no implementa las interfaces clonables y serializables?
La interfaz de la clase de recopilación especifica un conjunto de objetos llamados elementos. Cada clase de implementación específica de la interfaz de clase de recopilación puede elegir guardar y ordenar elementos a su manera. Algunas clases de colección permiten claves duplicadas, mientras que otras no.
20. ¿Qué es un iterador?
La interfaz Iterator proporciona muchas formas de iterar sobre elementos de recolección. Cada clase de recolección contiene métodos iterativos que pueden devolver una instancia de iterador. El iterador puede eliminar elementos de la colección subyacente durante la iteración.
La semántica y los significados de clonación o serialización están relacionados con implementaciones específicas. Por lo tanto, la implementación específica de la clase de recolección debe determinar cómo ser clonada o serializada.
21. ¿Cuál es la diferencia entre iterador y listiterator?
La diferencia se enumera a continuación:
22. ¿Cuál es la diferencia entre la falla rápida (Fail-Fast) y la falla segura (Fail-Safe)?
La falla de seguridad de Iterator se basa en hacer copias de la colección subyacente, por lo que no se ve afectada por las modificaciones en la colección de origen. Todas las clases de recolección bajo el paquete java.util fallan rápidamente, mientras que todas las clases bajo el paquete java.util.concurrent fallan de manera segura. Un iterador de falla rápida organizará una excepción de concepción de modificación concurrente, mientras que un iterador de falla segura nunca arrojará tal excepción.
23. ¿Cuál es el principio de funcionamiento del hashmap en Java?
Hashmap en Java almacena elementos en forma de pares de valores clave. Hashmap requiere una función hash que usa métodos hashcode () e igual () para agregar y recuperar elementos a/desde la colección. Cuando se llama al método PUT (), HashMap calculará el valor hash de la clave y luego almacenará los pares de valor clave en el índice apropiado en el conjunto. Si la clave ya existe, el valor se actualizará a un nuevo valor. Algunas características importantes de HASHMAP son su capacidad, factor de carga y cambio de tamaño de umbral.
24. ¿Dónde reflejan la importancia de los métodos hashcode () e igual ()?
Hashmap en Java usa métodos hashcode () y igual () para determinar el índice de pares de valor clave. Estos dos métodos también se utilizarán al obtener valores basados en claves. Si estos dos métodos no se implementan correctamente, dos claves diferentes pueden tener el mismo valor hash y, por lo tanto, pueden considerarse igual por el conjunto. Además, estos dos métodos también se utilizan para descubrir elementos duplicados. Por lo tanto, la implementación de estos dos métodos es crucial para la precisión y corrección de HASHMAP.
25. ¿Cuál es la diferencia entre hashmap y hashtable?
26. ¿Cuál es la diferencia entre una matriz (matriz) y una lista (ArrayList)? ¿Cuándo debo usar una matriz en lugar de ArrayList?
Lo siguiente enumera las diferencias entre Array y ArrayList:
27. ¿Cuál es la diferencia entre ArrayList y LinkedList?
Tanto ArrayList como LinkedList Implement List Interfaces, y tienen las siguientes diferencias:
ArrayList es una interfaz de datos basada en índices, y su capa subyacente es una matriz. Permite acceso aleatorio a elementos con O (1) complejidad del tiempo. En consecuencia, LinkedList almacena sus datos en forma de una lista de elementos, cada elemento está vinculado a sus elementos anteriores y próximos. En este caso, la complejidad del tiempo para encontrar un elemento es o (n).
En comparación con ArrayList, la inserción, adición y eliminación de LinkedList es más rápido porque cuando los elementos se agregan a cualquier posición en la colección, no es necesario recalcular el tamaño o actualizar el índice como una matriz.
LinkedList toma más memoria que ArrayList porque LinkedList almacena dos referencias para cada nodo, una apuntando al elemento anterior y otro apuntando al siguiente elemento.
También puede consultar ArrayList vs. LinkedList.
28. ¿Qué hacen las interfaces comparables y comparables? Enumere sus diferencias.
Java proporciona una interfaz comparable que contiene solo un método Compareto (). Este método puede ordenar dos objetos. Específicamente, devuelve un número negativo, 0 y un número positivo para indicar que el objeto de entrada es menor que, igual y mayor que el objeto ya existente.
Java proporciona una interfaz de comparación que incluye dos métodos: comparar () y igual (). El método compare () se usa para ordenar dos parámetros de entrada, devolviendo un número negativo, 0, y un número positivo indica que el primer parámetro es menor que, igual y mayor que el segundo parámetro. El método igual () requiere un objeto como parámetro, que se utiliza para determinar si el parámetro de entrada es igual al comparador. Este método devuelve verdadero solo cuando el parámetro de entrada también es un comparador y el parámetro de entrada y el resultado de clasificación de comparación actual son los mismos.
29. ¿Qué es una cola de prioridad de Java?
Priorityqueue es una cola ilimitada basada en el montón de prioridad, y sus elementos se clasifican en orden natural. Cuando se creamos, podemos proporcionarle un comparador responsable de clasificar elementos. PriorityQueue no permite valores nulos porque no tienen orden natural, o no tienen comparadores asociados. Finalmente, PriorityQueue no es seguro de hilo, y la complejidad del tiempo de la entrada y el desembolso es O (log (N)).
30. ¿Entiendes el símbolo Big O (notación Big-O)? ¿Puede dar ejemplos de diferentes estructuras de datos?
El símbolo Big O describe cuán buena es la escala o el rendimiento del algoritmo en el peor escenario cuando aumentan los elementos en la estructura de datos.
Los símbolos grandes O también se pueden usar para describir otros comportamientos, como el consumo de memoria. Debido a que las clases de recolección son en realidad estructuras de datos, generalmente usamos símbolos O grandes para elegir la mejor implementación según el tiempo, la memoria y el rendimiento. Los símbolos O grandes pueden dar una buena explicación del rendimiento de grandes cantidades de datos.
31. ¿Cómo intercambiar si usar una matriz no ordenada o una matriz ordenada?
La mayor ventaja de una matriz ordenada es que la complejidad del tiempo de la búsqueda es o (log n), mientras que la matriz no ordenada es o (n). La desventaja de las matrices ordenadas es que la complejidad del tiempo de la operación de inserción es o (n), porque los elementos con grandes valores deben moverse hacia atrás para dejar espacio para el nuevo elemento. En contraste, la complejidad del tiempo de inserción de una matriz no ordenada es la constante O (1).
32. ¿Cuáles son las mejores prácticas para Java Collection Class Frameworks?
Seleccionar correctamente el tipo de colección que se utilizará de acuerdo con las necesidades de la aplicación es muy importante para el rendimiento. Por ejemplo: si el tamaño del elemento es fijo y se puede conocer de antemano, debemos usar una matriz en lugar de ArrayList.
Algunas clases de colección permiten especificar la capacidad inicial. Por lo tanto, si podemos estimar el número de elementos almacenados, podemos establecer la capacidad inicial para evitar recalcular el valor hash o expandirlo.
Para la seguridad de los tipos, la legibilidad y la robustez, los genéricos siempre se usan. Al mismo tiempo, el uso de genéricos también puede evitar ClassCastException en tiempo de ejecución.
El uso de la clase inmutable proporcionada por JDK como clave para el mapa puede evitar implementar los métodos hashcode () e igual () para nuestras propias clases.
Las interfaces son mejores que la implementación al programar.
Cuando la colección subyacente está realmente vacía, devuelva un conjunto o una matriz con longitud 0 y no devuelva nulo.
33. ¿Cuáles son las diferencias entre la interfaz de enumeración y la interfaz iteradora?
La enumeración es dos veces más rápida que el iterador, mientras consume menos memoria. Sin embargo, el iterador es mucho más seguro que la enumeración, porque otros hilos no pueden modificar los objetos en la colección que es atravesado por el iterador. Al mismo tiempo, Iterator le permite a la persona que llama eliminar elementos en la colección subyacente, lo cual es imposible para la enumeración.
34. ¿Cuál es la diferencia entre hashset y TreeSet?
Hashset es implementado por una tabla hash, por lo que sus elementos están desordenados. La complejidad del tiempo de los métodos add (), eliminar () y contiene () es O (1).
Por otro lado, TreeSet se implementa mediante una estructura en forma de árbol, y se ordenan los elementos dentro. Por lo tanto, la complejidad del tiempo de los métodos add (), eliminar () y contiene () es o (logn).
Coleccionistas de basura
35. ¿Cuál es el propósito de la recolección de basura en Java? ¿Cuándo se recolectará basura?
El propósito de la recolección de basura es identificar y descartar objetos que la aplicación ya no usa para liberar y reutilizar recursos.
36. ¿Qué hará System.gc () y Runtime.gc ()?
Estos dos métodos se utilizan para incitar al JVM que realice la recolección de basura. Sin embargo, comenzar de inmediato o retrasar la recolección de basura depende de JVM.
37. ¿Cuándo se llama el método Finalize ()? ¿Cuál es el propósito de los destructores?
Antes de liberar la memoria ocupada por el objeto, el recolector de basura llama al método Finalize () del objeto. Generalmente se recomienda liberar recursos en poder de objetos en este método.
38. Si la referencia del objeto se establece en NULL, ¿el recolector de basura liberará inmediatamente la memoria ocupada por el objeto?
No, este objeto será reciclable en el próximo ciclo de recolección de basura.
39. ¿Cómo se ve la estructura del montón Java? ¿Qué es el espacio de Gen Perm en el montón?
El montón de JVM es el área de datos de tiempo de ejecución, y todas las instancias y matrices de clases se asignan memoria en el montón. Se crea cuando se inicia el JVM. La memoria del montón ocupada por el objeto es recolectada por el sistema automático de gestión de la memoria, es decir, el recolector de basura.
La memoria del montón está compuesta de objetos que sobreviven y mueren. Los objetos sobrevivientes son accesibles para la aplicación y no se recolectarán basura. El objeto muerto es un objeto al que no es accesible para la aplicación y no ha sido reciclado por el recolector de basura. Ocuparán espacio de memoria de montón hasta que el recolector de basura recupere estos objetos.
40. ¿Cuál es la diferencia entre un coleccionista en serie y un colector de rendimiento?
Los coleccionistas de rendimiento utilizan versiones paralelas de la próxima generación de recolectores de basura, que se utilizan para aplicaciones con datos de tamaño mediano y a gran escala. Los coleccionistas en serie son suficientes para la mayoría de las aplicaciones pequeñas (necesitan unos 100 metros de memoria en procesadores modernos).
41. En Java, ¿cuándo se pueden recolectar los objetos de basura?
Cuando un objeto no se puede incaltrar para la aplicación actualmente usando este objeto, el objeto se puede reciclar.
42. ¿Se producirá la recolección de basura en la generación permanente de JVM?
La recolección de basura no ocurrirá en la generación permanente. Si la generación permanente está llena o excede el valor crítico, activará la recolección de basura completa (GC completa). Si verifica cuidadosamente la información de salida del recolector de basura, encontrará que la generación permanente también se recicla. Esta es la razón por la cual el tamaño correcto de generación permanente es muy importante para evitar GC completo. Consulte Java 8: Desde la generación permanente hasta el área de metadatos
(Nota del traductor: la generación permanente se ha eliminado en Java 8, y se ha agregado un nuevo área de memoria nativa llamada área de metadatos)
Lo anterior es una compilación de la información para las preguntas de la entrevista de Java. Continuaremos agregando información relevante en el futuro. ¡Gracias por su apoyo a este sitio!