面经

1. mysql删除表语句是什么?drop和truncate区别?
2. 删除一行数据的sql
3. 查询一张表所有的数据的sql
4. 查询一张表有多少条数据sql。  count(1)和count(*)区别
5. i++和++i区别
6. 介绍下重载和重写。  构造方法可以重写重载吗?
7. arraylist和linkedlist的区别
8.解释一下深拷贝和浅拷贝
9. 如果有三个线程,我如何能保证顺序执行.
方法1: 使用join()
join() 方法可以确保一个线程在另一个线程执行完毕后才开始执行。通过合理地调用 join(),可以实现线程的顺序执行。

方法2:使用countdownlatch/semaphore

方法3: 使用锁和原子类,wait() + notifyAll()

方法4: 使用completablefuture

10. 如果有一个 T1 线程,想把 T2 线程加到 T1 里面,怎么实现?

方法1. 使用join()
Thread t2 = new Thread(() -> {
    // T2 线程的执行逻辑
    System.out.println("T2 线程正在执行");
});

Thread t1 = new Thread(() -> {
    try {
        System.out.println("T1 线程开始执行");
        
        // T1 线程在此处等待 T2 线程执行完成
        t2.start();  // 启动 T2 线程
        t2.join();    // T1 等待 T2 完成
        
        System.out.println("T2 线程已完成,T1 继续执行");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

t1.start();

方法2. 使用future.get()
ExecutorService executor = Executors.newSingleThreadExecutor();

Future future = executor.submit(() -> {
    // T2 线程的执行逻辑
    System.out.println("T2 线程正在执行");
});

Thread t1 = new Thread(() -> {
    try {
        System.out.println("T1 线程开始执行");
        
        // T1 线程在此处等待 T2 线程执行完成
        future.get();  // 阻塞直到 T2 完成
        
        System.out.println("T2 线程已完成,T1 继续执行");
    } catch (InterruptedException | ExecutionException e) {
        e.printStackTrace();
    } finally {
        executor.shutdown();
    }
});

t1.start();

方法3. 使用countdownlatch
CountDownLatch latch = new CountDownLatch(1);

Thread t2 = new Thread(() -> {
    try {
        System.out.println("T2 线程正在执行");
    } finally {
        latch.countDown();  // 完成时减少计数
    }
});

Thread t1 = new Thread(() -> {
    try {
        System.out.println("T1 线程开始执行");
        
        t2.start();  // 启动 T2 线程
        latch.await();  // 等待 T2 完成
        
        System.out.println("T2 线程已完成,T1 继续执行");
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
});

t1.start();

11. a=a+b 和 a+=b的区别

a = a + b,如果 a 和 b 的类型不同(如 a 是 int,b 是 double),需要显式强制类型转换,否则会编译报错。
即:
double a= 1;
int b = 2;
a = (double) (a+b); 
a += b,会自动执行隐式类型转换,将结果转换为 a 的类型。

13. 数据库的三大范式

如答案有错误欢迎指正
全部评论

相关推荐

首先 我觉得最重要的其实就是方向不清晰。第一次面试是在大二的秋招,当时能力一般,但是胆子很大,直接去面了当时仅有的几个小巨人企业(学校蛮偏的,没大厂几乎),然后就清晰了很多。大概了解了不同岗位需要的不同技能,以及如何提升竞争力除了竞赛,项目,实习。还可以尝试扩展自己的技术栈,例如嵌入式可以结合Android,嵌入式也需要有一定的原理图理解能力,接触到了lvgl,rtos这些概念。找到方向之后就是努力,就是不知道怎么努力。打比赛发现在硬件实验室里面的软件没什么发挥的机会,基本都是裸机开发,没有系统。软件也比较多的就是做个深度学习,视觉处理。实在是电子信息的佬太强了,电机调节啥的都包了,所以一直找不到提升的好方法。后来下定决心自己做项目,从比较熟悉的上位机qt开始做,然后是树莓派网关,云服务器linux的应用层基础,第一次画板,第一次尝试设计协议,第一次做app…终于发现,比赛其实不需要多,更重点是自己能力的提升。如果能力不够,没必要空焦虑,要把焦虑的情绪指向可以控制的事情上,而不是去想能否就业,能否高薪这种控制不了的事情上。现在来说,其实个人能力不是很强,只能边学边做了。大厂对于我们双非或许就像是月亮吧,总有人能登月,但是更多的只能仰望。唯有一步一步踏实的搭好自己的火箭,才有机会一睹芳容。
点赞 评论 收藏
分享
评论
4
11
分享

创作者周榜

更多
牛客网
牛客企业服务