Preguntas de la entrevista de Complete Works of Java (10)

Preguntas de la entrevista de Complete Works of Java (10)

Baiyu es jaja

91. Escribe una clase singleton en Java.

responder:

  • Singleton hambriento

public class Singleton {
    private Singleton(){}
    private static Singleton instance = new Singleton();
    public static Singleton getInstance(){
            return instance;
    }
}
  • Singleton perezoso

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {}
    public static synchronized Singleton getInstance(){
        if (instance == null)
         instance = new Singleton();
      return instance;
    }
}

Nota: Hay dos precauciones para implementar un singleton: ① Hacer que el constructor sea privado y no permitir que el mundo exterior cree objetos a través del constructor; ② Devolver la única instancia de la clase al mundo exterior a través de un método estático público. Hay una pregunta en la que pensar: el contenedor IoC de Spring puede crear singletons para clases ordinarias. ¿Cómo lo hace?

92. ¿Qué es UML?

Respuesta: UML es la abreviatura de Unified Modeling Language (Lenguaje de modelado unificado). Fue publicado en 1997. Integra el lenguaje, métodos y procesos de modelado orientado a objetos existentes en ese momento. Es un gráfico que apoya el modelado y el desarrollo de sistemas de software. Proporciona soporte de modelado y visualización para todas las etapas del desarrollo de software. El uso de UML puede ayudar a la comunicación y la comunicación, ayudar en el diseño de aplicaciones y la generación de documentos, y también puede explicar la estructura y el comportamiento del sistema.

93. ¿Cuáles son los diagramas de uso común en UML?

Respuesta: UML define una variedad de símbolos gráficos para describir parte o la totalidad de la estructura estática y la estructura dinámica de un sistema de software, incluyendo: diagrama de casos de uso, diagrama de clases, diagrama de secuencia y colaboración. Diagrama (diagrama de colaboración), diagrama de estados (diagrama de estados), diagrama de actividades (diagrama de actividades), diagrama de componentes (diagrama de componentes), diagrama de implementación (diagrama de implementación), etc. Entre estos símbolos gráficos, tres diagramas son los más importantes. Estos son: diagrama de casos de uso (utilizado para capturar requisitos y describir las funciones del sistema, a través del cual se pueden comprender rápidamente los módulos funcionales del sistema y sus relaciones), diagramas de clases (describir clases) Además de la relación entre clases y clases, puedes entender rápidamente el sistema a través de este diagrama), diagramas de secuencia (describe la interacción entre objetos al realizar tareas específicas y la secuencia de ejecución, a través de este diagrama puedes entender los mensajes que puede recibir el objeto, es decir, el objeto Servicios que se pueden brindar al mundo exterior).
Diagrama de casos de uso: Diagrama de
Preguntas de la entrevista de Complete Works of Java (10)
clases:
Preguntas de la entrevista de Complete Works of Java (10)
Diagrama de secuencia:
Preguntas de la entrevista de Complete Works of Java (10)

94. Escribe un tipo de burbuja en Java.

Respuesta: La clasificación de burbujas casi la escribe un programador, pero no todo el mundo puede escribir una clasificación de burbujas alta durante una entrevista. Aquí hay un código de referencia:


import java.util.Comparator;/**
 * 排序器接口(策略模式: 将算法封装到具有共同接口的独立的类中使得它们可以相互替换)
  */
