Resumen de la teoría básica de Java + Java WEB + Puntos de conocimiento del marco de código abierto de Java

1. Conceptos básicos de Java

1. ¿Cuál es la función de la palabra clave final?
  • Las clases modificadas por final no se pueden heredar
  • Los métodos modificados por final no se pueden anular
  • Las variables modificadas por final no se pueden cambiar. Si se modifica una referencia, significa que la referencia es inmutable y el contenido al que apunta la referencia es mutable.
  • Para los métodos modificados por final, la JVM intentará alinearlos para mejorar la eficiencia operativa. Las variables modificadas por final se almacenarán en el grupo constante durante la fase de compilación.
2. ¿Cuál es la diferencia entre clase abstracta e interfaz?
  • Una clase que declara la existencia de un método sin implementarlo se llama clase abstracta. Se utiliza para crear una clase que incorpora algún comportamiento básico y declara un método para la clase, pero la clase no se puede implementar en la clase. Caso. No se pueden crear instancias de clases abstractas. Sin embargo, puede crear una variable cuyo tipo sea una clase abstracta y hacer que apunte a una instancia de una subclase concreta. No puede haber constructores abstractos ni métodos estáticos abstractos. Las subclases de la clase abstracta proporcionan implementaciones para todos los métodos abstractos en su clase principal; de lo contrario, también serían clases abstractas. En su lugar, implemente el método en una subclase. Otras clases que conozcan su comportamiento pueden implementar estos métodos en su clase.
  • Una interfaz es una variante de una clase abstracta. En una interfaz, todos los métodos son abstractos. Se puede obtener herencia múltiple implementando dicha interfaz. Todos los métodos de la interfaz son abstractos y ninguno de ellos tiene un cuerpo de programa. Las interfaces solo pueden definir variables miembro finales estáticas. La implementación de una interfaz es similar a la creación de subclases, excepto que la clase implementadora no puede heredar el comportamiento de la definición de la interfaz. Cuando una clase implementa una interfaz particular, define (es decir, le da el cuerpo del programa) todos los métodos de esta interfaz. Luego puede llamar a los métodos de la interfaz en cualquier objeto de la clase que implemente la interfaz. Dado que existen clases abstractas, permite utilizar el nombre de la interfaz como tipo de variable de referencia. La vinculación dinámica normal tendrá efecto. Las referencias se pueden convertir hacia o desde tipos de interfaz, y el operador instancia de se puede utilizar para determinar si la clase de un objeto implementa la interfaz.
3. Clases de colección de Java: ¿Cuáles son las características y el uso de lista, conjunto, cola, mapa y pila?
  • Mapa
    • El mapa es un par clave-valor, y la clave es la única que no se puede repetir. Una clave corresponde a un valor y el valor se puede repetir.

    • TreeMap puede garantizar el orden, HashMap no garantiza el orden, es decir, está desordenado.

    • La clave y el valor se pueden extraer por separado del mapa: el método KeySet () puede extraer todas las claves en un conjunto, y el método Values ​​() puede extraer todos los valores del mapa en un conjunto.

  • Colocar
    • Un conjunto que no contiene elementos repetidos. El conjunto contiene como máximo un elemento nulo. Sólo se puede utilizar Iterator para implementar el recorrido de un solo elemento. No hay ningún método de sincronización en Set.
  • Lista
    • Una colección repetible ordenada puede agregar y eliminar elementos en cualquier posición. Iterator se puede usar para implementar un recorrido unidireccional y ListIterator se puede usar para implementar un recorrido bidireccional.
  • Cola
    • La cola sigue el principio de primero en entrar, primero en salir. Trate de evitar los métodos add() y remove() cuando la use. En su lugar, use offer() para agregar elementos y poll() para eliminar elementos. Su ventaja es que se puede juzgar por el valor de retorno. LinkedList implementa con éxito la interfaz Queue y Queue generalmente no permite la inserción de elementos nulos.
  • Pila
  • Stack sigue el principio de último en entrar, primero en salir. Stack hereda de Vector. Extiende la clase Vector a través de cinco operaciones para permitir que el vector sea tratado como una pila. Proporciona las operaciones habituales de empujar y sacar, así como la vista () método y prueba para tomar el vértice de la pila, método vacío para comprobar si la pila está vacía, etc.
  • uso
    • Si se trata de operaciones como pilas y colas, se recomienda utilizar Lista.
    • Para insertar y eliminar elementos rápidamente, se recomienda utilizar LinkedList. Si necesita un acceso aleatorio rápido a los elementos, se recomienda utilizar ArrayList.
4. Cuénteme sobre el rendimiento del almacenamiento y las características de ArrayList, Vector y LinkedList.
  • ArrayList y Vector utilizan matrices para almacenar datos. El número de elementos de la matriz es mayor que los datos almacenados reales, por lo que se pueden agregar e insertar elementos. Ambos permiten que los elementos se indexen directamente por número de serie, pero la inserción de elementos implica operaciones de memoria como como mover elementos de matriz, por lo que la indexación de datos es rápida pero lenta para insertar datos. Debido a que Vector usa el método sincronizado (seguridad de subprocesos), su rendimiento suele ser peor que ArrayList, mientras que LinkedList usa una lista doblemente vinculada para implementar el almacenamiento. Indexación de datos por número de serie requiere recorrido hacia adelante o hacia atrás, pero solo al insertar datos, solo necesita registrar los elementos antes y después de este elemento, por lo que la velocidad de inserción es más rápida.
5. ¿Pérdidas y desbordamientos de memoria?
  • Pérdida de memoria (memoryleak) significa que la aplicación no puede liberar el espacio de memoria que ha solicitado después de solicitar memoria. El daño de una pérdida de memoria se puede ignorar, pero si se permite que se desarrolle, eventualmente conducirá a un desbordamiento de memoria (fuera de memoria). . Por ejemplo, después de leer un archivo, la secuencia debe cerrarse rápidamente y la conexión a la base de datos debe liberarse.

  • Desbordamiento de memoria (fuera de memoria) significa que cuando una aplicación solicita memoria, no hay suficiente espacio de memoria para usar. Por ejemplo, en nuestro proyecto, importamos grandes lotes de datos en lotes.

7. ¿Cuál es la diferencia entre int y entero?
  • Integer es el tipo de empaquetado de int. Durante el unboxing y el boxing, ambos se convierten automáticamente. Int es un tipo básico y puede almacenar valores directamente; e integer es un objeto; una referencia apunta a este objeto. Dado que Integer es un objeto, en Los objetos JVM requieren una determinada estructura de datos para describir y, en comparación con int, ocupan mayor memoria.
8. ¿Cuáles son las diferencias entre String, StringBuilder y StringBuffer?
Cadena Constante de cadena inmutable Cuando se utiliza la concatenación de cadenas, hay dos espacios diferentes.
búfer de cadena variable de cadena variable Seguridad del hilo La concatenación de cadenas se agrega directamente después de la cadena.
variable de cadena StringBuilder variable No es seguro para subprocesos La concatenación de cadenas se agrega directamente después de la cadena.
  • La eficiencia de ejecución de StringBuilder es mayor que StringBuffer y mayor que String.
  • La cadena es constante e inmutable, por lo que se creará un nuevo objeto para cada asignación +=. StringBuffer y StringBuilder son variables. Al empalmar cadenas, se utiliza el método append para agregar sobre la base original. , por lo que el rendimiento es mayor que String, y debido a que StringBuffer es seguro para subprocesos y StringBuilder no es seguro para subprocesos, StringBuilder es más eficiente que StringBuffer.
  • Para empalmar grandes cantidades de cadenas, utilice StringBuffer y StringBuilder.
9. ¿Cuál es la diferencia entre Hashtable y Hashmap?
  • HashTable es seguro para subprocesos, HashMap no es seguro para subprocesos 2. Hashtable no permite valores nulos (la clave y el valor no están permitidos), HashMap permite valores nulos (tanto la clave como el valor están permitidos).
    Los métodos transversales de los dos son similares: Hashtable solo tiene un método de elementos más que HashMap.
10. ¿Cuáles son algunas excepciones comunes en tiempo de compilación?
  • SQLException Una excepción que proporciona información sobre un error de acceso a la base de datos u otro error.
    IOexception Señal de que se ha producido algún tipo de excepción de E/S. Esta clase se genera por una operación de E/S fallida o interrumpida
    Clase de excepción general FileNotFoundException Esta excepción se produce cuando falla un intento de abrir el archivo representado por el nombre de ruta especificado.
    ClassNotFoundException No se puede encontrar la definición de la clase con el nombre especificado.
    EOFException Esta excepción se produce cuando se llega inesperadamente al final de un archivo o secuencia durante la entrada.
11. ¿Cuáles son las reglas para la sobrecarga de métodos?
  • Los nombres de los métodos son los mismos, pero el orden, el tipo y la cantidad de parámetros en la lista de parámetros son diferentes. La sobrecarga no tiene nada que ver con el valor de retorno del método y existe en clases principales y subclases del mismo tipo. Se pueden generar diferentes excepciones y pueden tener diferentes modificadores.
12. ¿Cuáles son las reglas para la anulación de métodos?
  • La lista de parámetros, el nombre del método y el tipo de valor de retorno deben ser completamente consistentes y el constructor no se puede anular;
  • Los métodos declarados finales no se pueden anular;
  • Los métodos declarados como estáticos no tienen anulación (sólo tienen sentido las uniones anuladas y polimórficas);
  • Los permisos de acceso no pueden ser inferiores a los de la clase principal;
  • El método anulado no puede generar excepciones más amplias
  • Las subclases no pueden anular los métodos privados de la clase principal.
13. ¿Cuál es la diferencia entre tirar y tirar?
  • throw:
    la declaración de lanzamiento se usa en el cuerpo del método para indicar que se lanza una excepción, que es manejada por las declaraciones en el cuerpo del método. Lanzar es una acción que arroja específicamente una excepción, por lo que arroja una instancia de excepción. Al ejecutar un lanzamiento, se debe lanzar algún tipo de excepción.
  • throws:
    la declaración throws se usa después de la declaración del método para indicar que si se lanza una excepción, la persona que llama al método manejará la excepción. throws declara principalmente que este método generará un cierto tipo de excepción, para que sus usuarios sepan qué es necesario detectar.
  • El tipo de excepción. throws indica la posibilidad de una excepción, pero no necesariamente significa que esta excepción ocurrirá.
14. ¿Cuál es la diferencia entre clase abstracta e interfaz?
  • Todos los métodos de una interfaz son implícitamente abstractos. Una clase abstracta puede contener métodos tanto abstractos como no abstractos.
  • Una clase puede implementar muchas interfaces, pero solo puede heredar una clase abstracta
  • Si una clase quiere implementar una interfaz, debe implementar todos los métodos declarados por la interfaz. Sin embargo, una clase no necesita implementar todos los métodos declarados por una clase abstracta, por supuesto, en este caso, la clase también debe declararse abstracta.
  • Una clase abstracta puede implementar una interfaz sin proporcionar implementaciones de los métodos de la interfaz.
  • Las variables declaradas en las interfaces Java son finales de forma predeterminada. Las clases abstractas pueden contener variables no finales.
  • Las funciones miembro en las interfaces Java son públicas de forma predeterminada. Las funciones miembro de clases abstractas pueden ser privadas, protegidas o públicas.
  • Las interfaces son absolutamente abstractas y no se pueden crear instancias (Java 8 ya admite la implementación de métodos predeterminados en las interfaces). No se puede crear una instancia de una clase abstracta, pero se puede llamar si contiene un método principal.
