Resumen de la entrevista 20191227

1. ¿Cuáles son los aspectos de las características orientadas a objetos?

Hay 4 características principales: encapsulación, abstracción, herencia, polimorfismo.

  1. Encapsulación: la encapsulación es la base para garantizar una excelente modularidad de los componentes del software. El objetivo de la encapsulación es lograr una "alta cohesión y un bajo acoplamiento" de los componentes del software y evitar los cambios causados ​​por la interdependencia del programa. En los lenguajes de programación orientados a objetos, los objetos son la unidad más básica de encapsulación. La encapsulación orientada a objetos es más clara y poderosa que la encapsulación de lenguaje tradicional. La encapsulación orientada a objetos es encapsular el código que describe las propiedades y el comportamiento de un objeto en un "módulo", es decir, una clase, las propiedades están definidas por variables, el comportamiento está definido por métodos y los métodos pueden acceder directamente a las propiedades en el mismo objeto . En circunstancias normales, siempre y cuando recuerde juntar la variable y el método de acceso a la variable, todas las variables miembro de una clase se definen como privadas, y solo los métodos de esta clase pueden acceder a estas variables miembro, que es básicamente Para lograr la encapsulación de objetos, es fácil encontrar el método que se asignará a esta clase, que es básicamente una programación orientada a objetos. Comprenda un principio: coloque los métodos y métodos relacionados que operan en la misma cosa en la misma clase, y coloque el método y los datos que opera en la misma clase.

  2. Abstracción: la abstracción consiste en encontrar las similitudes y similitudes de algunas cosas y luego clasificarlas en una clase. Esta clase solo considera las similitudes y elementos comunes de estas cosas, e ignora aquellos aspectos que no están relacionados con el tema y el objetivo actual. Centrarse en los aspectos relacionados con el objetivo actual. Por ejemplo, cuando ves una hormiga y un elefante, puedes imaginar que son similares, eso es abstracción. La abstracción incluye la abstracción del comportamiento y la abstracción del estado. Por ejemplo, defina una clase Person de la
    siguiente manera: class Person {String name; int age;} Las personas son originalmente cosas muy complicadas, hay muchos aspectos, pero debido a que el sistema actual solo necesita saber el nombre y la edad de la persona, por lo tanto, en la clase definida anteriormente Solo se incluyen los dos atributos de nombre y edad, lo cual es una especie de abstracción. El uso de la abstracción puede evitar considerar algunos detalles que no están relacionados con el objetivo. Mi comprensión de la abstracción no es usar un microscopio para observar todos los aspectos de una cosa. Esto implica demasiado contenido, sino ser bueno para dividir el límite del problema. Solo se considera lo que se necesita en el sistema actual.

  3. Herencia: al definir e implementar una clase, puede proceder sobre la base de una clase existente, tomar el contenido definido por la clase existente como su propio contenido y agregar contenido nuevo o modificar el original El método lo hace más adecuado para necesidades especiales, que es la herencia. La herencia es un mecanismo para que las subclases compartan automáticamente datos y métodos de la clase principal. Es una relación entre clases y mejora la reutilización y extensibilidad del software.

  4. Polimorfismo: el polimorfismo se refiere al tipo específico señalado por la variable de referencia definida en el programa y la llamada al método emitida a través de la variable de referencia no se determina durante la programación, sino que solo se determina durante la operación del programa, es decir, una variable de referencia caerá Apunta al objeto de instancia de qué clase, y el método invocado por la variable de referencia es el método implementado en qué clase. Debe ser decidido por el programa durante la operación. Debido a que la clase específica se determina cuando se ejecuta el programa, de modo que sin modificar el código fuente, la variable de referencia se puede vincular a una variedad de implementaciones de clase diferentes, lo que hace que el método específico llamado por la referencia cambie en consecuencia, es decir, sin modificación El código del programa puede cambiar el código específico vinculado cuando el programa se está ejecutando, de modo que el programa puede seleccionar múltiples estados de ejecución, que es polimorfismo. El polimorfismo mejora la flexibilidad y la escalabilidad del software. Por ejemplo, UserDao en el siguiente código es una interfaz que define el objeto de instancia señalado por la variable de referencia userDao devuelta por daofactory.getDao () durante la ejecución. A veces se refiere a la implementación UserJdbcDao, y a veces se refiere a la implementación UserHibernateDao. De esta manera, sin modificar el código fuente, puede cambiar la implementación de la clase específica a la que apunta el usuarioDao, lo que hace que cambie el código específico llamado por el método userDao.insertUser (), es decir, a veces se llama al método insertUser de UserJdbcDao, y a veces el Método insertUser de UserHibernateDao: UserDao userDao = daofactory.getDao (); userDao.insertUser (usuario);

