1. El método igual se usa para comparar si el contenido del objeto es igual (anulado más adelante)
2. El método hashcode solo se usa en colecciones
3. Cuando el método igual se sobrescribe, si el objeto de comparación es igual se comparará a través del método sobrescribido iguales (juzgando si el contenido del objeto es igual).
4. Al colocar un objeto en una colección, primero determine si el valor hashcode del objeto a colocar es igual al valor de hashcode de cualquier elemento en la colección. Si no es igual, coloque el objeto en la colección directamente. Si los valores de hashcode son iguales, use el método igual para determinar si el objeto que se coloca es igual a cualquier objeto en la colección. Si el juicio igual no es igual, coloque el elemento directamente en la colección, de lo contrario no se colocará.
5. El método igual utiliza si las direcciones de memoria del objeto son iguales para determinar si los objetos son iguales.
Debido a que son dos objetos nuevos, las direcciones de memoria de los objetos no son iguales, por lo que Stu1.Equals (Stu2) es falso.
6. Los hilos A y B deben obtener el bloqueo del objeto O. suponiendo que A adquiere el bloqueo del objeto O, B esperar a que A libere el bloqueo de O. Si se usa sincronizado, si A no se libera, B esperará a que continúe y no se puede interrumpir. Si se usa Reentrantlock, si A no se libera, B puede interrumpir la espera después de esperar el tiempo suficiente y hacer otras cosas.
Reentrantlock adquiere cerraduras de tres maneras:
a) bloquear (), si se adquiere el bloqueo, regrese inmediatamente. Si otro hilo contiene el bloqueo, el hilo actual permanecerá en un estado inactivo hasta que se adquiera el bloqueo.
b) TryLock (), si se adquiere el bloqueo, volverá verdadero de inmediato, y si otro hilo sostiene el bloqueo, volverá falso inmediatamente;
c) TryLock (tiempo de espera largo, unidad de tiempo de tiempo), si se adquiere el bloqueo, devolverá verdadero de inmediato. Si otro hilo sostiene el bloqueo, esperará el tiempo dado del parámetro.
Durante el proceso de espera, si se adquiere el bloqueo, devuelve verdadero, y si el tiempo de espera de espera, devuelve falso;
d) LockInterruptualmente: si se adquiere el bloqueo, regrese inmediatamente. Si no se adquiere el bloqueo, el hilo actual está en estado inactivo hasta o bloqueado.
O el hilo actual se interrumpe por otro hilo
Sincronizado se implementa en el nivel JVM. El bloqueo sincronizado no solo se puede monitorear a través de algunas herramientas de monitoreo, sino que también pueden ocurrir excepciones durante la ejecución del código.
El JVM liberará automáticamente el bloqueo, pero no es posible usar el bloqueo. Lock se implementa a través del código. Para asegurarse de que el bloqueo se libere, el desbloqueo () debe colocarse finalmente {}
Cuando la competencia de recursos no es muy feroz, el rendimiento de sincronizado es mejor que el de Reetrantlock. Sin embargo, cuando la competencia de recursos es muy feroz, el rendimiento de sincronizado disminuirá en docenas de veces, pero el rendimiento de Reetrantlock puede permanecer normal;
En el JDK, las siguientes clases se utilizan principalmente para implementar el mecanismo de reflexión Java, que se encuentran en el paquete Java.Lang.Reflect:
Clase: representa una clase.
Clase de campo: una variable miembro que representa una clase (las variables miembros también se denominan atributos de una clase).
Clase de método: un método que representa la clase.
Clase de constructor: representa el método de constructor de la clase.
Clase de matriz: proporciona métodos estáticos para crear dinámicamente matrices y acceder a elementos de la matriz.
Aquí hay algunos ejemplos para ver la aplicación real de la API de reflexión:
1. Obtenga variables miembros, métodos de miembros, interfaces, superclase, métodos de constructor, etc. a través de clase
El método getClass () se define en la clase java.lang.object, por lo que para cualquier objeto Java, el tipo de objeto se puede obtener a través de este método. La clase de clase es una clase central en la API de reflexión, y tiene los siguientes métodos
GetName (): Obtenga el nombre completo de la clase.
getFields (): Obtenga la propiedad del tipo público de la clase.
getDeclaredfields (): Obtenga todas las propiedades de la clase.
getMethods (): un método para obtener el tipo público de la clase.
getDeclaredMethods (): Obtenga todos los métodos de la clase.
getMethod (nombre de cadena, clase [] Parametertypes): Obtiene un método específico de la clase, el parámetro de nombre especifica el nombre del método, Parametertypes Parameter especifica el tipo de parámetro del método.
getConstructors (): Obtenga el constructor del tipo público de la clase.
getConstructor (clase [] Parametertypes): Obtiene el constructor específico de la clase. El parámetro Parametertypes especifica el tipo de parámetro del constructor.
NewInStance (): cree un objeto de esta clase a través del constructor de la clase sin parámetros.
Pasos para escribir un reflector Java:
1) Primero debe obtener el objeto de clase de una clase
Por ejemplo:
Clase C1 = Test.Class; Clase c2 = class.forname ("com.reflection.test"); Clase C3 = nueva test (). GetClass (); 2) Luego llame a los métodos en el objeto de clase por separado para obtener las propiedades/métodos/constructores de una clase
Nota: Si desea obtener métodos/propiedades/constructores en la clase normalmente, debe centrarse en las siguientes clases de reflexión
Campo
Constructor
Método
<Servlet-mapping> <ervlet-name> </servlet-name> <url-pattern> </sl-Pattern> </servlet-mapping> for (string elementa: str) {system.out.print (elementa + ""); } List <String> list = new ArrayList <String> (); for (int i = 0; i <str.length; i ++) {if (! list.contains (str [i])) {list.add (str [i]); }} Set <string> set = new Hashset <String> (); for (int i = 0; i <str.length; i ++) {set.add (str [i]); }La primavera tiene seis transacciones y cinco niveles de aislamiento
Categoría 1: Inte Short Int Long
Categoría 2: Double Float
La tercera categoría: booleano lógico (solo tiene dos valores que se pueden considerar verdadero falso)
Categoría 4: Carácter Char
Métodos en la clase de modificación final
Función: se puede heredar, pero no se puede reescribir después de la herencia.
Clase de modificación final
Función: las clases no se pueden heredar.
Cuando se modifica el tipo básico final, el valor permanece sin cambios. El tipo de referencia indica que la dirección permanece sin cambios. Es decir, cuando es nuevo, la dirección no se puede reasignar.
Conoces el atributo de modificación final
La preparación es precompilada. Primero envíe el SQL a la base de datos para el preprocesamiento, y luego póngalo en el caché. La próxima vez que encuentre que hay lo mismo, no necesita compilarlo. La eficiencia de ejecución es alta, hay indicaciones de sintaxis para facilitar la verificación, y los parámetros son dinámicos, evitando la inyección de SQL debido a la verificación de sintaxis
Seleccione * de tbname = 'zck' y passwd = 'o' 1 '=' 1 ';
La declaración no es precompilada y requiere una verificación manual de errores de sintaxis, que está codificado
Hashmap permite que NULL como clave o valor de una entrada, mientras que hashtable no
poner el método
HashMap realizará un procesamiento especial en la tecla NULL Value, siempre colóquelo en la posición de la tabla [0]. Poner que el proceso es calcular primero el hash y luego calcular el valor del índice a través de hash y table.length, y luego colocar la clave en la posición de tabla [índice]. Cuando ya existen otros elementos en la Tabla [índice], se formará una lista vinculada en la posición de la tabla [índice], y los elementos recién agregados se colocarán en la tabla [índice], y los elementos originales se vincularán a través de la próxima entrada. De esta manera, el problema del conflicto hash se resuelve en forma de una lista vinculada. Cuando el número de elementos alcanza el valor crítico (factor capacto*), la capacidad se ampliará y la longitud de la matriz de tabla se convierte en tabla.
Obtener método
Del mismo modo, cuando la clave es nula, se realizará un procesamiento especial, y el elemento con la clave es nulo se encuentra en la lista vinculada de la tabla [0].
El proceso de GET es calcular primero el hash y luego calcular el valor del índice a través de hash y table.length, luego iterar a través de la lista vinculada en la tabla [índice] hasta que se encuentre la clave, y luego devolver la implementación subyacente de hashmap y hashtable son implementaciones de estructura de lista vinculada + matriz + para calcular el hash primero. El índice, que es el subíndice de la matriz de tabla, se calcula en función de hash y tabla.length, se calcula y se realiza la operación correspondiente.
La mayoría de los índices se basan en B-Tree
Los problemas de seguridad del hilo de servlet son causados principalmente por variables de instancia, por lo que las variables de instancia deben evitarse en los servlets.
Si el diseño de la aplicación no puede evitar usar variables de instancia, entonces la sincronización se usa para proteger las variables de instancia que se utilizarán, pero para un rendimiento óptimo del sistema, la ruta del código con disponibilidad mínima debe sincronizarse.
Escribe un patrón de singleton
public static long recursivo (int n) {if (n <= 0) return 0; if (n == 1) return 1; return recursivo (n - 1) + recursivo (n - 2);} public static long loop (int n) {if (n <= 0) return 0; if (n == 1 1) return 1; larga fib1 = 0; larga fib2 = 1; larga sum = 0; para (int s. = 2; i <n. i ++) {sum = fib1+fib2; fib1 = fib2; fib2 = sum;} regreso de la suma;} Hashtable es una clase segura de hilo. Utiliza sincronizado para bloquear toda la tabla hash para lograr la seguridad de hilo, es decir, bloquear toda la mesa cada vez y dejar que el hilo lo ocupe. Concurrenthashmap permite realizar múltiples operaciones de modificación que se realizan simultáneamente, y la clave es el uso de la tecnología de separación de bloqueos. Utiliza múltiples bloqueos para controlar las modificaciones a diferentes partes de la tabla hash.
Concurrenthashmap utiliza segmentos (segmento) para representar estas diferentes partes. Cada segmento es en realidad un pequeño hashtable, y tienen sus propias cerraduras. Mientras ocurran múltiples operaciones de modificación en diferentes segmentos, se pueden realizar simultáneamente.
Algunos métodos necesitan cruzar segmentos, como size () y contenSvalue (). Es posible que necesiten bloquear toda la mesa en lugar de solo un cierto segmento. Esto requiere bloquear todos los segmentos en secuencia. Después de completar la operación, los bloqueos de todos los segmentos se liberan en secuencia. "En orden" es muy importante aquí, de lo contrario, existe una gran posibilidad de punto muerto. En concurrenthashmap, la matriz de segmentos es final, y sus variables miembros son realmente finales. Sin embargo, simplemente declarar la matriz como final no garantiza que los miembros de la matriz sean finales, lo que requiere garantías de implementación.
Esto asegura que no haya un punto muerto, porque el orden en el que se obtienen las cerraduras se fija
① ThreadLocal ② Synchronized () ③ Wait () y notify () ④ Volátil
Hilo
ThreadLocal asegura que diferentes hilos tengan diferentes instancias, y el mismo hilo debe tener la misma instancia, es decir, cada hilo que usa la variable proporciona una copia del valor de la variable. Cada hilo puede cambiar de forma independiente su propia copia, en lugar de conflicto con la copia de otros hilos.
Ventajas: proporciona objetos compartidos a prueba de subprocesos
La diferencia de otros mecanismos de sincronización: el mecanismo de sincronización es sincronizar el acceso concurrente al mismo recurso mediante múltiples hilos y comunicarse entre múltiples hilos;
ThreadLocal es un intercambio de datos aislado de múltiples hilos, y fundamentalmente no comparte recursos entre múltiples hilos. Esto ciertamente no requiere que se sincronizen múltiples hilos.
volátil
La variable de miembro modificada volátil se ve obligada a releer el valor de la variable de miembro de la memoria compartida cada vez que se accede por un hilo. y,
Cuando la variable de miembro cambia, el hilo se ve obligado a volver a escribir el valor de cambio a la memoria compartida.
Ventajas: de esta manera, en cualquier momento, dos hilos diferentes siempre ven el mismo valor de una determinada variable miembro.
Razón: la especificación de lenguaje Java establece que para obtener la mejor velocidad, los subprocesos pueden guardar copias privadas de las variables de miembros compartidos.
Y solo se compara con el valor original de la variable de miembro compartido cuando el hilo entra o deja el bloque de código sincrónico.
De esta manera, cuando múltiples hilos interactúan con un objeto al mismo tiempo, es necesario prestar atención a permitir que el hilo obtenga cambios en las variables de miembros compartidos de manera oportuna.
La palabra clave volátil solicita la VM: para esta variable miembro, no puede guardar su copia privada, pero debe interactuar directamente con la variable de miembro compartido.
Consejos de uso: Use las variables volátiles en los miembros a las que se accede por dos o más subprocesos.
No es necesario usarlo cuando la variable a acceder ya está en el bloque de código sincronizado o es constante.
Para mejorar la eficiencia, un hilo copia una variable miembro (como A) (como B), y el acceso a A en el hilo realmente accede a B. La sincronización de A y B solo se realiza en ciertas acciones, por lo que hay una situación en la que A y B son inconsistentes. Volátil se usa para evitar esta situación.
Volátil le dice a JVM que las variables que modifica no retienen copias y acceden directamente a las de la memoria principal (es mejor usarlo cuando hay muchas operaciones de lectura; se requiere comunicación entre los subprocesos, pero este artículo no puede hacerlo)
Las variables volátiles tienen propiedades de visibilidad sincronizadas, pero no tienen propiedades atómicas.
Esto significa que el hilo puede descubrir automáticamente el último valor de la variable volátil. Las variables volátiles se pueden usar para proporcionar seguridad de subprocesos, pero solo se pueden aplicar a un conjunto muy limitado de casos de uso: no existe una restricción entre múltiples variables o entre el valor actual de una variable y el valor modificado.
Solo puede usar la variable volátil en lugar de bloqueos en casos limitados. Para hacer la seguridad de los subprocesos ideales de la variable volátil, las siguientes dos condiciones deben cumplirse al mismo tiempo:
Las operaciones de escritura a las variables no dependen del valor actual; La variable no está incluida en el invariante con otras variables.
dormir () vs Wait ()
Sleep es una clase de subprocesos (hilo), que hace que este hilo detenga la ejecución por un tiempo específico y envíe la oportunidad de ejecución a otros subprocesos, pero el estado de monitoreo permanece y se reanudará automáticamente después de eso. Llamar al sueño no liberará el bloqueo del objeto.
esperar es un método de la clase de objeto. Llamar al método de espera en este objeto hace que el hilo renuncie al bloqueo del objeto e ingrese a la piscina de bloqueo de espera esperando este objeto. Solo después de emitir un método de notificación (o notificar) para este objeto, este hilo ingresa a la piscina de bloqueo del objeto y se prepara para obtener el bloqueo del objeto y ingresa al estado en ejecución. (Si la variable se declara como volátil, será consistente con la memoria principal cada vez que se accede; si se accede a la variable en un método sincrónico o bloque síncrono, la variable se sincroniza cuando se obtiene el bloqueo en la entrada del método o bloque y el bloqueo se libera cuando el método o el bloque sale de bloqueo)).
http://www.yjbys.com/news/202750.html
El programa del cliente debe obtener primero un rol de contenedor específico y luego obtener un rol de iterador específico a través del rol de contenedor específico.
Iterator it = new ArrayList.Iterator ();
1) Acceda al contenido de un objeto contenedor sin exponer su representación interna.
2) Admite múltiples recorridos de objetos de contenedores.
3) Proporcione una interfaz unificada (iteración polimórfica) para atravesar diferentes estructuras de contenedores.
Use la nueva palabra clave} → se llamó al constructor
Use el método NewInstance de la clase de clase} → se llamó al constructor
Use el método NewInstance de la clase Constructor} → se llamó a la función constructora
Uso del método clon} → no se llama al constructor
Uso de la deserialización} → no se llama al constructor
Empleado emp2 = (empleado) class.forname ("com.employee"). NewInStance (); o
Empleado emp2 = empleado.class.newinstance (); constructor constructor = empleado.class.getConstructor (); Empleado emp3 = constructor.newinstance ();
Usando el método clon, primero debemos implementar la interfaz clonable e implementar el método clon definido por él
Empleado emp4 = (empleado) emp3.clone ();
Cuando comienza el programa, no carga todos los archivos de clase para ser utilizados por el programa a la vez. En cambio, carga dinámicamente un cierto archivo de clase en la memoria a través del mecanismo de carga de clase Java (ClassLoader) de acuerdo con las necesidades del programa. Por lo tanto, solo después de cargar el archivo de clase en la memoria puede ser referenciado por otras clases. Por lo tanto, ClassLoader se usa para cargar dinámicamente archivos de clase en la memoria.
Bootstrap Classloader: se llama el cargador de clase de inicio, es el cargador de clase de nivel superior en la jerarquía de carga de clase Java, responsable de cargar bibliotecas de clases principales en el JDK, como: rt.jar, recursos.jar, charsets.jar, etc. Extension ClassLoader: se llama la clase de extensión Loader, responsable de cargar la biblioteca de clases de Java, y carga de la biblioteca de clases y cargas de extensión. Java_home/jre/lib/ext/Por defecto.
App ClassLoader: se llama cargador de clase de sistema, que es responsable de cargar todos los frascos y archivos de clase en el directorio de clases de aplicación.
Debido a que esto puede evitar la carga repetida, cuando el padre ha cargado la clase, no hay necesidad de que el cargador de clases infantil la cargue nuevamente.
Teniendo en cuenta los factores de seguridad, imaginemos que si no usamos este modo delegado, podemos reemplazar dinámicamente los tipos definidos en la API de Java Core en cualquier momento, lo que representará un riesgo de seguridad muy grande. El método del delegado principal puede evitar esta situación, porque la cadena ya está cargada por el cargador de clase de arranque (bootstrcp classLoader) al inicio, por lo que el cargador de clases definido por el usuario nunca podrá cargar una cadena escrita por sí misma, a menos que cambie el algoritmo predeterminado de la clase de búsqueda de clases en JDK.
1. La solicitud del cliente del objeto de solicitud, esta solicitud contendrá parámetros de la solicitud GET/POST, y solo puede comprender las necesidades del cliente y luego responder.
2. Información relevante sobre el objeto de respuesta responde a las solicitudes de los clientes
3. El objeto de sesión se refiere a una sesión entre el cliente y el servidor, comenzando desde una aplicación web desde el cliente hasta el servidor hasta que el cliente esté desconectado del servidor.
4. El objeto OUT es una instancia de la clase JSPWriter y es un objeto de uso común para emitir contenido al cliente.
5. El objeto de página apunta a la página JSP actual, que es un poco como este puntero en la clase. Es una instancia de la clase java.lang.object
6. El objeto de aplicación se da cuenta del intercambio de datos entre usuarios y puede almacenar variables globales. Comienza con el inicio del servidor hasta que el servidor se apaga
7. El objeto de excepción es un objeto de excepción. Cuando se produce una excepción durante el proceso de ejecución, se genera este objeto.
8. El objeto PageContext proporciona acceso a todos los objetos y espacios de nombres en la página JSP
9. El objeto de configuración es utilizado por el motor JSP para pasarle información cuando se inicializa un servlet.
JS tiene una función isnan (val) // Si es un número, devuelve falso
Hay análisis de xmldom, análisis de saxo y análisis de stax
XMLDOM: (xmlDocumentObjectModel) El rendimiento se deteriora enormemente al procesar archivos grandes. Este problema es causado por la estructura del árbol DOM, que ocupa mucha memoria, y el DOM debe cargar todo el documento en la memoria antes de analizar el archivo, que es adecuado para el acceso aleatorio a XML;
Sax: (simplEapiforXML) A diferencia de DOM, Sax es un método de análisis XML basado en eventos. Lee archivos XML en secuencia y no requiere que el archivo completo se cargue de inmediato. Al encontrar un evento como el comienzo de un archivo, el final de un documento o el comienzo de una etiqueta y el final de una etiqueta, desencadena un evento en el que el usuario procesa el archivo XML escribiendo código de procesamiento en su evento de devolución de llamada, adecuado para el acceso secuencial a XML;
STAX: La diferencia entre (StreamingapiforXML) y otros métodos es que las aplicaciones pueden manejar XML como un flujo de eventos, que es mejor que otros métodos en términos de rendimiento y disponibilidad;
Thread.getState ()
Las anteriores son las preguntas de la entrevista de Java compiladas por el editor para usted. Espero que te tean útiles. Si tiene alguna pregunta, déjame un mensaje. ¡El editor le responderá a tiempo!