15. ¿Tipos básicos de Java y tamaños de bytes?
byte corto En t largo flotar doble carbonizarse booleano
8 bits 16 bits 32 bits 64 bits 32 bits 64 bits 16 bits Utilice un octavo de byte
16. ¿Qué cuatro modificaciones de acceso corresponden a los niveles de acceso?

público, protegido, sin modificador de acceso, privado

17. ¿Cuál es la diferencia entre String y StringBuffer?
  • La principal diferencia entre String y StringBuffer es el rendimiento: String es un objeto inmutable. Cada operación en el tipo String equivale a generar un nuevo objeto String y luego apuntar al nuevo objeto String. Así que trate de no realizar una gran cantidad de operaciones de empalme. en String. De lo contrario, se generarán muchos objetos temporales, lo que hará que el GC comience a funcionar, lo que afectará el rendimiento del sistema.
    StringBuffer opera en el objeto mismo, en lugar de generar nuevos objetos, por lo que en el caso de una gran cantidad de empalmes, recomendamos usar StringBuffer (seguro para subprocesos).
18. ¿Cuál es la implementación subyacente de HashSet?
  • La implementación de HashSet depende de HashMap y los valores de HashSet se almacenan en HashMap. Un objeto HashMap se inicializa en el método de construcción de HashSet y HashSet no permite valores duplicados.
    Por lo tanto, el valor de HashSet se almacena en HashMap como la clave de HashMap y devuelve falso cuando el valor almacenado ya existe.
19. ¿Cuál es el significado de clase abstracta?
  • El significado de las clases abstractas se puede resumir en tres oraciones: 1. Proporcionar un tipo común para otras subclases 2. Encapsular contenido definido repetidamente en subclases
  • Defina métodos abstractos. Aunque las subclases tienen diferentes implementaciones, su definición es consistente.
20. ¿Por qué es necesario anular el método hashCode al anular iguales?
  • hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个 int 整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。如果两个对象相等,则 hashcode 一定也是相同的如果两个对象相等,对两个对象分别调用 equals 方法都返回 true 如果两个对象有相同的 hashcode 值,它们也不一定是相等的因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖。hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据).
21. HashSet 和 TreeSet 有什么区别?
  • HashSet 是由一个 hash 表来实现的,因此,它的元素是无序的。add(),remove(),contains()
    方法的时间复杂度是 O(1)。TreeSet 是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是 O(logn)。
23. 数组在内存中如何分配?
  • 当一个对象使用 new 关键字创建的时候,会在堆上分配内存空间,然后才返回到对象的引用。这对数组来说也是一样的,因为数组也是一个对象,简单的值类型的数组,每个数组成员是一个引用(指针)引用到栈上的空间。
24. Java 中怎么创建一个不可变对象?
  • 对象的状态在构造函数之后都不能被修改,任何修改应该通过创建一个新对象来实现.

  • 所有的对象属性应该都设置为 final

  • 对象创建要正确,例如:对象的应用不能在构造函数中被泄露出去

  • 对象要设置为 final,确保不要继承的 Class 修改了 immutability 特性

25. Java 中 ++ 操作符是线程安全的吗?
  • 不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多个线程交差。
27. ¿Cuál es la diferencia entre == y igual () en Java?
  • == puede comparar tanto tipos de datos básicos como tipos de datos de referencia.
  • ==Al comparar tipos de datos básicos, se comparan los valores. Al comparar tipos de datos de referencia, se comparan las direcciones de los objetos.
  • igual solo puede comparar tipos de datos de referencia, compara si el contenido del objeto es el mismo y también compara la dirección del objeto sin reescribir.
28. ¿Cuál es la diferencia entre final, finalizar y finalmente?
  • final se usa para declarar propiedades, métodos y clases, lo que significa respectivamente que las propiedades son inmutables, los métodos no se pueden anular y las clases no se pueden heredar. Finalmente es parte de la estructura de la declaración de manejo de excepciones, lo que indica que siempre se ejecuta. finalize es un método de la clase Object. Este método del objeto reciclado se llamará cuando se ejecute el recolector de basura.
    Este método se puede anular para proporcionar otro reciclaje de recursos durante la recolección de basura, como cerrar archivos, etc.
29. ¿Dónde aparece el polimorfismo en Java?
  • El polimorfismo debe tener un enlace dinámico; de lo contrario, no es polimorfismo y la sobrecarga de métodos no es polimorfismo (porque la sobrecarga de métodos se determina en el momento de la compilación y no hay ningún enlace dinámico posterior en el tiempo de ejecución).
  • Cuando se cumplen estas tres condiciones: 1. Relación de clase padre-hijo 2. Hay anulación 3. Debe haber una referencia de clase padre que apunte al objeto de clase hijo
30. ¿Cuáles son las características de los tipos estáticos?
  • Atributos estáticos: cargados a medida que se carga la clase, el atributo ya no pertenece a un determinado objeto, sino a toda la clase
  • Método estático: llamado directamente con el nombre de la clase, no se puede acceder a las variables miembro no estáticas en un método estático
  • Estático solo puede acceder a estático
31. ¿De cuántas maneras crea Java objetos?
  • nuevo crea un nuevo objeto
  • a través del mecanismo de reflexión
  • Usando mecanismo de clonación
  • A través del mecanismo de serialización ObjectInputStream
32. ¿Cuáles son los métodos públicos en Object?
  • Object es la clase principal de todas las clases. Cualquier clase hereda el método protegido por clonación de objetos de forma predeterminada para implementar una copia superficial del objeto. Este método solo se puede llamar si se implementa la interfaz Cloneable; de ​​lo contrario, se generará una excepción CloneNotSupportedException.
  • igual es lo mismo que == en Objeto, y las subclases generalmente necesitan anular este método.
  • hashCode Este método se utiliza para la búsqueda de hash. Si anula el método igual, generalmente debe anular el método hashCode. Este método se utiliza en algunas colecciones con función hash.
  • Método getClass, obtiene el tipo de tiempo de ejecución
  • esperar hace que el hilo actual espere el bloqueo del objeto, el hilo actual debe ser el propietario del objeto, es decir, tiene el bloqueo del objeto.
  • El método wait() espera hasta que se adquiere o interrumpe el bloqueo.
  • esperar (tiempo de espera prolongado) establece un intervalo de tiempo de espera y regresa si el bloqueo no se obtiene dentro del tiempo especificado.
33. ¿Cuál es la diferencia entre & y &&?
  • & es un operador bit a bit, que representa la operación AND bit a bit, && es un operador lógico, que representa AND lógico (y).
34. ¿Puede haber varias clases en un archivo fuente .java (excepto clases internas)?
  • Un archivo fuente .java puede incluir varias clases (no clases internas), pero solo puede haber una clase pública en un único archivo, y la clase pública debe ser la misma que el nombre del archivo.
35. ¿Cómo salir correctamente de un bucle anidado de varios niveles?
  • romper;

  • Usar alias

36. ¿Cuál es la función de las clases internas?
  • Las clases internas pueden estar bien ocultas. Generalmente, las clases no internas no pueden tener
    permisos privados y protegidos, pero las clases internas sí.

  • La clase interna tiene acceso a todos los elementos de la clase externa.

  • Pero implementar herencia múltiple

  • Puedes evitar modificar la interfaz e implementar la llamada de dos métodos con el mismo nombre en la misma clase

38.¿Es String un tipo de datos básico?
  • Los tipos de datos básicos incluyen byte, int, char, long, float, double, boolean y short. La clase java.lang.String es de tipo final, por lo que esta clase no se puede heredar ni modificar. Para mejorar la eficiencia y ahorrar espacio, debemos utilizar la clase StringBuffer.
39. ¿Cómo utilizar la estática?
  • Static puede modificar clases internas, métodos, variables y bloques de código; la clase modificada por Static es una clase interna estática; el método modificado por Static es un método estático, lo que significa que el método pertenece a la clase actual y no a un objeto , y los métodos estáticos no se pueden anular y se pueden llamar directamente usando el nombre de la clase. No puede utilizar esta o super palabras clave en métodos estáticos.
  • Las variables estáticas modificadas son variables estáticas o variables de clase. Las variables estáticas son compartidas por todas las instancias y no dependen de los objetos. Las variables estáticas tienen solo una copia en la memoria. Cuando la JVM carga una clase, la memoria solo se asigna una vez para las variables estáticas.
    El bloque de código modificado por Static se denomina bloque de código estático y generalmente se usa para la optimización del programa. El código en el bloque de código estático solo se ejecutará una vez cuando se cargue toda la clase. Puede haber varios bloques de código estático. Si hay varios bloques de código estático, se ejecutarán en orden.
40. ¿Qué son el paso por valor y el paso por referencia?
  • Los tipos de datos básicos pasan valores, los tipos de datos de referencia pasan direcciones
  • La transferencia entre tipos de datos básicos es transferencia por valor y la transferencia entre tipos de datos de referencia es transferencia por referencia.
41. ¿Cuál es la diferencia entre sobrecargar y reescribir?
  • La anulación y la sobrecarga de métodos son diferentes manifestaciones del polimorfismo de Java. La anulación
    es una manifestación de polimorfismo entre clases principales y subclases, y la sobrecarga es una manifestación de polimorfismo en una clase. Si un método definido en una subclase tiene el mismo nombre y parámetros que su clase principal, decimos que el método está anulando. Cuando un objeto de una subclase usa este método, llamará a la definición de la subclase, por lo que la definición de la clase principal parece estar "protegida". Si se definen varios métodos con el mismo nombre en una clase y tienen diferente número de parámetros o diferentes tipos de parámetros, se denomina sobrecarga de métodos.
42. ¿Cuáles son las diferencias entre variables miembro y variables locales?
  • Desde una perspectiva gramatical, las variables miembro pertenecen a la clase, mientras que las variables locales son variables definidas en el método o los parámetros del método; las variables miembro pueden modificarse mediante modificadores como público, privado y estático, pero no se puede acceder a las variables locales. Modificado por modificadores de control y estático; las variables miembro y las variables locales pueden modificarse mediante final;
  • A juzgar por la forma en que se almacenan las variables en la memoria, las variables miembro son parte del objeto, el objeto existe en la memoria del montón y las variables locales existen en la memoria de la pila.
  • Desde la perspectiva del tiempo de supervivencia de las variables en la memoria, las variables miembro son parte del objeto y existen con la creación del objeto, mientras que las variables locales desaparecen automáticamente cuando se llama al método.
  • Si a una variable miembro no se le asigna un valor inicial, se le asignará automáticamente un valor basado en el valor predeterminado del tipo (excepto en un caso, a una variable miembro modificada por final pero no modificada por static se le debe asignar explícitamente un valor); local A las variables no se les asignará un valor automáticamente.
