- Saltaré las preguntas que se superponen con esta serie de artículos para no duplicar información innecesariamente. Recomiendo leer estos artículos, ya que cubren las preguntas más comunes (populares) de las entrevistas sobre Java Core.
- Podría describir las respuestas con más detalle, pero no lo haré, porque entonces cada respuesta podría prolongarse durante todo el artículo. Y nadie te pedirá ese nivel de detalle en ninguna entrevista de trabajo.
11. Nombra todos los métodos de la clase Objeto.
La clase Object tiene 11 métodos:-
Class<?> getClass() — obtiene la clase del objeto actual;
-
int hashCode() — obtiene el código hash del objeto actual;
-
booleano igual a (Objeto obj) : compara el objeto actual con otro objeto;
-
Clon de objeto() : crea y devuelve una copia del objeto actual;
-
String toString() : obtiene la representación en cadena del objeto;
-
void notify() — despierta un hilo esperando en el monitor de este objeto (la elección del hilo es aleatoria);
-
void notifyAll() — activa todos los hilos que esperan en el monitor de este objeto;
-
void wait() : hace que el hilo actual espere en el monitor actual (congela el hilo actual) hasta que una llamada notify o notifyAll despierte el hilo (solo funciona en un bloque sincronizado);
-
espera vacía (tiempo de espera largo) : hace que el hilo actual espere en el monitor actual (en el bloque sincronizado actual), pero con un tiempo de espera para salir del estado de espera (o nuevamente, hasta que una llamada de notificación o notificación a todos despierte el hilo);
-
void wait(long timeout, int nanos) : este método es como el método anterior, pero con un tiempo de espera más preciso;
-
void finalize() : este método se llama (finalmente) antes de que el recolector de basura elimine el objeto. Se utiliza para limpiar los recursos adquiridos.
12. ¿Cuál es la diferencia entre intentar con recursos y intentar capturar finalmente cuando se trabaja con recursos?
Normalmente, cuando se usa try-catch-finally , el bloque final se usa para cerrar recursos. Java 7 introduce la nueva declaración de prueba con recursos . Es análogo a try-catch-finally para liberar recursos, pero más compacto y legible. Recordemos cómo se ve try-catch-finally :String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
bufferedWriter.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Ahora reescribamos este código, pero usando try-with-resources :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
bufferedWriter.write(text);
} catch (IOException e) {
e.printStackTrace();
}
Eso es algo más sencillo, ¿no crees? Además del código más simple, hay un par de puntos más a tener en cuenta:
-
En try-with-resources , los recursos declarados entre paréntesis (recursos que se cerrarán) deben implementar la interfaz AutoCloseable y su único método close() .
El método close se ejecuta en un bloque finalmente implícito ; de lo contrario, ¿cómo descubriría el programa exactamente cómo cerrar el recurso?
Pero probablemente rara vez escriba sus propias implementaciones de recursos y su método de cierre.
-
Los bloques se ejecutan en este orden:
- El bloque de prueba .
- El bloque finalmente implícito .
- El bloque catch , que detecta excepciones que ocurren en los pasos anteriores.
- El bloque finalmente explícito .
Como regla general, las excepciones lanzadas más abajo en la lista interrumpen las lanzadas más arriba.
13. ¿Qué son las operaciones bit a bit?
Las operaciones bit a bit son operaciones sobre secuencias de bits. Incluyen operaciones lógicas y cambios bit a bit. Operadores logicos:-
bit a bit AND : compara valores de bits. Cualquier bit establecido en 0 (falso) establece el bit correspondiente en el resultado en 0. Es decir, si un bit es 1 (verdadero) en ambos valores comparados, entonces el bit resultante también será 1.
Denotado como AND o &
Ejemplo: 10111101 y 01100111 = 00100101
-
bit a bit OR : esta operación es la opuesta a la anterior. Cualquier bit establecido en 1 establece el bit correspondiente en el resultado en 1. En consecuencia, si el bit es 0 en ambos valores comparados, entonces el bit resultante también será 0.
Denotado como OR o |
Ejemplo: 10100101 | 01100011 = 11100111
-
bit a bit NOT : este operador se aplica a un solo valor. Voltea (invierte) los bits. Es decir, los bits que eran 1 pasan a ser 0; y los que eran 0 pasan a ser 1.
Denotado como NOT o ~
Ejemplo: ~10100101 = 01011010
-
OR exclusivo bit a bit : compara valores de bits. Si ambos bits son 1, entonces el bit resultante es 0. Si ambos bits son 0, entonces el bit resultante es 0. En otras palabras, para que el bit resultante sea 1, solo uno de los bits debe ser 1, y el otro bit debe ser 0.
Denotado como XOR o ^
Ejemplo: 10100101 ^ 01100011 = 11000110
- 01100011 >> 4 = 00000110
- 01100011 << 3 = 00011000
14. ¿Qué objetos inmutables estándar existen en Java?
Un objeto es inmutable si no permite que cambien sus valores originales. Puede tener métodos que devuelvan nuevos objetos del mismo tipo con valores diferentes. Algunos objetos inmutables estándar incluyen:- Sin duda, el tipo inmutable más famoso de Java es String;
- instancias de las clases contenedoras que envuelven tipos estándar: booleano, carácter, byte, corto, entero, largo, doble, flotante;
- Objetos BigInteger y BigDecimal, que normalmente se utilizan para números especialmente GRANDES;
- Objetos StackTraceElement que forman un seguimiento de pila (por ejemplo, el seguimiento de pila de una excepción);
- un objeto de la clase Archivo: puede modificar archivos, pero al mismo tiempo el objeto en sí permanece sin cambios;
- UUID, que a menudo se utilizan para identificar elementos de forma única;
- todos los objetos de clases en el paquete java.time;
- Objetos locales, que se utilizan para identificar una región geográfica, política o cultural.
15. ¿Cuáles son las ventajas de los objetos inmutables sobre los objetos ordinarios?
-
Los objetos inmutables son seguros de usar en un entorno multiproceso . Lo hacen para que no tengas que preocuparte por la pérdida de datos debido a las condiciones de la carrera. Esto es diferente a cuando trabajas con objetos comunes. En ese caso, hay que pensar e idear buenos mecanismos al utilizar el objeto en un entorno paralelo.
-
Los objetos inmutables sirven como claves en un mapa. Si usa un objeto mutable como clave HashMap y luego el estado del objeto cambia, entonces la estructura de datos podría confundirse: el objeto seguirá presente, pero si usa contieneKey(), es posible que no lo encuentre.
-
Los objetos inmutables son excelentes para almacenar datos inmutables (constantes) que nunca deben cambiarse mientras se ejecuta el programa.
-
Otra ventaja es la atomicidad del fallo. Si un objeto inmutable genera una excepción, no quedará en un estado no deseado (roto).
-
Estas clases son fáciles de probar.
-
No necesita ningún mecanismo adicional, como un constructor de copias o una implementación de clonación de objetos.
Preguntas sobre POO
16. ¿Cuáles son las ventajas de la programación orientada a objetos en general y en comparación con la programación procesal?
Bien, ventajas de la programación orientada a objetos:-
Las aplicaciones complejas son más fáciles de escribir usando programación orientada a objetos que con programación procedimental, ya que todo se divide en pequeños módulos (objetos que interactúan entre sí) y, como resultado, la programación se reduce a relaciones entre objetos.
-
Las aplicaciones escritas con programación orientada a objetos son mucho más fáciles de modificar (cuando se observan adecuadamente los principios de diseño).
-
Dado que tanto los datos como las operaciones de datos forman una sola entidad, no se manchan por toda la aplicación (como suele ser el caso en la programación de procedimientos).
-
El principio de encapsulación protege los datos más críticos del usuario.
-
El mismo código se puede reutilizar con datos diferentes porque las clases te permiten crear muchos objetos, cada uno con sus propios valores.
-
La herencia y el polimorfismo también le permiten reutilizar y ampliar el código existente (en lugar de duplicar funciones similares).
-
Ampliar una solicitud es más sencillo que hacerlo mediante un enfoque procesal.
-
El enfoque OOP permite abstraer los detalles de implementación.
17. Cuéntanos qué desventajas tiene la programación orientada a objetos
Lamentablemente también existen:-
La programación orientada a objetos requiere muchos conocimientos teóricos que deben dominarse antes de poder escribir algo.
-
Las ideas de programación orientada a objetos no son tan fáciles de entender y aplicar en la práctica (en el fondo hay que ser un pequeño filósofo).
-
La programación orientada a objetos reduce ligeramente el rendimiento de un programa debido a la mayor complejidad del sistema.
-
El enfoque OOP requiere más memoria ya que todo consta de clases, interfaces y métodos, que ocupan mucha más memoria que las variables ordinarias.
-
El tiempo requerido para el análisis inicial es mayor que para un enfoque procesal.
18. ¿Qué es el polimorfismo estático versus el polimorfismo dinámico?
El polimorfismo permite que objetos de la misma clase o interfaz se comporten de manera diferente. Hay dos tipos de polimorfismo, que también se conocen como unión temprana y tardía. Polimorfismo estático o unión temprana:- ocurre en el momento de la compilación (al principio del ciclo de vida del programa);
- decide qué método ejecutar en tiempo de compilación;
- la sobrecarga de métodos es un ejemplo de polimorfismo estático;
- la vinculación anticipada incluye métodos privados, estáticos y finales;
- la herencia no está involucrada en la vinculación anticipada;
- El polimorfismo estático no involucra objetos específicos, sino información sobre el tipo de clase que aparece a la izquierda del nombre de una variable.
- ocurre en tiempo de ejecución (mientras el programa se está ejecutando);
- el polimorfismo dinámico decide qué implementación específica tendrá un método en tiempo de ejecución;
- la anulación de métodos es un ejemplo de polimorfismo dinámico;
- vinculación tardía significa asignar un objeto específico, una referencia de su tipo o su superclase;
- la herencia está asociada con el polimorfismo dinámico.
GO TO FULL VERSION