Puntos de conocimiento dispersos de revisión de Java 1

1. Bloqueo y no bloqueo síncronos y asincrónicos

1.1.Sincrónico y asincrónicoSincrónico
y asincrónico en realidad se refieren al uso de intervalos de tiempo de la CPU, dependiendo principalmente del iniciador de la solicitud, ya sea que la adquisición del mensaje se inicie activamente o se notifique pasivamente.

  • Si se inicia activamente, ha estado esperando el resultado de la respuesta (bloqueo síncrono), o se pueden procesar otras cosas, pero es necesario sondear continuamente para ver si la solicitud iniciada tiene un resultado de respuesta (no bloqueo síncrono)
  • Si es notificado por el servidor, es decir, después de que el solicitante envía la solicitud, debe esperar la notificación (bloqueo asíncrono) o hacer lo suyo primero (no bloqueo asíncrono). Cuando se completa el procesamiento, el servidor notificará activamente al solicitante, Su solicitud ha sido completada, esto es asincrónico, la notificación asincrónica se completa con cambios de estado, notificaciones de mensajes o funciones de devolución de llamada.La mayoría de las veces, se utilizan funciones de devolución de llamada.

1.2 Bloqueo y no bloqueo

El bloqueo y el no bloqueo generalmente se refieren a operaciones para IO. En pocas palabras, después de llamar a una función y esperar a que la función devuelva el resultado, el subproceso actual se encuentra en un estado suspendido o en ejecución, si está suspendido, el estado significa que el el subproceso actual no puede hacer nada, solo espera obtener el resultado. Esto es bloqueo síncrono. Si todavía está en ejecución, significa que el subproceso actual puede continuar procesando otras tareas, que es un estado sin bloqueo.

2. La diferencia entre proceso e hilo

  • El proceso es una unidad independiente del sistema para la asignación y programación de recursos, y el proceso tiene un subproceso de espacio de direcciones independiente
  • Es una entidad de un proceso y la unidad básica de programación y asignación de CPU. Es una unidad básica que es más pequeña que un proceso y puede ejecutarse de forma independiente. Un programa tiene al menos un proceso y un proceso tiene al menos un hilo.
  • La sobrecarga de ejecución de subprocesos es pequeña, pero no favorece la gestión y protección de los recursos, mientras que el proceso es el contrario.

3. Categoría interna

3.1 ¿Por qué utilizar clases internas?

  • La mayor ventaja de usar clases internas es que puede resolver muy bien el problema de la herencia múltiple. El uso de clases internas también puede traernos las siguientes características:
    1). Las clases internas pueden usar múltiples instancias, cada instancia tiene su propia información de estado, y es independiente de la información de otros objetos periféricos.
    2) En una sola clase externa, varias clases internas pueden implementar la misma interfaz de diferentes maneras o heredar la misma clase.
    3) El momento de crear el objeto de la clase interna no depende de la creación del objeto de la clase externa.
    4) La clase interna no tiene una relación confusa "es-a", es una entidad independiente.

3.2, clasificación interna

3.2.1 Clase interna de miembro

public class Outer{
    
    
      private int age = 99;
      String name = "Coco";
      public class Inner{
    
    
          String name = "Jayden";
          public void show(){
    
    
              System.out.println(Outer.this.name);
              System.out.println(name);
              System.out.println(age);
          }
      }
      public Inner getInnerClass(){
    
    
          return new Inner();
      }
      public static void main(String[] args){
    
    
          Outer o = new Outer();
          Inner in = o.new Inner();
          in.show();
      }
  }

注意:
	01、Inner 类定义在 Outer 类的内部,相当于 Outer 类的一个成员变量的位置,Inner 类可以使用任意访问控制符,如 publicprotectedprivate02、Inner 类中定义的 show() 方法可以直接访问 Outer 类中的数据,而不受访问控制符的影响,如直接访问 Outer 类中的私有属性age
	03、外部类是不能直接使用内部类的成员和方法的,可先创建内部类的对象,然后通过内部类的对象来访问其成员变量和方法;
	04、如果外部类和内部类具有相同的成员变量或方法,内部类默认访问自己的成员变量或方法,如果要访问外部类的成员变量,可以使用 this 关键字,:Outer.this.name

3.2.2 Clase interna de miembro

/*
1.静态内部类不能直接访问外部类的非静态成员,但可以通过 new 外部类().成员 的方式访问,比如我们访问age,可以使用 new Outer1().age直接访问。
2.如果外部类的静态成员与内部类的成员名称相同,可通过“类名.静态成员”访问外部类的静态成员;如果外部类的静态成员与内部类的成员名称不相同,则可通过“成员名”直接调用外部类的静态成员
3.创建静态内部类的对象时,不需要外部类的对象,可以直接创建 内部类 对象名 = new 内部类();
*/
public class Outer1 {
    
    
    private int age = 99;
    static String name = "Coco";
    public static class Inner{
    
    
        String name = "Jayden";
        public void show(){
    
    
            System.out.println(Outer1.name);
            System.out.println(name);
            System.out.println(new Outer1().age);
        }
    }
    public static void main(String[] args){
    
    
        Inner i = new Inner();
        i.show();
    }
}

