2023年Java常见面试题及答案合集
1、String类能不能被继承?为什么?
不能
因为string类是被final修饰的类,final修饰过的类不能被继
承、final修饰过的变量不能被修改
2、实现单例设计模式(懒汉、饿汉)
//懒汉,顾名思义比较懒,在用的时候才实例化
public class Singleton{
//创建实例,注意,此时没有new
private static Singleton instance=null;
//构造方法私有化
private Singleton(){}
//公有的静态方法,返回实例对象
public static Singleton getInstance(){
if(instance==null){
//这里才new
grid韩剧instance=new Singleton();
}
return instance;
}
}
//饿汉,顾名思义很饥饿,创建对象的时候就直接new
public class Singleton{
//创建实例的时候就new
private static Singleton instance=new Singleton();
//私有化构造方法,外部不能new
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
3、简述Java的反射机制和使用场景
反射是Java的一种机制,可以让我们在运行时获取类的信息
通过反射我们可以获取到类的所有信息,比如它的属性、构造器、
方法、注解等
适用于需要动态创建对象的场景
关于反射能说的太多,已单独出一篇博客来记录,请出门右转至信不信十分钟让你彻底搞懂java反射
4、什么是内存泄漏,怎么确定内存泄漏?
概念:内存泄漏就是指jvm内存没有及时释放,用人话说就是使用
完的对象没有被回收,一般造成原因都是编码不规范,new了很多
值为null的对象,然后又不调用
怎么确认:linux有个工具叫valgrind,一两句话说不清楚,单独
拎出来讲,移步使用valgrind来检查内存泄漏
5、简述动态代理和静态代理
静态代理:
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序
运行前,代理类的.class文件就已经存在了
静态代理通常只代理一个类
静态代理事先知道要代理的是什么
动态代理:
在程序运行时,运用反射机制动态创建而成
动态代理是代理一个接口下的多个实现类
动态代理不知道要代理什么东西,只有在运行时才知道
6、手写生产者消费者模型
仓库:Warehouse
public class Warehouse{
private volatile int apple=0;
public synchronized void increace(){
while(apple==5){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
apple++;
System.out.println("苹果生产成功!");
notify();
public synchronized void decreace(){
while(apple==0){
java常见笔试题try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
}
apple--;
rotate3d 用法System.out.println("苹果消费成功!");
notify();
}
public static void main(String[]args){
Warehouse warehouse=new Warehouse();
Consumer con=new Consumer(warehouse);
Producer pro=new Producer(warehouse);
Thread t1=new Thread(con);
Thread t2=new Thread(pro);
t1.start();
t2.start();
}
}
生产者:Producer
public class Producer implements Runnable{
private Warehouse warehouse;
public Producer(Warehouse warehouse){
this.warehouse=warehouse;
视频制作教程网站}
@Override
public void run(){
for(int i=0;i<10;i++)
{
try{
System.out.println("pro i:"+i);
Thread.sleep(30);
}catch(InterruptedException e){
e.printStackTrace();
}
warehouse.increace();
}
}
消费者:Consumer
public class Consumer implements Runnable{
private Warehouse warehouse;
public Consumer(Warehouse warehouse){
std ostreamthis.warehouse=warehouse;
}
@Override
public void run(){
nginx防火墙是好是坏
for(int i=0;i<10;i++)
{
try{
System.out.println("Con:i"+i);
//这里设置跟上面30不同是为了仓库中的苹果能够增加,不会生产一个马上被消费
Thread.sleep(3000);
}catch(InterruptedException e){
e.printStackTrace();
}
warehouse.decreace();
}
}
}
7、Java中接口和抽象类的异同?
先单独说一点,让你可以在朋友面前:接口也能被继承,只不过是被接口继承
1、都能包含抽象的方法,这些抽象的方法用于描述类具备的功能,
不提供具体的实现(jdk1.8允许接口有一个default的实现方法)
2、接口是对事物行为的抽象,而抽象类是对事务本质的抽象;
3、接口中的变量必须给出初始值,抽象类可以不给;
4、一个类只能继承一个抽象类,但可以实现多个接口;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。