Clasificación de los puntos de conocimiento del contenido del examen final de JAVA

palabras del autor

Prefacio: Estos son muy básicos, y todavía hay muchas cosas que no se han escrito. El enfoque está en la revisión del examen, incluido el contenido de los últimos cuatro capítulos.

Para el contenido anterior, consulte la combinación de los puntos de contenido y conocimiento de la prueba de etapa JAVA

1. Recolección y flujo

Resumen de clase 1 Colección

  • Concepto de colección:
    • Un objeto contenedor que contiene y contiene datos, combinando muchos elementos en una sola unidad.
  • Marco de la colección:
    • El sistema para expresar y manipular colecciones, incluidas interfaces, clases de implementación y diagramas de estructura de marcos de colección.

4ede152b69a1475f945b23c974f34fbe.jpg

  • 接口:Iterable, Iterador, Colección, Lista, Cola, Conjunto, Mapa;
  • 类:ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap, Stack;

Implementación:

  1.  Interfaz java.lang.Iterable: implementa el objeto de esta clase de interfaz, admite el uso de Iterable para atravesar elementos y admite la declaración de bucle For Each;
  2. boolean add(), añade elementos a la colección. Si la llamada cambia el conjunto, devuelve verdadero, lo mismo a continuación
    1. next()//Mueve el cursor hacia atrás y devuelve el elemento al que apunta el cursor;
    2. remove()//Elimina el elemento desconocido del cursor actual;
  3. interfaz java.util.Collection: se utiliza para describir la colección más versátil, incluidas las operaciones y métodos de colección más versátiles;
    1. boolean add(), añade elementos a la colección. Si la llamada cambia el conjunto, devuelve verdadero, lo mismo a continuación
    2. boolean addAll(), agrega una colección a la colección
    3. boolean remove(), elimina el elemento especificado de la colección
    4. boolean removeAll(), elimina la colección especificada de la colección
    5. void clear(), elimina todos los elementos de la colección
    6. boolean contains(), para determinar si la colección contiene el elemento especificado
    7. boolean containsAll(), para determinar si contiene la colección especificada
    8. boolean isEmpty(), para determinar si la colección contiene elementos
    9. int size() , la longitud de la colección
    10. T[] toArray(, convierte la colección en una matriz del tipo especificado
    11. Iterador<E> iterador(), obtener iterador;
  4. Colección java.util.List: una colección ordenada de elementos que pueden contener duplicados. Además de los métodos heredados de Collection, proporcione métodos de operación basados ​​en índices posicionales:
    1. add(), mueve el elemento de posición especificado hacia atrás, agrega
    2. establecer(), reemplazar
    3. obtener (índice int), obtener
    4. eliminar (índice int), eliminar
  5. La clase de implementación básica de la interfaz de colección List, es decir, la implementación de diferentes estructuras de datos.
    1. java.util.ArrayList, basado en la realización de la estructura de datos de la matriz de objetos, la más utilizada, el rendimiento general es bueno
    2. java.util.LinkedList, basado en la implementación de la estructura de datos de lista doblemente enlazada
  6. Conversión de lista y matriz:
    1. List to Array usa el método toArray();
    2. Array to List: la clase de herramienta Arrays proporciona el método asList(T... a): el método asList() es un método de modo de adaptador, solo se convierte el tipo y la capa subyacente sigue siendo una matriz. Por lo tanto, ejecutar cualquier método que modifique la longitud de la colección (agregar/eliminar, etc.) arrojará una excepción

  7. Interfaz java.util.Map: se utiliza para almacenar pares clave-valor (clave-valor), y obtener el valor correspondiente a través del valor clave
    1. La clave en el Mapa debe ser única, y cada clave solo puede corresponder a un valor; pero diferentes claves pueden corresponder a un mismo valor; al agregar una clave-valor, si la clave ya existe, esta última sobrescribirá a la anterior.
    2. Admite cualquier tipo de objeto (tipo de referencia) como clave/valor
    3. Clase de implementación básica:
      1. java.util.HashMap, la eficiencia de consultas y el uso de memoria más equilibrados, no apto para subprocesos;
      2. java.util.TreeMap;
      3. java.util.Table
    4. Métodos de operación comúnmente utilizados:
      1. put(clave, valor), guarda el par clave-valor
      2. get(clave), obtiene el valor correspondiente basado en la clave, si el valor no existe, devuelve nulo
      3.  getOrDefault(key, VValue), obtenga el valor correspondiente, si no, use el valor predeterminado
      4. eliminar (tecla), eliminar el valor de valor correspondiente
      5. containsKey(Clave de objeto), si la clave existe;
      6. contieneValor(Valor del objeto), si el valor existe;
      7. size() , la longitud;
      8.  isEmpty(), si está vacío;
    5. ¿Cómo juzgar la misma clave? Reescriba los métodos hashCode() y equals()

      String reescribe el método hashCode()/equals(), por lo que se basa directamente en el valor de la cadena en lugar de la comparación del valor hash del objeto (parece significar aproximadamente que el juicio de igualdad de clave se basa en el valor de cadena de la clave directamente basado en la clave)

  8. Colección de conjuntos: no contiene elementos repetidos (abstracción de conjuntos en matemáticas), naipes, relaciones no repetitivas, personas, cosas, etc.

    Si se repite: según hashCode()/equals()

  9. Establecer interfaz: solo incluye el método heredado de Collection y agrega la restricción de que los elementos duplicados están prohibidos y no tiene un método de operación basado en índices;
    1. Clase de implementación básica:

    2. java.util.HashSet<>, los elementos están desordenados (la capa inferior determina si los elementos se repiten en función de HashMap)

    3. java.util.LinkedHashSet<>, los elementos están ordenados

    4. java.util.TreeSet<>, los elementos están ordenados

  10. Una colección inmutable es una colección que no se puede modificar. Una vez completada la definición, no se puede modificar, agregar ni eliminar. Los elementos de datos de una colección se proporcionan en el momento de la creación y son inmutables a lo largo de su vida útil.

    En Java 9, puede usar los métodos de fábrica estáticos List.of, Set.of y Map.of para crear listas, conjuntos o mapas inmutables

Aviso

 Resumen de clase 2 flujo

La programación funcional es una idea de programación.

  1. Stream opera en los elementos de la colección, no en la colección en sí. Por lo tanto, se crearán nuevas colecciones para agregar los resultados de las operaciones de Stream sin afectar la estructura de la colección de origen.
  2. Los pasos básicos para usar Stream incluyen:
    1. Create Stream: Obtenga el conjunto de datos del objeto de la colección a través del método stream().
    2. Intermedio: a través de una serie de métodos intermedios (Intermedios), el conjunto de datos se reprocesa, como el filtrado y la recuperación. Por ejemplo, utilice el método filter() para filtrar un conjunto de datos.
    3. Terminal: el procesamiento de elementos en el conjunto de datos se completa a través del método final (terminal). Por ejemplo, use forEach() para imprimir los elementos filtrados
  3. Operación intermedia
    1. filter(): filtre los elementos que son inconsistentes con los requisitos y coloque los elementos cuyo resultado de expresión sea verdadero en la nueva secuencia
    2. map (): asigne el tipo de elementos en la secuencia a un nuevo tipo, por ejemplo, siempre que un determinado atributo del elemento

    3. sorted( Comparator .**): Ordena los elementos en la secuencia.

    4. Comparator . compare() ordena según el valor especificado,  reversed() invierte

  4. terminar la operación
    1. coleccionar (coleccionistas . **)

    2. El groupingBy() de Collectors devuelve Map, toList() , toSet() , toMap() según el tipo especificado y los convierte en relaciones de mapeo para dar clave y valor

    3. para cada()

  5. Después de jdk8, el mapa también tiene el método forEach(), que proporciona el mapa y no se hereda

    forEach((k, v) -> { System.out.println(k + "/" + v.getColor()); });

  6. Eliminación de elementos El método removeIf() de Collection se implementa en base a Iterator.

Resumen de clase 3Contenedor opcional

  1. Motivo de la introducción: Resuelve la excepción del puntero nulo.
  2. Contenedor de valor único opcional, que proporciona muchos métodos útiles, sin detección explícita de valor nulo cuando se usa
  3. Obtener el objeto opcional
    1. El elemento ofNullable() no tiene que ser nulo
    2. El elemento of() no debe estar vacío//usar menos
  4. método común
    1. ifPresent(Consumer consumidor) no está vacío para realizar operaciones de parámetros y vacío para no hacer nada
    2. Los filtros y el mapa de la operación intermedia filter() se asignan a un nuevo tipo de contenedor. Ambos pueden devolver un contenedor vacío o () método jdk9, ejecutar la función de parámetro cuando está vacío y debe devolver el mismo tipo de contenedor
    3. Operación de terminación: orElse(): Obtiene el tipo de elemento, devuelve el objeto de creación de parámetros cuando está vacío, orEsleGet() ejecuta la función cuando está vacío
      , devuelve el objeto de elemento
      get(), obtiene el objeto contenedor, vacía la excepción de lanzamiento, no recomendado, use orElse( )
    4. isPresent() determina si está vacío

Ejercicios relacionados

1. La interfaz de nivel superior del marco de recopilación de Java es (C)

  • A. Iterable
  • B. Iterador
  • C. Colección
  • D. Lista

La interfaz de colección es la interfaz raíz del marco de colección de Java, que define un conjunto de operaciones básicas en objetos, como agregar, eliminar, borrar, atravesar, etc. La interfaz Iterable es una interfaz funcional que tiene solo un método abstracto iterator()

2. Declarar correctamente una variable de colección de enteros (B)

  • A. List<int> lista;
  • B. Lista <Entero> lista;
  • C. Lista lista<int>;
  • D. Lista lista<T>;

3. Si la clase A hereda de la clase B, se permite agregar objetos de clase B en la colección de variables List<A> list1

  • R. si
  • B. Incorrecto

Porque List<A> es una subclase de List, y List<B> también es una subclase de List, pero no hay relación entre List<A> y List<B>. Por lo tanto, solo se pueden agregar objetos de tipo A a la colección de variables List<A> list1, pero no se pueden agregar objetos de tipo B

Preguntas complementarias

La clase B hereda de la clase A, la colección List<A>, al agregar un objeto de tipo B a la colección ( )

  • A. Errores en tiempo de compilación
  • B. Errores de tiempo de ejecución
  • C. Advertencia
  • D sin error

No se puede agregar la clase principal, pero se puede agregar la clase secundaria

4.LinkedList es un tipo de colección basado en una lista vinculada heredada de la interfaz de la colección

  • R. si
  • B. Incorrecto

Análisis de respuesta:

LinkedList no es un tipo de colección, sino una implementación del tipo de colección List basada en una lista doblemente enlazada

5.Map es un tipo de colección que se utiliza para almacenar pares clave-valor

  • R. si
  • B. Incorrecto

El mapa no es una colección.

6. Para construir una instancia de la clase ArrayList, ¿cuál de las siguientes afirmaciones es correcta (B)?

  • A. ArrayList myList=nuevo objeto ();
  • B. List myList=new ArrayList ();
  • C. ArrayList myList=nueva lista ();
  • D.Lista miLista=nueva Lista();

7. Collection Stream es un contenedor para operar colecciones

  • R. si
  • B. Incorrecto

8. (Verdadero o falso) Collection Stream puede eliminar elementos de la colección de origen mediante operaciones de filtrado

  • R. si
  • B. Incorrecto

La operación de la transmisión generará una nueva colección y no afectará la estructura de la colección de origen.

9. Opcional es un tipo de colección al que se pueden agregar múltiples objetos del mismo tipo.

  • R. si
  • B. Incorrecto

Opcional no es un tipo de colección, sino un tipo contenedor que se usa para representar un valor que puede existir o no. Generalmente se usa para manejar el caso posiblemente nulo, no para almacenar varios objetos. Los tipos opcionales contienen un valor no nulo o están vacíos. Si desea representar varios objetos del mismo tipo, generalmente usa Lista, Conjunto u otros tipos de colección.

10. El método opcional map() permite cambiar el tipo de elementos en el contenedor

  • R. si
  • B. Incorrecto

La clase Optional proporciona el método map(), que permite convertir los valores del objeto Optional y devuelve un nuevo objeto Optional que contiene el resultado de la conversión. La función del método map() es convertir el objeto Opcional, que puede cambiar el tipo de elementos en el contenedor. Esto es muy útil cuando se trata de objetos opcionales, convirtiendo un objeto opcional de un tipo en un objeto opcional de otro tipo.

dos, anormal

resumen de la clase

Clasificación de excepciones:

  1. Throwable es el ancestro de todas las excepciones, Throwable tiene dos subclases, Error y Exception;
  2. Error es un error, lo que indica que se ha producido un error grave en la aplicación en ejecución, que se lanza a través de Error, y el programa general no puede manejarlo;
  3. La excepción es una excepción, lo que significa que cuando el programa se está ejecutando, el programa en sí puede detectar y manejar errores;
  4. Excepciones comunes:

Palabras clave para el manejo de excepciones:

  1. Atrapa la excepción:
    1. probar: Ejecutar código que puede generar excepciones;
    2. catch: excepción de captura;
    3. finalmente: independientemente de que ocurra una excepción, el código siempre se ejecuta;
  2. Lanzar una excepción:
    1. Lanzar: en la fase de generación de excepciones, el objeto de excepción se lanza manualmente;
  3. Excepción de declaración:
    1. throws declara varias clases de excepción que el método puede lanzar

 Definir nuevas excepciones:

  Métodos comunes en la clase Throwable:

Ejercicios relacionados

1. Basado en el siguiente código, método de análisis, no se lanza ninguna excepción, el resultado de salida

private static void try() {

    try {

      System.out.println("A");

      method(); // 未引发异常

      System.out.println("B");

      return;

      System.out.println("C");

    } catch (Exception e) {

      System.out.println("D");

    } finally {

      System.out.println("E");

    }

    System.out.println("F");

    return;

  }
  • A AB
  • B.ABE
  • C.ABEF
  • D.AEB

2. Basado en el siguiente código, método de análisis, lanzando una excepción, el resultado de salida

private static void try() {

    try {

      System.out.println("A");

      method(); // 引发异常

      System.out.println("B");

      return;

      System.out.println("C");

    } catch (Exception e) {

      System.out.println("D");

    } finally {

      System.out.println("E");

    }

    System.out.println("F");

    return;

  }
  • A. ADEB
  • B. ADBEF
  • C.ADEF
  • D. ADEBC

3. Solo admite excepciones de tipo personalizadas sin marcar, no admite excepciones de tipo marcadas personalizadas

  • R. si
  • B. Incorrecto

Java admite excepciones de tipo marcadas personalizadas y excepciones de tipo no marcadas. Una excepción verificada se refiere a una excepción que se debe manejar cuando se compila el programa, mientras que una excepción no verificada se refiere a una excepción que ocurre solo cuando el programa se está ejecutando. RuntimeException y sus subclases en Java son excepciones no verificadas, y otras excepciones y sus subclases son excepciones verificadas

4. Al personalizar la clase de excepción, la clase que se puede heredar es ( )

  • A.Error
  • B. subprograma
  • C. Throwable, Exception y sus subclases
  • D. Error de afirmación

5. En cuanto a la disposición de las excepciones en la cláusula catch, cuál de las siguientes es correcta ( ) 

  • A. La excepción de la clase principal viene primero y la excepción de la clase secundaria viene después.
  • B. Las excepciones de la subclase son lo primero, las excepciones de la clase principal siguen
  • C. Las excepciones con relación de herencia no pueden estar en el mismo bloque de prueba
  • D. Las excepciones pueden disponerse en cualquier orden, independientemente del orden

Esto se debe a que si la excepción de la clase principal viene primero, las excepciones de la subclase subsiguientes no se detectarán, porque la excepción de la clase principal ya contiene la excepción de la subclase. Y, por lo general, la información de la excepción de la subclase es más precisa que la excepción de la clase principal. Entonces, para manejar correctamente los diferentes tipos de excepciones, las cláusulas catch deben organizarse de menor a mayor.

6. El método que arroja una excepción no se declara en la clase principal y se permite agregar una declaración de excepción de tipo verificado cuando se reescribe la subclase.

  • R. si
  • B. Incorrecto

Cuando una subclase anula el método de la clase principal, para las excepciones verificadas, la subclase no puede agregar una declaración que genere una excepción. La subclase solo puede lanzar excepciones declaradas en el método de la clase principal o sus excepciones de subtipo, o no lanzar excepciones en absoluto. Esto es para garantizar que el uso de subclases no sea más propenso a errores que las clases principales, siguiendo el principio de sustitución de Liskov.

Si el método de la clase principal no declara lanzar ninguna excepción verificada, la subclase no puede declarar lanzar ninguna excepción verificada al reescribir el método. Si el método de la subclase arroja una excepción verificada, el compilador informará un error. Solo las excepciones no verificadas se pueden lanzar sin restricciones en los métodos de subclase.

7. Cuando ocurre una excepción, Java buscará en la pila de llamadas de método el programa más cercano que capture y maneje específicamente el mismo tipo de excepción, en lugar de un programa que pueda manejar este tipo de excepción.

  • R. si
  • B. Incorrecto

En Java, cuando ocurre una excepción, la máquina virtual de Java busca en la pila de llamadas de método un programa que pueda manejar la excepción hasta que encuentre un controlador de excepciones adecuado. Este controlador puede ser un programa que captura y maneja específicamente este tipo de excepción, o puede ser un controlador de excepciones general que puede manejar este tipo de excepción o su tipo principal.

El mecanismo de manejo de excepciones de Java permite el uso de sentencias try-catch para capturar y manejar excepciones. Cuando ocurre una excepción, el programa saltará al bloque catch que puede manejar la excepción, en lugar de continuar buscando el programa más cercano que específicamente atrape y maneje el tipo de excepción. Por lo tanto, un controlador de excepciones no está necesariamente diseñado específicamente para un determinado tipo de excepción, sino un controlador de excepciones capaz de manejar ese tipo de excepción o su supertipo.

Entonces, la afirmación dada es falsa. La expresión correcta debería ser: cuando ocurre una excepción, Java buscará en la pila de llamadas de método para encontrar un controlador de excepciones que pueda manejar el tipo de excepción o su tipo principal.

8. No puede capturar y manejar excepciones en el método donde ocurre la excepción

  • R. si
  • B. Incorrecto

En Java, las excepciones se pueden capturar y manejar fuera del método donde ocurrió la excepción. El mecanismo de manejo de excepciones de Java permite el uso de bloques de sentencias try-catch para capturar excepciones y manejarlas en los lugares apropiados. Esto significa que puede usar una declaración try-catch para capturar y manejar excepciones donde llama al método donde puede ocurrir la excepción, y no necesariamente necesita manejar la excepción dentro del método donde ocurrió la excepción.

9. La declaración del método arroja una excepción, que afectará la firma del método.

  • R. si
  • B. Incorrecto

10. Está prohibido lanzar excepciones en el constructor.

  • R. si
  • B. Incorrecto

En Java, los constructores pueden generar excepciones. Al igual que otros métodos, un constructor puede incluir en su declaración una declaración de que arroja una excepción.

Los constructores pueden generar excepciones comprobadas y excepciones no comprobadas. Una excepción comprobada es una excepción declarada explícitamente en la declaración del método que la persona que llama debe manejar o continuar lanzando. Una excepción no verificada es una excepción de RuntimeException o sus subclases que la persona que llama puede manejar o continuar lanzando opcionalmente.

Cuando el constructor lanza una excepción verificada, la persona que llama debe manejar estas excepciones al crear una instancia de objeto y puede capturar la excepción a través de un bloque try-catch o continuar lanzando una excepción a la capa superior.

11. Los métodos abstractos no se pueden declarar para lanzar excepciones

  • R. si
  • B. Incorrecto

Un método abstracto es un método que no tiene una implementación concreta, simplemente se declara en una clase o interfaz abstracta. En Java, los métodos abstractos se pueden declarar para generar excepciones, al igual que los métodos ordinarios. El propósito de declarar que se lanza una excepción es que la persona que llama sepa que el método puede generar un tipo específico de excepción y tomar las medidas correspondientes.

12. Al interactuar con recursos externos, pueden ocurrir excepciones de tipo no verificadas

  • R. si
  • B. Incorrecto

Al interactuar con recursos externos, pueden ocurrir excepciones verificadas en lugar de excepciones no verificadas (Excepción no verificada). Las excepciones no verificadas (como RuntimeException y sus subclases) generalmente indican errores de programa o errores de programación, mientras que las excepciones verificadas (como IOException, SQLException, etc.) generalmente indican fallas o condiciones anormales de operaciones de recursos externos.

tres, hilo

resumen de la clase

programa, proceso, hilo

  • Programa: se refiere a un archivo que contiene instrucciones y datos, que se almacena en un disco u otro dispositivo de datos, es decir, un programa es un código estático;
  • Proceso: es un proceso de ejecución de un programa, una actividad de ejecución de código en un conjunto de datos y la unidad básica de asignación y programación de recursos del sistema;
  • Subproceso: Un subproceso es una entidad en un proceso, y es la unidad básica programada y enviada independientemente por el sistema.Hay al menos un subproceso en un proceso, y múltiples subprocesos en un proceso comparten los recursos del proceso;

En resumen, un programa tiene al menos un proceso y un proceso tiene al menos un hilo

Creación de hilos:

Heredar la clase Thread para crear hilos

 Implementar la interfaz Runnable para crear hilos

 orden de ejecución

 Métodos comunes de la clase Thread:

  • start(): Inicie un nuevo hilo y ejecute  run() el código en el método.
  • run(): Define el código a ejecutar por el hilo.
  • sleep(long millis): Hace que el subproceso actual suspenda la ejecución durante el tiempo especificado.
  • join(): Espere a que termine este hilo.
  • interrupt(): Interrumpir el hilo.
  • La función de notificar() y notificarTodos() es despertar el subproceso en espera en el objeto actual; notificar() despierta un único subproceso y notificarTodos() despierta todos los subprocesos.

  • wait() : la función es permitir que el hilo actual entre en estado de espera y, al mismo tiempo, wait() también permitirá que el hilo actual libere el bloqueo que tiene. hasta que otro hilo llama a este objeto

Sincronización de hilos:

palabra clave volátil:

Visibilidad de datos simple y garantizada. Es decir, cuando un subproceso cambia cierta información en la memoria principal, se actualizará en la memoria principal inmediatamente después de la modificación. Y forzará que se borren los datos en el subproceso que almacenó en caché la variable, y los datos más recientes deben leerse de la memoria principal nuevamente .

Volatile puede garantizar la visibilidad de las variables, pero no puede garantizar la atomicidad de las operaciones de ejecución concurrentes

palabra clave sincronizada

Se utiliza para decorar métodos o bloques de código. Cuando un método o bloque de código se declara como sincronizado, significa que este método o bloque de código está sincronizado y solo un subproceso puede acceder a él al mismo tiempo.

La palabra clave sincronizada puede garantizar la seguridad de los subprocesos y evitar que varios subprocesos accedan y modifiquen datos compartidos al mismo tiempo. Cuando un subproceso ingresa a un método o bloque de código sincronizado, adquiere un bloqueo; cuando el subproceso deja el método o bloque de código sincronizado, libera el bloqueo. Solo el subproceso que adquiere el bloqueo puede ingresar al método sincronizado o al bloque de código,

El constructor no se puede sincronizar, es un error de sintaxis usar la palabra clave sincronizada en el constructor

Sincronizado no puede modificar métodos abstractos

Ejercicios relacionados

1. El método en la clase CountDownLatch que requiere que el subproceso de ejecución se bloquee hasta que el contador sea cero es

  • Un rastro()
  • B. esperar()
  • C. dormir()
  • D. enviar ()

CountDownLatch es una clase auxiliar de sincronización en Java, que se puede usar para controlar uno o más subprocesos para esperar la finalización de las operaciones de otros subprocesos. Hace esto con un contador inicializado en un entero positivo y hasta que el contador llega a cero, el subproceso de llamada está bloqueado.

El método await() es un método utilizado para bloquear subprocesos en la clase CountDownLatch. Cuando se llama al método await(), el subproceso actual se bloquea hasta que el valor del contador se vuelve cero. Cuando otros subprocesos llaman al método countDown() de CountDownLatch, el valor del contador se reducirá en uno, hasta que el valor del contador sea cero, el subproceso bloqueado se despertará para continuar con la ejecución.

2. Con respecto a la palabra clave volátil, ¿cuál de las siguientes afirmaciones es correcta?

  • A.  Se puede garantizar que la operación de la variable modificada está sincronizada
  • B.  Métodos de modificación para lograr operaciones atómicas
  • C.  El hilo no guarda una copia de la variable y la lee de la memoria principal cada vez que se usa
  • D.  Solo admite la modificación de tipos de datos básicos

La palabra clave volatile se usa para modificar variables en Java, y tiene las siguientes características:

A. Puede asegurar que la operación sobre la variable modificada sea visible, es decir, cuando un hilo modifica el valor de la variable modificada por volatile, otros hilos puede ver inmediatamente el valor más reciente. Pero no garantiza la atomicidad de las operaciones, por lo que no es adecuado para garantizar la sincronización de operaciones sobre variables.

B. Los métodos modificados no pueden lograr operaciones atómicas. La palabra clave volatile se usa principalmente para modificar variables, no métodos.

C. El subproceso no guarda una copia de la variable modificada volátil y lee el valor más reciente de la memoria principal cada vez que se usa la variable. Esta es una característica importante de volatile, que garantiza que el subproceso obtenga el valor más reciente.

D. La palabra clave volátil no solo admite la modificación de tipos de datos básicos, sino que también admite la modificación de variables de tipo de referencia. Por lo tanto, la opción D es incorrecta.

4. Emita una notificación de interrupción, que detendrá la ejecución del subproceso

  • R. si
  • B. Incorrecto

La emisión de una notificación de interrupción no detiene directamente la ejecución del subproceso. En Java, puede usar el método de interrupción () de la clase Thread para emitir una notificación de interrupción, pero esto es solo un mecanismo de notificación, que establecerá el estado de interrupción del hilo y no detendrá directamente la ejecución del hilo.

5. De forma predeterminada, el subproceso ejecutará la tarea repetidamente hasta que se interrumpa por la fuerza.

  • R. si
  • B. Incorrecto

De forma predeterminada, un subproceso no se repite una y otra vez hasta que se interrumpe a la fuerza. La ejecución de un subproceso depende de las tareas realizadas por el subproceso y la lógica del subproceso.

En Java, un subproceso puede realizar una tarea única o una tarea cíclica, según el código de implementación del subproceso. Un subproceso puede finalizar cuando se completa una tarea, o cuando se cumple una condición o se recibe una notificación de interrupción.

6. Hay dos métodos a nivel de instancia que requieren sincronización en la clase.Cuando un subproceso llama a uno de los métodos de sincronización, otros subprocesos no pueden llamar al otro método de sincronización.

  • R. si
  • B. Incorrecto

7. Hay 1 método de nivel de instancia en la clase que requiere sincronización y 1 método ordinario.

Cuando 1 subproceso llama a uno de los métodos sincronizados, otros subprocesos no pueden llamar al método no sincronizado

  • R. si
  • B. Incorrecto

8. El resultado de ejecución del siguiente programa ()

public static void main(String[] args) {

Thread t = new Thread() {

public void run() {

pong();

}

};

t.run();

System.out.print("ping");

}



static void pong() {

System.out.print("pong");

}
  • A. ping pong
  • B. hacer ping
  • C. Tanto el ping-pong como el ping-pong son posibles.
  • D tampoco

9. Las siguientes interfaces que pueden implementar operaciones de ejecución atómica bajo subprocesos múltiples son ( )

  • Una cerradura
  • B. Aleatorio
  • C. Atómico
  • D. Ejecutor

10. Tanto el método sleep() como el método wait() de la clase Thread pueden hacer que el hilo suspenda la ejecución.
A. Correcto
B. Incorrecto

Tanto el método sleep() como el método wait() de la clase Thread pueden suspender la ejecución del hilo, pero su uso y efectos son diferentes.

El método sleep() es un método estático de la clase Thread. Al llamarlo, el hilo actual suspenderá la ejecución durante un período de tiempo específico. El método sleep() no liberará el bloqueo y el subproceso no se interrumpirá durante el período de suspensión y no continuará ejecutándose hasta que finalice el tiempo de suspensión.

El método wait() es un método de instancia de la clase Object. Llamarlo hará que el subproceso actual suspenda la ejecución y libere el bloqueo del objeto. El método wait() generalmente se usa con la palabra clave sincronizada para lograr la coordinación y sincronización entre hilos. Cuando un subproceso llama al método wait(), entra en estado de espera hasta que otros subprocesos llaman al método notificar() o notificar a Todos() del mismo objeto para activar el subproceso en espera.

Cuatro, operación IO

resumen de la clase

El concepto de flujo IO:

  • Los flujos de IO operan read() y write() de la misma manera para diferentes entradas y salidas; la creación de diferentes tipos de flujos tiene diferentes métodos de implementación, y los diferentes tipos de flujos tienen sus propios métodos de operación únicos.
  • Independientemente de cómo funcione internamente, todos los flujos de E/S presentan el mismo patrón simple, una secuencia de datos que entran o salen de un programa.

Flujo de entrada, Flujo de salida:

  • El flujo de entrada, la superclase de operación del flujo de salida, admite subclases para operar datos binarios en forma de bytes básicos
  • clase abstracta java.io.InputStream: subclases básicas, ByteArrayInputStream, FileInputStream, etc.; 
  • int read() arroja IOException, el método abstracto se implementa mediante subclases específicas y devuelve el siguiente byte en la secuencia (debe representarse mediante un número entero entre 0 y 255), si no hay un byte legible al final de la secuencia, devolver -1.
  • clase abstracta java.io.OutputStream: subclases básicas, ByteArrayOutputStream, FileOutputStream, etc.;
  • void write(int b) lanza el método IOException Abstract. Escriba el byte decimal en el flujo de salida.
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Paths;
 
public class TestIO {
    public static void main(String[] args) {
        try {
            getByteStreams();
        } catch (IOException e) {
            e.printStackTrace();
        }
 
    }
    public static void getByteStreams()throws IOException {
        FileInputStream in=new FileInputStream("C:/Users/yu/Desktop/a.txt");
        FileOutputStream out=new FileOutputStream("C:/Users/yu/Desktop/b.txt");
        int c;
        while((c=in.read())!=-1){
            System.out.println("读取字节的10进制整数:"+c);
            out.write(c);
        }
        in.close();//有个问题就在于一旦异常了资源就无法关闭;
        out.close();
    }
 
}
  • Cierre de archivos de recursos: los archivos de recursos, como los flujos de E/S, no liberarán automáticamente los recursos ocupados al perder referencias como otros objetos. Por lo tanto, deben cerrarse correctamente, de lo contrario, se producirá un desbordamiento de la memoria. Tomando los flujos de E/S como ejemplo, para garantizar Independientemente de si se produce una excepción, el recurso se cierra y el recurso debe cerrarse manualmente en el bloque finalmente, pero esto provocará una gran redundancia en el programa;

La instrucción try-with-resources simplifica enormemente el código de procesamiento de recursos, de modo que los desarrolladores no necesitan preocuparse por el estado de los recursos, el orden en que se crean los objetos de recursos o el método de cierre correcto de los objetos de recursos.

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
 
public class Main {
    public static void main(String[] args) {
        getByteStreams();
    }
 
    public static void getByteStreams() {
        // 使用try-with-resources语句来创建输入流和输出流
        try (FileInputStream in = new FileInputStream("D:/桌面/in.txt");
             FileOutputStream out = new FileOutputStream("D:/桌面/out.txt")) {
            int c;
            while ((c = in.read()) != -1) {
                System.out.println("读取字节的10进制整数:" + c);
                out.write(c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

  • Aviso:

    (1) El cierre automático de recursos no tiene nada que ver con las excepciones. Cómo lidiar con la excepción sigue siendo cómo lidiar con ella.

    (2) Después de declarar el uso de recursos en la sentencia try, la secuencia de ejecución:

    • ​​​​Sin excepción, después de que se ejecuta el bloque de prueba, el recurso se cierra automáticamente, el bloque finalmente

    • Hay excepciones, los recursos se cierran automáticamente, capturan bloques, finalmente bloquean

camino:

  • Una ruta absoluta, que siempre incluye el elemento raíz y la lista completa del directorio necesaria para encontrar el archivo. Por ejemplo, D:/prueba/a.txt. Toda la información necesaria para encontrar el archivo está contenida en la declaración de ruta

  • Una ruta relativa, por ejemplo, a.txt. El programa no será accesible sin más información. Es decir, las rutas relativas deben describirse en última instancia en función de las rutas absolutas. '

  • Interfaz de ruta: la ruta representa una ruta de archivo que no depende del sistema. Es decir, la implementación específica de Path es diferente (Windows/Linux) cuando se ejecuta en diferentes sistemas operativos, pero los desarrolladores solo necesitan describir rutas para Path y no necesitan preocuparse por las diferencias en los sistemas operativos para diferentes sistemas.

  • Path getFileName(), devuelve el nombre del archivo o el último elemento de una secuencia de elementos de nombre. Es decir, la última descripción de la ruta, que puede ser un nombre de archivo o un nombre de directorio.

    Path getParent(), devuelve la ruta del directorio principal

  • Path getRoot(), devuelve la raíz de la ruta

    Método de resolución de ruta (otra ruta), empalme de rutas en una nueva ruta

    boolean equals(Object obj): invalida equals para determinar si las rutas son las mismas

Clase de herramienta de archivos:

  • La clase de herramientas java.nio.file.Files proporciona una gran cantidad de métodos estáticos basados ​​en operaciones de ruta, lectura/escritura/operación, archivos y directorios. Clasificación del método:

  • Juicio de archivos o directorios:

    booleano existe (ruta de la ruta)/notExists (ruta de la ruta), si la ruta de la ruta existe

    Boolean isDirectory(Path path), si la ruta es un directorio

  • Creación de archivos o directorios:

    Path createDirectory (Path dir) lanza IOException. Es anormal si la ruta del directorio ya existe; si la ruta del directorio es un directorio de varios niveles, es anormal

    Path createDirectories (Path dir) lanza IOException. Cree automáticamente directorios no existentes de varios niveles; el directorio ya existe, sin excepción

    La ruta createFile (ruta) lanza IOException. Cree un archivo basado en la ruta especificada. el archivo existe, excepción

  • Copia de archivos o directorios:

    La copia de la ruta (fuente de la ruta, destino de la ruta, opciones de CopyOption...) lanza una excepción IO, copia el archivo en el archivo de destino. Por defecto, si el archivo ya existe, una excepción

    Si la fuente es un directorio, los archivos que contiene no se copiarán, solo es equivalente a crear un directorio vacío

    enumeración java.nio.file.StandardCopyOption, implementa la interfaz CopyOption, opciones de copia

  • Movimiento de archivos o directorios:

    El movimiento de la ruta (origen de la ruta, destino de la ruta, opciones de CopyOption...) lanza IOException, mueve o cambia el nombre del archivo al archivo de destino.

    De forma predeterminada, si el archivo de destino existe, será una excepción y la opción de movimiento se puede declarar a través del parámetro de opciones

    Si se mueve en este directorio, es equivalente a cambiar el nombre del archivo

  • Eliminación de archivos o directorios:

    void delete(Path path) lanza IOException. Eliminar la ruta especificada; la ruta no existe, excepción

    boolean deleteIfExists(Path path) lanza IOException. La ruta no existe y no se elimina. Devolver si la eliminación fue exitosa

    Si la ruta es un directorio y el directorio contiene archivos (es decir, no está vacío), ambas eliminaciones son anormales

  • Recorrido de la ruta especificada (método de archivos):

    Stream<Path> walk(Path start, int maxDepth) arroja IOException: Atravesar, atravesar directorios y archivos en la ruta de la ruta en función de la profundidad especificada

    Stream<Path> walk(Path start) lanza IOException: recorre todos los directorios y archivos en la ruta, incluidos los subdirectorios, observa el orden de salida durante el recorrido y los genera jerárquicamente. Tenga en cuenta que el valor devuelto es una secuencia y las operaciones de secuencia se pueden usar más tarde, como filtrado, clasificación y otras funciones. Puede eliminar directorios no vacíos con la ayuda de este método

Ejercicios relacionados

1. Lo siguiente se puede describir correctamente, C:/a/b, la salida de la ruta es

Cadena p1 =  "C:/" ;
Cadena p2 =  "a" ;
Cadena p3 =  "b" ;

  • Un sistema. fuera .println(p1 + p2 + p3);
  • B. Sistema. out .println(Ruta. de (p1 + p2 + p3));
  • C. Sistema. out .println(Ruta. de (p1).resolve(p2).resolve(p3));
  • D. Sistema. out .println(Ruta. de (p3).resolve(p2).resolve(p1));

La salida correcta es:

C.System.out.println(Path.of(p1).resolve(p2).resolve(p3));

este código combinará la ruta como "C:/a/b" y la salida. El método Path.of() se usa para crear un objeto de ruta y el método resolve() se usa para conectar segmentos de ruta.

2. Si se lanza una excepción en el bloque de código de prueba de la declaración de prueba con recursos, primero ejecute el bloque catch para manejar la excepción y finalmente bloquee, luego cierre el recurso.

  • R. si
  • B. Incorrecto

3. El método de lectura (byte [] b) de InputStream, cuando la cantidad de bytes en la secuencia excede la capacidad del búfer de matriz de bytes, se lanzará una excepción

  • R. si
  • B. Incorrecto

Cuando se usa el método read(byte[] b) de InputStream, este método no arroja una excepción si hay más bytes en la secuencia de los que puede contener el búfer de matriz de bytes. Lee la mayor cantidad posible de datos de la secuencia en el búfer de matriz de bytes y devuelve la cantidad de bytes realmente leídos. Si el número de bytes en la secuencia excede la capacidad del búfer, solo leerá el tamaño de bytes del búfer y devolverá esa cantidad. Los bytes restantes permanecerán en el flujo, disponibles para operaciones de lectura posteriores.

4. El método write(byte[] b) de OutputStream escribirá todos los bytes en el búfer de matriz de bytes en el flujo de salida

  • R. si
  • B. Incorrecto

Cuando se utiliza el método write(byte[] b) de OutputStream, todos los bytes del búfer de matriz de bytes se escriben en el flujo de salida. Específicamente, este método escribe todos los bytes en la matriz de bytes b en el flujo de salida para que los datos puedan enviarse al destino. Si la longitud de la matriz de bytes es mayor que el tamaño del búfer del flujo de salida, este método escribe todos los bytes en el búfer del flujo de salida y envía la mayor cantidad posible del contenido del búfer al destino.

5. De forma predeterminada, los flujos de entrada y salida se basan en cadenas de caracteres para completar las operaciones de archivos
A. Verdadero
B.  Falso

De forma predeterminada, los flujos de entrada y salida no realizan operaciones de archivo basadas en cadenas. Los flujos de entrada y salida (InputStream y OutputStream) se utilizan para operaciones de entrada y salida a nivel de byte. Se utilizan para trabajar con datos de bytes en lugar de datos de cadenas.

Supongo que te gusta

Origin blog.csdn.net/qq_62377885/article/details/130780733
Recomendado
Clasificación