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实现?这么做有何优劣?