这些面试题都是从群里(互联网java技术学习 99350049)看来的,里面的面试题都是和JAVA相关的,看了后觉得自己很多都不会或者很多只知道概念但是没法很好的说出来,所以用这篇文章来理理JAVA基础相关面试题的回答。说不清楚或者不会的题目就先空着了,等会的时候再来补充。
1、JAVA中的几种基本数据类型是什么,各自占多少个字节。
8种基本数据类型。
byte、boolean:1个字节
short、char:2个字节
int、float:4个字节
long、double:8个字节
2、String类能被继承吗,为什么。
不能,String类被final修饰
3、String,StringBuffer,StringBuilder的区别。
String:每一个String都会占用空间,如果用3个字符串拼接最后结果,相当于建立4个String对象。
StringBuffer和StringBuilder是可变的,可以理解为存储字符串的容器,最终返回一个String对象。
StringBuffer是线程安全的
StringBuilder是非线程安全的
4、ArrayList和LinkedList的区别。
前提:已知在哪个位置进行相应操作时
ArrayList:基于数组,读取快,添加\删除慢
LinkdedList:基于链表,读取慢(需要从头结点或尾结点一个一个找),添加\删除快
如果是用Iterator遍历的方式来读取的话,2者没有区别,因为Iterator内部会记录当前要读的索引或结点。
5、讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当new的时候,他们的执行顺序。
class Person{
public static String str = "Person";
public Person(){
System.out.println("Person constructor");
}
public Person(String str){
System.out.println("Person say :" + str);
}
}
class XMPerson extends Person{
private int age;
private String name;
private String area;
public static String str = "XMPerson";
public XMPerson(){
System.out.println("XMPerson constructor");
age = 22;
name = "zhangxx";
}
{
System.out.println("construnctor");
area = "XM";
}
}
new XMPerson();
1)加载Person类,并进行初始化即进行静态变量str的赋值和静态块的执行。
2)加载XMPerson类,并进行初始化即进行静态变量str的赋值和静态块的执行。
3)在堆内存中开辟空间,分配地址
4)在对象空间中,对对象中de属性进行默认初始化
5)调用对应的构造函数进行对象的实例化
6)将地址赋值给引用变量
其中第5)步的具体操作过程为:
1、构造函数如果没有显示调用super或this,则第一行会先调用父类的构造函数
2、父类构造函数执行完后,对子类的属性进行显示初始化
3、执行构造代码块,进行area的赋值
4、执行子类构造函数的特定初始化
执行结果:
Person constructor
construnctor
XMPerson constructor
6、用过哪些Map类,都有什么区别,HashMap是线程安全的吗,并发下使用的Map是什么,他们内部原理分别是什么,比如存储方式,hashcode,扩容,默认容量等。
7、JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
8、有没有顺序的Map实现类,如果有,他们是怎么保证有序的。
有,LinkedHashMap。
通过双链表保证有序。LinkdedHashMap内部有个Entry<K,V>类型的变量作为头结点,LinkedHashMap实例化后,header.after = header.before = header.
每当push时,会执行current.after = header;current.before = header.before;current.after.before = this;current.before.after = this;
注意:最后一个结点的after指向的是header,这样构成循环双链表。
9、抽象类和接口的区别,类可以继承多个类么,接口可以继承多个接口么,类可以实现多个接口么。
abstract修饰的类为抽象类,修饰的方法是抽象方法。
抽象类:被abstract修饰的类。允许存在非抽象方法。只要有抽象方法就要定义成抽象类。不能被实例化
接口:interface修饰类,是特殊的抽象类。全部方法都是抽象方法。不能被实例化
类不可以继承多个类,接口可以继承多个接口,类可以实现多个接口。
10、讲讲你理解的nio。
同步非阻塞。遗留
11、反射的原理,反射创建类的3种方式是什么。
获取字节码文件对象,去使用构造方法、成员变量、成员方法。
1)
Class clazz = XMPerson.class;
XMPerson per1 = (XMPerson) clazz.newInstance();
2)
Class clazz = XMPerson.class;
Constructor constructor = clazz.getConstructor();
constructor.newInstance();
3)
Class<?> classType = Class.forName("java.lang.String");
Object array = Array.newInstance(classType, 10);
补充:获取字节码文件对象的4种方法
1)Class clazz = XMPerson.class
2)XMPerson xmPerson = new XMPerson();
Class clazz = xmPerson.getClass();
3)Class clazz = Class.forName(com.zxx.task.XMPerson);
4)Class clazz = XMPerson.class.getClassLoader().loadClass("com.zxx.task.XMPerson");
12、反射中,Class.forName和ClassLoader的区别。
Class.forName这个方法有2个重载方法:
Class.forName(String className)
Class.forName(String name,boolean initialize,ClassLoader loader)
第二个方法的第二个参数表示是否初始化,true为初始化。
第一个方法等价于Class.forName(className, true, ClassLoader.getCallerClassLoader())
Class.forName加载类时可以选择是否进行初始化,初始化即执行static变量的赋值和static语句块
ClassLoader加载类是不会进行初始化
未进行初始化的类在第一次使用时会进行初始化。
13、描述动态代理的几种实现方式,分别说出相应的优缺点。
14、动态代理和CGLIB实现的区别。
15、为什么CGLIB方式可以对接口实现代理。
16、Final的用途。
可修饰类、变量、方法。
final修饰的类、变量、方法异味着类不能被继承,变量不能被重新赋值,方法不能被重写。
17、写出3种单例模式实现。
1)
class Singleton{
private Singleton(){
}
private static Singleton singleton= new Singleton();
public SingletongetInstance(){
return singleton;
}
}
2)
class Singleton{
private Singleton(){
}
private static Singleton singleton;
public SingletongetInstance(){
if(singleton== null){//避免每次都要执行synchronized
synchronized(Singleton.class){//保证同步
if(singleton== null){
singleton= new Singleton();
}
}
}
return singleton;
}
}
3)
enum Singleton{
INSTANCE;
}
可参考http://www.oschina.net/code/snippet_107039_6062
18、如何在父类中为子类自动完成所有的hashCode和equals实现,这么做有何劣势。
19、请结合OO设计理念,谈谈访问修饰符public、private、protected、default在应用设计中的作用。
20、深拷贝和浅拷贝区别。
21、数组和链表数据结构描述,各自的时间复杂度。
数组要求连续的存储空间,链表不需要连续的存储空间。遗留
22、error和exception的区别,RuntimeException,RuntimeException的区别。
error和exception均是可抛异常,当发生error时表示发生了不可控制的异常,程序无法继续处理。遗留
23、请列出5个运行时异常。
NullPointException,ArrayOutOfIndexException.遗留
24、在自己的代码中,如果创建一个java.lang.String对象,这个对象是否可以被类加载器加载。为什么。
25、说一说你对java.lang.Object对象中的hashCode和equals方法的理解。在什么场景下需要重新实现这2个方法。
HashSet和HashMap情况下需要重新实现遗留
26、在jdk1.5中,引入了泛型,泛型的存在是用来解决什么问题。
27、这样的a.hashCode()有什么作用,与a.equals(b)有什么关系。
28、有没有可能2个不相等的对象有相同的hashCode.
有可能。这叫哈希冲突。遗留
29、Java中的HashSet内部是如何工作的。
HashSet无序的,如果写入时已有相同对象则抛弃。遗留
30、什么是序列化,怎么序列化,为什么序列化,反序列化后会遇到什么问题,如何解决。
什么是序列化:将对象转化成流的过程称为序列化
怎么序列化:类实现Serializable。eg.Person implements Serializable
为什么序列化:为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。
遗留