Resumen de preguntas de la entrevista (1) Fundación Java

Conceptos básicos de Java

 

1. ¿Cuál es la diferencia entre JDK y JRE?

 

  • JDK: Abreviatura de Java Development Kit, kit de desarrollo de Java, proporciona un entorno de desarrollo de Java y un entorno de ejecución.

  • JRE: Abreviatura de Java Runtime Environment, Java Runtime Environment, proporciona el entorno requerido para el funcionamiento de Java.

 

Específicamente, el JDK en realidad incluye el JRE, y también incluye el compilador javac que compila el código fuente de Java, y también incluye muchas herramientas para depurar y analizar programas de Java. En pocas palabras: si necesita ejecutar programas java, simplemente instale JRE, si necesita escribir programas java, debe instalar JDK.

 

2. ¿Cuál es la diferencia entre == e igual?

 

== Interpretación

 

El efecto del tipo básico y el tipo de referencia == es diferente, como se muestra a continuación:

 

  • Tipos básicos: compare si los valores son los mismos;

  • Tipo de referencia: comparar si las referencias son las mismas;

 

Ejemplo de código:

String x = "string";String y = "string";String z = new String("string");System.out.println(x==y); // trueSystem.out.println(x==z); // falseSystem.out.println(x.equals(y)); // trueSystem.out.println(x.equals(z)); // true

Interpretación del código: debido a que x e y se refieren a la misma referencia, == también es verdadero, y el nuevo método String () se reescribe para abrir el espacio de memoria, entonces == el resultado es falso, y la comparación igual es siempre el valor, entonces Los resultados son todos verdaderos.

 

Interpretación de iguales

 

Equals es esencialmente ==, excepto que String e Integer reescriben el método equals, convirtiéndolo en una comparación de valores. Vea el código a continuación para comprender.

 

Primero mira la comparación igual de un objeto con el mismo valor por defecto, el código es el siguiente:

 

class Cat {    public Cat(String name) {        this.name = name;    }
    private String name;
    public String getName() {        return name;    }
    public void setName(String name) {        this.name = name;    }}
Cat c1 = new Cat("王磊");Cat c2 = new Cat("王磊");System.out.println(c1.equals(c2)); // false

 

 

La salida es inesperada, ¿es falsa? Lo que está sucediendo, puede ver el código fuente de iguales. El código fuente es el siguiente:

 

public boolean equals(Object obj) {    return (this == obj);}

 

 

Resulta que igual es esencialmente ==.

Ese es el problema: ¿por qué dos objetos String con el mismo valor devuelven verdadero? El código es el siguiente:

​​​​​​​

String s1 = new String("老王");String s2 = new String("老王");System.out.println(s1.equals(s2)); // true

 

 

Del mismo modo, cuando ingresamos el método igual de String y encontramos la respuesta, el código es el siguiente:

public boolean equals(Object anObject) {    if (this == anObject) {        return true;    }    if (anObject instanceof String) {        String anotherString = (String)anObject;        int n = value.length;        if (n == anotherString.value.length) {            char v1[] = value;            char v2[] = anotherString.value;            int i = 0;            while (n-- != 0) {                if (v1[i] != v2[i])                    return false;                i++;            }            return true;        }    }    return false;}

 

 

Resultó que String reescribió el método igual de Object y cambió la comparación de referencia a la comparación de valores.

 

En resumen  : == es una comparación de valores para los tipos básicos y una referencia para los tipos de referencia; igual es la comparación de referencia por defecto, pero muchas clases han vuelto a igualar el método de igualdad, como String, Integer, etc. Para comparar los valores, en general, igual compara si los valores son iguales.

 

3. El hashCode () de los dos objetos es el mismo, por lo que equals () también debe ser verdadero, ¿verdad?

 

No, el hashCode () de los dos objetos es el mismo, y equals () no es necesariamente cierto.

 

Ejemplo de código:

String str1 = "通话";String str2 = "重地";System.out.println(String.format("str1:%d | str2:%d",                      str1.hashCode(),str2.hashCode()));System.out.println(str1.equals(str2));

 

 

Los resultados de la implementación:

 

str1 : 1179395 | str2 : 1179395

 

falso

 

Interpretación del código: Obviamente, el hashCode () de la "llamada" y el "pesado" son iguales, pero el igual () es falso, porque en la tabla hash, el hashCode () es igual, es decir, los valores hash de los dos pares de valores clave son iguales, pero ha La esperanza de que los valores sean iguales no necesariamente da como resultado pares clave-valor iguales.

 

4. ¿Cuál es el papel de final en Java?

 

  • La clase modificada final se llama clase final, que no se puede heredar.

  • Los métodos modificados finales no pueden ser anulados.

  • La variable modificada final se denomina constante. La constante debe inicializarse y el valor no puede modificarse después de la inicialización.

 

5. ¿Cuánto es Math.round (-1.5) en java?

 

Igual a -1, porque cuando el valor se toma en el eje numérico, el valor medio (0.5) se redondea a la derecha, entonces 0.5 positivo se redondea hacia arriba y 0.5 negativo se descarta directamente.

 

6. ¿Es String un tipo de datos básico?

 

String no es un tipo básico, hay 8 tipos básicos: byte, boolean, char, short, int, float, long, double y String es un objeto.

 

7. ¿Cuáles son las clases para manipular cadenas en Java? ¿Cuál es la diferencia entre ellos?

 

Las clases que manipulan cadenas son: String, StringBuffer, StringBuilder.

 

La diferencia entre String, StringBuffer y StringBuilder es que String declara un objeto inmutable. Cada operación genera un nuevo objeto String, y luego apunta el puntero al nuevo objeto String, y StringBuffer y StringBuilder pueden operar sobre la base del objeto original. Por lo tanto, es mejor no usar String en el caso de cambiar con frecuencia el contenido de la cadena.

 

