常见基础JAVA面试题
1.是否可以在static环境中访问非static变量?
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。
2.Java支持的数据类型有哪些?什么是自动拆装箱。
byte,short,int,long,float,double,boolean,char
自动装箱是指Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。如int转化成Integer,反之就是自动拆箱。
3.方法覆盖(Overriding)和方法重载(Overloading)是什么意思?
方法重载发生在同一个类里面两个或者多个方法的方法名相同,但是参数不同。
而覆盖是指子类重新定义了父类的方法。方法覆盖必须要有相同的方法名,参数列表和返回类型。
4.接口和抽象类的区别
不同之处:
-
接口中所有的方法都是抽象的,而抽象类则可以包含抽象方法和非抽象方法。
-
类可以实现多个接口,但是只能继承一个抽象类。
-
类如果实现一个接口,必须声明接口的所有方法,而可以不实现抽象类的所有方法。
-
抽象类可以在不提供接口方法实现的情况下实现接口。
-
接口声明的变量默认是final,抽象类可以包含非final变量。
-
接口成员函数默认是public,抽象类成员函数可以是private,protected或者是public。
5.创建线程的方法
5.1继承Thread类创建线程
-
定义Thread类子类,并重写run()方法
-
创建Thread子类实例,也就是创建线程对象
-
启动线程,即调用start()方法
public class MyThread extends Thread{ public void run(){ //重写run方法 } } public class Main(){ public static void main(String[] args){ new MyThread().start();//创建并启动线程 } }
5.2实现Runnable接口创建线程
-
定义Runnable接口实现类,重写run()方法
-
创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象
-
调用start()方法
public class MyThread implements Runnable{ public void run(){ } } public class Main{ public static void main(Stirng[] args){ MyThread myThread = new Mythread(); Thread thread = new Thread(myThread); thread().start(); //或者 //new Thread(new MyThread()).start() } }
5.3使用Callable和Future创建线程
5.4使用线程池创建线程
6.什么是死锁
两个进程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁。结果就是两个进程都陷入了无限的等待中。
7.Java集合类框架的基本接口有哪些?
Collection:代表一组对象,每一个对象都是它的子元素
Set:不包含重复元素的Collection
List:有顺序的collection,可包含重复元素
Map:可以把键(Key)映射到值(value)的对象,键不能重复
8.Java中HashMap的工作原理是什么?
Java中HashMap是以键值对(Key-value)的形式存储元素。HashMap需要一个hash函数,它使用hashCode()和equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把键值对存储在集合中合适的索引上。如果key已经存在,那么value就会被更新成新的值。
9.HashMap和Hashtable的区别是什么?
HashMap和Hashtable都实现了Map接口,区别是:
- HashMap允许键和值是null,Hashtable不允许键或者值是null
- Hashtable是同步的,而HashMap不是,HashMap适合于单线程。
10.ArrayList和LinkedList的区别是什么?
-
ArrayList的实现是基于数组来实现的,LinkedList的基于双向链表来实现。这两个数据结构的逻辑关系是不一样,当然物理存储的方式也会是不一样。
-
LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。
-
对于随机访问,ArrayList要优于LinkedList。
-
对于插入和删除操作,LinkedList优于ArrayList(理论上),实际并非如此(实际上ArrayList不论是插入还是删除效率,在元素数量趋多时,都是要优于LinkedList的),因这其中涉及数组与链表在元素操作方式、时间与空间上的复杂度计算问题,所以具体问题须具体分析和佐证。
11.如果存储相同的数据,ArrayList和LinkedList谁占用的空间更大?
- 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
- 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据,若要从数组中删除或插入某一个对象,需要移动后段的数组元素,从而会重新调整索引顺序,调整索引顺序会消耗一定的时间,相反,LinkedList是使用链表实现的,若要从链表中删除或插入某一个对象,只需要改变前后对象的引用即可
12.异常处理的时候,finally代码块的重要性是什么?
无论是否抛出异常,finally代码块总是会被执行。就算没有catch语句同时又抛出异常的情况下,finally代码块仍然会被执行。finally代码块主要是用来释放资源。