43. ¿Cuál es la diferencia entre métodos estáticos y métodos de instancia?
  • La diferencia entre métodos estáticos y métodos de instancia se refleja principalmente en dos aspectos:
    al llamar a métodos estáticos externamente, puede utilizar el método "nombre de clase. nombre de método" o el método "nombre de objeto. nombre de método". Los métodos de instancia solo tienen el último método. En otras palabras, llamar a métodos estáticos no requiere la creación de un objeto.
  • Cuando los métodos estáticos acceden a miembros de esta clase, solo se les permite acceder a miembros estáticos (es decir, variables miembro estáticas y métodos estáticos), pero no se les permite acceder a variables miembro de instancia ni a métodos de instancia; los métodos de instancia no tienen esta restricción.
44.¿Qué es el polimorfismo?
  • Permite que objetos de diferentes clases respondan al mismo mensaje. Es decir, un mismo mensaje puede comportarse de muchas formas diferentes dependiendo de la persona a quien se envía. (Enviar un mensaje es una llamada a función)
45. ¿Cuáles son las ventajas del polimorfismo?
  • Sustituibilidad. El polimorfismo permite la sustitución del código existente. Por ejemplo, el polimorfismo funciona para la clase Círculo, pero también funciona para cualquier otra geometría circular, como un toroide.
    Extensibilidad. El polimorfismo hace que el código sea extensible. Agregar nuevas subclases no afecta el polimorfismo, la herencia y el funcionamiento de otras características de las clases existentes. De hecho, es más fácil agregar nuevas subclases para obtener funciones polimórficas.
46. ​​¿Tres condiciones necesarias para la existencia del polimorfismo?
  • Debe haber herencia.
  • Es necesario que haya un método para reescribir.
  • La referencia de la clase principal apunta al objeto de la clase secundaria (para los métodos definidos en la clase principal, si el método se anula en la clase secundaria, la referencia del tipo de clase principal llamará al método en la clase secundaria, que es una conexión dinámica)
47. ¿Cuáles son las diferencias entre TreeMap, HashMap y LindedHashMap?
  • LinkedHashMap puede garantizar que la colección HashMap esté ordenada. El orden de depósito es el mismo que el orden de retiro. TreeMap implementa
    la interfaz SortMap y puede ordenar los registros que guarda según las claves. El valor predeterminado es ordenar en orden ascendente de valores clave. También puede especificar un comparador de clasificación. Cuando se utiliza un iterador para atravesar el TreeMap, los registros obtenidos son ordenado HashMap no garantiza el orden, es decir, no está ordenado y tiene una velocidad de acceso muy rápida. HashMap solo permite que la clave de un registro sea nula; permite que el valor de varios registros sea nulo; HashMap no admite la sincronización de subprocesos.
48. ¿Cuáles son las características orientadas a objetos de Java (OOP)?
  • Abstracción: la abstracción es el proceso de resumir las características comunes de una clase de objetos para construir una clase, incluida la abstracción de datos y la abstracción de comportamiento. La abstracción solo se centra en las propiedades y comportamientos de los objetos, pero no en los detalles de estos comportamientos.

  • Herencia: La herencia es el proceso de crear una nueva clase obteniendo información de herencia de una clase existente. La clase que proporciona información de herencia se llama clase padre (superclase, clase base); la clase que obtiene información de herencia se llama subclase (clase derivada). La herencia aporta cierta continuidad al sistema de software cambiante y, al mismo tiempo, también es un medio importante para encapsular factores variables en el programa.

  • Encapsulación: generalmente se cree que la encapsulación es la unión de datos y métodos de operación de datos, y el acceso a los datos solo puede realizarse a través de interfaces definidas. La esencia de la orientación a objetos es representar el mundo real como una serie de objetos cerrados y completamente autónomos. El método que escribimos en una clase es una encapsulación de detalles de implementación; la forma en que escribimos una clase es una encapsulación de datos y operaciones de datos. Se puede decir que la encapsulación consiste en ocultar todo lo que se puede ocultar y solo proporcionar la interfaz de programación más simple al mundo exterior.

  • Polimorfismo: el polimorfismo permite que objetos de diferentes subtipos respondan de manera diferente al mismo mensaje. En pocas palabras, se llama al mismo método con la misma referencia de objeto pero se hacen cosas diferentes. El polimorfismo se divide en polimorfismo en tiempo de compilación y polimorfismo en tiempo de ejecución. Si los métodos de un objeto se consideran servicios proporcionados por el objeto al mundo exterior, entonces el polimorfismo en tiempo de ejecución se puede explicar como: cuando el sistema A accede a los servicios proporcionados por el sistema B, el sistema B tiene múltiples formas de proporcionar servicios, pero todo es diferente para el sistema A. El sistema es transparente. La sobrecarga de métodos (sobrecarga) implementa el polimorfismo en tiempo de compilación (también conocido como enlace previo), mientras que la anulación de métodos (anulación) implementa el polimorfismo en tiempo de ejecución (también conocido como enlace posterior). El polimorfismo en tiempo de ejecución es la esencia de la orientación a objetos. Para lograr el polimorfismo, se deben hacer dos cosas: 1. Reescribir el método (la subclase hereda la clase principal y anula los métodos existentes o abstractos en la clase principal); 2. Modelado de objetos (use una referencia de tipo principal para hacer referencia a un objeto de subtipo, de modo que la misma referencia que llama al mismo método mostrará diferentes comportamientos dependiendo del objeto de subtipo)

49. ¿Enumere algunas excepciones comunes en tiempo de ejecución?
  • ArithmeticException (excepción aritmética)
  • ClassCastException (excepción de conversión de clase)
  • IllegalArgumentException (excepción de parámetro ilegal)
  • IndexOutOfBoundsException (excepción de índice fuera de límites)
  • NullPointerException (excepción de puntero nulo)
  • SecurityException (excepción de seguridad)
50.¿Qué es la reflexión?
  • La reflexión consiste en cargar objetos dinámicamente y analizarlos. En el estado de ejecución, para cualquier clase, puede conocer todas las propiedades y métodos de esta clase, para cualquier objeto, puede llamar a cualquiera de sus métodos. Esta función de obtener información dinámicamente y llamar dinámicamente métodos de objetos se convierte en un mecanismo de reflexión de Java.
51. ¿Cuál es el papel de la reflexión?
  • Determinar la clase a la que pertenece cualquier objeto en tiempo de ejecución.
  • Construir objetos de cualquier clase en tiempo de ejecución.
  • Determinar las variables miembro y los métodos de cualquier clase en tiempo de ejecución.
  • Llamar a métodos en cualquier objeto en tiempo de ejecución.
52. ¿Tres formas de obtener clase?
  • El objeto se obtiene llamando al método getClass(); se obtiene mediante la clase name.class; se
    obtiene mediante el método estático forName() del objeto Class
53. ¿Cuál es la diferencia entre romper y continuar?
  • break y continue son declaraciones que se utilizan para controlar bucles. break se usa para finalizar completamente un bucle y saltar fuera del cuerpo del bucle para ejecutar las declaraciones que siguen al bucle. continuar se utiliza para omitir este bucle y continuar con el siguiente.
54. ¿Cuáles son las similitudes y diferencias entre las excepciones de tiempo de ejecución y las excepciones generales?
  • Las excepciones representan condiciones anormales que pueden ocurrir durante la ejecución del programa. Las excepciones en tiempo de ejecución representan anomalías que pueden encontrarse en el funcionamiento normal de una máquina virtual y son un error operativo común. El compilador de Java requiere que se declaren métodos para generar excepciones que no sean de tiempo de ejecución que puedan ocurrir, pero no es necesario que se declaren para generar excepciones de tiempo de ejecución no detectadas.
55. ¿Cuáles son las características de cada una de las tres interfaces Lista, Mapa y Conjunto al acceder a elementos?
  • La lista accede a elementos en índices específicos y puede tener elementos duplicados. El conjunto no puede almacenar elementos repetidos (use el método igual () del objeto para distinguir si los elementos están repetidos). Map guarda el mapeo de pares clave-valor y la relación de mapeo puede ser uno a uno o muchos a uno.
56. ¿Cuál es la diferencia entre Colección y Colecciones?
  • Collection es la interfaz superior de la clase de colección. Las interfaces heredadas de ella incluyen principalmente Set y List.
    Collections es una clase auxiliar para la clase de colección. Proporciona una serie de métodos estáticos para implementar operaciones como búsqueda, clasificación y seguridad de subprocesos. para varias colecciones. .
57.¿Cuál es la diferencia entre Error y Excepción?
  • El error representa un problema grave en una situación en la que la recuperación no es imposible sino difícil. Por ejemplo, desbordamiento de memoria. Es imposible esperar que un programa pueda manejar tal situación. La excepción representa un problema de diseño o implementación. Es decir, representa una situación que nunca ocurriría si el programa se estuviera ejecutando normalmente.
58. ¿Ciclo de vida de EJB y cómo gestionar las transacciones?
  • SessionBean: el ciclo de vida de un Bean de sesión sin estado está determinado por el contenedor. Cuando el cliente envía una solicitud para crear una instancia de Bean, el contenedor EJB no necesariamente crea una nueva instancia de Bean para que el cliente la llame, sino que simplemente encuentra una al azar. Instancia de Bean existente. Algunas instancias se proporcionan a los clientes. Cuando el cliente llama a un Stateful Session Bean por primera vez, el contenedor debe crear inmediatamente una nueva instancia de Bean en el servidor y asociarla con el cliente. En el futuro, cuando el cliente llame al método del Stateful Session Bean, el contenedor enviará la llamada al cliente.La instancia de bean asociada con este cliente. EntityBean: los Entity Beans pueden sobrevivir durante un tiempo relativamente largo y su estado es persistente. Los beans de entidad viven mientras existan los datos en la base de datos. En lugar de hablar en términos de aplicaciones o procesos de servicio. Incluso si el contenedor EJB
    falla, los beans de entidad sobreviven. El ciclo de vida de Entity Beans puede ser
    administrado por el contenedor o por los propios beans.
    EJB gestiona las prácticas a través de las siguientes tecnologías: Object Practice Services (OTS) del Object Management Group (OMG), Sun Microsystems' Transaction Service (JTS), Java Transaction API (JTA) y la interfaz XA del Development Group (X/ Abierto).
59. ¿Cuál es la diferencia entre las interfaces Comparable y Comparator?
  • La interfaz Comparable contiene solo un método compareTo(). Este método puede ordenar dos objetos. Específicamente, devuelve números negativos, 0 y números positivos para indicar que el objeto de entrada es menor, igual o mayor que un objeto existente. La interfaz Comparator contiene dos métodos: comparar() y igualar().
60. ¿Puede el interruptor funcionar en bytes, largos y cadenas?
  • El switch puede operar en char, byte, short e int. El switch puede operar en las clases contenedoras de char, byte, short e int. El switch no puede operar
    en long, double, float y boolean, incluidas sus clases contenedoras. ser un tipo de cadena. , Cadena (solo se puede usar en Cadena después de Java 1.7) el modificador puede ser un tipo de enumeración (después de JDK 1.5)