La mayor diferencia entre StringBuffer y StringBuilder es que StringBuffer es seguro para subprocesos y StringBuilder no es seguro para subprocesos, pero el rendimiento de StringBuilder es mayor que StringBuffer, por lo que se recomienda utilizar StringBuilder en un entorno de un solo subproceso y StringBuffer en un entorno de múltiples subprocesos.

 

8. ¿String str = "i" es lo mismo que String str = new String ("i")?

 

No es lo mismo, porque la memoria se asigna de manera diferente. La forma de String str = "i", la máquina virtual java lo asignará al grupo constante, y String str = new String ("i") se asignará a la memoria del montón.

 

9. ¿Cómo invertir la cuerda?

 

Use el método reverse () de StringBuilder o stringBuffer.

 

Código de muestra:

// StringBuffer reverseStringBuffer stringBuffer = new StringBuffer();stringBuffer.append("abcdefg");System.out.println(stringBuffer.reverse()); // gfedcba// StringBuilder reverseStringBuilder stringBuilder = new StringBuilder();stringBuilder.append("abcdefg");System.out.println(stringBuilder.reverse()); // gfedcba

 

 

10. ¿Cuáles son los métodos comunes de la clase String?

 

  • indexOf (): devuelve el índice del carácter especificado.

  • charAt (): devuelve el carácter en el índice especificado.

  • replace (): reemplazo de cadena.

  • trim (): elimina el espacio en blanco en ambos extremos de la cadena.

  • split (): divide la cadena y devuelve una matriz de cadena dividida.

  • getBytes (): devuelve una matriz de bytes de cadenas.

  • length (): devuelve la longitud de la cadena.

  • toLowerCase (): Convierte la cadena en letras minúsculas.

  • toUpperCase (): convierte la cadena a caracteres en mayúscula.

  • substring (): cadena de intercepción.

  • equals (): comparación de cadenas.

 

11. ¿Las clases abstractas tienen que tener métodos abstractos?

 

No, las clases abstractas no tienen que tener métodos abstractos.

 

Código de muestra:

abstract class Cat {    public static void sayHi() {        System.out.println("hi~");    }}

 

 

En el código anterior, la clase abstracta no tiene un método abstracto, pero puede ejecutarse normalmente.

 

12. ¿Cuáles son las diferencias entre las clases ordinarias y las clases abstractas?

 

  • Las clases ordinarias no pueden contener métodos abstractos, las clases abstractas pueden contener métodos abstractos.

  • Las clases abstractas no pueden ser instanciadas directamente, las clases ordinarias pueden ser instanciadas directamente.

 

13. ¿Se pueden decorar las clases abstractas con las finales?

 

No, la definición de una clase abstracta es heredada por otras clases. Si se define como final, la clase no se puede heredar, por lo que habrá conflictos entre sí, por lo que final no puede modificar la clase abstracta. Como se muestra en la siguiente figura, el editor también mostrará un mensaje de error:

 

 

14. ¿Cuál es la diferencia entre una interfaz y una clase abstracta?

 

  • Implementación: el uso de subclases de clases abstractas se extiende para heredar; la interfaz debe usar implementos para implementar la interfaz.

  • Constructor: una clase abstracta puede tener un constructor; una interfaz no puede.

  • método principal: las clases abstractas pueden tener un método principal, y podemos ejecutarlo; las interfaces no pueden tener un método principal.

  • Número de implementaciones: una clase puede implementar muchas interfaces; pero solo puede heredar una clase abstracta.

  • Modificadores de acceso: los métodos en la interfaz usan el modificador público de manera predeterminada; los métodos en la clase abstracta pueden ser cualquier modificador de acceso.

 

15. ¿Hay varios tipos de transmisiones de E / S en Java?

 

Dividido por función: flujo de entrada (entrada), flujo de salida (salida).

 

Dividido por tipo: flujo de bytes y flujo de caracteres.

 

La diferencia entre un flujo de bytes y un flujo de caracteres es que el flujo de bytes se transmite en datos de entrada y salida de 8 bits en unidades de bytes, y el flujo de caracteres se transmite en transmisión de 16 bits y datos de entrada y salida en unidades de caracteres.

 

16. ¿Cuál es la diferencia entre BIO, NIO y AIO?

 

  • BIO: Block IO Synchronous Block IO es el IO tradicional que usamos habitualmente, se caracteriza por un modo simple, fácil de usar y baja capacidad de procesamiento simultáneo.

  • NIO: El nuevo IO síncrono sin bloqueo IO es una actualización del IO tradicional. El cliente y el servidor se comunican a través del canal (canal) para lograr la multiplexación.

  • AIO: Asynchronous IO es una actualización de NIO, también llamada NIO2, que implementa IO asincrónico sin bloqueo. La operación de IO asincrónica se basa en eventos y mecanismos de devolución de llamada.

 

17. ¿Cuáles son los métodos comunes de archivos?

 

  • Files.exists (): detecta si la ruta del archivo existe.

  • Files.createFile (): crea un archivo.

  • Files.createDirectory (): crea una carpeta.

  • Files.delete (): elimina un archivo o directorio.

  • Files.copy (): copia archivos.

  • Files.move (): mueve archivos.

  • Files.size (): muestra la cantidad de archivos.

  • Files.read (): lee archivos.

  • Files.write (): escribe archivos.

 

(Fin)

Publicado 9 artículos originales · me gusta 0 · visitas 248

Supongo que te gusta

Origin blog.csdn.net/Fabri/article/details/105174877
Recomendado
Clasificación