2. La cadena es el tipo de datos más básico

No es un tipo de datos básico, solo representa una clase y es un tipo de referencia.
Solo hay ocho tipos de datos básicos
: numérico, byte, corto, int,
punto flotante largo : flotante, doble
carácter: char
boolean: boolean

3. La diferencia entre int e Integer

  • Integer es una clase de contenedor para int, int es un tipo de datos básico de java
  • Las variables enteras deben instanciarse antes de que puedan usarse, mientras que las variables int no son necesarias
  • int se almacena en la pila, la referencia del objeto Integer se almacena en el espacio de la pila y los datos del objeto se almacenan en el espacio de almacenamiento dinámico
  • El valor predeterminado de Integer es nulo, el valor predeterminado de int es 0
  • Int es la transferencia de valor, los datos en la pila son inmutables, el objeto Integer se pasa por referencia, la referencia es inmutable, pero el valor de la dirección del espacio señalado por la referencia se puede cambiar
  • Los genéricos no admiten int, pero admiten enteros

4. La diferencia entre String, StringBuffer y StringBulider

Clase Capa inferior Variable A prueba de hilos Velocidad de ejecución Escenario de aplicación
Cuerda valor final de char [] Inmutable Si Lento Operar una pequeña cantidad de datos
StringBuffer valor de char [] Variable Si Rápido Opere grandes cantidades de datos en un solo hilo
StringBuilder valor de char [] Variable No En Operación multiproceso de grandes cantidades de datos

5. ¿Cuál es la diferencia entre las excepciones de tiempo de ejecución y las excepciones generales?

Excepción durante el tiempo de ejecución:

  • Se generará una excepción de tiempo de ejecución cuando el método se defina sin declaración
  • No es necesario detectar esta excepción de tiempo de ejecución al llamar a este método
  • La excepción de tiempo de ejecución se deriva de la clase java.lang.RuntimeException o java.lang.Error

Excepción general: al
definir un método, debe declarar todas las excepciones marcadas que se pueden generar;
al llamar a este método, debe capturar su excepción marcada, de lo contrario debe pasarla a la excepción

6. Hable sobre el rendimiento de almacenamiento y las características de ArrayList, Vector, LinkedList

Tipo Capa inferior Consultas Agregar o eliminar A prueba de hilos Eficiencia
Lista de arreglo Matriz Rápido Lento Inseguro Alta
Vector Matriz Rápido Lento Seguro Bajo
Lista enlazada Lista vinculada Lento Rápido Inseguro Alta

7. La diferencia entre Colección y Colección

1. java.util.Collection es una interfaz de colección, que proporciona métodos de interfaz generales para operaciones básicas en objetos de colección. La interfaz de la Colección tiene muchas implementaciones concretas en la biblioteca de clases Java. El significado de la interfaz de Colección es proporcionar un modo de operación unificado máximo para varias colecciones específicas
2. java.util.Collections es una clase de contenedor que contiene varios métodos polimórficos estáticos relacionados con las operaciones de colección. Esta clase no se puede instanciar, al igual que una clase de herramienta, que sirve el marco de Java Collection

8. La diferencia entre final, finalmente y finalizar

En Java, final se puede utilizar para decorar clases, métodos y variables (variables miembro o variables locales)

  • Todos los métodos miembros en la clase final se definen implícitamente como métodos finales, y la clase no se puede heredar.
  • El método final significa "final, final", lo que significa que este método no puede ser anulado.
  • La variable miembro final representa una constante y solo se puede asignar una vez, y su valor no cambiará después de la asignación.