61. ¿Qué clases de jdk no se pueden heredar?
  • Las clases que no se pueden heredar son aquellas modificadas con la palabra clave final. Generalmente, los tipos más básicos o los tipos que evitan que las clases extendidas destruyan inadvertidamente la implementación del método original deben ser finales. En jdk, System, String, StringBuffer, etc., son todos tipos básicos.
62. Los elementos de Set no se pueden repetir, entonces, ¿qué método se utiliza para distinguir si se repiten o no?
  • Los elementos del Conjunto no se pueden repetir. Si los elementos se repiten o no se determina mediante el método igual (). Los métodos iguales() y == determinan si un valor de referencia apunta al mismo objeto. Iguales() se anula en la clase para devolver verdadero cuando el contenido y los tipos de dos objetos separados coinciden.
63. ¿Cuál es la diferencia entre JDK y JRE?
  • Java Runtime Environment (JRE) es la máquina virtual Java que ejecutará programas Java. También contiene los complementos del navegador necesarios para ejecutar el subprograma. El Java Development Kit (JDK) es un completo kit de desarrollo de software Java, que incluye JRE, compilador y otras herramientas (como JavaDoc, depurador de Java), que permite a los desarrolladores desarrollar, compilar y ejecutar aplicaciones Java.
64. ¿Es posible acceder a variables no estáticas en un entorno estático?
  • Las variables estáticas pertenecen a clases en Java y sus valores son los mismos en todos los casos. Cuando la máquina virtual Java carga una clase, las variables estáticas se inicializan. Si su código intenta acceder a variables no estáticas sin utilizar una instancia, el compilador informará un error porque estas variables aún no se han creado y no están asociadas con ninguna instancia.
65. ¿Java admite herencia múltiple?
  • No, Java no admite herencia múltiple. Cada clase solo puede heredar de una clase, pero puede implementar múltiples interfaces.
66. ¿Qué es un iterador?
  • La interfaz Iterator proporciona muchos métodos para iterar sobre elementos de la colección. Cada clase de colección contiene métodos de iteración que devuelven instancias de iterador. Los iteradores pueden eliminar elementos de la colección subyacente durante el proceso de iteración.
    La semántica y el significado de la clonación o serialización están relacionados con la implementación específica. Por lo tanto, depende de la implementación específica de la clase de colección determinar cómo se clona o serializa.
67. ¿Cuál es la diferencia entre Iterator y ListIterator?
  • Sus diferencias se enumeran a continuación:
    Iterator se puede usar para atravesar colecciones Set y List, pero ListIterator solo se puede usar para atravesar List. Iterator solo puede atravesar una colección hacia adelante, mientras que ListIterator puede atravesar tanto hacia adelante como hacia atrás.
    ListIterator implementa la interfaz Iterator e incluye otras funciones, como agregar elementos, reemplazar elementos, obtener el índice de los elementos anteriores y siguientes, etc.
69.¿La Lista, el Conjunto y el Mapa heredan de la interfaz de Colección?
  • Solo las interfaces List y Set heredan de la interfaz Collection, y Map es un concepto de interfaz paralelo a Collection.
70. ¿Dónde existe el grupo constante de cadenas en el espacio de memoria?
  • El grupo constante de cadenas de jdk 6.0 está en el área de método, y la realización específica del área de método puede considerarse como el área permanente en el montón. El área de método ya no se declara en la especificación de la máquina virtual Java jdk 7.0 y el grupo de constantes de cadena se almacena en el espacio del montón. La especificación de la máquina virtual Java jdk 8.0 también declara el metaespacio y el grupo de constantes de cadena se almacena en el metaespacio. .
72. ¿Qué dos formas se utilizan para ordenar las colecciones?
  • Puede usar una colección ordenada, como TreeSet o TreeMap, o puede usar una colección ordenada, como una lista, y luego ordenarla con Collections.sort().
73. ¿Nombra tres características nuevas en JDK 1.7?
  • Aunque JDK 1.7 no es una versión tan grande como JDK 5 y 8, todavía tiene muchas características nuevas, como la declaración try-with-resource, de modo que cuando usa transmisiones o recursos, no necesita cerrarlos manualmente. Java se cerrará automáticamente. El grupo Fork-Join implementa una versión Java de Map-reduce hasta cierto punto. Las variables de cadena y el texto están permitidos en Switch. El operador de diamante (<>) se utiliza para la inferencia de tipos. Ya no es necesario declarar genéricos en el lado derecho de la declaración de variables, por lo que puede escribir código más legible y escribible y más conciso. Otra característica que vale la pena mencionar es el manejo mejorado de excepciones, como permitir capturar múltiples excepciones en el mismo bloque catch.
74. ¿Nombra 5 nuevas características introducidas en JDK 1.8?
  • Java 8 es una versión innovadora en la historia de Java. Estas son las 5 características principales de JDK 8: Expresiones Lambda, que permiten que funciones anónimas se pasen como objetos a través de Stream API, aprovechando al máximo las modernas CPU multinúcleo y escritura. código muy conciso API de fecha y hora, finalmente, hay una biblioteca de fecha y hora estable y simple en la que puede usar métodos de extensión, y ahora puede tener métodos estáticos predeterminados en la interfaz. Anotaciones duplicadas, ahora puedes usar la misma anotación varias veces en el mismo tipo.
75.¿Análisis del código fuente de ArrayList? (recitar)
  • ArrayList es una clase de colección de longitud variable, implementada en base a matrices de longitud fija. La capacidad inicializada usando el método de construcción predeterminado es 10 (después de 1.7, se retrasa la inicialización, es decir, la capacidad de elementData se inicializa cuando se llama al método add por primera vez para agregar un elemento es 10).
  • ArrayList permite valores nulos y elementos duplicados. Cuando el número de elementos agregados a ArrayList es mayor que la capacidad de su matriz subyacente, regenerará una matriz más grande a través del mecanismo de expansión. La longitud expandida de ArrayList es 1,5 veces la longitud original
  • Dado que la implementación subyacente de ArrayList se basa en matrices, puede garantizar que las operaciones de búsqueda aleatoria se completen con una complejidad O (1).
  • ArrayList es una clase que no es segura para subprocesos. En un entorno concurrente, varios subprocesos que operan ArrayList al mismo tiempo provocarán excepciones o errores impredecibles.
  • Es conveniente agregar secuencialmente
  • La eliminación y la inserción requieren copiar la matriz, lo que tiene un rendimiento deficiente (se puede usar LinkindList)
  • Integer.MAX_VALUE - 8: considerando principalmente diferentes JVM, algunas JVM agregarán algunos encabezados de datos. Cuando la capacidad expandida es mayor que MAX_ARRAY_SIZE, compararemos la capacidad mínima requerida con MAX_ARRAY_SIZE. Si es mayor, solo puede tomar números enteros. MAX_VALUE; de lo contrario, es Integer.MAX_VALUE -8.
    Este es el nuevo Objeto [] solo disponible desde jdk1.7
76.¿Análisis del código fuente de HashMap? (recitar)
  • Antes de jdk1.8 lista + lista vinculada
  • Después de jdk1.8 lista + lista vinculada (cuando la longitud de la lista vinculada llega a 8, se convierte en un árbol rojo-negro)
  • El factor de expansión de HashMap
    por defecto es 0,75, lo que significa que se desperdiciará 1/4 del espacio. Cuando se alcanza el factor de expansión, la lista se duplicará. 0,75 es un valor de equilibrio entre tiempo y espacio;
77. ¿Análisis del código fuente de ConcurrentHashMap? (recitar)
  • La tecnología de segmentación de bloqueo utilizada por ConcurrentHashMap primero divide los datos en segmentos para su almacenamiento y luego asigna un bloqueo a cada segmento de datos. Cuando un hilo ocupa el bloqueo para acceder a un segmento de datos, los datos de otros segmentos también pueden ser utilizados por otros hilos acceso. Algunos métodos necesitan abarcar segmentos, como size() y containsValue(). Es posible que necesiten bloquear toda la tabla en lugar de solo un determinado segmento. Esto requiere bloquear todos los segmentos en orden. Una vez completada la operación, los bloqueos de todos Los segmentos se publican en orden. "En orden" es muy importante aquí; de lo contrario, es muy probable que se produzca un punto muerto. Dentro de ConcurrentHashMap, la matriz de segmentos es final y sus variables miembro son en realidad finales. Sin embargo, simplemente declarar la matriz como final no garantiza que los miembros de la matriz también lo sean. final requiere garantías de implementación. Esto garantiza que no se produzca ningún punto muerto porque el orden en el que se adquieren los bloqueos es fijo.
  • ConcurrentHashMap se compone de una estructura de matriz de segmentos y una estructura de matriz HashEntry. El segmento es un bloqueo reentrante ReentrantLock, que desempeña la función de un bloqueo en ConcurrentHashMap, y HashEntry se utiliza para almacenar datos de pares clave-valor. Un ConcurrentHashMap contiene una matriz de segmentos. La estructura de Segment
    es similar a la de HashMap. Es una estructura de matriz y lista vinculada. Un segmento contiene una matriz HashEntry. Cada HashEntry es un elemento de una estructura de lista vinculada. Cada guardián de segmento contiene un Matriz HashEntry. Al modificar los datos de la matriz HashEntry, primero se debe obtener su bloqueo de segmento correspondiente.

二、Java Web

1. ¿Cuál es la diferencia entre sesión y cookie?
  • La sesión se almacena en el lado del servidor y la cookie se almacena en el lado del cliente, por lo que en términos de seguridad, la sesión es más segura que la cookie, luego obtenemos la información de la sesión a través del ID de sesión almacenado en la cookie de sesión. . Y dado que la sesión se almacena en la memoria del servidor, el aumento continuo de cosas en la sesión causará una carga en el servidor, por lo que se almacenará información muy importante en la sesión y algunas cosas menores se almacenarán en la cookie del cliente. y luego Para ser precisos, las cookies se dividen en dos categorías: cookies de sesión y cookies persistentes. Para ser precisos, las cookies de sesión se almacenan en la memoria del navegador del cliente, por lo que su ciclo de vida es consistente con el del navegador. La cookie de sesión desaparece cuando se desactiva la cookie de sesión. Sin embargo, la cookie persistente se almacena en el disco duro del cliente y el ciclo de vida de la cookie persistente es el tiempo de almacenamiento que configuramos al configurar la cookie. Entonces consideramos un problema cuando la cookie de sesión se desactiva. Se cierra el navegador. ¿Se perderá la sesión? Del análisis anterior, la información de la sesión se obtiene a través del ID de sesión de la cookie de sesión. Cuando se cierra el navegador, la cookie de sesión desaparece, por lo que nuestro ID de sesión desaparece, pero la información de la sesión aún existe. en el lado del servidor Esto En ese momento, simplemente no pudimos encontrar la llamada sesión, pero no existía. Entonces, ¿bajo qué circunstancias se pierde la sesión? Es cuando el servidor se apaga, o la sesión expira (el tiempo predeterminado es 30 minutos), o se llama a invalidate(), o queremos un determinado dato en la sesión. para desaparecer y llamar a la sesión. Método .removeAttribute(), ¿y cuándo se crea la sesión? Para ser precisos, se crea llamando a getession(). Ésta es la diferencia entre sesión y cookie.
