中软国际
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. 数据库的三大范式
如答案有错误欢迎指正
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. 数据库的三大范式
如答案有错误欢迎指正
全部评论
相关推荐
点赞 评论 收藏
分享
2025-11-13 14:37
门头沟学院 Java 程序员牛肉:是的,我觉得你最先需要的是多接触计算机圈子。我感觉你这个写的太幼稚了,根本没换位思考面试官。
你对实习的描述还是我写了前后端,我写了Restful接口,我用了EChatrs。你这让面试官怎么问你?问你什么是前后端?问你什么是Restful?讲真的兄弟,你这个简历在面试官眼里就是啥也不懂的好学生。所以一定要尽快加入一个圈子跟大家多聊聊,看看正儿八经的简历是怎么写的。
可以看一下我首页的简历怎么写那篇文章来学一下,你这里面的坑点我那篇文章里面都有讲过。
点赞 评论 收藏
分享
2025-12-07 16:30
大连理工大学 后端工程师 点赞 评论 收藏
分享
