Lecciones en español / OCP Java / Hoja de repaso · English
Hoja de repaso de OCP Java 1Z0-831 (Java SE 25)
Dominio 1: Handling date, time, text, numeric and boolean values (12%)
Consejos para el examen
- Revisa cada literal numérico buscando tres cosas: un 0 inicial (octal), un sufijo L o f faltante en un valor que lo necesita, y un guion bajo que toque un prefijo, un sufijo o el punto decimal.
- Cuando veas == entre dos variables Integer, revisa si ambos valores están entre -128 y 127. Si lo están, espera true; si no, espera false. Si un lado es primitivo, es una simple comparación numérica.
- Evalúa los operandos estrictamente de izquierda a derecha, anotando en papel el valor de cada variable después de cada ++ o --. En la asignación compuesta, recuerda el cast oculto: compila donde la forma larga no lo haría.
- Cuando una pregunta asigna un resultado aritmético a byte, short o char, busca la promoción a int. Solo compila con un cast, con una asignación compuesta o cuando toda la expresión es una constante que cabe.
- Antes de elegir una respuesta, anota el tipo de retorno de cada llamada a Math. La mayoría de las preguntas sobre Math son en realidad preguntas de error de compilación sobre round devolviendo long o pow devolviendo double.
- Busca llamadas a métodos de cadena cuyo valor de retorno no se asigna. Como String es inmutable, la variable original no cambia, y ese suele ser el punto central de la pregunta.
- Sigue un mismo objeto StringBuilder a través de cada línea, aplicando cada llamada aunque su resultado no se asigne. Luego revisa la aritmética de índices: todos los métodos de rango usan un final exclusivo.
- La posición del delimitador de cierre controla la sangría: si está en su propia línea y más a la izquierda que el contenido, la diferencia se convierte en espacios iniciales. Si está en la última línea de contenido, no hay salto de línea final.
- Cuando la llamada a un método de fecha y hora no se asigna, el objeto no cambia. Revisa también que el método exista en ese tipo: LocalDate no tiene plusHours, y LocalTime no tiene plusDays.
- Recuerda Period para fechas (P...Y...M...D) y Duration para horas (PT...H...M...S). Al cruzar un cambio de horario, plusDays conserva la hora del reloj, mientras que plusHours(24) conserva el tiempo transcurrido exacto.
Términos clave
- Primitive type (tipo primitivo)
- Uno de los ocho tipos de valor integrados (byte, short, int, long, float, double, char, boolean) que no son objetos.
- Literal
- Un valor fijo escrito en el código fuente, como 42, 3.5f, 'x' o 0b1010.
- Octal literal (literal octal)
- Un literal entero con un 0 inicial, que se lee en base 8, por lo que 010 equivale a 8.
- Default value (valor por defecto)
- El valor que recibe automáticamente un campo o elemento de arreglo: 0, false, '\u0000' o null. Las variables locales no tienen ninguno.
- Wrapper class (clase envoltorio)
- Una clase inmutable como Integer o Double que contiene un valor primitivo como objeto.
- Autoboxing
- La conversión automática de un primitivo a su wrapper, que el compilador realiza mediante valueOf.
- Unboxing
- La conversión automática de un wrapper a su primitivo; lanza NullPointerException si la referencia es null.
- Integer cache (caché de Integer)
- Un conjunto de objetos Integer, al menos de -128 a 127, que Integer.valueOf reutiliza, lo que hace que == parezca funcionar con valores pequeños.
- Operator precedence (precedencia de operadores)
- Las reglas que deciden qué operador de una expresión sin paréntesis se aplica primero.
- Postfix increment (incremento postfijo)
- x++: la expresión produce el valor anterior y luego x aumenta en uno.
- Compound assignment (asignación compuesta)
- Un operador como += que combina una operación con una asignación y convierte el resultado al tipo del operando izquierdo.
- Short-circuit evaluation (evaluación de cortocircuito)
- && y || omiten evaluar el operando derecho cuando el operando izquierdo ya determina el resultado.
- Widening conversion (conversión de ensanchamiento)
- Una conversión automática a un tipo de mayor rango, como de int a long o de float a double.
- Narrowing conversion (conversión de estrechamiento)
- Una conversión a un tipo de menor rango, que necesita un cast explícito salvo que sea una constante de tiempo de compilación que quepa.
- Numeric promotion (promoción numérica)
- La regla por la que los operandos de los operadores aritméticos se convierten a un tipo común de al menos int antes de la operación.
- Compile-time constant (constante de tiempo de compilación)
- Una expresión cuyo valor conoce el compilador, como un literal o una variable final inicializada con un literal.
- Math.round
- Redondea al número entero más cercano con las mitades hacia el infinito positivo; devuelve long para un argumento double e int para un float.
- Math.floor / Math.ceil
- Devuelven el double igual o justo por debajo (floor) o igual o justo por encima (ceil) del argumento, moviéndose hacia el infinito negativo o positivo.
- Math.pow
- Eleva una base double a un exponente double y siempre devuelve un double.
- Overloading by type (sobrecarga por tipo)
- abs, max y min tienen versiones para int, long, float y double, así que el tipo del resultado sigue a los tipos promovidos de los argumentos.
- Immutability (inmutabilidad)
- La propiedad de que el estado de un objeto no puede cambiar después de su creación; los métodos de String devuelven cadenas nuevas en su lugar.
- String pool
- Un área de la JVM que guarda una única copia compartida de cada literal de cadena y de cada cadena constante de tiempo de compilación.
- substring(begin, end)
- Devuelve los caracteres desde begin hasta end, sin incluir end.
- isBlank
- Devuelve true si una cadena está vacía o solo contiene caracteres de espacio en blanco.
- StringBuilder
- Una secuencia de caracteres mutable y no sincronizada cuyos métodos cambian el objeto en el mismo lugar.
- Method chaining (encadenamiento de métodos)
- Llamar un método sobre el resultado de otro; funciona con StringBuilder porque los métodos que lo modifican devuelven this.
- replace(start, end, str)
- Elimina los caracteres de start a end (exclusivo) e inserta str en ese lugar.
- Capacity (capacidad)
- La cantidad de almacenamiento que un StringBuilder tiene reservada, que es independiente de su longitud actual.
- Text block (bloque de texto)
- Un literal String de varias líneas delimitado por tres comillas dobles, cuyo contenido empieza en la línea siguiente al delimitador de apertura.
- Incidental whitespace (espacio en blanco incidental)
- La sangría inicial común que el compilador quita de cada línea de un bloque de texto.
- Line continuation (continuación de línea)
- Una barra invertida al final de una línea de un bloque de texto, que elimina el salto de línea para que la línea siguiente se una a ella.
- \s escape (escape \s)
- Un escape para un único espacio que sobrevive a la eliminación de los espacios en blanco finales.
- LocalDate
- Una fecha inmutable (año, mes, día) sin hora del día y sin zona horaria.
- LocalDateTime
- Una fecha y hora sin zona, así que no identifica un único instante global.
- ZonedDateTime
- Una fecha y hora con un ZoneId, que identifica un momento exacto y aplica el desfase y las reglas de horario de verano de esa zona.
- Instant
- Un punto en la línea de tiempo UTC medido desde el epoch 1970-01-01T00:00:00Z.
- Period
- Una cantidad de tiempo basada en fechas, en años, meses y días, que se imprime como P1Y2M3D.
- Duration
- Una cantidad basada en tiempo guardada como segundos y nanosegundos, que se imprime como PT2H30M.
- DST gap (hueco de horario de verano)
- La hora local que se salta cuando los relojes se adelantan; una hora dentro de ella se desplaza hacia adelante la duración del hueco.
- DST overlap (solapamiento de horario de verano)
- La hora local que se repite cuando los relojes se atrasan; ZonedDateTime mantiene por defecto el desfase anterior.
Dominio 2: Controlling program flow (8%)
Consejos para el examen
- Ignora la indentación. Cuenta sentencias: sin llaves, solo una sentencia pertenece al if o al else, y cada else se une al if sin pareja más cercano.
- Encuentra por dónde entra la ejecución al switch y luego sigue hacia abajo pasando cada etiqueta hasta encontrar un break o la llave de cierre. Un default en medio también hace fall-through.
- En una expresión switch, busca tres errores: un default faltante para selectores int o String, una rama de bloque sin yield, y un return o break usado para salir de la expresión.
- Lee los cases con patrones de arriba hacia abajo y elige el primero que coincida, revisando también la guarda. Un selector null lanza NullPointerException a menos que haya una etiqueta case null.
- Ordena los cases con patrones de lo específico a lo general: subtipos antes que supertipos, con guarda antes que sin guarda, constantes antes que patrones de tipo, y default al final.
- Revisa si la condición se evalúa antes o después del cuerpo: while y for pueden ejecutarse cero veces, do-while siempre se ejecuta al menos una vez. Revisa también que el do-while termine con punto y coma.
- Pregúntate a qué bucle se refiere cada break o continue. Sin etiqueta siempre es el bucle más interno; con etiqueta es el bucle que lleva esa etiqueta. Recuerda que continue en un bucle for sigue ejecutando la actualización.
- Trata if(false) y while(false) de forma distinta: el primero compila, el segundo no. Para las variables locales, rastrea cada camino, incluido un bucle que se ejecuta cero veces y un if sin else.
Términos clave
- Conditional expression (expresión condicional)
- El operador ternario cond ? a : b, que se evalúa a uno de dos valores según un boolean.
- Dangling else (else colgante)
- La regla de que un else se asocia con el if sin pareja más cercano, sin importar la indentación.
- Boolean condition (condición booleana)
- Una expresión de tipo boolean o Boolean, el único tipo que aceptan if, while y el operador ternario.
- Empty statement (sentencia vacía)
- Un punto y coma solo; después de if(...) se convierte en todo el cuerpo del if.
- Fall-through (caída a través)
- En un switch con dos puntos, la ejecución que continúa hacia las sentencias del siguiente case cuando no hay break.
- case label (etiqueta case)
- Una constante de tiempo de compilación que marca un punto de entrada en un switch.
- default label (etiqueta default)
- El punto de entrada usado cuando ningún case coincide; puede aparecer en cualquier parte del switch.
- Selector expression (expresión selectora)
- El valor en switch(...) que se compara con las etiquetas case.
- Switch expression (expresión switch)
- Un switch que se evalúa a un valor; debe ser exhaustivo y no puede hacer fall-through cuando usa etiquetas de flecha.
- Arrow label (etiqueta de flecha)
- case X -> ..., una etiqueta cuyo lado derecho es una única expresión, un bloque o un throw, sin fall-through.
- yield
- Una sentencia que entrega el valor de una expresión switch desde dentro de un bloque o de un grupo con dos puntos.
- Exhaustiveness (exhaustividad)
- El requisito de que una expresión switch cubra todos los valores posibles de su selector.
- Type pattern (patrón de tipo)
- Un patrón como String s que coincide cuando el valor es instancia del tipo y lo vincula a una variable.
- Record pattern (patrón de record)
- Un patrón como Point(int x, int y) que coincide con un record y extrae sus componentes.
- Guard (guarda)
- Una cláusula when después de un patrón que agrega una condición booleana para que el case coincida.
- case null
- Una etiqueta que permite que un switch con patrones maneje un selector null en lugar de lanzar NullPointerException.
- Dominance (dominancia)
- Un case está dominado cuando un case anterior coincide con todos los valores con los que él podría coincidir, lo que lo hace inalcanzable y es un error de compilación.
- Exhaustive switch (switch exhaustivo)
- Un switch cuyos cases cubren todos los valores posibles del selector, requerido para expresiones switch y switch con patrones.
- Unconditional pattern (patrón incondicional)
- Un patrón que coincide con todos los valores del tipo del selector, como case Object o para un selector Object.
- MatchException
- La excepción de tiempo de ejecución que lanza un switch exhaustivo si encuentra un valor que sus cases compilados no cubren, como un subtipo agregado recientemente.
- do-while loop (bucle do-while)
- Un bucle que ejecuta su cuerpo una vez antes de evaluar la condición, así que siempre se ejecuta al menos una vez.
- Enhanced for loop (bucle for mejorado)
- for (T x : source), que visita cada elemento de un arreglo o Iterable sin índice.
- Iterable
- La interfaz que permite usar un objeto como fuente de un bucle for mejorado.
- Infinite loop (bucle infinito)
- Un bucle cuya condición nunca se vuelve false, como while(true) o for(;;), del que normalmente se sale con break o return.
- break
- Termina el bucle o switch más interno que lo contiene, o la sentencia etiquetada que nombra.
- continue
- Salta el resto de la iteración actual del bucle más interno, o del bucle etiquetado que nombra.
- Label (etiqueta)
- Un identificador seguido de dos puntos colocado antes de una sentencia para que break o continue puedan apuntar a ella.
- Nested loop (bucle anidado)
- Un bucle dentro de otro bucle; un break o continue sin etiqueta afecta solo al interno.
- Unreachable statement (sentencia inalcanzable)
- Una sentencia que el compilador puede demostrar que nunca se ejecutará, lo cual es un error de compilación en Java.
- Definite assignment (asignación definida)
- La regla del compilador según la cual una variable local debe asignarse en cada camino antes de leerse.
- Constant expression (expresión constante)
- Una expresión que el compilador puede evaluar, como true o una variable final que contiene un literal, usada en el análisis de alcanzabilidad.
- Missing return statement
- El error que se reporta cuando un método que no es void puede llegar a su final sin devolver un valor.
Dominio 3: Using object-oriented concepts in Java (20%)
Consejos para el examen
- Lo estático se ejecuta una vez, el padre antes que el hijo. Para cada objeto nuevo: inicializadores y cuerpo del constructor del padre, luego inicializadores del hijo, luego cuerpo del constructor del hijo. Los inicializadores se ejecutan en el orden del código fuente.
- En un prólogo, lo permitido es: parámetros, variables locales, llamadas estáticas, lanzar excepciones y asignar campos de esta clase. Lo no permitido es: leer campos, llamar a métodos de instancia, super.x, return o poner super(...) dentro de un bloque.
- Los métodos de instancia siguen al objeto; los campos y los métodos estáticos siguen al tipo de la referencia. Para la sobrescritura, revisa la firma, el retorno covariante, que el acceso no sea más restringido y que no haya excepciones checked nuevas o más amplias.
- Los métodos de interfaz son public, se escriba o no, así que las implementaciones deben ser public. Los métodos estáticos de interfaz se llaman solo con el nombre de la interfaz, y los defaults duplicados deben resolverse con una sobrescritura.
- Los accesores de un record se llaman como los componentes (name(), no getName()). En un constructor compacto, reasigna los parámetros, nunca this.campo, y nunca declares una lista de parámetros.
- Toda subclase permitida necesita exactamente uno de final, sealed o non-sealed, a menos que sea un record o un enum, que son implícitamente final. El código del módulo sin nombre debe mantenerlas en el mismo paquete.
- Los constructores de enum son private y se ejecutan una vez por constante al inicializar la clase. valueOf distingue mayúsculas de minúsculas y lanza IllegalArgumentException, y la lista de constantes necesita punto y coma cuando le siguen miembros.
- Crear una clase interna desde fuera necesita un objeto externo: outer.new Inner(). Una clase anidada estática usa new Outer.Nested(). Las variables locales capturadas deben ser efectivamente final.
- Después de &&, la variable de patrón puede usarse; después de ||, no. Con una comprobación negada que hace return o throw, la variable está en alcance después de la sentencia if.
- Para var, revisa en cada línea: uso en un campo o parámetro, falta de inicializador, un inicializador null o {arreglo}, o varias variables en una declaración. Cada uno es un error de compilación.
- Cuenta objetos alcanzables, no variables. Dibuja las referencias en papel línea por línea, y recuerda que System.gc() no garantiza nada.
Términos clave
- Default constructor (constructor por defecto)
- El constructor sin argumentos que el compilador agrega solo cuando una clase no declara constructores.
- Static initializer (inicializador estático)
- Un bloque static { } que se ejecuta una vez cuando la clase se inicializa.
- Instance initializer (inicializador de instancia)
- Un bloque { } en el cuerpo de la clase que se ejecuta para cada objeto nuevo, antes del cuerpo del constructor pero después del constructor de la superclase.
- Pass by value (paso por valor)
- Java copia cada argumento en el parámetro; para los objetos, el valor copiado es la referencia.
- Prologue (prólogo)
- Las sentencias de un constructor antes de la llamada explícita a super(...) o this(...), que no pueden usar el objeto que se está construyendo.
- Epilogue (epílogo)
- Las sentencias después de la llamada explícita al constructor, donde el objeto puede usarse normalmente.
- Early construction context (contexto de construcción temprana)
- El prólogo y los argumentos de la llamada al constructor, donde las referencias a la instancia actual están restringidas.
- Explicit constructor invocation (invocación explícita de constructor)
- Una sentencia super(...) o this(...) que encadena a otro constructor.
- Overriding (sobrescritura)
- Redefinir un método de instancia heredado con la misma firma; el tipo del objeto en tiempo de ejecución decide qué versión se ejecuta.
- Overloading (sobrecarga)
- Declarar métodos con el mismo nombre pero listas de parámetros distintas; el compilador elige uno según los tipos de los argumentos.
- Hiding (ocultamiento)
- Declarar un método estático o un campo con el mismo nombre que uno del padre; el tipo de la referencia decide cuál se usa.
- Covariant return type (tipo de retorno covariante)
- El tipo de retorno de un método sobrescrito que es un subtipo del tipo de retorno del método original.
- Abstract method (método abstracto)
- Un método sin cuerpo que las subclases concretas o las clases que implementan deben implementar.
- Default method (método default)
- Un método de instancia de interfaz con cuerpo que las clases que implementan heredan y pueden sobrescribir.
- Static interface method (método estático de interfaz)
- Un método que pertenece a la propia interfaz y solo se llama como InterfaceName.method().
- Private interface method (método privado de interfaz)
- Un método auxiliar con cuerpo que solo es visible dentro de la interfaz.
- Record component (componente de record)
- Un nombre y un tipo en el encabezado de un record; cada uno se convierte en un campo private final y un accesor public.
- Canonical constructor (constructor canónico)
- El constructor cuyos parámetros coinciden en orden con los componentes del record y que asigna cada campo.
- Compact constructor (constructor compacto)
- Un constructor canónico escrito sin lista de parámetros, usado para validar o normalizar parámetros antes de que los campos se asignen automáticamente.
- Accessor method (método accesor)
- El método generado con el nombre de un componente, como x(), que devuelve su valor.
- Sealed class (clase sellada)
- Una clase o interfaz que permite solo los subtipos directos nombrados en su cláusula permits (o en el mismo archivo).
- permits clause (cláusula permits)
- La lista de clases o interfaces que pueden extender o implementar directamente un tipo sellado.
- non-sealed
- Un modificador para una subclase permitida que reabre la jerarquía para que cualquier clase pueda extenderla.
- Exhaustive hierarchy (jerarquía exhaustiva)
- Un conjunto cerrado de subtipos que permite al compilador verificar que un switch maneje todos los casos.
- Enum
- Una clase especial con un conjunto fijo de instancias con nombre declaradas al inicio de su cuerpo.
- values()
- Un método estático generado que devuelve un arreglo con todas las constantes del enum en orden de declaración.
- valueOf(String)
- Devuelve la constante con el nombre exacto dado, o lanza IllegalArgumentException.
- ordinal()
- La posición, empezando en cero, de una constante en su declaración.
- Static nested class (clase anidada estática)
- Una clase declarada static dentro de otra clase; no necesita una instancia externa y se crea con new Outer.Nested().
- Inner class (clase interna)
- Una clase miembro no estática cuyas instancias están ligadas a una instancia externa y pueden acceder a sus miembros.
- Anonymous class (clase anónima)
- Una clase sin nombre declarada e instanciada en una sola expresión, que extiende una clase o implementa una interfaz.
- Effectively final (efectivamente final)
- Una variable local que nunca se reasigna después de inicializarse, lo que permite usarla desde clases locales y lambdas.
- Pattern matching for instanceof (pattern matching con instanceof)
- Una comprobación instanceof que además enlaza el valor a una nueva variable del tipo comprobado cuando coincide.
- Pattern variable (variable de patrón)
- La variable declarada por un patrón, como s en o instanceof String s.
- Flow scoping (alcance por flujo)
- La regla según la cual una variable de patrón está en alcance solo donde el compilador puede demostrar que la coincidencia tuvo éxito.
- Record pattern (patrón de record)
- Un patrón como Point(int x, int y) que comprueba un tipo record y enlaza sus componentes.
- Encapsulation (encapsulamiento)
- Mantener los campos private y controlar el acceso al estado de un objeto mediante métodos.
- Immutable object (objeto inmutable)
- Un objeto cuyo estado no puede cambiar después de su construcción, como un String o un record bien diseñado.
- Defensive copy (copia defensiva)
- Una copia de una entrada o salida mutable que impide que código externo cambie el estado interno de un objeto.
- var
- Un nombre de tipo reservado que hace que el compilador infiera el tipo de una variable local a partir de su inicializador.
- Garbage collector (recolector de basura)
- El componente de la JVM que recupera automáticamente la memoria usada por objetos inalcanzables.
- Eligible for garbage collection (elegible para recolección)
- Un objeto que ningún hilo vivo puede alcanzar desde ninguna raíz del GC; puede recolectarse en cualquier momento posterior o nunca.
- GC root (raíz del GC)
- Un punto de partida para la alcanzabilidad, como una variable local en un método activo o un campo estático.
- Island of isolation (isla de aislamiento)
- Un grupo de objetos que se referencian entre sí pero no pueden alcanzarse desde ninguna raíz, así que todos son elegibles.
Dominio 4: Handling exceptions (8%)
Consejos para el examen
- Memoriza la división: los subtipos de RuntimeException y Error son unchecked; toda otra Exception es checked. IOException y FileNotFoundException son checked; NumberFormatException es unchecked.
- El valor de retorno queda fijo cuando se ejecuta el return del try; finally se ejecuta después y solo puede reemplazarlo haciendo su propio return. Un return o throw en finally oculta cualquier excepción anterior.
- En un multi-catch, revisa dos cosas: que ningún tipo de la lista sea subclase de otro, y que la variable nunca se asigne. Cualquiera de los dos errores es un error de compilación.
- Subclase antes que superclase, siempre. Y una excepción checked específica solo puede atraparse si algo en el try puede lanzarla; Exception, Throwable y los tipos unchecked siempre están permitidos.
- Rastrea el orden: abrir en orden de declaración, cuerpo, cerrar en orden inverso, luego catch, luego finally. Las variables de recurso son final y no son visibles en catch ni en finally.
- En try-with-resources, la excepción del cuerpo gana y las excepciones de cierre quedan suprimidas. En un finally simple, una excepción nueva reemplaza a la original, que se pierde.
- Para una sobrescritura, las excepciones checked permitidas son: las mismas, más específicas, menos o ninguna. Nunca nuevas y nunca más amplias. Las excepciones unchecked siempre están permitidas.
- La clase padre lo decide todo: extends Exception significa checked, extends RuntimeException significa unchecked. Los constructores no se heredan, así que escribe cada uno que necesites y llama a super.
Términos clave
- Throwable
- La clase raíz de todo lo que puede lanzarse, con subclases directas Error y Exception.
- Checked exception (excepción comprobada)
- Una subclase de Exception, pero no de RuntimeException, que debe atraparse o declararse.
- Unchecked exception (excepción no comprobada)
- RuntimeException, Error o cualquiera de sus subclases, que el compilador no te obliga a manejar.
- Handle-or-declare rule (regla de manejar o declarar)
- El requisito del compilador de que el código que lanza una excepción checked la atrape o la liste en throws.
- try block (bloque try)
- Un bloque que contiene código que podría lanzar excepciones, seguido de bloques catch y/o finally.
- catch block (bloque catch)
- Un manejador que se ejecuta cuando se lanza en el try una excepción de su tipo declarado (o de un subtipo).
- finally block (bloque finally)
- Un bloque que se ejecuta después de try y catch pase lo que pase, a menos que la JVM termine.
- Exception propagation (propagación de excepciones)
- Una excepción no atrapada que sale del método actual y sube por la pila de llamadas hacia quien llama.
- Multi-catch
- Un bloque catch que lista varios tipos de excepción separados por |, compartiendo un manejador y una variable.
- Related types (tipos relacionados)
- Tipos de excepción donde uno es subclase de otro; no pueden aparecer ambos en el mismo multi-catch.
- Implicitly final parameter (parámetro implícitamente final)
- La variable del multi-catch, que no puede reasignarse dentro del bloque.
- Precise rethrow (relanzamiento preciso)
- Relanzar una variable de excepción atrapada y no modificada para que el método solo necesite declarar los tipos específicos que realmente pueden ocurrir.
- Catch order (orden de los catch)
- La secuencia de arriba hacia abajo en que se revisan los bloques catch; se ejecuta el primero que coincide.
- Unreachable catch block (bloque catch inalcanzable)
- Un manejador que el compilador demuestra que nunca puede ejecutarse, porque un bloque anterior atrapa su tipo o porque el try no puede lanzarlo.
- Most specific first (el más específico primero)
- La regla de escribir los manejadores de excepciones de subclases antes que los de superclases.
- Checked exception analysis (análisis de excepciones checked)
- El seguimiento que hace el compilador de qué excepciones checked puede lanzar un bloque try, según las cláusulas throws de los métodos y las sentencias throw.
- try-with-resources
- Una sentencia try que declara recursos entre paréntesis y los cierra automáticamente al final del bloque.
- AutoCloseable
- La interfaz con un único método close() que un recurso debe implementar para usarse en try-with-resources.
- Closeable
- Una subinterfaz de AutoCloseable usada por las clases de E/S, cuyo close() lanza IOException.
- Reverse close order (cierre en orden inverso)
- Los recursos se cierran en el orden opuesto al de su declaración: el último abierto es el primero en cerrarse.
- Suppressed exception (excepción suprimida)
- Una excepción lanzada al cerrar un recurso que se adjunta a la excepción principal en lugar de reemplazarla.
- Primary exception (excepción principal)
- La excepción que realmente se propaga; en try-with-resources, la que lanza el bloque try si la hay.
- getSuppressed()
- Un método de Throwable que devuelve un arreglo con las excepciones suprimidas por esta.
- getCause()
- Un método de Throwable que devuelve la excepción que causó esta, lo cual es distinto de las excepciones suprimidas.
- throws clause (cláusula throws)
- La parte del encabezado de un método o constructor que declara las excepciones checked que puede pasar a quienes lo llaman.
- throw statement (sentencia throw)
- Una sentencia que lanza un objeto de excepción, como throw new IOException().
- Narrower exception (excepción más específica)
- Una subclase de un tipo de excepción, que un método que sobrescribe puede declarar en lugar del tipo padre.
- Contract (contrato)
- Las promesas que la firma de un método hace a quienes lo llaman, incluidas qué excepciones checked deben manejar.
- Custom exception (excepción personalizada)
- Una clase definida por la aplicación que extiende Exception, RuntimeException o una de sus subclases.
- Exception chaining (encadenamiento de excepciones)
- Envolver una excepción atrapada como causa de una excepción nueva para conservar los detalles originales.
- Cause (causa)
- El Throwable pasado al constructor de una excepción y devuelto por getCause().
- super(message)
- La llamada al constructor que pasa un mensaje de detalle a la clase de excepción padre.
Dominio 5: Working with arrays and collections (10%)
Consejos para el examen
- Para binarySearch con un valor ausente, encuentra el índice donde se insertaría, niégalo y réstale uno. Si el arreglo no está ordenado, la respuesta es 'indefinido'.
- Aprende los pares de la cola: add/offer, remove/poll, element/peek. El primero de cada par lanza una excepción al fallar, el segundo devuelve false o null. push y pop en un Deque trabajan en el frente.
- Modificar una colección List.of, Set.of o Map.of compila pero lanza UnsupportedOperationException. Arrays.asList permite set pero no add ni remove, y escribe en el arreglo.
- Revisa primero el tipo de la referencia: las referencias Set y Collection no tienen getFirst. Luego revisa la implementación: TreeSet y TreeMap rechazan addFirst y putFirst, las listas no modificables rechazan todo cambio, y las colecciones vacías lanzan NoSuchElementException.
- Revisa qué valor de retorno se pregunta: putIfAbsent devuelve el valor anterior (null cuando insertó), mientras que merge y computeIfAbsent devuelven el valor actual. Un resultado null de la función de merge elimina la clave.
- Lee las cadenas de comparadores de izquierda a derecha, y aplica reversed() a todo lo que está antes en la cadena. compareTo y compare devuelven negativo, cero o positivo, no solo -1, 0 y 1.
- En un TreeSet o TreeMap, que compareTo devuelva 0 significa duplicado, sin importar equals. headSet excluye su límite, tailSet lo incluye, y lower/higher son estrictos mientras que floor/ceiling no.
- Las preguntas del examen suelen mostrar list.add(...) sobre un List<? extends Algo> y preguntar si compila. No compila (excepto con null). Con ? super, agregar el tipo de la cota compila, pero asignar get() a algo más específico que Object no.
- Para un List<Integer>, un argumento int simple siempre significa índice. Busca Integer.valueOf, un cast a Integer u Object, o una variable Integer para detectar la versión por valor.
Términos clave
- Array (arreglo)
- Un objeto de longitud fija que contiene elementos de un tipo, accedidos por un índice que empieza en cero.
- Shallow copy (copia superficial)
- Una copia de un arreglo cuyos elementos son las mismas referencias a objetos que el original.
- Insertion point (punto de inserción)
- El índice donde se insertaría una clave ausente; binarySearch devuelve -(punto de inserción) - 1 para ella.
- Arrays.mismatch
- Devuelve el primer índice en el que dos arreglos difieren, o -1 si son iguales.
- List
- Una colección ordenada que permite duplicados y acceso por índice, como ArrayList o LinkedList.
- Set
- Una colección sin elementos duplicados, como HashSet, LinkedHashSet o TreeSet.
- Map
- Una estructura de claves únicas asociadas a valores que no es una Collection, como HashMap o TreeMap.
- Deque (cola doble)
- Una cola de doble extremo que admite inserción y eliminación en ambos extremos, utilizable como cola o como pila.
- Unmodifiable collection (colección no modificable)
- Una colección cuyos métodos modificadores lanzan UnsupportedOperationException, como las que crea List.of.
- UnsupportedOperationException
- La excepción en tiempo de ejecución que se lanza cuando una colección no admite una operación de modificación.
- Fixed-size list (lista de tamaño fijo)
- La lista devuelta por Arrays.asList, que admite set pero no add ni remove.
- Unmodifiable view (vista no modificable)
- Un envoltorio de solo lectura, como Collections.unmodifiableList, que sigue reflejando los cambios de la colección subyacente.
- SequencedCollection
- Una interfaz de Java 21 para colecciones con un orden de recorrido definido, que proporciona operaciones de primero/último y reversed().
- SequencedSet
- Una colección secuenciada sin duplicados, implementada por LinkedHashSet y heredada por SortedSet.
- SequencedMap
- Un map con un orden de entradas definido, implementado por LinkedHashMap y extendido por SortedMap.
- reversed()
- Devuelve una vista en orden inverso de una colección o map secuenciado que refleja los cambios posteriores.
- getOrDefault
- Devuelve el valor asociado si la clave está presente, o el valor por defecto dado en caso contrario, sin modificar el map.
- putIfAbsent
- Guarda un valor solo cuando la clave está ausente o asociada a null, y devuelve el valor anterior.
- computeIfAbsent
- Calcula y guarda un valor a partir de la clave solo cuando la clave está ausente o asociada a null, y devuelve el valor actual.
- merge
- Guarda un valor para una clave ausente, o lo combina con el valor existente usando una función; un resultado null elimina la clave.
- Comparable
- Una interfaz que implementa una clase para definir su orden natural mediante compareTo.
- Comparator
- Un objeto aparte que define un orden mediante compare, lo que permite varios órdenes para un mismo tipo.
- thenComparing
- Un método de Comparator que agrega una clave secundaria usada solo cuando la primera comparación empata.
- Stable sort (ordenamiento estable)
- Un ordenamiento que mantiene los elementos iguales en su orden relativo original.
- Natural ordering (orden natural)
- El orden definido por el propio método compareTo de un elemento, de la interfaz Comparable.
- NavigableSet
- Una interfaz de conjunto ordenado con métodos como floor, ceiling, headSet y tailSet, implementada por TreeSet.
- floor / ceiling
- El mayor elemento menor o igual, o el menor elemento mayor o igual, que un valor dado.
- headSet / tailSet
- Vistas de los elementos por debajo de un límite (exclusivo por defecto) o en y por encima de un límite (inclusivo por defecto).
- Type parameter (parámetro de tipo)
- Un marcador como T declarado entre corchetes angulares en una clase, interfaz o método y reemplazado por un argumento de tipo en cada uso.
- Bounded type parameter (parámetro de tipo acotado)
- Un parámetro de tipo restringido con extends, como <T extends Comparable<T>>, para que el código pueda llamar a los métodos de la cota.
- Upper-bounded wildcard (comodín con cota superior)
- ? extends X: acepta X o cualquier subtipo; seguro para leer como X, pero solo se puede agregar null.
- Lower-bounded wildcard (comodín con cota inferior)
- ? super X: acepta X o cualquier supertipo; seguro para agregar valores X, pero las lecturas devuelven Object.
- Type erasure (borrado de tipos)
- El compilador elimina los argumentos de tipo genéricos después de verificarlos, así que no están disponibles en tiempo de ejecución.
- remove(int index)
- Elimina y devuelve el elemento en la posición dada; lanza IndexOutOfBoundsException con un índice inválido.
- remove(Object o)
- Elimina el primer elemento igual a o y devuelve true si se eliminó uno, false en caso contrario.
- Overload resolution phases (fases de resolución de sobrecargas)
- El compilador intenta primero coincidencias sin boxing, luego con boxing y unboxing, y luego con varargs.
- removeIf
- Un método de Collection que elimina cada elemento que cumple un Predicate y devuelve true si se eliminó algo.
Dominio 6: Working with streams and lambda expressions (16%)
Consejos para el examen
- Relaciona los nombres de método con las interfaces: get para Supplier, accept para Consumer, apply para Function y los operadores, test para Predicate. Las preguntas suelen llamar al método equivocado, como predicate.apply(x), que no compila.
- Revisa tres cosas en cada pregunta de lambdas: las reglas de paréntesis para los parámetros, las llaves con return y punto y coma, y si alguna variable local capturada se reasigna en cualquier parte del método, incluso después de la lambda.
- Recuerda que range excluye el final y rangeClosed lo incluye, y que un stream es de un solo uso. Una pregunta que guarda un stream en una variable y llama dos operaciones terminales sobre él termina en IllegalStateException.
- Rastrea las preguntas de salida elemento por elemento, no operación por operación, y revisa si hay alguna operación terminal. Cuidado también con sorted sobre un stream infinito, que se cuelga aunque haya un limit después.
- Conoce los tipos de retorno: count es long; min, max, findFirst, findAny y reduce de un argumento devuelven Optional; los métodos match devuelven boolean; y allMatch sobre un stream vacío es true.
- toMap sin función de fusión lanza IllegalStateException ante una clave duplicada. counting() produce Long, y averagingX produce Double; las respuestas del examen suelen usar Integer en su lugar.
- average() siempre devuelve OptionalDouble, sum() en IntStream devuelve int y OptionalInt usa getAsInt(). Las respuestas que asignan average() a un double o llaman a get() sobre un OptionalInt no compilan.
- La trampa clásica: orElse(expensiveCall()) ejecuta expensiveCall() incluso cuando el Optional tiene un valor; orElseGet no. Además, Optional.of(null) lanza una excepción de inmediato, mientras que ofNullable(null) queda vacío.
- Distingue fold de scan por el tamaño de la salida: fold emite un elemento al final, scan emite uno por cada elemento de entrada. En las ventanas, fixed no se solapa y su última ventana puede ser corta; sliding se solapa.
- En las preguntas de salida con streams paralelos, el orden de forEach es impredecible, findAny es impredecible, pero collect/toList mantienen el orden de recorrido. Un reduce con un valor inicial que no es identidad da un resultado distinto en paralelo.
Términos clave
- Functional interface (interfaz funcional)
- Una interfaz con exactamente un método abstracto, que una lambda o una referencia a método puede implementar.
- Supplier<T>
- No recibe argumentos y devuelve un T mediante get().
- Predicate<T>
- Recibe un T y devuelve un boolean mediante test(); se puede componer con and, or y negate.
- UnaryOperator<T>
- Una Function<T, T> cuyos tipos de entrada y salida son iguales; su método es apply.
- BinaryOperator<T>
- Una BiFunction<T, T, T> que combina dos valores del mismo tipo en uno; la usa reduce.
- Lambda expression (expresión lambda)
- Una función anónima escrita como parámetros -> cuerpo que implementa una interfaz funcional.
- Effectively final (efectivamente final)
- Una variable local que nunca se reasigna después de inicializarse, así que una lambda o clase interna puede capturarla.
- Bound method reference (referencia a método ligada)
- Una referencia sobre un objeto específico, como System.out::println, cuyo receptor queda fijo cuando se crea la referencia.
- Unbound method reference (referencia a método no ligada)
- Una referencia como String::length donde el primer argumento proporcionado en la llamada se convierte en el receptor.
- Constructor reference (referencia a constructor)
- ClassName::new, que crea un objeto nuevo usando el constructor que coincide con los parámetros de la interfaz destino.
- Stream source (fuente del stream)
- De dónde vienen los elementos, como una colección, un arreglo, valores de Stream.of, un rango o un generador.
- IntStream.range
- Produce ints desde el inicio hasta el final, sin incluirlo.
- IntStream.rangeClosed
- Produce ints desde el inicio hasta el final, incluyéndolo.
- Stream.iterate
- Construye un stream a partir de una semilla y una función aplicada repetidamente; la forma de dos argumentos es infinita, la de tres argumentos se detiene cuando un predicado falla.
- Infinite stream (stream infinito)
- Un stream sin final natural, creado con generate o con iterate de dos argumentos, que necesita una operación de cortocircuito para terminar.
- Lazy evaluation (evaluación perezosa)
- Las operaciones intermedias se ejecutan solo cuando una operación terminal hace pasar los elementos por la canalización.
- flatMap
- Asocia cada elemento a un stream y concatena los streams resultantes en un único stream.
- Stateful operation (operación con estado)
- Una operación intermedia como sorted o distinct que debe llevar registro de los elementos que ya ha visto.
- Short-circuiting operation (operación de cortocircuito)
- Una operación como limit que puede terminar sin procesar todos los elementos.
- peek
- Una operación intermedia que ejecuta una acción sobre cada elemento a medida que pasa, principalmente para depuración.
- Terminal operation (operación terminal)
- La operación final de una canalización que dispara el procesamiento y produce un resultado o un efecto secundario.
- reduce
- Combina los elementos en un solo valor con un acumulador, opcionalmente partiendo de un valor identidad.
- Identity value (valor identidad)
- Un valor inicial que no cambia el resultado al combinarse, como 0 para la suma o "" para la concatenación.
- collect
- Una reducción mutable que reúne los elementos en un contenedor, normalmente mediante un Collector.
- Stream.toList()
- Una operación terminal que devuelve un List no modificable con los elementos del stream.
- groupingBy
- Un collector que agrupa los elementos según un clasificador en un Map cuyos valores son listas o el resultado de un collector descendente.
- partitioningBy
- Un collector que divide los elementos en un Map<Boolean, ...> con las claves true y false siempre presentes.
- Downstream collector (collector descendente)
- Un collector pasado a groupingBy o partitioningBy que procesa cada grupo, como counting o mapping.
- Merge function (función de fusión)
- Un BinaryOperator dado a toMap que decide el valor cuando dos elementos se asocian a la misma clave.
- joining
- Un collector que concatena cadenas con un delimitador, prefijo y sufijo opcionales.
- IntStream
- Un stream de valores int primitivos con operaciones numéricas como sum, average y summaryStatistics.
- OptionalDouble
- Un contenedor tipo Optional para un double, devuelto por average() en los streams primitivos; se lee con getAsDouble().
- boxed()
- Convierte un stream primitivo en un stream de los objetos envoltorio correspondientes.
- IntSummaryStatistics
- Un objeto que contiene el conteo, la suma, el mínimo, el máximo y el promedio calculados en una sola pasada.
- mapToInt
- Convierte un Stream<T> en un IntStream usando una ToIntFunction.
- Optional.of
- Crea un Optional que contiene un valor no null; lanza NullPointerException si el valor es null.
- Optional.ofNullable
- Crea un Optional que está vacío si el valor es null y lleno en caso contrario.
- orElse
- Devuelve el valor o un valor alternativo; la expresión alternativa se evalúa siempre.
- orElseGet
- Devuelve el valor o llama a un Supplier para producir un valor alternativo solo cuando está vacío.
- orElseThrow
- Devuelve el valor o lanza una excepción: NoSuchElementException sin argumento, o la excepción proporcionada.
- Gatherer
- Un objeto que describe una operación intermedia de stream personalizada mediante un inicializador, un integrador, un combinador y un finalizador.
- windowFixed
- Un gatherer integrado que agrupa los elementos en listas de tamaño fijo sin solaparse, con una última lista posiblemente más corta.
- windowSliding
- Un gatherer integrado que emite listas solapadas de tamaño fijo, avanzando un elemento a la vez.
- fold
- Un gatherer integrado que combina todos los elementos en un solo resultado emitido cuando termina el stream.
- scan
- Un gatherer integrado que emite el resultado acumulado después de cada elemento, como una suma acumulativa.
- Parallel stream (stream paralelo)
- Un stream cuyas operaciones se ejecutan en varios hilos, por defecto en el ForkJoinPool común.
- forEachOrdered
- Una operación terminal que procesa los elementos en orden de recorrido incluso en un stream paralelo.
- Associative operation (operación asociativa)
- Una operación donde la agrupación no importa, (a op b) op c = a op (b op c), requerida para un reduce paralelo correcto.
- Stateful lambda (lambda con estado)
- Una lambda que lee o modifica estado mutable compartido durante la ejecución del stream, lo cual es inseguro en paralelo.
Dominio 7: Packaging and deploying Java code (7%)
Consejos para el examen
- exports controla el acceso ordinario y aplica en tiempo de compilación y de ejecución; opens controla la reflexión solo en tiempo de ejecución. Si la firma de un método exportado usa tipos de otro módulo, esa dependencia debería ser requires transitive.
- Ten claro a quién pertenece cada directiva: uses va en el consumidor, provides ... with va en el proveedor, y el paquete de la interfaz debe exportarlo quien la define. El paquete de la implementación no necesita exportarse.
- Los módulos automáticos vienen de JARs simples en el module path; el módulo sin nombre viene de cualquier cosa en el class path. Los módulos con nombre pueden requerir módulos automáticos, pero nunca el módulo sin nombre.
- La sintaxis de ejecución es java -p ruta -m módulo/paquete.Clase. Recuerda que -d significa directorio de salida para javac pero describe-module para java.
- Una ambigüedad causada por dos imports de módulo se reporta solo donde se usa el nombre simple, y un import de un solo tipo la resuelve. Recuerda también que los imports de módulo traen tipos de los módulos requeridos de forma transitiva.
- Si una clase tiene tanto main(String[]) como main(), se elige la versión con String[]. Un main private no es lanzable, y un main de instancia necesita un constructor sin argumentos no private.
- En modo fuente se lanza la primera clase de nivel superior del archivo, los argumentos después del nombre del archivo van a main y no se producen archivos class. El soporte de varios archivos encuentra las otras clases como archivos fuente según el directorio del paquete.
- Relaciona herramienta y tarea: jar empaqueta, jdeps analiza, jlink construye un runtime. jlink funciona solo con módulos con nombre, nunca con módulos automáticos ni con el class path.
Términos clave
- module-info.java
- El archivo de declaración del módulo en la raíz de sus fuentes, que nombra el módulo y sus directivas.
- requires transitive
- Declara una dependencia y la hace legible para todo módulo que requiera este módulo (legibilidad implícita).
- exports
- Hace que los tipos públicos de un paquete sean accesibles para otros módulos; opcionalmente limitado con una cláusula to.
- opens
- Permite la reflexión profunda en tiempo de ejecución, incluidos los miembros private, sobre un paquete sin conceder acceso en tiempo de compilación.
- Strong encapsulation (encapsulamiento fuerte)
- La regla según la cual los paquetes no exportados son inaccesibles para otros módulos aunque sus clases sean public.
- Service interface (interfaz de servicio)
- El tipo, normalmente una interfaz en un paquete exportado, del que dependen los consumidores y que implementan los proveedores.
- uses
- Una directiva de módulo en el consumidor que declara que busca implementaciones de un servicio con ServiceLoader.
- provides ... with
- Una directiva de módulo en el proveedor que nombra la interfaz del servicio y la clase de implementación que lo proporciona.
- ServiceLoader
- La clase que descubre e instancia proveedores de servicios en tiempo de ejecución mediante load, iteración, findFirst o stream.
- ServiceLoader.Provider
- Un manejador de un proveedor que expone type() sin instanciarlo y get() para crear la instancia.
- Module path
- La lista de ubicaciones donde se buscan módulos, establecida con --module-path o -p, donde se aplican las reglas de los módulos.
- Named module (módulo con nombre)
- Un módulo con module-info.class en el module path que lee solo lo que requiere y expone solo lo que exporta.
- Automatic module (módulo automático)
- Un JAR no modular en el module path; recibe un nombre derivado, exporta todos sus paquetes y lee todos los módulos.
- Unnamed module (módulo sin nombre)
- El módulo que contiene todo el código del class path; lo lee todo y lo exporta todo, pero no puede requerirse.
- Automatic-Module-Name
- Un atributo del manifiesto que establece un nombre estable para un JAR usado como módulo automático.
- --module-path (-p)
- La opción de javac y java que lista los directorios o JARs que contienen módulos.
- --module (-m)
- La opción de java que nombra el módulo a ejecutar, opcionalmente con /MainClass.
- --describe-module (-d)
- Una opción de java que imprime el descriptor de un módulo; no es lo mismo que el directorio de salida -d de javac.
- --module-source-path
- Una opción de javac para compilar varios módulos a la vez desde un árbol de fuentes con una carpeta por módulo.
- --list-modules
- Una opción de java que lista los módulos observables y sus versiones.
- Module import declaration (declaración import module)
- import module M; que importa bajo demanda todos los tipos public de nivel superior de los paquetes que exporta M, incluidos los de sus dependencias transitivas.
- Ambiguous simple name (nombre simple ambiguo)
- Un nombre de tipo que dos imports proporcionan desde paquetes distintos; usarlo sin calificar es un error de compilación.
- Shadowing (ocultamiento)
- Cuando un import o una declaración más específicos ocultan un nombre que de otro modo proporcionaría un import más amplio.
- Single-type import (import de un solo tipo)
- Un import que nombra una clase, como import java.util.List;, que tiene prioridad sobre los imports bajo demanda y de módulo.
- Instance main method (método main de instancia)
- Un método main no estático, con o sin parámetro String[], que el launcher llama sobre una instancia recién creada.
- Compact source file (archivo fuente compacto)
- Un archivo fuente con campos y métodos de nivel superior no encerrados en una clase, que el compilador envuelve en una clase final implícita.
- Implicitly declared class (clase declarada implícitamente)
- La clase final del paquete sin nombre que el compilador crea para un archivo fuente compacto; el código no puede referirse a ella por su nombre.
- java.lang.IO
- Una clase con utilidades estáticas de consola print, println y readln, disponible sin import.
- Source-file mode (modo de archivo fuente)
- Ejecutar java con el nombre de un archivo .java para que el launcher compile el código fuente en memoria y lo ejecute sin escribir archivos class.
- Multi-file source program (programa fuente de varios archivos)
- Un programa en modo fuente cuyas otras clases se encuentran como archivos .java bajo el directorio del archivo lanzado y se compilan bajo demanda.
- --source
- Una opción del launcher que establece la versión del lenguaje para el modo fuente; obligatoria para archivos que no terminan en .java.
- Shebang file (archivo shebang)
- Un script ejecutable cuya primera línea empieza con #! y nombra el launcher java, ejecutado directamente por el sistema operativo.
- jar
- La herramienta del JDK que crea, lista, extrae y actualiza archivos JAR y puede registrar una clase principal.
- jdeps
- El analizador de dependencias del JDK que informa de las dependencias de paquetes y módulos y del uso de APIs internas.
- jlink
- La herramienta del JDK que ensambla módulos con nombre y sus dependencias en una imagen de runtime personalizada.
- Runtime image (imagen de runtime)
- Un directorio autocontenido con una JVM y solo los módulos que necesita una aplicación.
- Manifest (manifiesto)
- El archivo META-INF/MANIFEST.MF dentro de un JAR que contiene metadatos como Main-Class.
Dominio 8: Managing concurrent code execution (9%)
Consejos para el examen
- El método de Runnable es run(), devuelve void y no puede lanzar excepciones checked. daemon() y priority() están disponibles en los builders de plataforma; los hilos virtuales siempre son daemon.
- Los hilos virtuales mejoran la escalabilidad de las tareas bloqueantes con mucha E/S, no la velocidad bruta de CPU. No los agrupes en pools; limita el acceso a recursos escasos con un Semaphore. Siempre son hilos daemon.
- execute devuelve void y solo recibe un Runnable; submit devuelve un Future. shutdown no espera, awaitTermination espera y close() hace ambas cosas. Las excepciones dentro de una tarea te llegan envueltas en ExecutionException desde get().
- Llamar a run() no crea un hilo, así que Thread.currentThread() dentro de él es quien llama. Llamar a start() dos veces lanza IllegalThreadStateException. A menos que el código use join u otra herramienta de coordinación, el orden de salida entre hilos es impredecible.
- volatile da visibilidad pero no atomicidad, así que count++ sobre un volatile sigue siendo inseguro. Los métodos synchronized de instancia bloquean this y los estáticos bloquean el objeto Class; dos métodos solo se excluyen entre sí si usan el mismo lock.
- incrementAndGet devuelve el valor nuevo y getAndIncrement el anterior. Libera siempre en finally, y solo después de un lock o tryLock exitoso; liberar un lock que no tienes lanza IllegalMonitorStateException.
- Modificar un ArrayList mientras lo recorres lanza ConcurrentModificationException; un CopyOnWriteArrayList no, y el bucle ve la instantánea anterior. ConcurrentHashMap rechaza claves y valores null. put/take se bloquean, offer/poll no.
- Los hilos en deadlock están BLOCKED o WAITING; los hilos en livelock están RUNNABLE y ocupados. La solución estándar de deadlock en las opciones de respuesta es adquirir los locks en un orden consistente.
- Los scoped values no tienen método set; la única forma de cambiar el valor visible es volver a enlazarlo en un alcance anidado. get() fuera de cualquier enlace lanza NoSuchElementException, así que usa isBound u orElse cuando el valor pueda faltar.
Términos clave
- Runnable
- Una interfaz funcional con void run() que representa una tarea sin resultado y sin excepciones checked.
- Thread.Builder
- Una API fluida, obtenida con Thread.ofPlatform() o Thread.ofVirtual(), para configurar y crear hilos.
- unstarted
- Un método de Thread.Builder que crea un hilo configurado sin iniciarlo.
- Daemon thread (hilo daemon)
- Un hilo en segundo plano que no impide que la JVM termine.
- join
- Un método de Thread que hace que quien llama espere hasta que ese hilo termine.
- Platform thread (hilo de plataforma)
- Un hilo de Java respaldado uno a uno por un hilo del sistema operativo durante toda su vida.
- Virtual thread (hilo virtual)
- Un hilo ligero gestionado por la JVM que se desmonta de su portador mientras está bloqueado para que el portador pueda ejecutar otro trabajo.
- Carrier thread (hilo portador)
- Un hilo de plataforma sobre el que la JVM monta los hilos virtuales para ejecutarlos.
- newVirtualThreadPerTaskExecutor
- Un método de fábrica de Executors que devuelve un ExecutorService que inicia un hilo virtual nuevo por cada tarea.
- Pinning (fijación)
- Un estado en el que un hilo virtual bloqueado no puede desmontarse de su portador, lo que reduce la escalabilidad.
- Callable<V>
- Una interfaz de tarea con V call() throws Exception, que devuelve un resultado y puede lanzar excepciones checked.
- Future<V>
- Un manejador de un resultado pendiente, con get, get con timeout, isDone y cancel.
- ExecutionException
- La excepción checked que lanza Future.get cuando la propia tarea lanzó una excepción; la excepción original es su causa.
- shutdown
- Hace que un executor deje de aceptar tareas nuevas mientras permite que terminen las enviadas, sin esperar.
- awaitTermination
- Se bloquea hasta que todas las tareas terminan después del shutdown o hasta que vence un timeout, y devuelve si terminó.
- Thread.State
- El enum de los estados de un hilo: NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING y TERMINATED.
- BLOCKED
- El estado de un hilo que espera adquirir un lock de monitor para un bloque o método synchronized.
- TIMED_WAITING
- El estado de un hilo que espera con un límite de tiempo, como en sleep o join con timeout.
- IllegalThreadStateException
- Se lanza cuando se llama a start() sobre un hilo que ya fue iniciado.
- Interrupt (interrupción)
- Una señal cooperativa que activa la bandera de interrupción de un hilo y lo despierta de sleep, wait o join con InterruptedException.
- Race condition (condición de carrera)
- Un error en el que el resultado depende del momento en que los hilos acceden a datos mutables compartidos.
- Intrinsic lock (monitor) (lock intrínseco)
- El lock integrado en todo objeto, que adquieren los bloques y métodos synchronized.
- synchronized method (método synchronized)
- Un método cuyo cuerpo se ejecuta mientras se tiene el lock de this, o del objeto Class en los métodos estáticos.
- Visibility (visibilidad)
- Si se garantiza que las lecturas de otro hilo verán una escritura hecha por un hilo.
- volatile
- Un modificador de campo que garantiza la visibilidad y el orden de las lecturas y escrituras, pero no la atomicidad de las operaciones compuestas.
- AtomicInteger
- Un envoltorio de int con operaciones atómicas sin locks como incrementAndGet y compareAndSet.
- Compare-and-swap (CAS)
- Una operación atómica de hardware que actualiza un valor solo si todavía es igual a un valor esperado.
- ReentrantLock
- Una implementación explícita de Lock que el hilo que la tiene puede volver a adquirir, y que se libera con las llamadas unlock correspondientes.
- tryLock
- Un método de Lock que intenta adquirir el lock sin bloquearse, o dentro de un timeout, y devuelve si tuvo éxito.
- IllegalMonitorStateException
- Se lanza cuando un hilo libera un lock que no tiene.
- ConcurrentHashMap
- Un map seguro para hilos que permite lecturas y escrituras concurrentes, con iteradores débilmente consistentes y sin claves ni valores null.
- CopyOnWriteArrayList
- Una lista segura para hilos que copia su arreglo en cada escritura; los iteradores usan una instantánea y nunca lanzan ConcurrentModificationException.
- BlockingQueue
- Una cola cuyos métodos put y take esperan espacio o elementos, usada para el traspaso productor-consumidor.
- Weakly consistent iterator (iterador débilmente consistente)
- Un iterador que tolera modificaciones concurrentes sin lanzar excepciones y puede reflejar o no los cambios hechos después de su creación.
- Deadlock (interbloqueo)
- Dos o más hilos que esperan para siempre cada uno un lock que tiene otro, formando un ciclo.
- Starvation (inanición)
- A un hilo se le niega perpetuamente el acceso a un recurso que necesita porque otros hilos lo siguen obteniendo.
- Livelock
- Los hilos siguen activos, respondiéndose repetidamente unos a otros, pero no avanzan.
- Lock ordering (orden de locks)
- Una técnica de prevención en la que todos los hilos adquieren varios locks en el mismo orden global.
- Thread dump (volcado de hilos)
- Una instantánea del estado y la pila de cada hilo, usada para encontrar deadlocks e hilos bloqueados.
- ScopedValue
- Un valor enlazado durante la duración de una llamada y legible por todo el código del alcance dinámico de esa llamada, que luego se desenlaza automáticamente.
- ScopedValue.where
- Crea un enlace entre una clave de scoped value y un valor, seguido de run o call para ejecutar código con él.
- Dynamic scope (alcance dinámico)
- El conjunto de código ejecutado durante una llamada, incluidos los métodos llamados indirectamente, donde un enlace es visible.
- ThreadLocal
- Una variable con un valor mutable distinto por hilo que persiste hasta que se elimina.
- Rebinding (reenlace)
- Enlazar un scoped value ya enlazado a un valor nuevo en una llamada anidada where(...).run(...).
Dominio 9: Using the Java I/O API (6%)
Consejos para el examen
- Resolver una ruta absoluta la devuelve sin cambios, relativize lanza IllegalArgumentException al mezclar rutas absolutas y relativas, y normalize nunca comprueba el disco. La mayoría de los métodos de Path no requieren que el archivo exista.
- createDirectory falla si el directorio existe o si falta el padre; createDirectories maneja ambos casos. copy y move fallan con un destino existente a menos que se indique REPLACE_EXISTING. delete lanza una excepción con un archivo inexistente; deleteIfExists devuelve false.
- readAllLines devuelve un List y cierra el archivo; lines devuelve un Stream que debes cerrar. writeString sin opciones trunca el contenido existente, y APPEND por sí solo falla si el archivo no existe.
- list es un solo nivel y excluye el directorio de inicio; walk es recursivo e incluye el directorio de inicio; find requiere maxDepth y un BiPredicate que recibe atributos. Todos devuelven streams que deben cerrarse.
- Las señales de fin de datos difieren: read() devuelve -1, readLine() devuelve null. Las clases que terminan en Stream manejan bytes; Reader y Writer manejan caracteres. Cerrar el envoltorio externo cierra el stream interno.
- System.console() puede devolver null, así que el código del examen que llama a un método sobre él sin comprobarlo puede lanzar NullPointerException. readPassword devuelve char[], y System.out y System.err son PrintStream.
- Al deserializar, los campos transient y static no se leen del stream, los inicializadores de campo no se ejecutan y no se llama a los constructores de la clase Serializable; solo se ejecuta el constructor sin argumentos de la primera superclase no serializable.
- Los recursos se cierran en orden inverso, antes de catch y finally. Una excepción de close después de una excepción del cuerpo se suprime, no se lanza. Files.lines, list, walk y find devuelven streams que debes cerrar; readAllLines y writeString no lo necesitan.
Términos clave
- Path
- Una interfaz que representa una ubicación del sistema de archivos como una secuencia de elementos de nombre, opcionalmente con una raíz.
- resolve
- Une una ruta con otra; devuelve el argumento sin cambios si el argumento es absoluto.
- relativize
- Construye una ruta relativa de una ruta a otra; ambas deben ser absolutas o ambas relativas.
- normalize
- Elimina los elementos . y los pares nombre/.. mediante lógica de texto sin acceder al sistema de archivos.
- toRealPath
- Devuelve la ruta real con los enlaces resueltos, y lanza IOException si el archivo no existe.
- Files.createDirectories
- Crea un directorio y todos los padres que falten, sin fallar si el directorio ya existe.
- FileAlreadyExistsException
- Se lanza cuando una operación crearía o sobrescribiría una ruta que ya existe sin permiso para reemplazarla.
- REPLACE_EXISTING
- Una StandardCopyOption que permite a copy o move sobrescribir un destino existente.
- ATOMIC_MOVE
- Una opción de move que pide un movimiento de todo o nada, y falla si el sistema de archivos no puede garantizarlo.
- DirectoryNotEmptyException
- Se lanza al intentar eliminar un directorio que todavía contiene entradas.
- Files.readAllLines
- Lee un archivo entero en un List<String>, un elemento por línea, y cierra el archivo.
- Files.lines
- Devuelve un Stream<String> de las líneas del archivo, llenado de forma perezosa, que debe cerrarse después de usarse.
- Files.writeString
- Escribe un CharSequence en un archivo, por defecto creándolo o truncando el contenido existente.
- StandardOpenOption.APPEND
- Una opción de apertura que escribe al final de un archivo existente en lugar de reemplazar su contenido.
- UncheckedIOException
- Un envoltorio unchecked de una IOException, usado cuando la E/S falla dentro del procesamiento de un stream.
- Files.list
- Devuelve un Stream<Path> perezoso de las entradas directas de un directorio, sin recursión.
- Files.walk
- Devuelve un Stream<Path> perezoso, en profundidad, de un árbol de directorios, incluida la ruta de inicio, opcionalmente limitado por maxDepth.
- Files.find
- Recorre un árbol hasta un maxDepth obligatorio y devuelve las rutas que cumplen un BiPredicate<Path, BasicFileAttributes>.
- BasicFileAttributes
- Una interfaz que expone el tamaño, las marcas de tiempo y el tipo de archivo leídos junto con la entrada del directorio.
- FOLLOW_LINKS
- Una FileVisitOption que hace que walk y find sigan los enlaces simbólicos.
- Byte stream (stream de bytes)
- Un InputStream u OutputStream que transfiere bytes crudos, adecuado para datos binarios.
- Character stream (stream de caracteres)
- Un Reader o Writer que transfiere caracteres, decodificando y codificando bytes con un charset.
- InputStreamReader
- Un puente que envuelve un InputStream de bytes y lo decodifica en caracteres usando un charset.
- BufferedReader
- Un Reader que usa buffer para la entrada y proporciona readLine(), que devuelve null al final del archivo.
- flush
- Fuerza que cualquier salida en el buffer se escriba en el destino subyacente.
- System.in
- El stream de entrada estándar, un InputStream normalmente conectado al teclado.
- System.err
- El stream de error estándar, un PrintStream pensado para mensajes de error y de diagnóstico.
- Console
- Una clase obtenida de System.console() para entrada y salida de texto interactiva, que puede ser null cuando no está disponible.
- readPassword
- Un método de Console que lee la entrada sin mostrarla y devuelve un arreglo de char.
- printf
- Un método que escribe salida con formato usando especificadores como %s, %d, %.2f y %n.
- Serializable
- Una interfaz marcadora que permite que las instancias de una clase se escriban y lean mediante streams de objetos.
- transient
- Un modificador de campo que excluye el campo de la serialización; se restaura con su valor por defecto.
- serialVersionUID
- Un identificador de versión private static final long que se comprueba durante la deserialización para detectar versiones de clase incompatibles.
- NotSerializableException
- Se lanza en tiempo de ejecución al escribir un objeto que tiene un campo no transient cuyo tipo no es serializable.
- ObjectInputFilter
- Un mecanismo para restringir qué clases y cuántos datos pueden deserializarse, usado para defenderse de entradas inseguras.
- try-with-resources
- Una sentencia try que declara recursos AutoCloseable y los cierra automáticamente en orden inverso.
- AutoCloseable
- Una interfaz con close() throws Exception, requerida para los recursos de try-with-resources.
- Closeable
- Una interfaz de E/S que extiende AutoCloseable con close() throws IOException.
- Suppressed exception (excepción suprimida)
- Una excepción lanzada al cerrar un recurso después de que el cuerpo ya lanzó otra, adjuntada a la original mediante addSuppressed.
- Resource-backed stream (stream respaldado por un recurso)
- Un Stream como los de Files.lines, list, walk o find que mantiene un manejador abierto y debe cerrarse.
Dominio 10: Implementing localization (4%)
Consejos para el examen
- La forma de cadena es idioma_PAÍS con el idioma en minúsculas y el país en mayúsculas, siempre con el idioma primero. Locale.setDefault cambia solo la JVM. Usa Locale.of en lugar de los constructores obsoletos.
- Orden: locale solicitado (idioma_país, luego idioma), luego locale por defecto (idioma_país, luego idioma), luego base. Para las claves que faltan, solo se buscan los padres del bundle elegido, nunca los bundles del locale por defecto.
- Conoce qué fábrica usar, que el porcentaje multiplica por 100, que el redondeo por defecto es HALF_EVEN, y que parse lanza la ParseException checked pero acepta texto con basura al final después de un número válido.
- Sin cambiar los dígitos decimales, los formatos compactos redondean a un número entero con HALF_EVEN, así que 1,234,567 es 1M y 1,500 es 2K. Los números menores que 1,000 se imprimen sin cambios en inglés de EE. UU.
- MM es el mes y mm los minutos; HH es formato de 24 horas y hh de 12 horas. Formatear un LocalDate con letras de hora lanza UnsupportedTemporalTypeException, y un análisis incorrecto lanza la DateTimeParseException unchecked.
- Los marcadores empiezan en cero y pueden reutilizarse o reordenarse. Un apóstrofo suelto rompe el patrón, así que escribe dos comillas simples. Los números se formatean con la agrupación del locale incluso sin tipo de formato.
Términos clave
- Locale
- Un objeto que identifica un idioma y opcionalmente un país y una variante, usado por las clases sensibles a la configuración regional.
- Language code (código de idioma)
- Un código ISO 639 en minúsculas, como en o fr, que forma la primera parte de un locale.
- Country code (código de país)
- Un código ISO 3166 en mayúsculas, como US o CA, que identifica la región de un locale.
- Locale.of
- El método de fábrica para crear un Locale a partir de un idioma y opcionalmente un país y una variante.
- Default locale (locale por defecto)
- El locale que usa la JVM cuando no se indica ninguno, inicializado desde el sistema operativo y modificable con Locale.setDefault.
- Resource bundle
- Un conjunto de recursos clave-valor específicos de un locale, cargados por nombre base y locale con ResourceBundle.getBundle.
- Base name (nombre base)
- El prefijo común de una familia de bundles, como Messages, al que se agregan sufijos de locale como _fr_CA.
- Default (base) bundle (bundle base)
- El archivo de bundle sin sufijo de locale, usado como respaldo final y raíz de toda cadena de padres.
- Parent chain (cadena de padres)
- La secuencia de bundles menos específicos, como fr_CA a fr a base, en la que se busca una clave que falta en el bundle elegido.
- MissingResourceException
- Una excepción unchecked que se lanza cuando no se encuentra ningún bundle o cuando una clave falta en el bundle y en sus padres.
- NumberFormat
- Una clase abstracta sensible al locale para formatear y analizar números, obtenida mediante métodos de fábrica.
- getCurrencyInstance
- Devuelve un NumberFormat que formatea valores como moneda para un locale, con su símbolo y sus decimales estándar.
- HALF_EVEN
- El modo de redondeo por defecto que redondea las mitades exactas al dígito par más cercano.
- ParseException
- Una excepción checked que se lanza cuando un texto no puede analizarse como número o fecha.
- DecimalFormat
- Un NumberFormat concreto que formatea usando un patrón de símbolos 0, #, coma y punto.
- CompactNumberFormat
- Una subclase de NumberFormat que formatea números en formas cortas específicas del locale, como 1K o 1 thousand.
- NumberFormat.Style.SHORT
- El estilo compacto que usa sufijos abreviados como K, M y B en inglés de EE. UU.
- NumberFormat.Style.LONG
- El estilo compacto que escribe la magnitud completa, como thousand o million.
- getCompactNumberInstance
- El método de fábrica de NumberFormat que devuelve un formateador compacto para un locale y un estilo.
- DateTimeFormatter
- Una clase inmutable y segura para hilos que formatea y analiza valores de java.time usando constantes ISO, estilos localizados o patrones.
- FormatStyle
- Un enum de SHORT, MEDIUM, LONG y FULL usado para disposiciones de fecha y hora específicas del locale.
- ofPattern
- Crea un formateador a partir de letras de patrón como yyyy-MM-dd HH:mm, opcionalmente con un Locale.
- DateTimeParseException
- Una excepción unchecked que se lanza cuando un texto no puede analizarse como fecha u hora.
- UnsupportedTemporalTypeException
- Se lanza cuando el formateo requiere un campo que el valor no tiene, como las horas en un LocalDate.
- MessageFormat
- Una clase de java.text que construye mensajes sensibles al locale sustituyendo argumentos en marcadores indexados.
- Placeholder (marcador)
- Un elemento {n} en un patrón que se reemplaza por el argumento n, opcionalmente con un tipo de formato como number o date.
- Format type (tipo de formato)
- La segunda parte de un marcador, como number, date, time o choice, que controla cómo se formatea el argumento.
- Quoting (comillas)
- En MessageFormat, una comilla simple inicia una sección literal; dos comillas simples producen un apóstrofo.
- ChoiceFormat
- Un formato usado mediante el tipo choice que selecciona el texto según rangos numéricos, útil para plurales simples.
Estudia OCP Java gratis
Plan semana a semana con lecciones, cuestionarios, simulaciones de examen y práctica, en español.
Abrir el plan de estudioPlan semana a semana con lecciones, cuestionarios, simulaciones de examen y práctica, en español.