finalmente

  • Parte del manejo de excepciones, generalmente utilizado para liberar recursos, como la conexión de base de datos de flujo IO
  • En términos generales, el bloque de código finalmente se ejecutará y, en circunstancias especiales, como que jvm salga temprano (system.exit ()), no se ejecutará

finalizar

  • Un método de la clase de objeto, usado para la recolección de basura, generalmente llamado por el recolector de basura, no necesitamos llamar

9. La diferencia entre sobrecarga y anulación

Anular

  • El nombre del método, los parámetros y el valor de retorno son iguales.
  • Los métodos de subclase no pueden limitar los derechos de acceso de los métodos de clase principal.
  • Los métodos de subclase no pueden arrojar más excepciones que los métodos de clase padre.
  • Existe entre la clase principal y la clase secundaria.
  • El método se define como final y no se puede reescribir.
  • El método anulado no puede ser privado, de lo contrario, solo define un nuevo método en su subclase y no lo sobrescribe.

Aplicación: la
cobertura más familiar es la implementación de métodos de interfaz. Generalmente, solo los métodos se declaran en la interfaz. Cuando implementamos, necesitamos implementar todos los métodos de la declaración de interfaz.
Además de este uso típico, también heredamos Puede sobrescribir métodos en la clase padre en subclases

Sobrecarga

  • Al menos uno del tipo de parámetro, número y orden es diferente.
  • No puede sobrecargar nombres de métodos que solo devuelven valores diferentes
  • Para una clase
  • No se puede sobrecargar por permisos de acceso, tipo de retorno, excepción lanzada
  • El tipo de excepción y el número de métodos no afectarán la sobrecarga.

Resumen

Override es el comportamiento entre diferentes clases, y overload es el comportamiento en la misma clase.
El método de sobrecarga puede cambiar el tipo de valor de retorno, porque no tiene nada que ver con el tipo de valor de retorno.

10. ¿Cuáles son las similitudes y diferencias entre síncrono y asíncrono, y bajo qué circunstancias se usan por separado?

Hay dos tipos de interacción en Java: síncrono y asíncrono:

Interacción sincrónica:

Se refiere al envío de una solicitud, debe esperar la devolución antes de poder enviar la siguiente solicitud, hay un proceso de espera;

Interacción asincrónica:

Se refiere a enviar una solicitud sin esperar una devolución, puede enviar la siguiente solicitud en cualquier momento, es decir, sin esperar.

La diferencia:

Uno necesita esperar, el otro no necesita esperar. En algunos casos, el desarrollo de nuestro proyecto elegirá preferentemente el método de interacción asincrónica sin esperar.

¿Qué situaciones sugieren usar la interacción sincrónica?

Por ejemplo, el sistema de transferencia del banco, la operación de almacenamiento de la base de datos, etc., utilizará la operación interactiva sincrónica, y el resto de los casos preferirán usar la interacción asincrónica.

11. ¿Cuál es la diferencia entre clase abstracta e interfaz?

Clase abstracta:

  • No se puede instanciar, puede definir referencias
  • La clase abstracta heredada debe implementar todos los métodos abstractos; de lo contrario, aún debe declararse como clase abstracta
  • Puede definir un constructor, puede tener métodos abstractos y métodos concretos.
  • Los miembros pueden ser públicos, predeterminados, protegidos, privados
  • Puede definir variables miembro
  • Un método abstracto debe ser una clase abstracta, una clase abstracta puede no tener un método abstracto

Interfaz

  • No se puede instanciar, puede definir referencias
  • La implementación de una interfaz requiere la implementación de todos los métodos abstractos, de lo contrario aún debe declararse como una clase abstracta
  • No se puede definir ningún constructor, todos los métodos son métodos abstractos.
  • Los miembros deben ser públicos.
  • Puede definir variables miembro realmente constantes

12 、 adelante 和 redireccionamiento

Tipo Solicitudes Barra de direcciones Compartir datos Restricciones de salto Comportarse de manera diferente
adelante 1 Sin cambios Solicitar datos compartidos Solo puedo saltar a los recursos de este sitio Comportamiento del lado del servidor
redirigir 2 Cambio No solicite datos compartidos Salta a cualquier URL Comportamiento del cliente

