Al tener conocimiento de preguntas de la entrevista de Java

1, la explicación de la pila de memoria (Stack), el uso de la región heap (montón) y un método (área de método) de.
Respuesta:Por lo general, se define un tipo de datos básicos de las variables, una referencia a un objeto, existe en el lugar de preservación de llamadas a funciones utilizar el espacio de pila en la JVM, y objetos creados por la nueva palabra clave y constructor del espacio en el montón, el montón es el área principal de la gestión recolector de basura,Ahora que los recolectores de basura se utilizan algoritmo de recolección generacional, espacio de pila también se puede subdividir en la vieja generación y la nueva generación, a continuación, punto específico se puede dividir en Edén, sobreviviente (y se puede dividir en De sobreviviente sobreviviente), Titular; el método y el área montón son hilos individuales compartidos área de memoria para almacenar información de clase se han cargado en la JVM, constantes, variable estática, el compilador JIT para compilar el código y otros datos; programa literal (literal), tales como la escritura directa de 100 "hola" y constantes, están en la piscina constante, la piscina es parte de la región constante del método. espacio de pila para operar el más rápido pero la pila es muy pequeña, por lo general un gran número de objetos están en el espacio del montón, pila y tamaño de la pila puede ser ajustado por los parámetros de la JVM de inicio, se queda sin espacio de pila dará lugar a StackOverflowError, mientras que el montón y constante falta de espacio en la piscina conducirá a OutOfMemoryError.

String str = new String("hello");

La variable str declaración anterior en la pila, cree que con el nuevo objeto de cadena en el montón, y "hola" el método literal es en la zona.

2, la matriz no tiene ningún método length ()? La cadena no tiene método length ()?
Respuesta:Ningún método longitud array (), los atributos de longitud. Cadena tiene un método length ().
JavaScript, la longitud de la cadena se obtuvo por la propiedad de longitud, que se confunde fácilmente y Java.

3, el constructor (constructor) puede reescribirse si (override)?
A: El constructor no puede ser heredado, y por lo tanto no puede ser reescrita, pero puede ser sobrecargado.

4, dos objetos del mismo valor (x.equals (y) == true) , pero pueden tener diferentes código hash, este derecho frase?
R: No,Si dos objetos X e Y satisfacen x.equals (y) = true, código hash del mismo (código hash) debe ser el mismo.
: Java Para eqauls y hashCode método se especifica en
(1) si dos objetos idénticos (devuelve verdadero método equals), entonces deben ser el mismo valor hashCode;
(2) si dos objetos tienen el mismo hashCode, no son necesariamente los mismos.
Por supuesto, puede que no quiera seguir, pero si usted viola los anteriores principios se encuentra que cuando se utiliza el contenedor, el mismo objeto puede aparecer en la colección Conjunto, al tiempo que aumenta la eficiencia de los nuevos elementos se verá muy reducido (para usar un dispositivo de almacenamiento de hash el sistema, si el código hash de frecuentes conflictos dará lugar a un fuerte descenso en el rendimiento de acceso).

5, pueden heredar clase String?
A: clase String es la clase final no puede ser heredada.

6, cuando un objeto se pasa como un parámetro a un método, este método puede cambiar las propiedades de este objeto, y devuelve el resultado de los cambios en, a continuación, en el extremo se hace pasar por transferencia de referencia o valor aquí?
A: se pasa el valor.Java método Invocación en lenguaje sólo es compatible con el valor del parámetro pasado. Cuando se pasa a un método para la instancia de objeto como un parámetro, el valor del parámetro es una referencia al objeto. Propiedades del objeto se pueden cambiar en el procedimiento llamado, pero los cambios no afectarán al objeto referenciado por la persona que llama. C ++ y C # puede ser transmitida o por referencia parámetros para cambiar los valores de los parámetros pasados. Puede ser escrito en C # código que se muestra a continuación, pero no se puede hacer en Java.