2. ¿Cuál es la conexión entre la sesión y la cookie?
  • La sesión funciona a través de cookies. Se contacta con la sesión y la cookie a través de COOKIE [′ PHPSESSID ′ ], a través de _COOKIE['PHPSESSID'], y a través deCOO K I E [ PHPSESSID ]para contactar, a través de_COOKIE['PHPSESSID'] puedes conocer el id de sesión y obtener otra información.
    En los sitios web de compras, el ID de sesión de los productos que el usuario agrega al carrito de compras generalmente se registra en la base de datos. Cuando el usuario vuelve a visitar, el ID de sesión se puede usar para encontrar los productos que el usuario agregó por última vez al carrito de compras. Debido a que el ID de sesión es único, se puede buscar en función de él cuando se registre en la base de datos.
3. ¿Cuál es el ciclo de vida del servlet?
  • El ciclo de vida de Servlet se puede dividir en cuatro etapas: carga y creación de instancias, inicialización, servicio y destrucción.
    Cuando el cliente realiza la primera solicitud, primero determina si el objeto Servlet existe. Si no existe, el contenedor web crea el objeto y luego llama al método init() para inicializarlo. Este método de inicialización solo se llama una vez en el ciclo de vida completo del servlet.
    Después de completar la creación y creación de instancias del objeto Servlet, el contenedor web llamará al método service() del objeto Servlet para
    manejar la solicitud.

  • El método destroy() se llama automáticamente cuando se cierra el contenedor web o cuando se va a eliminar el objeto Servlet del contenedor.

4. ¿Qué es el servicio web?
  • En la superficie, WebService es una aplicación que expone una API a la que se puede llamar al mundo exterior a través de la Web, es decir, la aplicación se puede llamar mediante programación a través de la Web. Llamamos cliente a la aplicación que llama a este servicio web y llamamos servidor a la aplicación que proporciona este servicio web. Desde una perspectiva más profunda, WebService es una nueva plataforma para crear aplicaciones distribuidas interoperables: es una plataforma y un conjunto de estándares. Define cómo las aplicaciones pueden lograr la interoperabilidad en la Web. Puede escribir servicios web en cualquier idioma que desee y en cualquier plataforma que desee, siempre que podamos consultar y acceder a estos servicios a través del estándar de servicios web.
5. ¿Cuáles son las diferencias, puntos comunes y ámbitos de aplicación de jsp y servlet?
  • JSP es una extensión de la tecnología Servlet, que es esencialmente una forma simple de Servlet. JSP se compila en forma "similar a un servlet".
    La principal diferencia entre Servlet y JSP es que la lógica de aplicación de Servlet está en el archivo Java y está completamente separada del HTML en la capa de presentación. En el caso de JSP, Java y HTML se pueden combinar en un archivo con extensión .jsp. JSP se centra en vistas y los servlets se utilizan principalmente para la lógica de control. En el marco de struts, JSP se encuentra en la capa de vista del patrón de diseño MVC
    y Servlet se encuentra en la capa de control.
6. ¿Cuál es la diferencia entre reenviar y redirigir?
  • Desde la barra de direcciones,
    reenviar significa que el servidor solicita recursos. El servidor accede directamente a la URL de la dirección de destino, lee el contenido de respuesta de esa URL y luego envía el contenido al navegador. El navegador no tiene idea de dónde está el contenido. enviado por el servidor proviene. De dónde vino, por lo que su barra de direcciones sigue siendo la dirección original. Redirigir significa que el servidor envía un código de estado basado en la lógica para indicarle al navegador que solicite esa dirección nuevamente. Entonces, la barra de direcciones muestra la nueva URL.
  • Desde la perspectiva del intercambio de datos,
    reenviar: la página reenviada y la página reenviada pueden compartir los datos en la solicitud
    Redirigir: no puede compartir datos 3. Desde la perspectiva de la aplicación,
    reenviar: generalmente se usa cuando los usuarios inician sesión, reenviar al página correspondiente según el rol Módulo
    Redireccionamiento: Generalmente se usa para regresar a la página principal y saltar a otros sitios web cuando los usuarios cierran sesión e inician sesión. 4. En términos de eficiencia, adelante: alto Redireccionamiento: bajo
    .
7. ¿Cuál es la diferencia entre request.getAttribute() y request.getParameter()?
  • request.getParameter() se obtiene mediante la implementación del contenedor para obtener los datos pasados ​​a través de métodos como post, get, etc.
  • request.setAttribute() y getAttribute() solo fluyen dentro del contenedor web y solo se encuentran en la etapa de procesamiento de solicitudes.
  • getAttribute devuelve un objeto, getParameter devuelve una cadena
  • getAttribute() siempre se ha utilizado junto con setAttribute(). Sólo después de configurarlo con setAttribute(), se puede obtener el valor a través de getAttribute(). Pasan datos de tipo Objeto. Y debe usarse en el mismo objeto de solicitud para que sea válido. y getParameter() es recibir los parámetros enviados por get o post del formulario.
9. ¿Qué tecnologías se utilizan para implementar varias partes de MVC? ¿Como alcanzar?
  • MVC es la abreviatura de Model-View-Controller. "Modelo" representa la lógica de negocios de la aplicación (implementada a través de componentes JavaBean, EJB), "Vista" es la superficie de presentación de la aplicación (generada por páginas JSP) y "Controlador" proporciona el control del proceso de la aplicación (generalmente un Servlet). ), a través de este modelo de diseño, la lógica de la aplicación, el proceso de procesamiento y la lógica de visualización se dividen en diferentes componentes para su implementación. Estos componentes se pueden interactuar y reutilizar.
11. La diferencia entre los métodos get y post de una solicitud Http.
  • Obtener es una solicitud de datos al servidor, mientras que Publicar es una solicitud para enviar datos al servidor.
  • Obtener es obtener información, no modificar información, es similar a la función de consulta de la base de datos y los datos no se modificarán.
  • Los parámetros de la solicitud Get se pasarán después de la URL y los datos solicitados se agregarán a la URL. La URL y los datos de transmisión están separados por ?, y los parámetros están conectados con &. El XX en %XX es el hexadecimal. representación de este símbolo. ASCII, si los datos son letras/números en inglés, envíelos como están. Si es un espacio, conviértalo a +. Si son caracteres chinos/otros, cifre directamente la cadena con BASE64
    .
  • Hay un límite de tamaño en los datos transmitidos por Get. Debido a que GET envía datos a través de URL, la cantidad de datos que GET puede enviar está directamente relacionada con la longitud de la URL. Diferentes navegadores tienen diferentes restricciones en la longitud de la URL. .
  • Los datos solicitados por GET serán almacenados en caché por el navegador, y el nombre de usuario y la contraseña aparecerán en texto sin cifrar en la URL. Otros pueden verificar los registros históricos de navegación y los datos no están seguros. En el lado del servidor, utilice Request.QueryString para obtener los datos enviados mediante el método Get.
    La solicitud de publicación se envía al servidor web como el contenido real del mensaje http. Los datos se colocan en el encabezado HTML para su envío. La publicación no limitar los datos enviados. Publicar es más seguro que Get. Cuando los datos están en chino o datos no confidenciales, use get porque al usar get, los parámetros se mostrarán en la dirección. Para datos confidenciales y datos que no son caracteres chinos, use post.
  • POST representa una solicitud que puede modificar recursos en el servidor. En el lado del servidor, los datos enviados en el método Post solo se pueden obtener mediante Request.Form.
12. ¿Cómo crea el contenedor Tomcat una instancia de clase de servlet? ¿Qué principios se utilizan?
  • Cuando se inicia el contenedor, leerá los archivos web.xml en todas las aplicaciones web en el directorio webapps, luego analizará los archivos xml y leerá la información de registro del servlet. Luego, las clases de servlet registradas en cada aplicación se cargan y se crean instancias mediante reflexión. (A veces también se crea una instancia en la primera solicitud)
  • Agregue 1 al registrar el servlet. Si es un número positivo, se instanciará al principio. Si no está escrito o es un número negativo, se instanciará en la primera solicitud.
13. ¿Cuáles son los pasos básicos para que JDBC acceda a la base de datos?

El primer paso: Class.forName() carga el controlador de conexión de la base de datos;

Paso 2: DriverManager.getConnection() obtiene el objeto de conexión de datos;

Paso 3: Obtener el objeto de sesión SQL basado en SQL, existen dos métodos: Declaración y Declaración Preparada;

Paso 4: ejecutar SQL. Si hay un valor de parámetro antes de ejecutar SQL, establezca el valor del parámetro setXXX();

Paso 5: Procese el conjunto de resultados;

Paso 6: cierre el conjunto de resultados, cierre la sesión y cierre la conexión.

14. ¿Por qué utilizar PreparedStatement?

La interfaz PreparedStatement hereda de Statement. Las instancias de PreparedStatement contienen declaraciones SQL compiladas, por lo que su velocidad de ejecución es más rápida que la de los objetos Statement.
​ Como subclase de Statement, PreparedStatement hereda todas las funciones de Statement. Se han modificado tres métodos ejecutar, ejecutarQuery y ejecutarUpdate para que ya no requieran parámetros.
En aplicaciones JDBC, PreparedStatement se utiliza en la mayoría de los casos por las siguientes razones:
legibilidad y mantenibilidad del código. La declaración debe empalmarse continuamente, pero PreparedStatement no.
PreparedStatement maximiza el rendimiento. DB tiene un mecanismo de almacenamiento en caché y no será necesario volver a compilar la misma declaración precompilada si se vuelve a llamar.
El punto más importante es que la seguridad ha mejorado enormemente. La declaración es fácil de inyectar mediante SQL, y
el contenido pasado por PreparedStatement no tendrá ninguna relación coincidente con la declaración SQL.

15. Principio del grupo de conexiones de bases de datos. ¿Por qué utilizar la agrupación de conexiones?

1. La conexión a la base de datos es una operación que requiere mucho tiempo y el grupo de conexiones permite que varias operaciones compartan una conexión.
2. La idea básica del grupo de conexiones de bases de datos es establecer un "grupo de búfer" para las conexiones de bases de datos. Coloque una cierta cantidad de conexiones en el grupo de búfer de antemano. Cuando necesite establecer una conexión de base de datos, solo necesita sacar una del "grupo de búfer" y volver a colocarla después de su uso. Podemos evitar que el sistema tenga infinitas conexiones a la base de datos estableciendo el número máximo de conexiones en el grupo de conexiones. Más importante aún, podemos monitorear la cantidad y el uso de las conexiones de la base de datos a través del mecanismo de administración del grupo de conexiones, proporcionando una base para el desarrollo, las pruebas y el ajuste del rendimiento del sistema.
3. El propósito del uso de grupos de conexiones es mejorar la gestión de los recursos de conexión de la base de datos.

16.¿Cuál es la diferencia entre ejecutar, ejecutarQuery y ejecutarActualizar?

