20230908java面经整理

1.cpp和java的区别

cpp可以多重继承,对表java中的实现多个接口
cpp支持运算符重载、goto、默认函数参数
cpp自动强转,导致不安全;java必须显式强转
java提供垃圾回收机制,自动管理内存分配,当gc要释放无用对象时调用finalize方法
java提供反射机制,允许程序运行时得到类或对象的相关属性和操作
java为解释性语言,编译成字节码后由jvm之星;cpp为编译性语言,得到二进制代码
cpp快,java跨平台
java没有指针,更加安全

2.什么是数据库事务?怎么使用?

事务时一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,执行结果使得数据库从一个一致性状态到另一个一致性状态,要么都执行,要么都不执行。

默认就是自动开启事物,一个sql就是一个事务;

或者手动开启:
start transaction 开启事物
commit 提交
rollback 回滚

或者设置自动提交参数autocommit=1,自动提交

3.线程进程协程

进程是程序关于某数据集合上的一次运行活动,是系统进行资源分配的基本单位
线程是程序执行流的最小单位,PCB包括线程ID,当前指令指针PC,寄存器集合和堆栈组成
线程自己不拥有系统资源,但共享进程的全部资源
线程可共享堆不可共享栈
协程是更轻量级的一种函数,一个线程中的多个协程是串行的,所以go是多核编程
进程切换是从用户态到内核态再到用户态,效率低下
线程切换是os根据自己策略决定,切换内容保存在内核栈中
协程切换是程序决定,只有用户态,效率高

4.进程通信和线程通信

进程:管道(先进先出)、消息队列、共享内存(解决消息拷贝)、信号量、信号、socket(stream、dgram)
线程:互斥锁、读写锁、条件变量condition、信号量semaphore

5.堆栈的区别

1.栈是系统自动分配,堆要人工申请和释放
2.栈远小于堆
3.堆向上生长,内存地址由低到高;栈向下生长,内存地址由高到低
4.堆动态分配,栈可以动态或者静态
5.栈有专门的寄存器,更快;堆申请容易有内存碎片,效率低
6.栈存放函数返回地址、相关参数、局部变量和寄存器;堆内容由开发人员决定

6.多线程竞争

数据竞争:多个数据同时读写共享数据
死锁:互相等待对方释放资源
活锁:不断尝试,尝试失败尝试失败
优先级反转:低优先级的任务阻塞了一个高优先级的任务
解决方法:互斥锁、信号量、条件变量、读写锁、原子操作、线程安全的数据结构、资源分配和释放策略

7.乐观锁和悲观锁,哪里调用?

悲观锁:共享资源每次只给一个线程使用,其他线程阻塞,用完再转让(synchronized,reentrantlock)
乐观锁:认为共享资源每次访问都不会出现问题,无需加锁也无需等待,提交时候校验是否被修改即可(版本号机制、cas算法,aba问题用版本号或者时间戳解决)

8.线程间数据共享volatile

1.可见性:一个线程改了其他线程会立即看到
2.禁止指令重排:确保写操作不会重排到后面的读操作之前
3.不保证原子性:不适用于++这些复合操作,应该用锁

9.归并排序

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.nio是什么

非阻塞的处理IO的方式(new io),不需要一直阻塞等待数据的到来,使得处理并发时高效
1.双向的通道为基本数据传输单元,流单线
2.缓冲区为nio用来读取和写入数据的容器,在通道和应用程序之间传输数据,字节or字符
3.选择器,监视多个通道的事件,例如就绪和可读,通过selector可以实现但线程管理多通道
4.非阻塞,当通道无数据不会阻塞线程,可以执行其他任务
5.同步异步:同步指线程请求完成前被阻塞;异步指完成前继续执行其他任务

10.integer128

byte8位,short16位,int32为,long64位,128位的话需要用BigInteger

猜你喜欢

转载自blog.csdn.net/weixin_40986490/article/details/132766095
今日推荐