7, cuerdas y StringBuilder, StringBuffer la diferencia?
R: plataforma Java proporciona dos tipos de cadenas: Cadena y StringBuffer / StringBuilder, que pueden almacenar y manipular cadenas. cadena de cadena que es de sólo lectura, lo que significa que el contenido de una cadena de referencias de cadena no se puede cambiar. La representación de la clase StringBuffer / StringBuilder objeto String puede ser modificado directamente. En el hilo de seguridad, StringBuilder no es seguro para subprocesos, mientras que StringBuffer es seguro para subprocesos, si un objeto StringBuffer es el uso de múltiples hilos en un búfer de cadena, StringBuffer en muchos aspectos con la palabra clave sincronizada, lo que puede garantizar hilo es seguro, pero el enfoque StringBuilder no es la clave, no puede garantizar flujos seguros, puede haber algo mal funcionamiento se produce. Así que si usted quiere operar un multi-hilo, entonces deberíamos usar StringBuffer, pero en el caso de un único subproceso, se recomienda utilizar el más rápido StringBuilder.

Se aplica a un pequeño número de manipulación de cadenas: String
StringBuilder: adecuado para un único subproceso funcionamiento de un gran número de casos en el búfer de caracteres
conducta de un gran número de operativo multi-hilo adecuado debajo del búfer de caracteres: StringBuffer

8, la diferencia entre sobrecarga (sobrecarga) y regrabable (Override) es. método sobrecargado pueden diferenciarse según el tipo de cambio?
A: método == sobrecarga y reescritura son manera multi-estado, excepto que se implementa polimorfismo en tiempo de compilación, que se consigue polimorfismo tiempo de ejecución. == sobrecarga se produce en una clase, el método del mismo nombre si hay diferentes lista de parámetros (parámetros de diferentes tipos y diferentes números de parámetros o ambos) se considera sobrecargada; reescritura se produce niño y el padre clase de sala de subclases anulan el requisito es método reemplazado con la clase padre es método reemplazado con el mismo tipo de retorno, el método se anula un mejor acceso que el padre, no puede ser cambiada declaraciones de métodos de la clase padre que más excepciones (en s principio de sustitución).Sobrecargada hay requisitos especiales para el tipo de retorno.

preguntas: preguntas cara cara Huawei se les hace una pregunta tan - "¿Por qué no puede distinguir una sobrecarga en función del tipo de retorno," rápida que le diga la respuesta!
Sobrecargada hay requisitos especiales para el tipo de retorno

9, describir el principio mecanismo de JVM documento de carga de clases?
A: La JVM se carga en la clase por el cargador de clases (cargador de clases) y sus subclases para lograr, en el cargador de clases Java es un componente importante del sistema de tiempo de ejecución de Java, que es responsable de la búsqueda y carga de clases en tiempo de ejecución clase de archivos.
Como la naturaleza multi-plataforma de Java, compilado el código fuente de Java no es un programa ejecutable, pero uno o más archivos de clase. Cuando el programa necesita utilizar una clase Java, JVM se asegurará de que la clase ha sido cargada, la conexión (verificación, preparación y analítica) y la inicialización. Cargando refiere a la clase de los datos leídos en el tipo de archivo .class en la memoria, por lo general la creación de una matriz de bytes leídos en archivos .class y, a continuación, genera la clase de objeto correspondiente Clase cargado. Una vez cargado, el objeto de clase no es completa, por lo que en este caso la clase no está disponible todavía. Cuando después de la clase se carga en la fase de conexión, esta fase incluyendo la verificación, la preparación (memoria asignada como una variable estática y establecer un valor inicial predeterminado) y el análisis (sustituyó referencias simbólicas a directamente de referencia) tres pasos. Por último, la clase JVM se inicia, que comprende: 1) Si hay una clase controladora directa y la clase no se ha inicializado, entonces inicializar la clase padre; 2) si existe el estado de inicialización de clase, se realizan secuencialmente sobre estos estados de inicialización.
Cargando clases por el cargador de clases se ha completado, el cargador de clases comprende: a raíz cargador (Bootstrap), cargador extendida (la extensión), el sistema de carga (Sistema) y cargador de clases definidas por el usuario (en el java.lang.ClassLoader subclase). A partir de Java 2 (JDK 1.2), el proceso de carga de clases adoptó padre encargado mecanismo (PDM). PDM garantiza mejor la seguridad de la plataforma Java, en este mecanismo, JVM viene es la raíz Bootstrap cargador, cargador de otro tiene uno y sólo uno de los padres cargador de clases. Cargando primera clase las cargas cargador de clases padre la solicitud, el cargador de clases padre cuando su auto subclase incapacidad de carga del cargador. Bootstrap JVM no proporciona una referencia al programa Java. La siguiente es una descripción de varias clases de cargador:

Bootstrap: generalmente implementado usando código nativo, es responsable de bibliotecas del núcleo básico de carga JVM (rt.jar);
la extensión: la carga de los java.ext.dirs sistema de la biblioteca atributo de directorio especificado, su matriz se carga en arranque;
el Sistema: aplicación del cargador de clase conocida, una extensión de la clase padre. Es el cargador de clases más ampliamente utilizado. Ruta de clases desde la variable o el medio ambiente sistema de atributos descritos directorio java.class.path clase especificada, por defecto cargador cargador de matriz definida por el usuario.

10, char tipo de variable puede almacenar unos caracteres chinos, y por qué?
A: tipo char puede almacenar un caracteres chinos, debido a la codificación en Java usando Unicode (no seleccione ninguna codificación particular, sólo tiene que utilizar el número de caracteres del juego de caracteres, que es una única forma unificada), un tipo char representó dos palabras sección (16 bits), a fin de poner un chino no es ningún problema.

Añadido: Uso de medios Unicode que el personaje en el interior JVM y fuera tienen diferentes manifestaciones, dentro de la JVM es Unicode, cuando el personaje se transfiere desde el interior a la JVM externo (por ejemplo, almacenada en el sistema de archivos), se necesita la conversión de codificación. Por lo tanto, no hay flujo de bytes de Java y el flujo de caracteres, y el convertidor de corriente de la conversión de tales InputStreamReader y corriente OutputStreamReader entre caracteres y flujos de bytes, estas dos clases son el flujo de bytes entre la clase adaptador y flujo de caracteres, suponga unas tareas de conversión de código; para los programadores de C para lograr esto probablemente depende de la unión de transcodificación (unión / sindicato) función de memoria compartida para lograr.

11, clase abstracta (clase abstracta) e interfaces (interfaz) ¿Cuáles son las similitudes y diferencias?
Respuesta:No hay clases abstractas e interfaces se pueden crear instancias, pero la referencia pueden definirse tipo de clases abstractas e interfaces.Si una clase hereda una clase abstracta o implementa una interfaz necesidad de métodos abstractos para lograr todos ellos, de lo contrario la clase todavía tiene que ser declarado como una clase abstracta. Interfaz más abstracto que la clase abstracta, se puede definir como un constructor de la clase abstracta puede tener métodos abstractos y métodos específicos, pero no pueden definir la interfaz y en el que los métodos constructores son todos los métodos abstractos. miembros de la clase abstracta puede ser privado, por defecto, protegido, público, y la interfaz son todos los miembros del público. Puede definir un abstractas variables miembro de clase y variables miembro definidas en la interfaz de realidad son constantes. Hay métodos abstractos de la clase debe ser declarado como una clase abstracta, clase abstracta no puede tener métodos abstractos.

12, una clase anidada estática (estática Nested Class) y las clases interiores (clase interna) diferente?
R: estática anidada clase se declara estática (estática) de clase interna, no se puede confiar en una instancia de clase se instancia externa. Las clases internas suelen ser necesarios para la clase instantiate se instancia en el exterior