1. El método de ejecución (consulta de cadena) de Declaración se utiliza para ejecutar cualquier consulta SQL. Si el resultado de la consulta es un ResultSet, este método devuelve verdadero. Si el resultado no es un ResultSet, como una consulta de inserción o actualización, devolverá falso. Podemos obtener el ResultSet a través de su método getResultSet, u obtener el número de registros actualizados a través del método getUpdateCount().
2. La interfaz ejecutarQuery (consulta de cadena) de Statement se utiliza para ejecutar la consulta de selección y devolver ResultSet.
Incluso si no se encuentran registros en la consulta, el ResultSet devuelto no será nulo. Generalmente usamos ejecutarQuery para ejecutar declaraciones de consulta. En este caso, si se pasa una declaración de inserción o actualización, se generará una excepción
java.util.SQLException con el mensaje de error "el método EXECUTEQUERY no se puede usar para actualizar". ,
​ 3. El método de ejecución de la declaración (consulta de cadena) se utiliza para ejecutar
instrucciones de inserción o actualización/eliminación (DML), o no devolver nada. Para las declaraciones DDL, el valor de retorno es de tipo int. Si es una declaración DML, es una actualizar El número de entradas, si es DDL, devuelve 0.
Debe usar el método ejecutar() solo cuando no esté seguro de qué declaración es; de lo contrario, debe usar el método ejecutarQuery o ejecutarUpdate.

17. ¿Qué es el conjunto de resultados de JDBC?

Después de consultar la base de datos, se devolverá un ResultSet, que es como una tabla de datos del conjunto de resultados de la consulta.
El objeto ResultSet mantiene un cursor apuntando a la fila de datos actual. Al principio, el cursor apunta a la primera fila. Si se llama al método next() de ResultSet, el cursor se moverá hacia abajo una fila. Si no hay más datos, el método next() devolverá falso. Puede usarlo en un bucle for para iterar sobre un conjunto de datos.
El ResultSet predeterminado no se puede actualizar y el cursor solo puede moverse hacia abajo. En otras palabras, solo puede atravesar desde la primera línea hasta la última línea. Sin embargo, también puede crear un ResultSet que se puede revertir o actualizar.
Cuando el objeto Statement que genera el ResultSet debe cerrarse o volverse a ejecutar o se obtiene el siguiente ResultSet, el objeto ResultSet también se cerrará automáticamente. Los datos de la columna se pueden obtener pasando el nombre de la columna o un número de serie a partir de 1 a través del método getter de ResultSet.

18.¿Qué es un Servlet?

Servlet es un programa Java que utiliza la interfaz de programación de aplicaciones (API) de Java Servlet y clases y métodos relacionados. La
interfaz principal que todos los Servlets deben implementar es javax.servlet.servlet. Cada servlet debe implementar directa o indirectamente esta interfaz, o heredar javax.servlet.GenericServlet o javax.servlet.HTTPServlet.
El servlet se utiliza principalmente para procesar solicitudes HTTP del cliente y devolver una respuesta.

19.¿Cuál es la diferencia entre los métodos doGet y doPost?

​ doGet: el método GET agrega el par nombre-valor a la URL solicitada. Debido a que las URL tienen un límite en la cantidad de caracteres, esto limita la cantidad de valores de parámetros utilizados en las solicitudes de los clientes. Y los valores de los parámetros en la solicitud son visibles, por lo que no se puede pasar información confidencial de esta manera.
doPOST: El método POST supera las limitaciones del método GET al colocar los valores de los parámetros de la solicitud en el cuerpo de la solicitud, por lo que no hay límite en la cantidad de parámetros que se pueden enviar. Finalmente, la información confidencial transmitida a través de solicitudes POST no es visible para los clientes externos.

22. ¿Cómo transferir objetos entre páginas?

solicitud, sesión, aplicación, cookie

23. ¿Cuál es la diferencia entre INCLUDE dinámico e INCLUDE estático en JSP?

​ La inclusión dinámica se utiliza para jsp: implementación de acción de inclusión <jsp: include page = “include.jsp” Flush = “true” /> Siempre verificará los cambios en los archivos incluidos, es adecuado para incluir páginas dinámicas y puede tomar parámetros. .
La inclusión estática se implementa utilizando pseudocódigo de inclusión y no verifica los cambios en los archivos incluidos. Es adecuado para incluir páginas estáticas <%@include file="include.html"%>.

24. ¿Cuáles son los cuatro alcances principales de JSP?

Los cuatro ámbitos en JSP incluyen página, solicitud, sesión y aplicación. Específicamente: la página representa objetos y atributos relacionados con una página.
La solicitud representa objetos y propiedades relacionados con una solicitud emitida por un cliente web. Una solicitud puede abarcar varias páginas e involucrar múltiples componentes web; los datos temporales que deben mostrarse en la página se pueden colocar en este alcance. sesión representa los objetos y propiedades relacionados con una sesión establecida por un usuario con el servidor. Los datos relacionados con un usuario deben colocarse en la propia sesión del usuario.
La aplicación representa objetos y propiedades relacionados con toda la aplicación web. Es esencialmente un alcance global que abarca toda la aplicación web, incluidas múltiples páginas, solicitudes y sesiones.

25. ¿Cuáles son las conexiones y diferencias entre BS y CS?

1.Diferentes entornos de hardware:
C/S generalmente se construye en una red dedicada, un entorno de red de pequeña escala y se utilizan servidores especiales para proporcionar servicios de conexión e intercambio de datos entre LAN. B /
S se construye en una red de área amplia y no tiene que ser un entorno de hardware de red dedicado, como acceso telefónico a Internet, equipo de alquiler. Gestión de la información por usted mismo. Tiene una mayor adaptabilidad que C/S. Generalmente, siempre que tenga un sistema operativo y un navegador, será suficiente. .

2.
C/S tiene diferentes requisitos de seguridad. Generalmente está orientado a un grupo de usuarios relativamente fijo y tiene un fuerte control sobre la seguridad de la información. Generalmente, los sistemas de información altamente confidenciales adoptan una estructura C/S. Parte de la información pública puede ser liberada a través de B/ S. B
/S está construido sobre una red de área amplia, tiene capacidades de control de seguridad relativamente débiles y puede estar orientado a usuarios desconocidos.

3.Con diferentes arquitecturas de programas
, los programas C/S pueden prestar más atención a los procesos, pueden realizar verificaciones de permisos de varios niveles y pueden prestar menos atención a la velocidad de ejecución del sistema. Las múltiples consideraciones de seguridad y velocidad de acceso de B/S se basan en las necesidades Para una mayor optimización. Arriba. La arquitectura del programa con estructura B/S tiene requisitos más altos que C/S. Es una tendencia de desarrollo. Desde la serie .Net de MS hasta BizTalk 2000 Exchange 2000, etc., es totalmente compatible con el sistema construido por red. componentes SUN e IBM promueven la tecnología de componentes JavaBean, etc., hacen que B/S sea más maduro.

4.La reutilización de software de diferentes programas C/S puede inevitablemente considerarse de manera integral. La reutilización de los componentes no es tan buena como la reutilización de los componentes bajo los requisitos B/S. Las
múltiples estructuras de pares B/S requieren funciones relativamente independientes de los componentes. Reutilización relativamente mejor: simplemente compre una mesa de comedor que pueda reutilizarse en lugar de hacer una mesa de piedra en la pared.

5.El mantenimiento del sistema es diferente.

Debido a la integridad del programa C/S, es necesario examinarlo en su totalidad, abordar los problemas que surjan y actualizar el sistema. La actualización es difícil. Puede que sea necesario crear un nuevo sistema compuesto por B
/ S y reemplace los componentes de aspecto individualmente para lograr una actualización perfecta del sistema. Los gastos generales de mantenimiento del sistema se reducen al mínimo. Los usuarios pueden actualizar descargándolos e instalándolos desde Internet.

6.Para solucionar el problema, diferentes
programas C/S pueden manejar planos de usuario fijos, y en la misma área se requieren altos requisitos de seguridad relacionados con el sistema operativo, todos deben ser el mismo sistema
B/S construido en la WAN, frente a diferentes grupos de usuarios, dispersos geográficamente., esto es algo que C/S no puede hacer. Tiene la menor relación con la plataforma del sistema operativo.

7. La interfaz de usuario es diferente.
C/S se basa principalmente en la plataforma Windows, con métodos de expresión limitados y generalmente tiene requisitos más altos para los programadores. B/S se basa en el navegador y tiene formas de expresión más ricas y vívidas para comunicarse. usuarios Y la mayoría de ellos son difíciles de usar Reducir y
reducir los costos de desarrollo.

8.El flujo de información es diferente.
Los programas C/S son generalmente un procesamiento mecánico centralizado típico, con una interactividad relativamente baja
. La dirección del flujo de información B/S puede cambiar, como BB BC BG y otros cambios en la información y la dirección del flujo, más como un centro comercial.

26. Explique el ciclo de vida de Servlet y la diferencia entre Servlet y CGI.

Después de que el contenedor web carga el servlet y lo crea una instancia, comienza el ciclo de vida del servlet. El contenedor ejecuta su método init para inicializar el servlet. Cuando llega la solicitud, ejecuta su método de servicio. El método de servicio envía automáticamente el método doXXX (doGet, doPost) correspondiente a la solicitud. ), etc., cuando el servidor decide destruir la instancia, se llama a su método de destrucción. La diferencia con cgi es que el servlet está en el proceso del servidor y ejecuta su método de servicio a través de subprocesos múltiples. Una instancia puede atender múltiples solicitudes y su instancia generalmente no se destruye, mientras que CGI crea un nuevo proceso para cada solicitud. El servicio se destruye una vez completado, por lo que su eficiencia es menor que la del servlet.

27. ¿Cómo evitar el envío repetido de formularios?

La solución general para envíos repetidos:
1. Utilice la redirección para resolver el problema de los envíos repetidos
2. Después de hacer clic una vez, el botón deja de ser válido
3. El principio de carga (Carga) es generar el estilo de Carga cuando hace clic en enviar. Ocultar esto estilo después de completar)
4. Personalizar el filtro de envío duplicado

28. ¿Cuál es la función de la solicitud?

1. Obtener los parámetros de solicitud getParameter()
2. Obtener la ruta virtual de la aplicación web actual getContextPath
3. Reenviar getRequestDispatcher(path).forward(solicitud, respuesta);
4. Sigue siendo un objeto de dominio

29. ¿Recibir una solicitud de caracteres chinos confusos?

1、乱码的根本原因:
浏览器的编码方式 UTF-8 和 服务器的解码方式 ISO-859-1 不一样2、解决方法:
1)第一种方式 使用 URLEncoder 和 URLDecoder 两个类 编解码。先以 iso-8895-1 进行编码,然后再以 utf-8 进行解码
2)第二种方式 使用 String 类的方法进行编解码
3)第三种方式 更改 server.xml 配置文件。
GET 请求是在 URL 地址栏中传递请求参数的,它会被 Tomcat 服务器自动解码,而 Tomcat 服务器默认的字符集也是 ISO-8859-1,所以我们需要修改 Tomcat 服务器的字符集为 UTF-8。

30.post 请求中文乱码问题?

