# Quiz de la fase 1: Java Vanilla — El Núcleo del Lenguaje (17 & 21)

> 19 afirmaciones de verdadero o falso, con la respuesta explicada, sobre los días de esta fase del plan JavaMastery.

Versión interactiva: https://aprende-java.webs-economicas.es/quiz/fase-1/

## Afirmaciones

### 1. Comparar dos `Integer` con `==` compara siempre su valor numérico.

**Respuesta:** Falso. `==` compara referencias. Entre -128 y 127 suele funcionar por la caché de `Integer.valueOf`, y fuera de ese rango falla. Usa `equals`.

**Para recordarlo:** Con objetos, `==` pregunta «¿es el mismo objeto?». Para comparar valores, `equals` siempre.

Se estudia en el [día 2: Cimientos del Lenguaje, POO Limpia y Records Inmutables](https://aprende-java.webs-economicas.es/dias/poo-limpia-records.md).

### 2. Un `record` puede tener métodos propios y un constructor compacto para validar sus datos.

**Respuesta:** Verdadero. El constructor compacto (`record Email(String value) { Email { ... } }`) es el sitio para las invariantes.

**Para recordarlo:** Record = datos + reglas. Las reglas van en el constructor compacto.

Se estudia en el [día 2: Cimientos del Lenguaje, POO Limpia y Records Inmutables](https://aprende-java.webs-economicas.es/dias/poo-limpia-records.md).

### 3. Como los campos de un record son `final`, un record que contiene una `List` es completamente inmutable.

**Respuesta:** Falso. `final` impide reasignar la referencia, no modificar la lista. Para blindarlo, copia en el constructor con `List.copyOf(...)`.

**Para recordarlo:** `final` congela la referencia, no el contenido. Haz una copia defensiva con `List.copyOf` en el constructor.

Se estudia en el [día 2: Cimientos del Lenguaje, POO Limpia y Records Inmutables](https://aprende-java.webs-economicas.es/dias/poo-limpia-records.md).

### 4. Si sobrescribes `equals` sin sobrescribir `hashCode`, `HashMap` y `HashSet` pueden no encontrar objetos que son iguales.

**Respuesta:** Verdadero. Las colecciones hash buscan primero por `hashCode`. Dos objetos iguales con hash distinto acaban en cubos distintos.

**Para recordarlo:** Van siempre en pareja: si tocas `equals`, toca `hashCode`. Un record ya los genera por ti.

Se estudia en el [día 4: Memoria JVM, Contrato equals/hashCode y Manejo de Excepciones](https://aprende-java.webs-economicas.es/dias/memoria-jvm-equals-hashcode-excepciones.md).

### 5. `IOException` es una excepción checked: el compilador obliga a capturarla o a declararla con `throws`.

**Respuesta:** Verdadero. Hereda de `Exception` y no de `RuntimeException`, así que es checked.

**Para recordarlo:** Checked = hereda de `Exception` pero no de `RuntimeException`. El compilador te obliga a tratarla.

Se estudia en el [día 4: Memoria JVM, Contrato equals/hashCode y Manejo de Excepciones](https://aprende-java.webs-economicas.es/dias/memoria-jvm-equals-hashcode-excepciones.md).

### 6. `try-with-resources` cierra los recursos en orden inverso al de su declaración.

**Respuesta:** Verdadero. El último recurso abierto se cierra primero, igual que una pila. Así un `ResultSet` se cierra antes que su `Connection`.

**Para recordarlo:** Piensa en una pila: lo último que abres es lo primero que se cierra.

Se estudia en el [día 4: Memoria JVM, Contrato equals/hashCode y Manejo de Excepciones](https://aprende-java.webs-economicas.es/dias/memoria-jvm-equals-hashcode-excepciones.md).

### 7. `List.of(...)` admite elementos `null`.

**Respuesta:** Falso. Las colecciones de `List.of`, `Set.of` y `Map.of` lanzan `NullPointerException` con `null`, además de ser inmutables.

**Para recordarlo:** `List.of` no admite `null` ni cambios. Si necesitas cualquiera de las dos cosas, usa `new ArrayList<>(...)`.

Se estudia en el [día 5: El Collection Framework y Genéricos en Java 17 y 21](https://aprende-java.webs-economicas.es/dias/colecciones-genericos.md).

### 8. `get(i)` es O(1) en `ArrayList` y O(n) en `LinkedList`.

**Respuesta:** Verdadero. `ArrayList` accede directamente al array; `LinkedList` tiene que recorrer nodos desde un extremo.

**Para recordarlo:** Por defecto, `ArrayList`. `LinkedList` casi nunca gana en la práctica.

Se estudia en el [día 5: El Collection Framework y Genéricos en Java 17 y 21](https://aprende-java.webs-economicas.es/dias/colecciones-genericos.md).

### 9. Las operaciones intermedias de un Stream, como `filter` o `map`, no se ejecutan hasta que hay una operación terminal.

**Respuesta:** Verdadero. Los streams son perezosos. Sin `collect`, `forEach`, `count` u otra operación terminal no se procesa ningún elemento.

**Para recordarlo:** Sin operación terminal no pasa nada: `filter` y `map` solo describen el trabajo.

Se estudia en el [día 6: Programación Funcional: Streams, Optional y Pattern Matching en 17/21](https://aprende-java.webs-economicas.es/dias/streams-optional-pattern-matching.md).

### 10. `var` convierte Java en un lenguaje de tipado dinámico.

**Respuesta:** Falso. `var` solo es inferencia en variables locales: el tipo se fija al compilar y no puede cambiar.

**Para recordarlo:** `var` te ahorra escribir el tipo, no lo elimina: el compilador lo fija y ya no cambia.

Se estudia en el [día 2: Cimientos del Lenguaje, POO Limpia y Records Inmutables](https://aprende-java.webs-economicas.es/dias/poo-limpia-records.md).

### 11. En Java 21, un `switch` con pattern matching sobre una `sealed interface` puede ser exhaustivo sin rama `default`.

**Respuesta:** Verdadero. El compilador conoce todos los subtipos permitidos y avisa si falta uno. Añadir `default` haría perder esa comprobación.

**Para recordarlo:** Con `sealed` + `switch`, no pongas `default`: deja que el compilador te avise cuando añadas un subtipo.

Se estudia en el [día 6: Programación Funcional: Streams, Optional y Pattern Matching en 17/21](https://aprende-java.webs-economicas.es/dias/streams-optional-pattern-matching.md).

### 12. `Optional` está pensado para usarse como tipo de los atributos de entidades y DTOs.

**Respuesta:** Falso. Está diseñado como tipo de retorno para expresar "puede no haber valor". No es serializable y complica JPA y JSON.

**Para recordarlo:** `Optional` para lo que devuelves, nunca para lo que guardas.

Se estudia en el [día 6: Programación Funcional: Streams, Optional y Pattern Matching en 17/21](https://aprende-java.webs-economicas.es/dias/streams-optional-pattern-matching.md).

### 13. Una clase `abstract` puede tener constructores y campos con estado.

**Respuesta:** Verdadero. No se puede instanciar directamente, pero sus constructores se ejecutan al crear una subclase (`super(...)`) y sus campos forman parte de cada objeto hijo.

**Para recordarlo:** Abstracta = no se instancia, pero comparte estado y código con sus hijas.

Se estudia en el [día 3: Programación Orientada a Objetos de Verdad: Herencia, Interfaces y Polimorfismo](https://aprende-java.webs-economicas.es/dias/poo-herencia-interfaces-polimorfismo.md).

### 14. Los métodos `static` se pueden sobrescribir en una subclase y se eligen según el tipo real del objeto.

**Respuesta:** Falso. Los métodos `static` se ocultan, no se sobrescriben: se eligen al compilar según el tipo declarado. El polimorfismo solo funciona con métodos de instancia.

**Para recordarlo:** Static = decide el compilador. Instancia = decide la JVM al ejecutar.

Se estudia en el [día 3: Programación Orientada a Objetos de Verdad: Herencia, Interfaces y Polimorfismo](https://aprende-java.webs-economicas.es/dias/poo-herencia-interfaces-polimorfismo.md).

### 15. Con `public boolean equals(Tarea otra)` estás sobrescribiendo el `equals` de `Object`.

**Respuesta:** Falso. Lo estás sobrecargando: la firma de `Object` es `equals(Object o)`, así que las colecciones seguirán usando el `equals` heredado. `@Override` lo habría detectado al compilar.

**Para recordarlo:** Pon siempre `@Override`: si la firma no coincide, el compilador te avisa.

Se estudia en el [día 3: Programación Orientada a Objetos de Verdad: Herencia, Interfaces y Polimorfismo](https://aprende-java.webs-economicas.es/dias/poo-herencia-interfaces-polimorfismo.md).

### 16. Guardar un enum en base de datos con `EnumType.ORDINAL` es seguro aunque añadas constantes al principio.

**Respuesta:** Falso. `ORDINAL` guarda la posición. Si insertas o reordenas constantes, los números antiguos pasan a significar otra cosa sin que nada falle.

**Para recordarlo:** Enums en base de datos: siempre `@Enumerated(EnumType.STRING)`.

Se estudia en el [día 3: Programación Orientada a Objetos de Verdad: Herencia, Interfaces y Polimorfismo](https://aprende-java.webs-economicas.es/dias/poo-herencia-interfaces-polimorfismo.md).

### 17. `Instant` representa un momento exacto en la línea del tiempo, independiente de la zona horaria.

**Respuesta:** Verdadero. Cuenta segundos y nanosegundos desde 1970 en UTC. Para mostrarlo a una persona se convierte con `atZone(zona)`.

**Para recordarlo:** Registrar cuándo pasó algo: `Instant`. Mostrarlo: conviértelo a la zona del usuario.

Se estudia en el [día 7: APIs del Día a Día: Fechas, Texto, Ficheros, HTTP y Logging](https://aprende-java.webs-economicas.es/dias/fechas-texto-ficheros-http-logging.md).

### 18. `HttpClient` lanza una excepción cuando el servidor responde con un 404 o un 500.

**Respuesta:** Falso. La respuesta llega con normalidad y tienes que comprobar `statusCode()`. Solo los fallos de red y los timeouts lanzan excepción.

**Para recordarlo:** Con `HttpClient`, mira siempre `statusCode()` antes de usar el cuerpo.

Se estudia en el [día 7: APIs del Día a Día: Fechas, Texto, Ficheros, HTTP y Logging](https://aprende-java.webs-economicas.es/dias/fechas-texto-ficheros-http-logging.md).

### 19. En `log.error("Fallo en {}", id, e)`, SLF4J imprime el stack trace de `e` aunque no tenga marcador `{}`.

**Respuesta:** Verdadero. Si el último argumento es un `Throwable` que no consume ningún marcador, SLF4J lo trata como la excepción del mensaje e imprime su traza completa.

**Para recordarlo:** La excepción va siempre como último argumento del log, nunca `e.getMessage()`.

Se estudia en el [día 7: APIs del Día a Día: Fechas, Texto, Ficheros, HTTP y Logging](https://aprende-java.webs-economicas.es/dias/fechas-texto-ficheros-http-logging.md).