preguntas de la entrevista - ¿Qué lugar el siguiente código producirá un error de compilación?

class Outer {
    class Inner {}
    public static void foo() { new Inner(); }
    public void bar() { new Inner(); }
    public static void main(String[] args) {
        new Inner();
    }
}

Nota: La creación de las clases internas de un centro de Java africanos estática de los objetos a ser dependiente de su objeto externo, las preguntas de la cara superior de los métodos de foo y principales son métodos estáticos, métodos estáticos no esto, no que es el llamado objeto externo, y por lo tanto no puede haber crear un objeto de la clase interna, si se desea crear un objeto de la clase interna en un método estático, se puede hacer esto:

    new Outer().new Inner();

13, Java habrá una pérdida de memoria, por favor describir sencilla.
R: Debido a que hay teóricamente Java la recolección de basura (GC) no habrá pérdidas de memoria (que también es ampliamente utilizado en Java es una causa importante de la programación del lado del servidor); sin embargo, en el desarrollo real, puede haber inútil, pero alcanzable objetos que no se pueden recuperar GC, por lo que dará lugar a pérdidas de memoria. Hibernate ejemplo de Sesión (caché) de los objetos que pertenecen a un estado coherente, el recolector de basura no se recuperará estos objetos, sin embargo, puede haber basura objetos inútiles estos objetos, si no se ha cerrado (Close) o vaciar (el color) caché puede conducir a pérdidas de memoria. Ejemplo El siguiente código resultaría en una pérdida de memoria.

import java.util.Arrays;
import java.util.EmptyStackException;

public class MyStack<T> {
    private T[] elements;
    private int size = 0;

    private static final int INIT_CAPACITY = 16;

    public MyStack() {
        elements = (T[]) new Object[INIT_CAPACITY];
    }

    public void push(T elem) {
        ensureCapacity();
        elements[size++] = elem;
    }

    public T pop() {
        if(size == 0) 
            throw new EmptyStackException();
        return elements[--size];
    }

    private void ensureCapacity() {
        if(elements.length == size) {
            elements = Arrays.copyOf(elements, 2 * size + 1);
        }
    }
}

Los implementos de código por encima de una pila de estructura (el último en salir (FILO)), a primera vista no parece ningún problema obvio, incluso puede ser a través de una variedad de pruebas de unidad que escribe. Sin embargo, uno de los métodos oposición, pero hay un problema de pérdidas de memoria cuando un objeto en la pila utilizamos pop método pop, el objeto no se recolector de basura, a pesar de que el programa ya no está utilizando una pila de referencias a estos objetos, porque la pila interna mantiene las antiguas referencias a estos objetos (referencia obsoleta). En la recolección de basura soporte de idiomas, la pérdida de memoria es muy sutil, esta pérdida de memoria es en realidad restos de objetos inconscientes. Si una referencia de objeto se mantiene hasta inconsciente, a continuación, el recolector de basura no trata este tema, no va a tratar con otros objetos en la referencia del objeto, incluso si sólo unos pocos de tales objetos también pueden causar una gran cantidad de objetos que deben excluirse Además de la recolección de basura, lo que resulta en un impacto significativo en el rendimiento, que dará lugar a paginación de disco (memoria física y los datos en el disco duro de intercambio de memoria virtual) en casos extremos, incluso causa OutOfMemoryError.

14, resumen (abstract) si el método puede ser simultáneamente estática (static), también es un método local (nativo), que se puede sincronizar si modificado?
A: no se puede. necesidades método abstracto a subclase anulaciones, y los métodos estáticos no se pueden reescribir, por lo que los dos son contradictorios. método nativo es un método implementado por el código nativo (por ejemplo, código C), no se implementa el método abstracto, y es contradictorio. métodos sincronizados y detalles de implementación relacionados con el método abstracto no implica los detalles de implementación, y por lo tanto contradictorias.