1、post 请求方式乱码的原因是:因为 post 是以二进制流的形式发送到的服务器。服务器收到数据后。默认以 iso-8859-1 进行编码。
2、post 请求乱码解决,只需要在获取请求参数之前调用 request.setCharacterEncoding(“UTF-8”); 方法设置字符集 即可。

31.响应乱码?

1、原因: 由服务器编码,默认使用 ISO-8859-1 进行编码
由浏览器解码,默认使用 GBK 进行解码
2、解决方案方法 1:设置响应头
response.setHeader(“Content-Type”,“text/html;charset=utf-8”);
方法 2:设置响应的内容类型

Response.setContentType("text/html;charset=utf-8");
De esta manera, se le puede indicar al navegador en el encabezado de respuesta que el método de codificación del cuerpo de la respuesta es UTF-8; al mismo tiempo, el servidor También utilizará este juego de caracteres para codificar, pero cabe señalar que los dos métodos deben realizarse antes de Response.getWriter().

32. ¿Cuáles son los defectos de los objetos Cookie?

1. Las cookies son texto claro y no son seguras.
2. Diferentes navegadores tienen restricciones en el número y tamaño de los objetos Cookie.
3. Los objetos Cookie llevan demasiado tráfico.
4. El valor en un objeto Cookie solo puede ser una cadena, no un objeto. Los datos transmitidos a través de la red sólo pueden ser cadenas.

33. ¿Cuál es el mecanismo operativo de la sesión?

1. Cree un objeto de sesión en el lado del servidor, que tenga una ID única a nivel mundial.

2. Al crear el objeto de sesión, cree un objeto de cookie especial. El nombre del objeto de cookie es
JSESSIONID. El valor del objeto de cookie es el ID global único del objeto de sesión, y este objeto de cookie especial se enviará al navegador.

3. Cuando el navegador envíe una solicitud en el futuro, llevará este objeto Cookie especial
4. El servidor busca el objeto de sesión correspondiente en el servidor en función del valor de este objeto Cookie especial para distinguir diferentes usuarios.

34. ¿Pasivación y activación?

1. El proceso mediante el cual la sesión y los objetos en el dominio de la sesión se serializan desde la memoria al disco duro se denomina pasivación. La pasivación se produce cuando se apaga el servidor.
2. El proceso de deserializar la sesión y los objetos en el dominio de la sesión desde el disco duro a la memoria se llama activación. La activación se producirá cuando el servidor se vuelva a encender.
3. Para garantizar que los objetos en el dominio de sesión puedan pasivarse y activarse junto con la sesión, debe asegurarse de que la clase correspondiente al objeto implemente la
interfaz serializable .

35. ¿Cómo funciona el filtro?

Hay un método doFilter en la interfaz del filtro. Después de escribir el filtro y configurar qué recursos web interceptar, el servidor WEB llamará al método doFilter del filtro cada vez antes de llamar al método de servicio del recurso web. Por lo tanto, en este Escribir código dentro de un método puede lograr los siguientes objetivos:
dejar que se ejecute un fragmento de código antes de llamar al recurso de destino.
Si se debe llamar al recurso de destino (es decir, si se debe permitir que el usuario acceda a los recursos web). Después de llamar al recurso de destino, deje que se ejecute un fragmento de código.
Cuando el servidor web llama al método doFilter, pasará un objeto filterChain. El objeto filterChain es
el objeto más importante en la interfaz de filtro. También proporciona un método doFilter. Los desarrolladores pueden decidir si llamar a este método según sus necesidades. Llame a este método, luego el servidor web llamará
al método de servicio del recurso web, es decir, se accederá al recurso web; de lo contrario, no se accederá al recurso web.

36. ¿Qué es la cadena de Filtros?

En una aplicación web, se pueden desarrollar y escribir múltiples filtros. La combinación de estos filtros se denomina cadena de filtros. El servidor web determina qué filtro llamar primero según el orden en que el filtro está registrado en el archivo web.xml. Cuando se llama al método doFilter del primer filtro, el servidor web creará un objeto FilterChain que representa la cadena de filtros y pásalo al método
. En el método doFilter, si el desarrollador llama al método doFilter del objeto FilterChain, el servidor web comprobará
si hay otro filtro en el objeto FilterChain. Si lo hay, se llamará al segundo filtro. Si no, el recurso de destino ser llamado.

38. ¿Secuencia de inicio de Servlet Filter Listener?

La secuencia de inicio es oyente->Filtro->servlet.
Simplemente se registra como: oyente, filtro, servlet. La
secuencia de ejecución no cambiará debido al orden de las tres etiquetas en el archivo de configuración.

3. Marco de código abierto

  1. ¿Ventajas de MyBatis?

1. La programación basada en declaraciones SQL es bastante flexible y no tendrá ningún impacto en el diseño existente de la aplicación o base de datos. SQL está escrito en XML, lo que desacopla SQL del código del programa y facilita la administración unificada; se proporcionan etiquetas XML para admitir dinámica escribir sentencias SQL y se puede reutilizar.
2. En comparación con JDBC, la cantidad de código se reduce en más del 50%, lo que elimina una gran cantidad de código redundante en JDBC y no es necesario cambiar manualmente la conexión; 3. Muy compatible con varias bases de datos (porque MyBatis usa JDBC para conectarse a la base de datos, siempre que JDBC admita la base de datos, MyBatis la admitirá).
4. Capacidad para integrarse bien con Spring,
5. Proporcionar etiquetas de mapeo para admitir el mapeo de relaciones de campos ORM entre objetos y bases de datos, proporcionar etiquetas de mapeo de relaciones de objetos para respaldar el mantenimiento de componentes de relaciones de objetos.
3. ¿Cuáles son las desventajas del marco MyBatis?
(1) La carga de trabajo de escribir declaraciones SQL es relativamente grande, especialmente cuando hay muchos campos y tablas relacionadas, lo que requiere que los desarrolladores tengan ciertas habilidades para escribir declaraciones SQL.
(2) Las declaraciones SQL dependen de la base de datos, lo que da como resultado una portabilidad deficiente de la base de datos y la base de datos no se puede reemplazar a voluntad.

  1. ¿Flujo de trabajo SpringMVC?

1. El usuario envía una solicitud al controlador front-end DispatcherServlet
2. DispatcherServlet recibe la solicitud y llama al asignador del procesador HandlerMapping.
3. El asignador de procesador encuentra el procesador específico de acuerdo con la URL de solicitud, genera el objeto del procesador y el interceptor del procesador (si lo hay) y los devuelve a DispatcherServlet.
4. DispatcherServlet llama al procesador a través del adaptador de procesador HandlerAdapter
5. Procesador de ejecución (Controlador, también llamado controlador de fondo).
6. Una vez completada la ejecución del Controlador, regresa a ModelAndView
7. HandlerAdapter devuelve el resultado de la ejecución del controlador ModelAndView al DispatcherServlet
8. DispatcherServlet pasa ModelAndView al analizador de vistas ViewReslover
9. ViewReslover devuelve la Vista específica después del análisis
10 El DispatcherServlet representa la Vista (es decir, completa los datos del modelo en la vista).
11. DispatcherServlet responde a los usuarios

4. ¿Qué es SpringMVC?

SpringMVC es un marco de modo mvc proporcionado por Spring

5. ¿Cuándo se utiliza el marco MyBatis?

(1) MyBatis se centra en SQL en sí y es una solución de capa DAO bastante flexible.
(2) Para proyectos que tienen requisitos de alto rendimiento o necesidades cambiantes, como proyectos de Internet, MyBatis será una buena opción.

6. ¿Cuáles son las conexiones y diferencias entre beanFactory y ApplicationContext en Spring?

BeanFactory es una fábrica relativamente primitiva en Spring y no puede admitir muchos complementos de Spring, como funciones AOP,
aplicaciones web, etc.
La interfaz ApplicationContext se deriva de la interfaz BeanFactory y, además de
las funciones de la interfaz BeanFactory, también tiene funciones como acceso a recursos, propagación de eventos y acceso a mensajes internacionalizados. La diferencia general es la siguiente:
1) Utilice ApplicationContext para configurar beans. La configuración predeterminada es singleton, y se creará una instancia independientemente de si se usa o no.
La ventaja es la precarga, pero la desventaja es el desperdicio de memoria; 2) Cuando se utiliza BeanFactory para crear instancias de objetos, no se crearán instancias de los beans configurados hasta que se utilicen. La ventaja es que ahorra
memoria, pero la desventaja es que es relativamente lento y se usa principalmente para el desarrollo de dispositivos móviles;
3) Si no hay requisitos especiales, debe completarse usando ApplicationContext, ApplicationContext puede realizar
todas las funciones. que puede ser realizado por BeanFactory, y también tiene otras funciones más.

7.¿Cuáles son los métodos de inyección de SpringIOC?

Inyección de constructor método de conjunto inyección de interfaz de inyección

8. ¿Cuál es la diferencia entre interceptores y filtros?

1. El interceptor se basa en el mecanismo de reflexión de Java, mientras que el filtro se basa en devoluciones de llamadas de funciones
2. El interceptor no depende del contenedor de servlet, pero el filtro depende del contenedor de servlet.
3. Los interceptores solo pueden funcionar con solicitudes de acción, mientras que los filtros pueden funcionar con casi todas las solicitudes.
4. El interceptor puede acceder a los objetos en el contexto de acción y la pila de valores, pero el filtro no.
5. En el ciclo de vida de la acción, el interceptor se puede llamar varias veces, pero el filtro solo se puede llamar una vez cuando se inicializa el contenedor.

9.¿Qué es SpringIOC?

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。

10.AOP 有哪些实现方式?
实现 AOP 的技术,主要分为两大类:
静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;编译时编织(特殊编译器实现)
类加载时编织(特殊的类加载器实现)。
动态代理 - 在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。
  1. 解释一下代理模式?

    1、代理模式: 代理模式就是本该我做的事,我不做,我交给代理人去完成。就比如,我生产了一些产品,我自己不卖,我委托代理商帮我卖,让代理商和顾客打交道,我自己负责主要产品的生产就可以了。 代理模式的使用,需要有本类,和代理类,本类和代理类共同实现统一的接口。然后在 main 中调用就可以了。本类中的业务逻辑一般是不会变动的,在我们需要的时候可以不断的添加代理对象,或者修改代理类来实现业务的变更。
    2、代理模式可以分为: 静态代理 优点:可以做到在不修改目标对象功能的前提下,对目标功能扩展 缺点:因为本来和代理类要实现统一的接口,所以会产生很多的代理类,类太多,一旦接口增加方法,目标对象和代理对象都要维护。 动态代理(JDK 代理/接口代理)代理对象,不需要实现接口,代理对象的生成,是利用 JDK 的 API,动态的在内存中构建代理对象,需要我们指定代理对象/目标对象实现的接口的类型。 Cglib 代理 特点: 在内存中构建一个子类对象,从而实现对目标对象功能的扩展。
    3、使用场景: 修改代码的时候。不用随便去修改别人已经写好的代码,如果需要修改的话,可以通过代理的方式来扩展该方法。 隐藏某个类的时候,可以为其提供代理类 当我们要扩展某个类功能的时候,可以使用代理类 当一个类需要对不同的调用者提供不同的调用权限的时候,可以使用代理类来实现。 减少本类代码量的时候。 需要提升处理速度的时候。就比如我们在访问某个大型系统的时候,一次生成实例会耗费大量的时间,我们可以采用代理模式,当用来需要的时候才生成实例,这样就能提高访问的速度。