La redirección es cuando el navegador envía una solicitud al servidor y recibe una respuesta, y luego envía una solicitud a una nueva dirección. El reenvío es cuando el servidor recibe la solicitud y salta a una nueva dirección para completar la respuesta.

13. La diferencia entre EJB y JavaBean

  • JavaBean es un componente y EJB es un marco
  • JavaBean está orientado a la visualización de la lógica de negocios y la capa de presentación. Al escribir un JavaBean, puede poner los eventos y elementos de la lógica de negocios en él, y luego pasar los atributos variables para mostrar el contenido requerido en la capa de presentación. EJB es un componente ejecutable u objeto de negocio implementado en el servidor. EJB tiene un descriptor de implementación. A través de este descriptor de implementación, se pueden describir las propiedades de EJB. EJB no interactúa con la capa de presentación.
  • EJB no es un JavaBean general, EJB es un JavaBean de nivel empresarial, EJB se divide en tres tipos, Bean de entidad, Bean de mensaje, Bean de sesión, escribir EJB debe seguir ciertas especificaciones, especificaciones específicas que puede consultar en la información relacionada. Para ejecutar EJB, necesita el contenedor EJB correspondiente, como Weblogic, Jboss, etc., y JavaBean no necesita, solo necesita instalar Tomcat.
  • EJB se usa para el desarrollo de aplicaciones del lado del servidor, y JavaBeans se usa para el desarrollo de aplicaciones del lado del cliente. Los JavaBeans también se pueden usar para el desarrollo de aplicaciones del lado del servidor, pero el modelo JavaBeans no proporciona un marco de servicio. Cuando las aplicaciones necesitan usar servicios a nivel del sistema (como gestión de transacciones, seguridad, vida útil) La gestión del ciclo, etc.) no es adecuada.
  • Los componentes EJB se pueden personalizar para la implementación. Mediante los descriptores de implementación, puede personalizar la configuración de tiempo de ejecución al implementar EJB, mientras que los componentes JavaBeans no se pueden personalizar durante la implementación. La personalización de los componentes JavaBeans solo ocurre durante la fase de desarrollo, y solo las herramientas de desarrollo Los componentes JavaBeans se crean y ensamblan, y no se pueden personalizar durante la implementación.
  • Los componentes EJB son objetos distribuidos y las aplicaciones cliente u otros componentes EJB pueden acceder de forma remota, mientras que los componentes JavaBeans no están distribuidos. Los componentes JavaBeans solo se pueden usar en las aplicaciones que constituyen y no pueden proporcionar capacidades de acceso remoto.
  • Los componentes EJB son invisibles para los usuarios finales, se ejecutan en el lado del servidor, y no hay una interfaz hombre-máquina, y algunos componentes JavaBeans son visibles para los usuarios finales, como los componentes de botones utilizados en las aplicaciones GUI

14. Cuándo usar afirmar

Las afirmaciones son un método de depuración común en el desarrollo de software, y muchos lenguajes de desarrollo admiten este mecanismo. En general, las afirmaciones se utilizan para garantizar la corrección más básica y crítica del programa. La verificación de aserciones generalmente se activa durante el desarrollo y las pruebas. Para garantizar la eficiencia de la ejecución del programa, la verificación de aserciones generalmente se desactiva una vez que se lanza el software. La aserción es una declaración que contiene una expresión booleana. Cuando se ejecuta la declaración, se supone que la expresión es verdadera. Si el valor de la expresión es falso, el sistema informará un error de aserción

15. Diseñe cuatro hilos, dos de los cuales aumentan j en 1 cada vez, y los otros dos hilos disminuyen j en 1, y escriba el programa

16. Si iniciar un hilo con run () o start ()

Iniciar el hilo debe utilizar el método start (). Cuando inicia un subproceso con start (), el subproceso entra en el estado listo, lo que hace que el procesador virtual representado por el subproceso esté en un estado ejecutable, lo que significa que puede ser programado y ejecutado por la JVM. Esto no significa que el hilo se ejecutará inmediatamente. Cuando la CPU le asigna tiempo, comienza a ejecutar el método run () (si lo hay). start () es el método, llama al método run () y el método run () es lo que debe reescribir. El método run () contiene el cuerpo del hilo.

