20230908 resumen de la entrevista java

1.La diferencia entre cpp y java

cpp puede tener herencia múltiple. Para la implementación de múltiples interfaces en la tabla java,
cpp admite la sobrecarga del operador, goto y los parámetros de función predeterminados.
cpp fuerza automáticamente la transferencia, lo que genera inseguridad; java debe forzar explícitamente la transferencia.
java proporciona una basura Mecanismo de recopilación y gestión automática de la asignación de memoria. Cuando gc quiere liberar objetos inútiles, llama al método de finalización
. Java proporciona un mecanismo de reflexión que permite al programa obtener los atributos y operaciones relevantes de la clase u objeto cuando el programa se está ejecutando.
Java es un lenguaje interpretado, que se compila en código de bytes y es utilizado por JVM Star; cpp es un lenguaje compilado. Es más rápido obtener código binario
cpp, java multiplataforma
java no tiene punteros y es más seguro

2. ¿Qué es una transacción de base de datos? ¿cómo utilizar?

Una transacción es una secuencia indivisible de operaciones de base de datos y la unidad básica de control de concurrencia de la base de datos. El resultado de la ejecución hace que la base de datos pase de un estado de coherencia a otro estado de coherencia, ya sea con todas las ejecuciones o sin ninguna ejecución.

El valor predeterminado es iniciar las cosas automáticamente, y un SQL es una transacción;

O inícielo manualmente:
iniciar transacción, abrir
confirmación de transacción, confirmar
reversión, revertir

O configure el parámetro de envío automático autocommit=1 para enviar automáticamente

3. Corrutina de proceso de subprocesos

Un proceso es una actividad en ejecución de un programa en un determinado conjunto de datos y es la unidad básica de asignación de recursos en el sistema. Un subproceso es la unidad más pequeña de flujo de ejecución
del programa . La PCB incluye el ID del subproceso, el puntero de instrucción actual de la PC, el conjunto de registros y la pila. El subproceso en sí no es propietario de los recursos del sistema, pero todos los recursos del proceso se comparten. Los subprocesos pueden compartir el montón pero no la pila . Las corrutinas son una función más liviana. Múltiples corrutinas en un subproceso son serial, por lo que Go es un proceso de programación multinúcleo . El cambio es del estado de usuario al estado de kernel y luego al estado de usuario, baja eficiencia. El sistema operativo decide el cambio de subprocesos de acuerdo con su propia estrategia, y el contenido del cambio se guarda en el pila del kernel El cambio de rutina lo decide el programa, solo el estado del usuario es alto y la eficiencia es alta.





4. Comunicación de procesos y comunicación de hilos.

Proceso: canalización (primero en entrar, primero en salir), cola de mensajes, memoria compartida (resolver copia de mensaje), semáforo, señal, socket (flujo, dgram) subproceso: bloqueo mutex, bloqueo de lectura-escritura, condición de variable de condición, semáforo
semáforo

5. La diferencia entre pilas

1. El sistema asigna automáticamente la pila y el montón debe solicitarse y liberarse manualmente
2. La pila es mucho más pequeña que el montón
3. El montón crece hacia arriba y la dirección de memoria va de menor a mayor; la pila crece hacia abajo y la dirección de memoria va de mayor a menor
4. El montón se asigna dinámicamente. La pila puede ser dinámica o estática
5. La pila tiene registros especiales, lo cual es más rápido, la aplicación del montón es propensa a la fragmentación de la memoria y es ineficiente
6. La pila almacena direcciones de retorno de funciones, parámetros relacionados, variables locales y registros; el contenido del montón lo determina el desarrollador

6. Competencia multiproceso

Competencia de datos: varios datos leen y escriben datos compartidos al mismo tiempo.
Punto muerto: esperando que cada uno libere recursos.
Livelock: intentando y fallando constantemente.
Inversión de prioridad: una tarea de baja prioridad bloquea una tarea de alta prioridad.
Solución: Mutex bloqueos, semáforos, variables de condición, bloqueos de lectura y escritura, operaciones atómicas, estructuras de datos seguras para subprocesos, asignación de recursos y estrategias de liberación

7. ¿Dónde llamar al bloqueo optimista y al bloqueo pesimista?

Bloqueo pesimista: los recursos compartidos solo los usa un subproceso a la vez, otros subprocesos se bloquean y luego se transfieren después de su uso (sincronizado, reentrantlock)
Bloqueo optimista: se cree que no habrá problemas cada vez que se acceda a los recursos compartidos. Y no es necesario bloquear ni esperar al enviar, solo verifique si se ha modificado (mecanismo de número de versión, algoritmo cas, el problema aba se resuelve con el número de versión o la marca de tiempo)

8. El intercambio de datos entre subprocesos es volátil

1. Visibilidad: los cambios realizados por un subproceso serán visibles inmediatamente para otros subprocesos
2. Prohibición de reorganización de instrucciones: asegúrese de que las operaciones de escritura no se reorganicen antes de las operaciones de lectura posteriores
3. No se garantiza la atomicidad: no aplicable a ++ y otras operaciones compuestas , debería usar bloqueo

9. Combinar clasificación

def merge_sort(arr):
    if len(arr) > 1:
        mid = len(arr) // 2  # 找到中间位置
        left_half = arr[:mid]  # 分割成左右两个子序列
        right_half = arr[mid:]

        merge_sort(left_half)  # 递归对左子序列进行排序
        merge_sort(right_half)  # 递归对右子序列进行排序

        # 合并左右两个有序子序列
        i = j = k = 0
        while i < len(left_half) and j < len(right_half):
            if left_half[i] < right_half[j]:
                arr[k] = left_half[i]
                i += 1
            else:
                arr[k] = right_half[j]
                j += 1
            k += 1

        # 处理剩余元素
        while i < len(left_half):
            arr[k] = left_half[i]
            i += 1
            k += 1

        while j < len(right_half):
            arr[k] = right_half[j]
            j += 1
            k += 1

# 示例用法
arr = [12, 11, 13, 5, 6, 7]
merge_sort(arr)
print("排序后的数组:", arr)

9. ¿Qué es nio?


El método sin bloqueo para procesar IO (nuevo IO) no necesita bloquear ni esperar la llegada de datos, lo que lo hace eficiente al procesar concurrencia. 1. El canal bidireccional es la unidad básica de transmisión de datos y el flujo es una sola línea
2. El buffer es nio para lectura y contenedor para escribir datos, transmitir datos entre canales y aplicaciones, bytes o caracteres
3. Selector, monitorear eventos de múltiples canales, como listo y legible, se puede lograr a través del selector pero gestión de subprocesos multicanal
4. Sin bloqueo, cuando no hay datos en el canal, el subproceso no se bloqueará y se pueden realizar otras tareas
5. Síncrono y asíncrono: Sincrónico significa que la solicitud del subproceso se bloquea antes de que se complete; asincrónico significa que otras tareas continúan ejecutándose antes de completarse.

10.entero128

El byte es de 8 bits, el corto es de 16 bits, el int32 es, el largo es de 64 bits, si es de 128 bits, se requiere BigInteger.

Supongo que te gusta

Origin blog.csdn.net/weixin_40986490/article/details/132766095
Recomendado
Clasificación