12.Mybatis 是如何 sql 执行结果封装为目标对象?都有哪些映射形式?
第一种是使用<resultMap>标签,逐一定义数据库列名和对象属性名之间的映射关系。第二种是使用 sql 列的别名功能,将列的别名书写为对象属性名。
有了列名与属性名的映射关系后,Mybatis 通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。
13.Spring bean 的生命周期?
1、Spring 容器根据配置中的 bean 定义中实例化 bean。
2、Spring 使用依赖注入填充所有属性,如 bean 中所定义的配置。
3 、如果 bean Implemente la interfaz BeanNameAware y se llama a la fábrica pasando el ID del bean.
establecerBeanName()。
4. Si frijol Implemente la interfaz BeanFactoryAware y se llama a la fábrica pasando su propia instancia.
establecerBeanFactory()。
5. Si hay BeanPostProcessors asociados con el bean, llame a preProcessBeforeInitialization()
método.
6. Si se especifica un método init (atributo método-init de) para el bean, se llamará.
7. Finalmente, si hay BeanPostProcessors asociados con el bean, se llamará
Método postProcessAfterInitialization().
8. Si el bean implementa la interfaz desechableBean, se llamará a destroy() cuando se cierre el contenedor de resorte. 9. Si se especifica el método de destrucción (atributo del método de destrucción de) para el bean, se llamará.
51
14. ¿Qué patrones de diseño se utilizan en el marco Spring?

El modo proxy es el más utilizado en AOP.
Modo singleton, el valor predeterminado es el modo singleton al definir un bean en el archivo de configuración de Spring. Patrón de fábrica, BeanFactory se utiliza para crear instancias de objetos.
Método de plantilla para resolver código repetitivo.
Controlador de front-end, Spring proporciona DispatcherSerclet para distribuir solicitudes. Ver ayuda, Spring proporciona una serie de etiquetas JSP.
Inyección de dependencia, que es el concepto central utilizado en la interfaz BeanFactory/ApplicationContext.

16. ¿Cuáles son los beneficios de utilizar el marco Sping?

1、简化开发,解耦,集成其它框架。
2、低侵入式设计,代码污染级别级别。
3、Spring 的 DI 机制降低了业务对象替换的复杂性,提高了软件之间的解耦。
4、Spring AOP 支持将一些通用的任务进行集中式的管理,例如:安全,事务,日志等,从而使代码能更好的复用。

17.解释 Spring 支持的几种 bean 的作用域?(前面两个记住,后面背诵)

当通过 Spring 容器创建一个 Bean 实例的时候,不仅可以完成 bean 实例的实力化,还可以为 bean 指定作用域。Spring bean 元素的支持以下 5 种作用域:
Singleton:单例模式,在整个 spring IOC 容器中,使用 singleton 定义的 bean 将只有一个实
例。
Prototype:多例模式,每次通过容器中的 getBean 方法获取 prototype 定义的 beans 时,都会产生一个新的 bean 的实例。
Request:对于每次 Http 请求,使用 request 定义的 bean 都会产生一个新的实例,只有在 web 应用时候,该作用域才会有效。
Session:对于每次 Http Session,使用 session 定义的 Bean 都将产生一个新的实例。Globalsession:每个全局的 Http Sesisonn,使用 session 定义的本都将产生一个新的实例

18.在 Spring 中如何注入一个 java 集合?

Spring 提供理论四种集合类的配置元素:

lt;List&: esta etiqueta se usa para ensamblar un valor de lista con valores duplicados
lt;set&: esta etiqueta se usa para ensamblar un valor establecido sin valores duplicados lt;map&: esta etiqueta se puede usar para inyectar clave-valor pairslt;props&: esta etiqueta se utiliza para admitir la inyección de pares clave-valor y pares clave-valor de tipo cadena.

19. ¿Qué son los frijoles primaverales?

Son los objetos que forman la columna vertebral de la aplicación de un usuario.
Los beans son administrados por el contenedor Spring IoC.
El contenedor Spring IoC crea instancias, configura, ensambla y administra. Los beans se crean en función de los metadatos de configuración proporcionados por el usuario al contenedor.

23. ¿Cuáles son las anotaciones importantes de Spring?

@Controller: clase de controlador utilizada en proyectos Spring MVC. @Service: para clases de servicio.
@RequestMapping: se utiliza para configurar la asignación de URI en los métodos del controlador del controlador.
@ResponseBody: se usa para enviar un objeto como respuesta, generalmente se usa para enviar datos XML o JSON como respuesta.
@PathVariable: se utiliza para asignar valores dinámicos de URI a parámetros del método del controlador.
@Autowired: se utiliza para dependencias de cableado automático en Spring Beans.

@Qualifier: utilice la anotación @Autowired para evitar confusiones cuando hay varias instancias de tipo bean. @Scope: se utiliza para configurar el alcance de Spring Beans.
@Configuration, @ComponentScan y @Bean: para configuración basada en Java. @Aspect, @Before, @After, @Around, @Pointcut: se utilizan en programación de aspectos (AOP).

24. ¿Cuáles son las diferencias entre @Component, @Controller, @Repository y @Service?

1. @Component: esto marca la clase java como un bean. Es el estereotipo común para cualquier componente administrado por Spring. El mecanismo de escaneo de componentes de Spring ahora puede recogerlo y llevarlo al entorno de la aplicación.
2. @Controller: esto marca una clase como controlador Spring Web MVC. Los beans marcados con él se importan automáticamente al contenedor de IoC.
3. @Service: esta anotación es una especialización de la anotación del componente. No proporciona ningún comportamiento adicional para la anotación @Component. Puede usar @Service en lugar de @Component en las clases de la capa de servicio, ya que especifica la intención de una mejor manera.
4. @Repository: esta anotación es una especialización de la anotación @Component con propósitos y funciones similares.
Proporciona beneficios adicionales a DAO . Importa DAO al contenedor de IoC y hace que las excepciones no comprobadas sean elegibles para la conversión a Spring DataAccessException.

27. ¿Cuál es el principio de la programación Spring AOP (orientada a aspectos)?

1、AOP 面向切面编程,它是一种思想。它就是针对业务处理过程中的切面进行提取,以达到优化代码的目的,减少重复代码的目的。 就比如,在编写业务逻辑代码的时候,我们习惯性的都要写:日志记录,事物控制,以及权限控制等,每一个子模块都要写这些代码,代码明显存在重复。这时候,我们运用面向切面的编程思想,采用横切技术,将代码中重复的部分,不影响主业务逻辑的部分抽取出来,放在某个地方进行集中式的管理,调用。 形成日志切面,事物控制切面,权限控制切面。 这样,我们就只需要关系业务的逻辑处理,即提高了工作的效率,又使得代码变的简洁优雅。这就是面向切面的编程思想,它是面向对象编程思想的一种扩展。
2、AOP 的使用场景: 缓存、权限管理、内容传递、错误处理、懒加载、记录跟踪、优化、
校准、调试、持久化、资源池、同步管理、事物控制等。 AOP 的相关概念: 切面(Aspect)
连接点(JoinPoint) 通知(Advice) 切入点(Pointcut) 代理(Proxy): 织入(WeaVing)3、Spring AOP 的编程原理? 代理机制 JDK 的动态代理:只能用于实现了接口的类产生代理。 Cglib 代理:针对没有实现接口的类产生代理,应用的是底层的字节码增强技术,生成当前类的子类对象。

28.Spring MVC 框架有什么用?

Spring Web MVC 框架提供 模型-视图-控制器 架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序。 MVC 模式有助于分离应用程序的不同方面,如输入逻辑,业务逻辑和 UI 逻辑,同时在所有这些元素之间提供松散耦合。

31.Mybatis 中#{}和${}的区别是什么?

#{} está precompilado, error de análisis de KaTeX: 'EOF' esperado, obtuvo '#' en la posición 22: ...reemplazo. Cuando Mybatis procese #̲{}, reemplazará ${} con el valor de la variable cuando #{... {} en SQL. El uso de #{} puede prevenir eficazmente la inyección de SQL y mejorar la seguridad del sistema.

32. ¿Cuál es la diferencia entre @Autowire y @Resource en Spring?

@Autowire ensambla por tipo de forma predeterminada. De manera predeterminada, requiere que el objeto dependiente exista. Si se permite que sea nulo, puede establecer su atributo requerido en falso. Si queremos ensamblar por nombre, podemos usarlo en junto con la anotación @Qualifier; @Resource tiene como valor predeterminado el nombre. Ensamblaje, cuando no se puede encontrar un bean que coincida con el nombre, se ensamblará según el tipo. Se puede especificar a través del atributo de nombre.
Si no se especifica el atributo de nombre Cuando la anotación está marcada en el campo, el nombre del campo se utilizará como el nombre del bean de forma predeterminada para encontrar el objeto dependiente. La anotación está marcada en el método de establecimiento del atributo, es decir, de forma predeterminada, el atributo name se utiliza como nombre del bean para encontrar el objeto dependiente.

33. ¿Qué es la inversión de control (IOC) y la inyección de dependencia (DI)?

COI: La relación de dependencia entre objetos es creada por el contenedor. La relación entre objetos es creada y mantenida originalmente por nuestros propios desarrolladores. Después de usar el marco Spring, la relación entre objetos es creada y mantenida por el contenedor. Deje que el contenedor haga lo que hace el desarrollador Esto es inversión de control. La interfaz BeanFactory es la interfaz principal del contenedor Spring Ioc.
DI: Cuando usamos el contenedor Spring, el contenedor establece dependencias entre objetos llamando al método set o constructor.
La inversión del control es el objetivo y la inyección de dependencia es un medio para lograr la inversión del control.

34. ¿Cómo funciona Spring?

1、内部最核心的就是 IOC 了,之前是 new 对象,现在可以直接从容器中获取,动态注入,这其实就是利用 java 里的反射。反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,根据 xml Spring 的配置文件来动态的创建对象,和调用对象里的方法的。
2、Spring 另一个核心就是 AOP 面向切面编程,可以为某一类对象 进行监督和控制(也就是在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过配置类达到的。(日志、事务等)
3、Spring 目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明管理的(Spring 根据这些配置 内部通过反射去动态的组装对象)要记住: Spring 是一个容器,凡是在容器里的对象才会有 Spring 所提供的这些服务和功能。
4、Spring 里用的最经典设计模式:模板方法模式。(有兴趣同学可以了解一下)、核心容器组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

36. SpringMVC 的运行流程?

DispatcherServlet 前置控制器 |HandlerMapping 请求映射(到 Controller)
|HandlerAdapter 请求映射(到 Controller 类的方法上)|Controller 控制器| HandlerIntercepter 拦截器|ViewResolver 视图映射|View 视图处理

Supongo que te gusta

Origin blog.csdn.net/lanlan112233/article/details/129706390
Recomendado
Clasificación