17. ¿Qué son los servidores de aplicaciones?

  • Tomcat: servidor de aplicaciones liviano gratuito y de código abierto. Es ampliamente utilizado en sistemas pequeños y medianos y usuarios de acceso concurrente. Es la primera opción para desarrollar y depurar programas JSP. La parte de Tomcat es en realidad una extensión del servidor Apache, pero se ejecuta de forma independiente, por lo que cuando ejecuta tomcat, en realidad se ejecuta como un proceso separado de Apache. Solo se implementan las especificaciones relevantes de JSP / Servlet, y EJB no es compatible
  • Jetty es gratuito y de código abierto, la arquitectura es relativamente simple y también es un servidor de aplicaciones escalable y muy flexible. Jetty está escrito en lenguaje Java, y su API se lanza en forma de un conjunto de paquetes JAR. Los desarrolladores pueden crear instancias de contenedores Jetty en un objeto, que puede proporcionar rápidamente aplicaciones Java independientes

18. Si la interfaz puede heredar la interfaz

Entre la interfaz y la clase ordinaria:

  • Una interfaz puede heredar varias interfaces: la interfaz C se extiende A, B {}
  • Una clase puede implementar múltiples interfaces: la clase D implementa A, B, C {}
  • Una clase solo puede heredar una clase, no herencia múltiple: la clase B extiende A {}
  • Una clase puede implementar una (o más) interfaces mientras hereda la clase: la clase E extiende D implementa A, B, C {}

Entre interfaces, clases ordinarias y clases abstractas.

  • Las clases abstractas pueden implementar interfaces
  • Las clases abstractas pueden heredar clases ordinarias

19. ¿Cuál es el mecanismo de trabajo del grupo de conexión de datos?

El conjunto de conexiones de datos consiste en colocar la conexión de la base de datos en un servidor intermedio, como tomcat, luego es equivalente a no tener que "conectarse" a la base de datos y realizar operaciones relacionadas cada vez que opera la base de datos, pero opera directamente la "conexión" en el servidor "Pool",. De esta manera, se puede mejorar la "eficiencia". Sin embargo, el pool de datos se usa generalmente en proyectos con una gran cantidad de datos, lo que puede mejorar la eficiencia del programa. Piense si esto pondrá la carga relevante en el servidor En la parte superior, debido a que este "grupo" se encuentra en el servidor, no se recomienda para proyectos con pequeñas cantidades de datos. Las solicitudes demasiado frecuentes harán que la carga del servidor sea más pesada. Cuando se
inicia el servidor J2EE, se establecerá y mantendrá un cierto número de conexiones de grupo. No menos que este número de conexiones de grupo. Cuando el programa cliente necesita conectarse, el controlador de grupo devuelve una conexión de grupo no utilizada y la marca como ocupada. Si no hay conexiones inactivas actualmente, el controlador de grupo crea un cierto número de conexiones. El número de conexiones nuevas está determinado por los parámetros de configuración. Cuando se completa la llamada de conexión de grupo utilizada, el controlador de grupo registra esta tabla de conexión como inactiva, y otras llamadas pueden usar esta conexión.

20. ¿Hay algún método length () para matrices? ¿Existe un método length () para String?

Matriz: propiedad de longitud
Cadena: método de longitud ()
lista: método de tamaño ()

21. ¿Se puede anular el constructor Constructor?

El constructor no se puede heredar, por lo que no puede anular Override, pero se puede sobrecargar.

El constructor no se puede heredar, por lo que no se puede anular el constructor. Cada clase debe tener su propio constructor, que es responsable de construir su propia parte de la construcción. Las subclases no anularán el constructor de la clase principal, pero deben ser responsables de llamar al constructor de la clase principal al principio.

22. ¿Qué tecnologías se utilizan para implementar cada parte de MVC? ¿Cómo lograrlo?

  • modelo: La lógica de negocios de la aplicación (como: el funcionamiento de la base de datos), implementada por JavaBean
    (hibernate, mybatis, ibatis)
  • view: capa de vista, utilizada para la interacción con los usuarios, generada principalmente por páginas jsp.
    (Jsp, FreeMarker, tails, taglib, EL, Velocity)
  • controlador: control de procesos, generalmente un servlet.