public interface Sorter {
   /**
    * 排序
    * @param list 待排序的数组
    */
   public <T extends Comparable<T>> void sort(T[] list);   /**
    * 排序
    * @param list 待排序的数组
    * @param comp 比较两个对象的比较器
    */
   public <T> void sort(T[] list, Comparator<T> comp);
}
import java.util.Comparator;
public class BubbleSorter implements Sorter {
    @Override
    public <T extends Comparable<T>> void sort(T[] list) {
        boolean swapped = true;
        for (int i = 1, len = list.length; i < len && swapped; ++i{
          swapped = false;
          for (int j = 0; j < len - i; ++j) {
            if (list[j].compareTo(list[j + 1]) > 0) {
               T temp = list[j];
               list[j] = list[j + 1];
               list[j + 1] = temp;
               swapped = true;
             }
            }
        }
    }
    @Override
    public <T> void sort(T[] list, Comparator<T> comp) {
      boolean swapped = true;
       for (int i = 1, len = list.length; i < len && swapped; ++i){
          swapped = false;
          for (int j = 0; j < len - i; ++j) {
            if (comp.compare(list[j], list[j + 1]) > 0) {
               T temp = list[j];
               list[j] = list[j + 1];
               list[j + 1] = temp;
               swapped = true;
             }
            }
        }
    }
}

95. Escriba una búsqueda binaria en Java.

Respuesta: La búsqueda binaria, también conocida como búsqueda binaria y búsqueda binaria, es un algoritmo de búsqueda para encontrar un elemento específico en una matriz ordenada. El proceso de búsqueda comienza desde el elemento intermedio de la matriz. Si el elemento intermedio resulta ser el elemento que se va a buscar, el proceso de búsqueda finaliza; si un elemento en particular es mayor o menor que el elemento intermedio, busque en la mitad de la matriz que sea mayor o menor que el elemento intermedio , Y comience la comparación desde el elemento del medio como al principio. Si la matriz ya está vacía en un determinado paso, significa que no se puede encontrar el elemento especificado. Este algoritmo de búsqueda reduce el rango de búsqueda a la mitad cada vez que compara, y su complejidad de tiempo es O (logN).


import java.util.Comparator;
public class MyUtil {
   public static <T extends Comparable<T>> int binarySearch(T[] x, T key) {
  return binarySearch(x, 0, x.length- 1, key);
   }
     // 使用循环实现的二分查找
   public static <T> int binarySearch(T[] x, T key, Comparator<T> comp) {
     int low = 0;
     int high = x.length - 1;
     while (low <= high) {
       int mid = (low + high) >>> 1;
       int cmp = comp.compare(x[mid], key);
       if (cmp < 0) {
            low= mid + 1;
       }else if (cmp > 0) {
            high= mid - 1;
       }else {
            return mid;
       }
      }
      return -1;
   }
    // 使用递归实现的二分查找
   private static<T extends Comparable<T>> int binarySearch(T[] x, int low, int high, T key) {
     if(low <= high) {
       int mid = low + ((high -low) >> 1);
       if(key.compareTo(x[mid])== 0) {
          return mid;
       }else if(key.compareTo(x[mid])< 0) {
          return binarySearch(x,low, mid - 1, key);
       } else {
          return binarySearch(x,mid + 1, high, key);
       }
      }
      return -1;
   }
}

Explicación: En el código anterior se dan dos versiones de búsqueda binaria, una se realiza mediante recursividad y la otra se realiza mediante bucle. Cabe señalar que el método (alto + bajo) / 2 no debe usarse al calcular la posición intermedia, ya que la operación de suma puede hacer que el entero se salga de los límites, uno de los siguientes tres métodos debe usarse aquí: bajo + (alto-bajo) / 2 o bajo + (alto-bajo) >> 1 o (bajo + alto) >>> 1 (>>> es desplazamiento lógico a la derecha, desplazamiento a la derecha sin bit de signo)

96. Explique la diferencia entre Servlet y CGI.

Respuesta: La diferencia entre Servlet y CGI es que Servlet está en el proceso del servidor. Ejecuta su método service () en modo multiproceso. Una instancia puede atender múltiples solicitudes y su instancia generalmente no se destruye. Sin embargo, CGI hace todo para cada solicitud. Se genera un nuevo proceso y el servicio se destruye una vez finalizado, por lo que la eficiencia es menor que la de Servlet.

Suplemento: Sun Microsystems lanzó la tecnología Servlet en 1996 para competir con CGI. Servlet es un programa especial de Java. Una aplicación web basada en Java generalmente contiene una o más clases de Servlet. Servlet no puede ser creado y ejecutado por sí mismo. Se ejecuta en un contenedor de Servlet. El contenedor pasa la solicitud del usuario al programa de Servlet y envía la respuesta del Servlet al usuario. Por lo general, un servlet se asociará con una o más páginas JSP. En el pasado, CGI fue criticado a menudo por problemas de rendimiento, pero Fast CGI ya ha resuelto el problema de eficiencia de CGI, por lo que no tiene que ser criticado por CGI durante la entrevista. De hecho, muchos sitios web con los que está familiarizado usan CGI. tecnología.

97. ¿Qué métodos hay en la interfaz de Servlet?

Respuesta: La interfaz de Servlet define 5 métodos, de los cuales los primeros tres métodos están relacionados con el ciclo de vida del Servlet:


- void init(ServletConfig config) throws ServletException 
- void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException 
- void destory() 
- java.lang.String getServletInfo() 
- ServletConfig getServletConfig()

Después de que el contenedor web carga el servlet y lo instancia, el ciclo de vida del servlet comienza y el contenedor ejecuta su método init () para inicializar el servlet; cuando llega la solicitud, se llama al método service () del servlet y se llamará al método service () según sea necesario para corresponder a la solicitud El método de doGet o doPost; cuando se cierra el servidor o se desinstala el proyecto, el servidor destruirá la instancia de Servlet, en este momento se llamará al método destroy () del Servlet.

98. ¿Cuál es la diferencia entre reenviar y redireccionar?

Respuesta: Reenviar es la transferencia de control en el contenedor. 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 conoce el servidor en absoluto. ¿De dónde proviene el contenido enviado, 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 decirle al navegador que solicite esa dirección nuevamente. Por lo tanto, puede ver la dirección del enlace después del salto en la barra de direcciones del navegador. Obviamente, la redirección no puede acceder a los recursos protegidos por el servidor. Pero puede redirigir de un sitio web a otro sitio web. Forward es más eficiente, así que intente usar forward cuando lo necesite (llamando al método forward () del objeto RequestDispatcher, que se puede obtener a través del método getRequestDispatcher () del objeto ServletRequest), y esto también ayuda a ocultar el enlace real; en algunos casos A continuación, si necesita acceder a un recurso en otro servidor, debe usar la redirección (implementada llamando a su método sendRedirect () por el objeto HttpServletResponse).

99. ¿Cuáles son los objetos integrados de JSP? Cuales son los roles?

Respuesta: JSP tiene 9 objetos integrados:

  • solicitud: Encapsula la solicitud del cliente, que contiene los parámetros de la solicitud GET o POST;
  • respuesta: encapsular la respuesta del servidor al cliente;
  • pageContext: se pueden obtener otros objetos a través de este objeto;
  • sesión: el objeto que encapsula la sesión del usuario;
  • aplicación: el objeto que encapsula el entorno operativo del servidor;
  • out: el objeto de flujo de salida al que responde el servidor de salida;
  • config: el objeto de configuración de la aplicación web;
  • página: la propia página JSP (equivalente a esta en el programa Java);
  • excepción: el objeto que encapsula la página que lanza la excepción.

Suplemento: Si utiliza Servlet para generar contenido dinámico en páginas web, sin duda es un trabajo muy tedioso. Por otro lado, todo el texto y las etiquetas HTML están codificadas, e incluso los cambios menores deben volver a compilarse. JSP resuelve estos problemas de Servlet. Es un buen complemento para Servlet. Se puede usar exclusivamente como usuario para presentar una vista (Vista), y Servlet como controlador (Controlador) es específicamente responsable de procesar las solicitudes de los usuarios y reenviar o redireccionar a una determinada página. Muchos desarrollos web basados ​​en Java utilizan tanto Servlet como JSP. Una página JSP es en realidad un Servlet, y el servidor (contenedor Servlet) que puede ejecutar Servlet suele ser también un contenedor JSP, que puede proporcionar un entorno de ejecución para páginas JSP. Tomcat es un contenedor Servlet / JSP. Cuando se solicita una página JSP por primera vez, el contenedor Servlet / JSP primero convierte la página JSP en una clase de implementación de una página JSP, que es una clase Java que implementa la interfaz JspPage o su subinterfaz HttpJspPage. La interfaz JspPage es una subinterfaz de Servlet, por lo que cada página JSP es un Servlet. Después de que la conversión sea exitosa, el contenedor compilará la clase Servlet, luego el contenedor carga y crea una instancia del código de bytes de Java, y ejecuta las operaciones del ciclo de vida que normalmente hace en el Servlet. Para solicitudes posteriores a la misma página JSP, el contenedor verificará si la página JSP se ha modificado y, si se ha modificado, la volverá a transformar, volverá a compilar y ejecutará. De lo contrario, ejecute la instancia de Servlet existente en la memoria. Podemos ver todo mirando el programa Java correspondiente a un fragmento de código JSP, y se revelará el misterio de los 9 objetos incorporados.

Página JSP:


<%@ page pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%><!DOCTYPE html><html>
  <head>
    <base href="<%=basePath%>">
    <title>首页</title>
    <style type="text/css">
        * { font-family: "Arial"; }
    </style>
  </head>