15, se explica la diferencia entre las variables estáticas y variables de instancia.
Respuesta:Las variables estáticas se modifican las variables modificadoras estáticos, también conocidos como variables de clase, que pertenecen a la clase, no pertenece a ninguna clase de objeto, independientemente del número de objetos para crear una variable estática clase y sólo una copia en la memoria;Ejemplos de variables deben ser dependiente de una instancia, es necesario crear un objeto antes de poder acceder a él a través de un objeto. Las variables estáticas se pueden implementar de forma que varios objetos compartidos memoria.

Añadido: desarrollo de Java, las clases de contexto y herramientas por lo general tienen una gran cantidad de miembros estáticos.

16, si se puede hacer llamadas a método no estático (no estático) desde dentro de un método estático (estático)?
A: No, métodos estáticos puede único miembro estática de acceso, porque llamar método no estático de crear primero un objeto, el objeto puede no ser inicializado cuando se llama a un método estático.

17, la forma de lograr el clon objetivo?
A: Hay dos maneras:
1) implementar la interfaz Cloneable y el clon de anulación () de la clase Object ;.
2) implementa la interfaz Serializable, clonado por serialización y deserialización de los objetos, se puede lograr la profundidad real de los clones. .

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

public class MyUtil {

    private MyUtil() {
        throw new AssertionError();
    }

    @SuppressWarnings("unchecked")
    public static <T extends Serializable> T clone(T obj) throws Exception {
        ByteArrayOutputStream bout = new ByteArrayOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(bout);
        oos.writeObject(obj);

        ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
        ObjectInputStream ois = new ObjectInputStream(bin);
        return (T) ois.readObject();

        // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义
        // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放
    }
}

Aquí está el código de prueba:

import java.io.Serializable;

/**
 * 人类
 * @author 骆昊
 *
 */
class Person implements Serializable {
    private static final long serialVersionUID = -9102017020286042305L;

    private String name;    // 姓名
    private int age;        // 年龄
    private Car car;        // 座驾

    public Person(String name, int age, Car car) {
        this.name = name;
        this.age = age;
        this.car = car;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", car=" + car + "]";
    }

}
/**
 * 小汽车类
 * @author 骆昊
 *
 */
class Car implements Serializable {
    private static final long serialVersionUID = -5713945027627603702L;

    private String brand;       // 品牌
    private int maxSpeed;       // 最高时速

    public Car(String brand, int maxSpeed) {
        this.brand = brand;
        this.maxSpeed = maxSpeed;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }

    public int getMaxSpeed() {
        return maxSpeed;
    }

    public void setMaxSpeed(int maxSpeed) {
        this.maxSpeed = maxSpeed;
    }

    @Override
    public String toString() {
        return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]";
    }

}
class CloneTest {

    public static void main(String[] args) {
        try {
            Person p1 = new Person("Hao LUO", 33, new Car("Benz", 300));
            Person p2 = MyUtil.clone(p1);   // 深度克隆
            p2.getCar().setBrand("BYD");
            // 修改克隆的Person对象p2关联的汽车对象的品牌属性
            // 原来的Person对象p1关联的汽车不会受到任何影响
            // 因为在克隆Person对象时其关联的汽车对象也被克隆了
            System.out.println(p1);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Nota: Sobre la base de la clonación y la serialización de-serialización para lograr no sólo la profundidad de la clonación, que es más importante, está limitada por los genéricos, se puede comprobar si se desea clonar objetos de soporte serialización, esta comprobación es compilador completa, no en lanza un funcionamiento anormal, este esquema es mucho mejor que el método que utiliza la clase clon clon del objeto. Deje que los problemas en tiempo de compilación expuestos siempre es mejor dejar el asunto al tiempo de ejecución.

Publicados 444 artículos originales · elogios ganado 15 · Vistas a 10000 +

Supongo que te gusta

Origin blog.csdn.net/zt2650693774/article/details/104984621
Recomendado
Clasificación