Puede enviar las solicitudes de los usuarios y seleccionar la vista adecuada para mostrar,
también puede interpretar las entradas del usuario y asignarlas a las operaciones que puede realizar la capa del modelo.
(Severlet, struts, primavera, acción)

23. ¿Hay varias formas de implementar un hilo en Java? ¿Qué palabras clave modifican el método de sincronización? ¿Por qué no se recomiendan los métodos stop () y suspend ()?

  • Hay dos métodos de implementación, a saber, heredar la clase Thread e implementar la interfaz Runnable
  • Use los nuevos formularios Thread () y nuevo Thread (ejecutable), respectivamente, y use la palabra clave sincronizada para modificar el método de sincronización
  • El primer método llama directamente al método de ejecución de thread, por lo que a menudo usamos la subclase Thread, a saber, nuevo SubThread ().
  • El segundo método llama al método run de runnable.
    Antes de java5, había los siguientes dos:

El primer tipo:
new Thread () {}. Start (); esto significa llamar al método de ejecución del objeto de subclase Thread, new Thread () {} significa un objeto de instancia de una subclase anónima de Thread, después de agregar el método de ejecución a la subclase El código es el siguiente:

new Thread(){
      public void run(){
     } 
 }.start();

El segundo tipo:
new Thread (new Runnable () {}). Start (); esto significa llamar al método de ejecución del objeto Runnable aceptado por el objeto Thread, new Runnable () {} significa un objeto de instancia de una subclase anónima de Runnable, runnable El código después de agregar el método de ejecución a la subclase de es el siguiente:

 new Thread(new Runnable(){
         public void run(){
         } 
     }
  ).start(); 

A partir de java5, hay varias formas de crear subprocesos múltiples en el grupo de subprocesos:

ExecutorService pool = Executors.newFixedThreadPool(3)
  for(int i=0;i<10;i++){
     pool.execute(new Runable(){
         public void run(){
         }
     });
 }
 Executors.newCachedThreadPool().execute(new Runable(){
     public void run(){
     }
 });
 Executors.newSingleThreadExecutor().execute(new Runable(
     {public void run(){
     }
 });   

El método stop () es un comportamiento de terminación de subproceso aproximado. No realiza ninguna operación de limpieza antes de que finalice el subproceso, por lo que es inherentemente inseguro. Terminar un hilo con el método Thread.stop () liberará todos los bloqueos adquiridos por el hilo, y si el objeto está en un estado discontinuo, otros hilos pueden verificarlos y modificarlos en ese estado. Como resultado, es difícil verificar el problema real. Debido a las razones anteriores, el método stop () no se debe usar, pero se debe colocar un indicador en su propia clase Thread para controlar si el hilo objetivo está activo o detenido. Si el indicador indica que debe dejar de ejecutarse, se puede finalizar con el método run (). Si el hilo objetivo espera por un largo tiempo, el método interrupt () debe usarse para interrumpir la espera.

Método suspend () Este método se ha opuesto porque tiene una tendencia inherente al punto muerto. Cuando se llama al método suspend (), el hilo objetivo se detendrá. Si el hilo objetivo se cuelga en un monitor que protege los recursos críticos del sistema, ningún otro hilo puede acceder al recurso hasta que se reinicie el hilo objetivo. A menos que el hilo suspendido se reanude. Para cualquier otro subproceso, si desea restaurar el subproceso de destino mientras intenta utilizar cualquiera de los recursos bloqueados, provocará un punto muerto. Por las razones anteriores, no debe usar el método suspend (), sino que debe colocar un indicador en su propia clase de hilo para controlar si el hilo está activo o suspendido. Si la bandera indica que el hilo debe suspenderse, entonces use el método wait () para ordenarle que ingrese al estado de espera. Si el indicador indica que se debe reanudar el subproceso, utilice el método notify () para reiniciar el subproceso.

18 artículos originales publicados · Me gusta1 · Visitas 1417

Supongo que te gusta

Origin blog.csdn.net/qiteng_sijia/article/details/103737499
Recomendado
Clasificación