Cuestionario
Cuestionario
Cuestionario
3
Herencia
● La herencia proporciona a un objeto la
capacidad de adquirir los campos y métodos de
otra clase, llamada clase base. La herencia
proporciona la posibilidad de volver a usar el
código y se puede usar para agregar
características adicionales a una clase
existente, sin modificarla.
4
Abstracción
● La abstracción es el proceso de separar ideas de instancias
específicas y así desarrollar clases en términos de su propia
funcionalidad, en lugar de sus detalles de implementación.
Java admite la creación y existencia de clases abstractas que
exponen interfaces, sin incluir la implementación real de todos
los métodos. La técnica de abstracción tiene como objetivo
separar los detalles de implementación de una clase de su
comportamiento.
5
Diferencias entre Abstraccion y
Encapsulacion
● La abstracción y la encapsulación son conceptos
complementarios. Por un lado, la abstracción se centra en el
comportamiento de un objeto. Por otro lado, la encapsulación
se enfoca en la implementación del comportamiento de un
objeto. La encapsulación generalmente se logra al ocultar
información sobre el estado interno de un objeto y, por lo tanto,
puede verse como una estrategia utilizada para proporcionar
abstracción
6
Preguntas generales sobre Java
¿Qué es JVM? ¿Por qué Java se llama el "Lenguaje de
Programación Independiente de Plataforma"?
9
¿Qué significa la palabra clave "static"? ¿Puedes
sobreescribir el método private o static en Java?
10
¿Se puede acceder a variables no estáticas en
contexto estático?
● Una variable estática en Java pertenece a su clase y su valor
permanece igual para todas sus instancias. Una variable
estática se inicializa cuando la clase es cargada por la JVM. Si
su código intenta acceder a una variable no estática, sin
ninguna instancia, el compilador se quejará, porque esas
variables aún no se han creado y no están asociadas a ninguna
instancia
11
¿Cuáles son los tipos de datos compatibles con Java? ¿Qué es Autoboxing and Unboxing?
● datos primitivos compatibles con el lenguaje de programación Java son:
● byte
● short
● int
● long
● float
● double
● boolean
● char
● Autoboxing es la conversión automática hecha por el compilador Java entre los tipos primitivos y sus
correspondientes object wrapper classes. Por ejemplo, el compilador convierte un int a an Integer, un double
a a Double, y así sucesivamente. Si la conversión se realiza de otra manera, se llama a esta operación
unboxing.
12
¿Qué es la sobreescritura y
sobrecarga de metodos en Java?
● La sobrecarga de métodos en Java ocurre cuando dos o más
métodos en la misma clase tienen exactamente el mismo
nombre, pero diferentes parámetros. Por otro lado, la
sobreescritura de métodos se define como el caso cuando una
clase secundaria redefine el mismo método que una clase
principal. Los métodos reemplazados deben tener el mismo
nombre, lista de argumentos y tipo de devolución. El método
principal puede no limitar el acceso del método que anula.
13
¿Qué es un Constructor, Constructor
Overloading en Java y Copy-Constructor?
● Un constructor se invoca cuando se crea un nuevo objeto. Cada clase tiene un
constructor . En caso de que el programador no proporcione un constructor para una
clase, el compilador de Java (Javac) crea un constructor predeterminado para esa
clase. La sobrecarga del constructor es similar a la sobrecarga de métodos en Java.
Se pueden crear diferentes constructores para una sola clase. Cada constructor
debe tener su propia lista de parámetros únicos. Finalmente, Java admite
constructores de copia como C ++, pero la diferencia radica en el hecho de que Java
no crea un constructor de copia predeterminado si no escribe el suyo propio.
14
¿Admite Java una herencia múltiple?
● No, Java no admite herencia múltiple. Cada clase puede extenderse solo en una
clase, pero puede implementar más de una interfaz.
● https://www.javacodegeeks.com/2014/04/abstract-class-versus-interface-in-the-jdk-8-
era.html
15
¿Cuál es la diferencia entre una
interfaz y una clase abstracta?
● interfaces y clases abstractas. Ambas implementaciones comparten algunas
características comunes, pero difieren en las siguientes características:
● Todos los métodos en una interfaz son implícitamente abstractos. Por otro lado, una
clase abstracta puede contener métodos abstractos y no abstractos.
● Una clase puede implementar un número de Interfaces, pero puede extender solo
una clase abstracta.
● Para que una clase implemente una interfaz, debe implementar todos sus métodos
declarados. Sin embargo, una clase puede no implementar todos los métodos
declarados de una clase abstracta. Aunque, en este caso, la subclase también debe
declararse como abstracta.
16
● Las clases abstractas pueden implementar interfaces sin siquiera proporcionar la
implementación de métodos de interfaz.
● Las variables declaradas en una interfaz Java son predeterminadas por defecto. Una
clase abstracta puede contener variables no finales.
● Los miembros de una interfaz Java son públicos por defecto. Un miembro de una
clase abstracta puede ser privado, protegido o público.
● Una interfaz es absolutamente abstracta y no puede ser instanciada. Una clase
abstracta tampoco puede crearse una instancia, pero puede invocarse si contiene un
método principal.
17
¿Qué es paso por referencia y paso
por valor?
● Cuando un objeto se pasa por valor, esto significa que se pasa
una copia del objeto. Por lo tanto, incluso si se realizan
cambios en ese objeto, no afecta el valor original. Cuando un
objeto se pasa por referencia, esto significa que el objeto real
no se pasa, sino que se pasa una referencia del objeto. Por lo
tanto, cualquier cambio realizado por el método externo,
también se refleja en todos los lugares.
18
Hilos en Java(Java Threads)
¿Cuál es la diferencia entre procesos e hilos?
20
Explicar diferentes formas de crear un hilo.
¿Cuál preferirías y por qué?
● Hay tres formas que se pueden utilizar para crear Threads:
○ Una clase puede extender la clase Thread.
21
Explica los estados de hilos disponibles en un nivel
alto
● Durante su ejecución, un hilo puede residir en uno de los siguientes states:
● NEW: El hilo está listo para ejecutarse, pero no necesariamente comienza a ejecutarse
inmediatamente.
● RUNNABLE: La máquina virtual Java (JVM) está ejecutando activamente el código del
subproceso.
● BLOCKED: El subproceso está bloqueado mientras espera un bloqueo de monitor.
● WAITING: El subproceso espera que otro subproceso realice una acción particular.
24
¿Qué es un punto muerto(deadlock)?
● Una condición que ocurre cuando dos procesos
están esperando el uno al otro para completar,
antes de continuar. El resultado es que ambos
procesos esperan infinitamente.
● https://www.javacodegeeks.com/2013/01/java-deadlock-example-how-to-analyze-de
adlock-situation.html
25
¿Cómo se asegura de que N threads puedan acceder a
N recursos sin interbloqueo(deadlock)?
● Una forma muy simple de evitar el dealock al
utilizar N threads es imponer un orden en los
bloqueos y forzar a cada subproceso a seguir
ese orden. Por lo tanto, si todos los
subprocesos bloquean y desbloquean los
mutex en el mismo orden, no pueden surgir
interbloqueos
26
Java Collections
¿Cuáles son las interfaces básicas de Java
Collections Framework?
● Java Collections Framework proporciona un conjunto bien diseñado de interfaces y
clases que admiten operaciones en colecciones de objetos. Las interfaces más básicas
que residen en el marco de colecciones de Java son:
○ Collection, que representa un grupo de objetos conocidos como sus elementos.
○ Set, que es una colección que no puede contener elementos duplicados.
○ Map, que es un objeto que asigna claves a valores y no puede contener claves
duplicadas.
28
¿Por qué Collection no extiende las interfaces
Cloneable y Serializable?
● La interfaz Collection especifica grupos de objetos conocidos
como elementos. Cada implementación concreta de Collection
puede elegir su propia forma de cómo mantener y ordenar sus
elementos. Algunas colecciones permiten claves duplicadas,
mientras que otras colecciones no lo hacen. La semántica y las
implicaciones de la clonación o la serialización entran en juego
cuando se trata de implementaciones reales. Por lo tanto, las
implementaciones concretas de las colecciones deben decidir
cómo se pueden clonar o serializar.
29
¿Qué es un iterador?
● La interfaz Iterator proporciona una cantidad de
métodos que pueden iterar sobre cualquier
Collection. Cada Java Collection contiene el
método iterator que devuelve una instancia
Iterator. Los iteradores son capaces de
eliminar elementos de la colección subyacente
durante la iteración.
30
¿Qué diferencias existen entre Iterator y
ListIterator?
● Las diferencias de estos elementos se enumeran a continuación:
● Se puede usar un iterator para recorrer las colecciones Set y List, mientras que
ListIterator se puede usar para iterar solo sobre las Lists.
● El Iterator puede recorrer una colección solo en la dirección de avance, mientras
que ListIterator puede atravesar a List en ambas direcciones.
● El ListIterator implementa la interfaz Iterator y contiene funcionalidad adicional, tal
como la adición de un elemento, en sustitución de un elemento, conseguir la
posición de índice para los elementos anteriores y siguientes, etc.
31
¿Cuál es la diferencia entre fail-fast
y fail-safe?
● La propiedad fail-safe de los iterator funciona con el clon de
la colección subyacente y, por lo tanto, no se ve afectada por
ninguna modificación en la colección.
● Todas las clases de colección en el paquete java.util son
fail-fast, mientras que las clases de colección en
java.util.concurrent son fail-safe. Los fail-fast iterator lanzan
una Excepcion ConcurrentModificationException, mientras
que el iterator fail-safe nunca arroja una excepción
32
¿Cómo funciona HashMap en Java?
● Un HashMap en Java almacena pares clave-valor . El HashMap requiere una
función hash y utiliza los metodos hashCode y equals, con el fin de poner y
recuperar elementos desde y hacia la colección respectivamente. Cuando se invoca
el método put, HashMap calcula el valor hash de la clave y almacena el par en el
índice apropiado dentro de la colección. Si la clave existe, su valor se actualiza con
el nuevo valor. Algunas características importantes de a HashMap son su capacidad,
su factor de carga y el redimensionamiento del umbral.
● https://www.javacodegeeks.com/2014/03/how-hashmap-works-in-java.html
33
¿Cuál es la importancia de los métodos
hashCode() y equals()?
● En Java, un HashMap utiliza los métodos hashCode() y equals() para determinar el
índice del par clave-valor y para detectar duplicados. Más específicamente, el
metodo hashCode() se usa para determinar dónde se almacenará la clave
especificada. Dado que las diferentes claves pueden producir el mismo valor hash,
el metodo equals() para determinar si la clave especificada realmente existe en la
colección o no. Por lo tanto, la implementación de ambos métodos es crucial para la
precisión y eficiencia del HashMap.
34
¿Qué diferencias existen entre HashMap y
Hashtable?
● Tanto la clase HashMap como la clase Hashtable implementan la interfaz Map y, por lo tanto, tienen
características muy similares. Sin embargo, difieren en las siguientes características:
● Un HashMap permite la existencia de claves y valores nulos, mientras que Hashtable no permite ni claves
nulas, ni valores nulos.
● Un Hashtable está sincronizado, mientras que a HashMap no. Por lo tanto, HashMap se prefiere en entornos
de un solo subproceso(single-threaded), mientras que a Hashtable es adecuado para entornos de múltiples
subprocesos(multi-threaded).
● Un HashMap proporciona su conjunto de claves y una aplicación Java puede iterar sobre ellas. Por lo tanto,
a HashMap es fail-fast. Por otro lado, a Hashtable proporciona una Enumeration de sus claves.
35
¿Cuál es la diferencia entre Array y ArrayList? ¿Cuándo
usarás Array sobre ArrayList?
● Las clases Array y ArrayList difieren en las siguientes características:
●
● Un ArrayList es una estructura de datos basada en índice respaldada por un Array. Proporciona acceso
aleatorio a sus elementos con un rendimiento igual a O(1). Por otro lado, un LinkedList almacena sus datos
como una lista de elementos y cada elemento está vinculado a su elemento anterior y siguiente. En este
caso, la operación de búsqueda de un elemento tiene un tiempo de ejecución igual a O(n).
● Las operaciones de inserción, adición y eliminación de un elemento son más rápidas en LinkedList
comparación con un ArrayList, porque no hay necesidad de cambiar el tamaño de una matriz o actualizar el
índice cuando se agrega un elemento en una posición arbitraria dentro de la colección.
● Un LinkedList consume más memoria que an ArrayList, porque cada nodo en un LinkedList almacena dos
referencias, una para su elemento anterior y otra para su próximo elemento.
● https://www.javacodegeeks.com/2013/12/arraylist-vs-linkedlist.html 37
¿Qué es la interfaz Comparable y
Comparator? Enumera sus diferencias.
● Java proporciona la interfaz Comparable, que contiene solo un método, llamado
compareTo(). Este método compara dos objetos para imponer un orden entre ellos.
Específicamente, devuelve un entero negativo, cero o un entero positivo para indicar
que el objeto de entrada es menor, igual o mayor que el objeto existente. Java
proporciona la interfaz Comparator, que contiene dos métodos, llamado compare()
y equals(). El primer método compara sus dos argumentos de entrada e impone un
orden entre ellos. Devuelve un entero negativo, cero o un entero positivo para indicar
que el primer argumento es menor, igual o mayor que el segundo. El segundo
método requiere un objeto como parámetro y tiene como objetivo decidir si el objeto
de entrada es igual al comparador. El método devuelve verdadero, solo si el objeto
especificado también es un comparador e impone el mismo orden que el
comparador.
38
¿Qué es Java Priority Queue?
● El PriorityQueuees una cola ilimitada, basada en el priority heap y sus elementos
están ordenados en su orden natural. En el momento de su creación, podemos
proporcionar un Comparator que es responsable de ordenar los elementos del
PriorityQueue. una PriorityQueue no permite valores nulos , esos objetos que no
proporcionan un orden natural o aquellos objetos que no tienen ningún Comparator
asociado. Finalmente, Java PriorityQueue no es thread-safe y requiere tiempo
O(log(n)) para sus operaciones de enqueing y dequeing.
39
¿Qué sabe acerca de la notación de la Big-O y puede
dar algunos ejemplos con respecto a las diferentes
estructuras de datos
● La notación Big-O simplemente describe qué tan bien un algoritmo escala o se
desempeña en el peor de los casos a medida que aumenta el número de elementos
en una estructura de datos. La notación Big-O también se puede usar para describir
otros comportamientos, como el consumo de memoria. Dado que las clases de
recopilación son en realidad estructuras de datos, generalmente usamos la notación
Big-O para elegir la mejor implementación para usar, en función del tiempo, la
memoria y el rendimiento. La notación Big-O puede dar una buena indicación sobre
el rendimiento para grandes cantidades de datos.
● https://www.javacodegeeks.com/2011/04/simple-big-o-notation-post.html
40
¿Cuál es la compensación entre usar una matriz
desordenada versus una matriz ordenada?
● La principal ventaja de una matriz ordenada es que los tiempos
de búsqueda tienen una complejidad temporal de O(log n), en
comparación con la de una matriz desordenada, que es O(n).
La desventaja de una matriz ordenada es que la operación de
inserción tiene una complejidad temporal de O(n), porque los
elementos con valores más altos deben moverse para dejar
espacio para el nuevo elemento. En cambio, la operación de
inserción para una matriz desordenada toma un tiempo
constante de O(1).
41
¿Cuáles son algunas de las mejores prácticas
relacionadas con el marco de Java Collection?
● Elegir el tipo correcto de la colección para usar, en función de las necesidades de la aplicación, es crucial
para su rendimiento. Por ejemplo, si el tamaño de los elementos es fijo y se conoce a priori, utilizaremos un
Array, en lugar de un ArrayList.
● Algunas clases de colección nos permiten especificar su capacidad inicial. Por lo tanto, si tenemos una
estimación sobre la cantidad de elementos que se almacenarán, podemos usarla para evitar el reajuste o
cambio de tamaño.
● Siempre use Generics para seguridad de tipo, legibilidad y robustez. Además, al usar Generics evitas el
ClassCastExceptiondurante el tiempo de ejecución.
● Utilice clases inmutables proporcionadas por el Java Development Kit (JDK) como clave en un Map, para
evitar la implementación de los metodos equals() y hashCode() para una clase personalizada.
● Devuelve colecciones o matrices de longitud cero en lugar de devolver un valor nulo en caso de que la
colección subyacente esté realmente vacía.
42
¿Cuál es la diferencia entre las interfaces
Enumeration e Iterator?
● Enumeration es dos veces más rápido que un iterator y usa
muy poca memoria. Sin embargo, iterator es mucho más
seguro en comparación con Enumeration, porque otros
subprocesos no pueden modificar el objeto de colección que
está atravesando actualmente iterator. Además, Iterator nos
permite que la persona que llama elimine elementos de la
colección subyacente, algo con lo que no es posible
Enumerations.
43
¿Cuál es la diferencia entre HashSet y TreeSet?
● El HashSet se implementa utilizando una tabla hash y, por lo
tanto, sus elementos no están ordenados. Los métodos add,
remove y contains de un HashSet tienen una complejidad de
tiempo constante O(1). Por otro lado, a TreeSet se implementa
usando una estructura de árbol. Los elementos en a TreeSet
están ordenados, y por lo tanto, los métodos add, remove y
contains tienen una complejidad temporal de O(log n).
44
Garbage Collectors
¿Cuál es el propósito de la recolección de basura
en Java y cuándo se usa?
● El propósito de la recolección de basura es
identificar y descartar aquellos objetos que la
aplicación ya no necesita, para que los
recursos se recuperen y reutilicen.
● 46
¿Qué hacen los métodos System.gc () y Runtime.gc ()?
47
¿Cuándo se llama al finalize ()? ¿Cuál es el
propósito de la finalización?
● El recolector de basura llama al método
finalize(), justo antes de liberar la memoria del
objeto. Por lo general, se recomienda liberar
recursos guardados por el objeto dentro del
método finalize().
48
Si una referencia de objeto se establece en nulo,
¿Garbage Collector liberará inmediatamente la memoria
que tiene ese objeto?
● No, el objeto estará disponible para la
recolección de basura en el siguiente ciclo del
recolector de basura.
49
¿Cuál es la estructura de Java Heap?
¿Qué es el espacio Perm Gen en Heap?
● La JVM tiene un HEAP que es el área de datos de tiempo de ejecución a partir de la
cual se asigna la memoria para todas las instancias de clase y matrices. Se crea en
la puesta en marcha de JVM. La memoria de pila para objetos es reclamada por un
sistema de gestión de memoria automático que se conoce como recolector de
basura. La memoria del HEAP consiste en objetos vivos y muertos. La aplicación
puede acceder a los objetos en vivo y no serán objeto de recolección de basura. Los
objetos muertos son aquellos a los que la aplicación nunca accederá, pero que aún
no han sido recolectados por el recolector de basura. Dichos objetos ocupan el
espacio de la memoria del HEAP hasta que finalmente son recogidos por el
recolector de basura.
● https://www.javacodegeeks.com/2014/04/java-interview-questions-and-answers.html
50
¿Cuál es la diferencia entre el recolector de basura en
serie y en el rendimiento?
● El recolector de basura de rendimiento utiliza una versión
paralela del colector de generación joven y está destinado a ser
utilizado con aplicaciones que tienen conjuntos de datos
medianos a grandes. Por otro lado, el colector serial
generalmente es adecuado para la mayoría de las aplicaciones
pequeñas (aquellas que requieren montones de hasta
aproximadamente 100MB en procesadores modernos).
51
¿Cuándo un objeto se vuelve elegible para la
recolección de basura en Java?
● Un objeto Java está sujeto a la recolección de
basura cuando no se puede acceder al
programa en el que se utiliza actualmente.
52
¿Se produce la recolección de basura en el
espacio de generación permanente en JVM?
● La recolección de basura ocurre en el espacio de PermGen y si el espacio de
PermGen está lleno o cruza un umbral, puede desencadenar una recolección de
basura completa. Si observa detenidamente el resultado del recolector de basura,
verá que el espacio PermGen también es basura. Esta es la razón por la cual el
tamaño correcto del espacio PermGen es importante para evitar la recolección
frecuente de basura completa.
● https://www.javacodegeeks.com/2013/02/java-8-from-permgen-to-metaspace.html
53
Exception Handling
¿Cuáles son los dos tipos de excepciones en Java?
¿Cuáles son las diferencias entre ellos?
● Java tiene dos tipos de excepciones: excepciones controladas
y excepciones no controladas. Las excepciones no controladas
no necesitan ser declaradas en un método o cláusula throws de
un constructor, si pueden ser lanzadas por la ejecución del
método o el constructor, y propagarse fuera del método o del
límite del constructor. Por otro lado, las excepciones
controladas deben declararse en un método o cláusula throws
de un constructor.
● http://www.javacodegeeks.com/2013/07/java-exception-handling-tutorial-with-exampl
es-and-best-practices.html
55
¿Cuál es la diferencia entre Exception y Error en
java?
● Exception y la clase Error son ambas subclases
de la clase Throwable. La clase Exception se
usa para condiciones excepcionales que el
programa de un usuario debería atrapar. La
clase Error define excepciones que no están
exceptuadas para ser capturadas por el
programa de usuario.
56
¿Cuál es la diferencia entre throw y throws?
57
¿Cuál es la importancia de finally en el manejo de
excepciones?
● Un bloque finally siempre se ejecutará, independientemente de que se haya lanzado o no una excepción. Incluso en el caso en que
falta la declaración catch y se lanza una excepción, el bloque finally se ejecutará. Lo último que hay que mencionar es que el bloque
finally se usa para liberar recursos como búferes de E / S, conexiones de bases de datos, etc.
58
¿Qué pasará con el objeto Exception después del manejo de excepciones?
59