Java基础面试题

1.Java中的几种基本数据类型是什么,各占用多少个字节?

答:八种,分别为byte 2个字节、short 4个字节、int 4个字节、long 8个字节、float 4个字节、long 8个字节、boolean 2个字节、char 1个字节。

2.String类能被继承吗,为什么?

答:不能被继承。因为String是被final修饰的类,被final关键字修饰的类不能被继承。

3.String、StringBuffer、StringBuilder的区别。

答:(1)String是只读字符串,String引用的字符串内容不可改变,StringBuffer和StringBulider创建的字符串对象内容是可以直接修改的。

(2)StringBuilder是非线程安全的,StringBuilder的所有方法没有被synchronized关键字修饰,所以效率比StringBuffer高。

4.ArrayList和LinkedList有什么区别。

答:(1)ArrayList底层是采用数组实现的,LinkedList底层是由双层循环链表实现的。

(2)ArrayList查找速度非常快,增删操作非常慢。LinkedList查找速度非常慢,增删速度非常快。

ArrayList增删慢的原因:ArrayList扩容时,需要先确定扩容的大小,创建一个新的数组,然后调用Array.copyOf();方法进行复制到新数组中;把指定元素(要删除元素)后面位置的所有元素,利用System.arraycopy()方法整体向前移动一个位置,最后一个位置的元素指定为null,然后让gc去回收它。

(3)ArrayList和LinkedList都是线程非安全的。

附加题:如何把ArrayList和LinkedList改成线程安全的?

答:使用Collections.synchronizedList方法把ArrayList变成一个线程安全的List。

(4)ArrayList是以O(1)时间复杂度对元素进行随机访问,LinkedList是以O(n)时间复杂度进行访问。

5.讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。

(1)父类静态变量

(2)父类静态代码块

(3)子类静态变量

(4)子类静态代码块

————————————类的实例化先加载静态static修饰

(5)父类非静态变量(父类实例成员变量)

(6)父类构造函数

(7)子类非静态变量(子类实例成员变量)

(8)子类构造函数

6.用过哪些Map类,都有什么区别,HashMap是线程安全的吗?并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。

7.抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。

区别:

(1)抽象类和接口都不能实例化。

(2)抽象类要被子类继承,接口要被实现。

(3)接口里面都是抽象方法,抽象类里面可以有抽象方法也可以有实例方法。

(4)接口里定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。

(5)抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。

(6)抽象类里可以没有抽象方法。

(7)单继承,多实现。类不会继承多个类或者接口,类可以实现多个接口。

(8)接口可以继承接口,并可多继承接口。

8.继承和聚合的区别在哪?

(1)继承指的是一个类继承另外一个类的功能,并可以增加它自己的新功能,继承是类与类或者类与接口之间最常见的关系。

(2)聚合体现的是整体与部分、拥有的关系,整体与部分是可以分离的,具有各自的生命周期。

注:继承是is-a,聚合是include。

9.IO模型有哪些,讲讲你理解的nio,他和bio的区别是啥,谈谈reactor模型。

10.反射的原理,反射创建类实例的三种方式是什么?

反射定义:程序运行时加载一个类,动态获取类的基本信息和定义的方法,构造函数,域等。

11.反射中,Class.forName和ClassLoader区别。

12.描述动态代理的几种实现方式,分别说出相应的优缺点。

13.动态代理与cglib实现的区别

14.为什么CGlib方式可以对接口实现代理。

15.final的用途

(1)final可以修饰成员变量、本地变量、方法以及类

(2)不能对final类变量再次赋值

(3)本地变量必须在声明时赋值

(4)在匿名类中所有变量都必须是final变量

(5)final方法不能被重写,final类不能被继承

16.写出三种单例模式实现

单例模式定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

(1)懒汉,线程不安全

public class Singleton{

private static Singleton instance;

private Singleton(){}

public static synchronized Singleton getInstance(){

if(instance==null){

instance = new Singleton();

}

return instance;

}

}

效率低,大部分情况下不需要同步。

2.饿汉模式

public class Singleton{

private static Singleton instance = new Singleton();

private Singleton(){}

public static Singleton getInstance(){

return instance;

}

}

instance在类装载时就实例化。

3.双重校验锁

public class Singleton{

private volatile static Singleton singleton;

private Singleton(){}

public static Singleton getSingleton(){

if(singleton==null){

synchronized(Singleton.class){

if(singleton ==null){

singleton = new Singleton();

}

}

}

return singleton;

}

}
17.如何在父类中为子类自动完成所有的hascode和equals实现?这么做有何优劣?




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值