3.2.3 Clase interna del método: su alcance está limitado al método, no se puede acceder a la clase interna fuera del método
3.2.4 Clase interna anónima

/*
1、匿名内部类是直接使用 new 来生成一个对象的引用;
*/
public class OuterClass {
    
    
          public InnerClass getInnerClass(final int   num,String str2){
    
    
              return new InnerClass(){
    
    
                  int number = num + 3;
                  public int getNumber(){
    
    
                      return number;
                  }
              };        /* 注意:分号不能省 */
          }
          public static void main(String[] args) {
    
    
              OuterClass out = new OuterClass();
              InnerClass inner = out.getInnerClass(2, "chenssy");
              System.out.println(inner.getNumber());
          }
      }
      interface InnerClass {
    
    
          int getNumber();
      }

4. Ciclo de vida del frijol de primavera

Las tres etapas del ciclo de vida

4.1
Alcance de la fase de creación = "singleton" (predeterminado)

Spring工厂创建的同时,对象创建
ClassPathXmlApplicationContext s1 = new ClassPathXmlApplicationContext("application.xml");

注意:lazy-init="true" 这种情况下是在获取对象的时候才创建
<bean name="student" class="com.zq.student" scope="singleton" lazy-init="true"/>

alcance = "prototipo"

Spring工厂在获取对象的时候创建对象.

ClassPathXmlApplicationContext s1 = new ClassPathXmlApplicationContext("application.xml");
Object student = s1.getBean("student");

4.2 Fase de inicialización

4.3 Fase de destrucción

5. Aprendizaje de matrices

1. Se puede utilizar para almacenar varios datos. Cada elemento de la matriz almacena un dato. Por lo general, se puede
acceder al elemento de la matriz a través del índice del elemento de la matriz, incluida la asignación al elemento de la matriz y la eliminación del valor del elemento de la matriz.

5.1 Las matrices de Java requieren que todos los elementos de la matriz tengan el mismo tipo de datos.

5.2 Las características de la matriz:

  • Una vez completada la inicialización de la matriz, el espacio ocupado por la matriz en la memoria será fijo y cualquier cambio en los elementos de la matriz (incluido el vaciado) hará que la longitud de la matriz sea invariable.
  • Las matrices pueden almacenar tipos de datos básicos o tipos de referencia. Siempre que todos los elementos de la matriz tengan el mismo tipo.
  • La matriz es un tipo de referencia, es decir, puede ser almacenada por otra matriz.

5.3. Hay dos formas de inicializar la matriz:

  • Inicialización estática: durante la inicialización, el programador especifica explícitamente el valor inicial de cada elemento de la matriz y el sistema determina la longitud de la matriz.
  • Inicialización dinámica: la longitud de la matriz la especifica el programador o el programa durante la inicialización, y el sistema asigna valores iniciales a los elementos.

Inicialización estática

//定义一个int[]类型的数组,并静态初始化。
int[] arrayInt = new int[]{
    
    1,2,3,4,5};

//上面的代码等价于下面的代码
int[] arrayInt1;
arrayInt1 = new int[]{
    
    1,2,3,4,5};

//上面的代码等价于下面的代码
int[] arrayInt2 = {
    
    1,2,3,4,5};

Inicialización dinámica

声明数组类型与静态初始化指定的数组元素相同
int[] arrayInt = new int[5];

5.4. Acceso a elementos de matriz y recorrido de matriz

Atributo de longitud
de la matriz length length es el atributo de longitud de la matriz.A través de este atributo, se puede obtener la longitud de la matriz, y luego el valor de la matriz puede ser consultado (impreso) por este atributo y asignado a la matriz dinámicamente.

数组长度属性例子
//1.查询(打印)数组的值
public class J_ArrayDemo3 {
    
    
    public static void main(String[] args) {
    
    
        int[] arrayInt = new int[8];
        for (int i = 0; i < arrayInt.length; i++) {
    
    
            System.out.println(arrayInt[i]);
        }
    }
}