  <body>
    <h1>Hello, World!</h1>
    <hr/>
    <h2>Current time is: <%= new java.util.Date().toString() %></h2>
  </body></html>

El código Java correspondiente:


/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/7.0.52
 * Generated at: 2014-10-13 13:28:38 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */package org.apache.jsp;import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
        implements org.apache.jasper.runtime.JspSourceDependent {

    private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory
            .getDefaultFactory();

    private static java.util.Map<java.lang.String, java.lang.Long> _jspx_dependants;

    private javax.el.ExpressionFactory _el_expressionfactory;
    private org.apache.tomcat.InstanceManager _jsp_instancemanager;

    public java.util.Map<java.lang.String, java.lang.Long> getDependants() {
        return _jspx_dependants;
    }

    public void _jspInit() {
        _el_expressionfactory = _jspxFactory.getJspApplicationContext(
                getServletConfig().getServletContext()).getExpressionFactory();
        _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory
                .getInstanceManager(getServletConfig());
    }

    public void _jspDestroy() {
    }

    public void _jspService(
            final javax.servlet.http.HttpServletRequest request,
            final javax.servlet.http.HttpServletResponse response)
            throws java.io.IOException, javax.servlet.ServletException {
        // 内置对象就是在这里定义的
        final javax.servlet.jsp.PageContext pageContext;
        javax.servlet.http.HttpSession session = null;
        final javax.servlet.ServletContext application;
        final javax.servlet.ServletConfig config;
        javax.servlet.jsp.JspWriter out = null;
        final java.lang.Object page = this;
        javax.servlet.jsp.JspWriter _jspx_out = null;
        javax.servlet.jsp.PageContext _jspx_page_context = null;

        try {
            response.setContentType("text/html;charset=UTF-8");
            pageContext = _jspxFactory.getPageContext(this, request, response,
                    null, true, 8192, true);
            _jspx_page_context = pageContext;
            application = pageContext.getServletContext();
            config = pageContext.getServletConfig();
            session = pageContext.getSession();
            out = pageContext.getOut();
            _jspx_out = out;

            out.write('\r');
            out.write('\n');

            String path = request.getContextPath();
            String basePath = request.getScheme() + "://"
                    + request.getServerName() + ":" + request.getServerPort()
                    + path + "/";// 以下代码通过输出流将HTML标签输出到浏览器中            out.write("\r\n");
            out.write("\r\n");
            out.write("<!DOCTYPE html>\r\n");
            out.write("<html>\r\n");
            out.write("  <head>\r\n");
            out.write("    <base href=\"");
            out.print(basePath);
            out.write("\">\r\n");
            out.write("    <title>首页</title>\r\n");
            out.write("    <style type=\"text/css\">\r\n");
            out.write("    \t* { font-family: \"Arial\"; }\r\n");
            out.write("    </style>\r\n");
            out.write("  </head>\r\n");
            out.write("  \r\n");
            out.write("  <body>\r\n");
            out.write("    <h1>Hello, World!</h1>\r\n");
            out.write("    <hr/>\r\n");
            out.write("    <h2>Current time is: ");
            out.print(new java.util.Date().toString());
            out.write("</h2>\r\n");
            out.write("  </body>\r\n");
            out.write("</html>\r\n");
        } catch (java.lang.Throwable t) {
            if (!(t instanceof javax.servlet.jsp.SkipPageException)) {                out = _jspx_out;
                if (out != null && out.getBufferSize() != 0)
                    try {                        out.clearBuffer();
                    } catch (java.io.IOException e) {
                    }
                if (_jspx_page_context != null)
                    _jspx_page_context.handlePageException(t);
                else
                    throw new ServletException(t);
            }
        } finally {
            _jspxFactory.releasePageContext(_jspx_page_context);
        }
    }
}

100. ¿La diferencia entre obtener y publicar solicitud?

Respuesta:
①get request se usa para obtener recursos del servidor, y post se usa para enviar datos al servidor;
②get agrega los datos en el formulario a la URL apuntada por la acción en la forma de nombre = valor, y ambos usan "?" Conexión, y la conexión "&" entre cada variable; la publicación es colocar los datos en el formulario en el encabezado de la solicitud o el cuerpo del mensaje del protocolo HTTP y pasarlos a la URL a la que apunta la acción; ;
Los datos transmitidos por get están sujetos al límite de longitud de la URL (1024 Bytes); mientras que la publicación puede transmitir una gran cantidad de datos, los archivos de carga generalmente usan el método de publicación;
④Cuando se usa get, los parámetros se mostrarán en la barra de direcciones. Si los datos no son datos confidenciales, entonces puede usar get; para datos confidenciales, la aplicación aún los usa post;
⑤get utiliza el formato de texto de codificación de URL de aplicación / x-www-form-urlencoded de tipo MIME (también llamado codificación de signo de porcentaje) para pasar parámetros para garantizar que los parámetros transmitidos estén compuestos de texto que siga la especificación, por ejemplo, la codificación de un espacio es "% 20".

Supongo que te gusta

Origin blog.51cto.com/15061944/2593708
Recomendado
Clasificación