Ejercicios resueltos en Java con cadenas
Ejercicios resueltos en Java con cadenas
16. ¿Cuál es la salida del siguiente código?
5: var line = new String("-");
6: var anotherLine = line.concat("-");
7: System.out.print(line == anotherLine);
8: System.out.print(" ");
9: System.out.print(line.length());
A. false 1
B. false 2
C. true 1
D. true 2
E. Does not compile
La respuesta correcta es A. false 1 ya que el operador == compara las referencias de objetos, y aunque line y anotherLine contienen el mismo valor, son dos objetos diferentes. Por lo tanto, la primera expresión imprime false. La segunda expresión imprime 1, ya que la longitud de la cadena line es 1.
El código crea una nueva cadena llamada “line” que contiene un guión. Luego, se concatena otro guión a “line” y se guarda el resultado en una nueva cadena llamada “anotherLine”. Después, se compara “line” y “anotherLine” usando el operador == para ver si son el mismo objeto. Como “line” y “anotherLine” son dos objetos diferentes, el resultado de la comparación es falso. Finalmente, se imprime la longitud de “line”, que es 1 ya que solo contiene un carácter. Por lo tanto, la salida del código es “false 1”, lo que significa que la respuesta correcta es la opción A.
Una cadena de texto (String) es inmutable, por lo que se devuelve un objeto diferente en la línea 6. El objeto al que apunta anotherLine tiene una longitud de 2 después de que se completa la línea 6. Sin embargo, la referencia original de la variable line todavía apunta a un objeto de longitud 1. Por lo tanto, la opción A es correcta.
Aquí te dejo el código de ejemplo en Java:
String line = "a"; // crea una cadena de texto (String) de longitud 1
String anotherLine = line.concat(«b»); // concatena «b» a la cadena de texto original
// la variable line sigue apuntando a la cadena de texto original de longitud 1
// la variable anotherLine apunta a una cadena de texto nueva de longitud 2
Es importante destacar que debido a que una cadena de texto (String) es inmutable en Java, cualquier modificación que se haga a ella resultará en la creación de un nuevo objeto. En este ejemplo, al concatenar «b» a la cadena original se crea un nuevo objeto de longitud 2, mientras que la cadena original sigue siendo de longitud 1.
17 ¿Cuántas de estas líneas contienen un error de compilación?
public void pi() {
byte b = 3.14;
double d = 3.14;
float f = 3.14;
short s = 3.14;
}
A. Ninguna
B. Una
C. Dos
D. Tres
E. Cuatro
La respuesta correcta es la opción D (hay tres líneas que darán error de compilación)
Las líneas que darán error son:
1.
byte b = 3.14;
– no se puede asignar un valor decimal (3.14) a una variable byte.
2.
float f = 3.14;
– se debe agregar una «f» al final del valor decimal para indicar que es un float. Por lo tanto, debería ser
float f = 3.14f;
.
3.
short s = 3.14;
– no se puede asignar un valor decimal a una variable short.
El código muestra un método llamado “pi” que contiene cuatro declaraciones de variables. La primera declaración intenta asignar un valor de punto flotante (3.14) a una variable de tipo byte. Esto produce un error de compilación porque un valor de punto flotante no se puede asignar directamente a una variable de tipo byte sin una conversión explícita. La segunda declaración asigna correctamente un valor de punto flotante a una variable de tipo double. La tercera declaración intenta asignar un valor de punto flotante (3.14) a una variable de tipo float. Esto produce un error de compilación porque el valor 3.14 es un literal double y no se puede asignar directamente a una variable float sin una conversión explícita o sin agregar una “f” al final del literal para indicar que es un literal float (por ejemplo, 3.14f). La cuarta declaración intenta asignar un valor de punto flotante (3.14) a una variable de tipo short. Esto produce un error de compilación porque un valor de punto flotante no se puede asignar directamente a una variable de tipo short sin una conversión explícita.
Por lo tanto, tres líneas contienen un error de compilación, lo que significa que la respuesta correcta es la opción D.
Tanto byte como short no compilan porque no almacenan valores con puntos decimales. Además, tenga en cuenta que 3.14 es automáticamente un double. Requiere una conversión explícita a float o escribir 3.14f para asignarse a un float. Dado que solo double compila, la opción D es la respuesta correcta.
18. En los Estados Unidos, el horario de verano termina el 6 de noviembre de 2022 a las 02:00 a.m. y repetimos la hora anterior. ¿Cuál es la salida del siguiente código Java?
var localDate = LocalDate.of(2022, Month.NOVEMBER, 6);
var localTime = LocalTime.of(1, 0);
var zone = ZoneId.of(«America/New_York»);
var z = ZonedDateTime.of(localDate, localTime, zone);
var offset = z.getOffset();
for (int i = 0; i < 6; i++)
z.plusHours(1);
System.out.print(z.getHour() + » » + offset.equals(z.getOffset()));
A. 5 false
B. 5 true
C. 6 false
D. 6 true
E. 7 false
F. 7 true
G. Ninguna de las anteriores
El código crea una fecha y hora local para el 6 de noviembre de 2022 a la 1:00 a.m. en la zona horaria “America/New_York”. Luego obtiene el desplazamiento horario para esa fecha y hora y lo guarda en la variable “offset”. Después, el código intenta agregar 6 horas a la fecha y hora usando un bucle for y el método plusHours(). Sin embargo, este método no modifica el objeto original sino que devuelve un nuevo objeto con la hora modificada. Como el código no guarda el objeto devuelto por el método plusHours(), la fecha y hora original no se modifican. Por lo tanto, cuando se imprime la hora y se compara el desplazamiento horario original con el desplazamiento horario actual, la salida es “1 true”, lo que significa que ninguna de las opciones dadas es correcta y la respuesta correcta es la opción G.
Esta pregunta es complicada. El resultado de z.plusHours(1) nunca se guarda en una variable ni se usa. Dado que ZonedDateTime es inmutable, la hora permanece a las 01:00. El código imprime 1 true, lo que hace que ninguna de estas opciones sea correcta y la opción G sea la respuesta.
19. ¿Qué imprime el siguiente código?
var baa = 8;
var bleat = ~baa;
var sheep = ~bleat;
System.out.printf(bleat + " " + sheep);
A. – 8 8
B. – 8 9
C. – 9 8
D. – 9 9
E. Ninguno de los anteriores
El código crea una variable llamada “baa” y le asigna el valor 8. Luego, aplica el operador de complemento a uno (~) a “baa” y guarda el resultado en una variable llamada “bleat”. El operador de complemento a uno invierte todos los bits del valor de “baa”. Como “baa” es un entero con un valor de 8 (que se representa en binario como 00001000), el resultado de aplicar el operador de complemento a uno es -9 (que se representa en binario como 11110111). Después, el código aplica nuevamente el operador de complemento a uno a “bleat” y guarda el resultado en una variable llamada “sheep”. Como “bleat” tiene un valor de -9 (que se representa en binario como 11110111), el resultado de aplicar el operador de complemento a uno es 8 (que se representa en binario como 00001000). Finalmente, el código imprime los valores de “bleat” y “sheep”, que son -9 y 8 respectivamente. Por lo tanto, la salida del código es “-9 8”, lo que significa que la respuesta correcta es la opción C.
El operador de complemento a uno (~) invierte todos los bits del número. Puedes calcular esto negando el número y restando uno, lo que en este caso es -9. Aplicar el operador de complemento a uno dos veces te da el número original, que es 8. Por lo tanto, la opción C es la respuesta.
20. El autor de este método olvidó incluir el tipo de datos. ¿Cuál de los siguientes tipos de referencia puede completar mejor el espacio en blanco para completar este método?
public static void secret( mystery) {
char ch = mystery.charAt(3);
mystery = mystery.insert(1, “more”);
int num = mystery.length();
}
A. String
B. StringBuilder
C. Ambos
D. Ninguno
El código muestra un método llamado “secret” que toma un parámetro llamado “mystery” cuyo tipo de datos no se especifica. El método llama a los métodos charAt(), insert() y length() en el parámetro “mystery”. El método charAt() está disponible tanto en la clase String como en la clase StringBuilder. Sin embargo, el método insert() solo está disponible en la clase StringBuilder y no en la clase String. Por lo tanto, el tipo de datos que mejor puede completar el espacio en blanco para que el método se compile correctamente es StringBuilder. La respuesta correcta es la opción B.
21. LocalTime.of() tiene varios sobrecargas. ¿Cuál de los siguientes no es uno de ellas?
A. LocalTime.of(int hour, int minute)
B. LocalTime.of(int hour, int minute, int second)
C. LocalTime.of(int hour, int minute, int second, int nanoOfSecond)
D. LocalTime.of(int hour, int minute, int second, int nanoOfSecond, int picoSeconds)
Respuesta Correcta: D
La respuesta correcta es D porque LocalTime.of() no tiene un sobrecarga que acepte un argumento de pico segundos.
Hay tres sobrecargas para LocalTime.of(). Las opciones A, B y C son todas sobrecargas válidas. La opción D no lo es porque Java solo permite pasar un parámetro de segundo fraccionario. Java admite nanosegundos, pero no la granularidad adicional de los picosegundos.
Recuerda La clase `LocalTime` tiene varias sobrecargas disponibles en el método `of()`. Puedes crear una instancia de la clase `LocalTime` utilizando los siguientes argumentos:
– `int hour`: la hora del día (0-23).
– `int minute`: el minuto de la hora (0-59).
– `int second`: el segundo del minuto (0-59).
– `int nanoOfSecond`: el nanosegundo del segundo (0-999,999,999).
Por ejemplo, para crear una instancia de la clase `LocalTime` con la hora 12:30:45 y 500000000 nanosegundos, puedes utilizar el siguiente código:
«`java
LocalTime localTime = LocalTime.of(12, 30, 45, 500000000);
«`
22. ¿Cuáles afirmaciones son verdaderas sobre la salida de este código? (Elige tres.)
var text = """
ant antelope \s \n
cat "kitten" \
seal sea lion
""";
System.out.print(text);
A. Contiene dos comillas.
B. Contiene ocho comillas.
C. Tiene tres líneas.
D. Una línea está en blanco.
E. Dos líneas están en blanco.
F. La primera línea contiene espacios en blanco al final.
G. La primera línea no contiene espacios en blanco al final.
Respuestas correctas: A, C y F
Las comillas triples (“”») son la sintaxis de bloque de texto. La opción A es correcta, ya que solo se muestra las dos comillas alrededor de “gatito”. El \n da una línea en blanco ya que está al final de la línea. La última línea también está en blanco, lo que hace que la opción E sea correcta. Finalmente, la opción F es correcta, ya que \s conserva los espacios en blanco finales.
23. Completa los espacios en blanco: los operadores !=__________,________,___________y ++ se enumeran en los mismos o crecientes niveles de precedencia del operador. (Elige dos.)
A. == , * , !
B. / , % , *
C. * , — , /
D. ! , * , %
E. += , && , *
F. * , < , /
Respuestas correctas: A y B
Las opciones A y B son correctas. La opción A es correcta y enumera los operadores en el mismo o en un nivel creciente de precedencia de operador. En la opción B, los tres operadores tienen en realidad la misma precedencia de operador, por lo que es correcta. La opción C es incorrecta, ya que la división (/) tiene una precedencia menor que el operador de decremento (- -). La opción D es incorrecta porque el operador de complemento lógico (!) tiene un orden de precedencia más alto que los otros dos operadores. La opción E enumera los operadores en el orden correcto, pero no se ajustan dentro de no iguales (!=) y el operador de incremento (++) como se indica en la pregunta. En particular, el operador de adición compuesta (+=) y el operador lógico de cortocircuito (&&) tienen una precedencia menor que el operador no igual (!=). Finalmente, la opción F es incorrecta porque el operador relacional (<) no se ajusta entre el operador de multiplicación (*) y el operador de división (/) en orden de precedencia.
24. ¿Cuántas de las clases LocalDate, Period y ZonedDate tienen un método para obtener el año?
A. Ninguno
B. Uno
C. Dos
D. Tres
Respuestas correctas: C
La clase LocalDate representa una fecha utilizando campos de año, mes y día. Hay un método getYear() para obtener el año. La clase Periodo contiene unidades de años, meses y días. Tiene un método getYears(). No hay una clase de fecha/hora llamada ZonedDate. Existe una clase llamada ZonedDateTime, que sí tiene un método getYear(). Dado que solo LocalDate y Period tienen un método para obtener el año, la opción C es correcta.»