Recorrido de bucles exclusivos de arreglos para arreglos y colecciones para cada
sintaxis de bucle foreach
para (variable de tipo de arreglo: variable de arreglo (variable de colección)) { // acceder automáticamente (iterar) a cada elemento }

public class J_ArrayDemo5 {
    
    
	public static void main(String[] args) {
    
    
	    String[] books = {
    
    "疯狂Java","狂神说","小滴课堂","黑马","尚学堂"};
	    for (String a : books) {
    
    
	        System.out.println(a);
	    }
	}
}

5.4.1. Métodos de uso común en matrices

clasificar

/*
数组的工具类java.util.Arrays
数组对象本身没有什么方法可以供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些计本的操作
常用功能:
给数组赋值,通过fill方法
对数组排序,通过sort方法
比较数组,通过equal方法比较数组中元素的值是否相等
查找数组元素,通过binary Search方法能对排序好的数组进行二分查找法操作
*/
public class J_ArrayDemo22 {
    
    
    public static void main(String[] args) {
    
    
        /*
         * 对数组arrayType的元素进行排序
         * void sort(type[] arrayType);
         * 对数组arrayType所在范围内的元素进行排序
         * void sort(type[] arrayType,int fromIndex,int toIndex)
         */
        int[] arrayInt = {
    
    22,34,11,25,28,12};
        int[] arrayInt1 = {
    
    22,34,11,25,28,12};
        Arrays.sort(arrayInt);
        for (int a : arrayInt){
    
    
            System.out.print(a + ",");
        }
        System.out.println();
        Arrays.sort(arrayInt1,2,4);
        for (int a : arrayInt1){
    
    
            System.out.print(a + ",");
        }
    }
}

public class J_ArrayDemo23 {
    
    
    public static void main(String[] args) {
    
    
    /*
     * String toString(type[] arrayType)
     * 将数组转化为字符串。
     */
        int[] arrayInt1 = null;
        int[] arrayInt2 = new int[0];
        int[] arrayInt3 = {
    
    1};
        int[] arrayInt4 = {
    
    1,12,23,4,1,2,3,1};
        System.out.println(Arrays.toString(arrayInt1));
        System.out.println(Arrays.toString(arrayInt2));
        System.out.println(Arrays.toString(arrayInt3));
        System.out.println(Arrays.toString(arrayInt4));
    }
}

6, apilar y amontonar

  • Pila: cuando se ejecuta un método, abrirá un espacio propio en la pila de memoria, las variables de este método se colocarán en este espacio y las variables del método se destruirán cuando el método finalice.
  • Montón: cuando se crea un objeto en el programa, el objeto se guardará en el montón. El objeto no se destruirá con el final del método. Incluso después de que finalice el método, el objeto puede seguir siendo referenciado por otras variables de referencia. Cuando se hace referencia a cualquier variable de referencia, el mecanismo de recolección de basura del sistema la recicla cuando el sistema está inactivo.

7. La diferencia entre filtros e interceptores:

① El interceptor se basa en el mecanismo de reflexión de Java, y el filtro se basa en la función de devolución de llamada.
② El interceptor no depende del contenedor del servlet y el filtro depende del contenedor del servlet.
③ Los interceptores solo pueden trabajar en solicitudes de acción, mientras que los filtros pueden funcionar en casi todas las solicitudes.
④ El interceptor puede acceder a los objetos en el contexto de la acción y la pila de valores, pero el filtro no.
⑤En el ciclo de vida de la acción, el interceptor se puede llamar varias veces, mientras que el filtro solo se puede llamar una vez cuando se inicializa el contenedor.
⑥ El interceptor puede obtener cada bean en el contenedor IOC, pero el filtro no. Esto es muy importante. Inyectar un servicio en el interceptor puede llamar la lógica empresarial.

8. ¿Cuáles son las similitudes y diferencias entre jsp y servlet, y cuáles son las conexiones?

1. JSP se convierte en un servlet después de ser compilado (jsp es esencialmente un servlet, jvm solo puede reconocer clases java, no código jsp, el contenedor web compila código jsp en clases java que jvm puede reconocer)

2.jsp se muestra mejor en la página, el servlet es mejor en el control lógico

3. No hay objetos integrados en setvlet. Los objetos integrados en jsp deben obtenerse a través del objeto HttpServletRequest, el objeto HttpServletResponse y el objeto HttpServlet

4. JSP es una simplificación del servlet. El uso de jsp solo necesita completar el contenido que el programador necesita enviar al cliente. La forma de incrustar el script java en jsp en una clase se completa con el contenedor jsp, y el servlet es un completo clase java, el método de servicio de esta clase se utiliza para generar una respuesta al cliente

9. ¿Cómo es una solicitud http completa?

1. Analizar la URL

Primero, el navegador verificará si la URL existe correctamente y, si no es válida, devolverá un motor de búsqueda predeterminado.
Si existe y es legal, entonces se puede analizar para obtener información como protocolo (http o https), nombre de dominio (baidu), recurso (página de inicio), etc.

2.
Consulta de DNS El navegador primero verificará si la información del nombre de dominio está en la caché.
Luego, verifique si el nombre de dominio está en el archivo Hosts local.
Si no está allí, el navegador enviará una solicitud de consulta al servidor DNS para obtener la dirección IP del servidor de destino.

3. Transmisión y transporte TCP. En
este momento, el navegador obtiene la IP (retorno de DNS) y el puerto del servidor de destino (incluido en la URL, si no, utilice el predeterminado (puerto 80 predeterminado de HTTP)), y el navegador Llame al socket de función de biblioteca para generar sockets TCP Stream, es decir, paquetes TCP completos.
Una vez completado el paquete TCP, se puede transmitir El navegador y el servidor completan el protocolo de enlace de tres vías TCP, establecen una conexión y luego solicitan recursos del servidor.

4. El servidor recibe solicitudes y responde a
HTTP con muchos métodos de solicitud, tales como: GET / POST / PUT / DELETE, etc. La entrada de URL en nuestro navegador es el método GET.
El servidor recibe la solicitud GET y el servidor obtiene el contenido correspondiente de acuerdo con la información de la solicitud. Por ejemplo, lo que ingresamos es: \ Baidu, lo sabrás \, entonces significa visitar el archivo de la página de inicio de Baidu

5. El navegador analiza y renderiza El
navegador obtiene el recurso al que quiere acceder desde el servidor La mayoría de las veces, este recurso es una página HTML, por supuesto, también puede ser un archivo de otros tipos.
El navegador primero analiza el documento HTML y genera un árbol de análisis (un árbol con elementos DOM como nodos).
Cargue recursos externos de la página, como JS, CSS e imágenes.
Recorre el árbol DOM, calcula el estilo de cada nodo, y finalmente completa el renderizado y conviértete en la página que vemos.

10. Dos formas de implementar la redirección de páginas: reenvío de solicitudes y redirección.

Reenvío de solicitudes: el
cliente envía primero una solicitud al servidor. El servidor encuentra un servlet coincidente y lo especifica para que se ejecute. Cuando se ejecuta el servlet, llama al método getRequestDispacther () para reenviar la solicitud al student_list.jsp especificado, el todo el proceso se completa en el lado del servidor y se completa en la misma solicitud, por lo que el servlet y jsp comparten la misma solicitud, todo lo que se coloca en el servlet se puede eliminar en la lista de estudiantes, por lo que la lista de estudiantes puede obtener el resultado de getAttribute ( ) y devolver el resultado al cliente después de que se ejecute getAttribute (). Todo el proceso es una solicitud y una respuesta.

Redirección: el
cliente envía una solicitud al servidor. El servidor coincide con el servlet. Después de que se procesa el servlet, se llama al método sendRedirect () y esta respuesta se devuelve al cliente inmediatamente. La línea de respuesta le dice al cliente que debe envía otra solicitud para acceder a student_list. jsp, inmediatamente después de que el cliente recibe esta solicitud, envía inmediatamente una nueva solicitud para solicitar student_list.jsp, donde las dos solicitudes no interfieren entre sí y son independientes entre sí. Cualquier cosa en setAttribute () en la solicitud anterior está al dorso No disponible en la solicitud. Puede verse que hay dos solicitudes y dos respuestas en sendRedirect (). (El servidor envía un código de estado 302 y un encabezado de mensaje de ubicación al navegador. Después de recibir la solicitud, el navegador enviará una solicitud nuevamente de acuerdo con la dirección de redireccionamiento)

Reenvío de solicitudes: request.getRequestDispatcher ("/ test.jsp"). Forword (solicitud, respuesta);
Redirección: response.sendRedirect ("/ test.jsp");

la diferencia:

1. Número de solicitudes: Redirección significa que el navegador envía una solicitud al servidor y envía una solicitud a una nueva dirección nuevamente después de recibir la respuesta. Reenvío significa que el servidor salta a una nueva dirección para completar la respuesta después de recibir la respuesta. solicitud; redirigir al menos la solicitud dos veces, reenviar la solicitud una vez;

2. La barra de direcciones es diferente: la barra de direcciones de redireccionamiento cambiará y la barra de direcciones de redireccionamiento no cambiará;

3. Ya sea para compartir datos: Redirigir dos veces para solicitar no compartir datos y reenviar una vez para solicitar datos compartidos (el intercambio de información se usa en el nivel de solicitud y la redirección seguramente saldrá mal);

4. Restricción de redirección: la redirección se puede redirigir a cualquier URL, y el reenvío solo puede redirigir los recursos de este sitio;

5. Ocurren diferentes comportamientos: la redirección es un comportamiento del lado del cliente y el reenvío es un comportamiento del lado del servidor;

11. Códigos de estado de retorno http comunes (200,301,302,400)

200-La solicitud es exitosa
301-El recurso (página web, etc.) se transfiere permanentemente a otra URL
404-El recurso solicitado (página web, etc.) no existe
500-Error interno del servidor

Supongo que te gusta

Origin blog.csdn.net/Anna_Liqi/article/details/114433653
Recomendado
Clasificación