Q1. ¿Cuál es la diferencia entre “==” y “igual (…)” en la comparación de objetos de Java String?
A1. Cuando utiliza “==” (es decir, comparación superficial), en realidad está comparando las dos referencias de objeto para ver si apuntan al mismo objeto . Cuando usa “igual (…)”, que es una “comparación profunda” que compara los valores de cadena reales .
Q2 ¿Por qué la clase String se ha hecho inmutable en Java?
A2. Para rendimiento y seguridad de roscas.
1. Rendimiento : los objetos inmutables son ideales para representar valores de tipos de datos abstractos (es decir, objetos de valor) como números, tipos enumerados, etc. Si necesita un valor diferente, cree un objeto diferente. En Java, Integer , Long , Float , Character , BigInteger y BigDecimal son objetos inmutables. Las estrategias de optimización como el almacenamiento en caché de hashcode, el almacenamiento en caché de objetos, la agrupación de objetos, etc. se pueden aplicar fácilmente para mejorar el rendimiento. Si las cadenas se hicieran mutables, la agrupación de cadenas no sería posible ya que cambiar la cadena con una referencia conducirá al valor incorrecto para las otras referencias.
2. Seguridad de subprocesos ya que los objetos inmutables son inherentemente seguros para subprocesos ya que no pueden modificarse una vez creados. Solo se pueden usar como objetos de solo lectura. Se pueden compartir fácilmente entre múltiples hilos para una mejor escalabilidad.
Q3. ¿Por qué se prefiere una matriz de caracteres, es decir, char [] sobre String para almacenar una contraseña?
A3. La cadena es inmutable en Java y se almacena en el grupo de cadenas. Una vez que se crea, permanece en la piscina hasta que se recolecta la basura. Esto tiene un mayor riesgo de 1) que alguien produzca un volcado de memoria para encontrar la contraseña 2) la aplicación registra inadvertidamente la contraseña como una cadena legible.
Si usa un char [] en su lugar, puede anularlo con algunos valores ficticios una vez que lo haya hecho, y también registrar el char [] como “[C @ 5829428e” no es tan malo como registrarlo como String “contraseña123”.
Q4. ¿Qué sabes sobre la carga de clases? ¿Explicar los cargadores de clases Java? Si tiene una clase en un paquete, ¿qué necesita hacer para ejecutarla? ¿Explicar la carga dinámica de clases?
A4. Los cargadores de clases son jerárquicos. Las clases se introducen en la JVM ya que se hace referencia a ellas por nombre en una clase que ya se está ejecutando en la JVM. Entonces, ¿cómo se carga la primera clase? La primera clase se carga especialmente con la ayuda del método estático main () declarado en su clase. Todas las clases cargadas posteriormente son cargadas por las clases, que ya están cargadas y en ejecución. Un cargador de clases crea un espacio de nombres. Todas las JVM incluyen al menos un cargador de clases que está incrustado dentro de la JVM llamado cargador de clases primordial (o bootstrap). La JVM tiene ganchos para permitir que los cargadores de clases definidos por el usuario se usen en lugar del cargador de clases primordial. Veamos los cargadores de clases creados por la JVM.
Conceptos básicos de Java Class Loader
Los cargadores de clases son jerárquicos y usan un modelo de delegación al cargar una clase. Los cargadores de clases solicitan a sus padres que carguen la clase primero antes de intentar cargarla ellos mismos. Cuando un cargador de clases carga una clase, los cargadores de clases secundarios en la jerarquía nunca volverán a cargar la clase. De ahí que se mantenga la unicidad. Las clases cargadas por un cargador de clases hijo tienen visibilidad en las clases cargadas por sus padres en la jerarquía, pero lo contrario no es cierto como se explica en el diagrama anterior.
Q5. ¿Puede darnos algunos escenarios en los que haya utilizado subprocesos múltiples en aplicaciones Java?
A5
Escenario 1: los servlets son inherentemente multiproceso
y cada usuario usará un hilo del grupo de hilos. El número de subprocesos se configura a través del contenedor web del servidor de aplicaciones. Servlet 3.1 admite E / S sin bloqueo para un mejor rendimiento.
¿Qué tiene de malo el modelo de subprocesos por solicitud?
Pre Servlet 3.1 utiliza el modelo de subproceso por solicitud, que limita el número de conexiones simultáneas al número de subprocesos JVM que se ejecutan simultáneamente. Cada hilo introduce un aumento significativo de la huella de la memoria y la utilización de la CPU a través de cambios de contexto. Servlet 3.1 rectifica esto a través de E / S sin bloqueo. Se pueden usar menos subprocesos en un grupo para ejecutar la solicitud. NIO le permite administrar múltiples canales (conexiones de red o archivos) usando solo un hilo (o menos).
Escenario 2: Un servidor MINA (es decir, basado en E / S sin bloqueo) con protocolo TCP de bajo nivel
para dar servicio a más de 250 sitios de gasolina. El servidor admite el pago en la solución de la bomba. Los clientes están basados en C ++ y envían datos de combustible y tarjeta de crédito al servidor. Un grupo de subprocesos reutilizables dice que 30 se pueden usar para manejar transacciones concurrentes.
Los marcos como Apache MINA, Netty, Grizzly y Akka proporcionan paradigmas basados en eventos y sin bloqueo para escribir aplicaciones concurrentes. MINA y Netty son frameworks de menor nivel que Akka, y tienen NIO (New Java IO) como núcleo.
Akka es un marco de propósito general de nivel superior en comparación con MINA y Netty para crear aplicaciones basadas en eventos, escalables y tolerantes a fallas. Akka está escrito en Scala, con enlaces de lenguaje proporcionados tanto para Scala como para Java. Akka usa el modelo Actor para ocultar todo el código relacionado con hilos y le brinda interfaces realmente simples y útiles para implementar fácilmente un sistema escalable y tolerante a fallas.
A pesar de que necesita tener un buen manejo para escribir programas concurrentes en Java y a los entrevistadores les gusta cuestionarlo / evaluarlo, favorezca un marco como Akka, ya que escribir programas concurrentes complejos no es una tarea trivial, y necesita lidiar con hilos, cerraduras, condiciones de carrera y depuración. Escribir programas concurrentes sin marcos puede ser propenso a errores y puede generar código difícil de leer, probar y mantener. Si está trabajando en el espacio BigData, eche un vistazo a Apache Spark, que se basa en Scala & Akka Toolkit.
Escenario 3: un programador de Swing se ocupa de los siguientes tipos de hilos:
a) Subprocesos iniciales que ejecutan el código de aplicación inicial.
b) El hilo de despacho de eventos, donde se ejecuta todo el código de manejo de eventos. La mayoría del código que interactúa con el marco Swing también debe ejecutarse en este hilo.
c) Subprocesos de trabajo, también conocidos como subprocesos en segundo plano, donde se ejecutan tareas en segundo plano que requieren mucho tiempo. Por ejemplo, cargar una imagen, recuperar y almacenar en caché los datos, procesar cualquier lógica que requiera mucho tiempo, etc.
Escenario 4: procesamiento asincrónico al generar un subproceso de trabajo
Una aplicación en línea con el requisito de producir informes que requieren mucho tiempo o un proceso comercial (por ejemplo, reequilibrar cuentas, agregar información jerárquica, etc.) podría beneficiarse al hacer que estas operaciones de larga ejecución sean asíncronas. Estas tareas se realizan en un subproceso de trabajo independiente. Una vez que se completan los informes o el proceso comercial de larga duración, el resultado se puede comunicar al usuario por correo electrónico o actualizar asincrónicamente la página web a través de técnicas conocidas como “inserción del servidor” o “extracción del cliente”. Un ejemplo típico sería
a) Un usuario solicita un informe agregado o un proceso comercial como reequilibrar sus carteras.
b) La entrada del usuario se puede guardar en una tabla de base de datos para un proceso separado para recogerla periódicamente y procesarla de forma asincrónica.
c) El usuario ahora podría continuar realizando otras funciones del sitio web sin ser bloqueado.
d) Un proceso separado que se ejecute en la misma máquina o en una máquina diferente puede escanear periódicamente la tabla en busca de entradas y producir los informes necesarios o ejecutar el proceso comercial relevante. Este podría ser un trabajo programado que se ejecuta una vez durante la temporada baja o cada 10 minutos. Esto depende del requisito comercial.
e) Una vez que se complete el informe o el proceso, notifique al usuario por correo electrónico o haga que el informe esté disponible en línea para su descarga.
Se puede usar un CountDownLatch para esperar que varios subprocesos realicen diferentes tareas. Una vez que CountDownLatch llega a cero, se pueden liberar los hilos en espera. Por ejemplo, 3 hilos separados que pueblan las secciones de encabezado, cuerpo y pie de página. CountDownLatch comienza desde 3.
Escenario 5: escribir su propio editor en Java donde el resaltado de sintaxis se realiza en un hilo separado
Para maximizar el rendimiento de la aplicación, el resaltado de sintaxis intensivo de la CPU se puede llevar a cabo en un subproceso de trabajo independiente mientras el usuario puede usar el editor.
Escenario 6: Java 7 fork y join para procesar algoritmos intensivos de computación en una máquina multi-core
Ejemplo . números = {1,2,3,4,5,6,7,8,9,10}, suma = 55; procesarlos usando la función fork y join introducida en Java 7.
Encontrará más de 300 preguntas y respuestas frecuentes sobre entrevistas en Java con muchos diagramas en http://www.java-success.com .