Java基础面试题,适用于初级
java常见的继承、多态相关、String等
- String和StringBuffer的区别
答:java中它们都可以存储和操作单个或者多个字符串。String是final修饰的,表示其不可变性;而StringBuffer提供对字符串的修改,而且可以动态的进行字符串的组装。(注:可了解StringBuffer和StringBulider的区别)。 - 覆盖(重写)和重载的区别;
答:重载一般是定义名称相同的方法,通过传入不同的参数(个数、类型等)来区分这些方法,会根据不同的参数样式来选择执行哪一个方法。(一个类)
(1)不同参数个数、不同参数类型、不同参数顺序;
(2)方法的异常不会对重载造成影响。
重写指的是指在修改方法之后,使方法达到不同的作用。(多个类)
(1)覆盖方法的标识符必须一致
(2)返回值必须一致
(3)子类所抛出的异常必须是父类的子类或者相同。
注:如果存在继承关系时,父类访问权限为private,则子类不构成重写或者覆盖。 - 接口可否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?
答:继承可以继承接口。抽象类可以实现接口,抽象类可以继承实体类,前提条件是:实体类必须有明确的构造函数。 - 抽象类和接口的区别?
答:该问题需要回答抽象类和接口分别是什么,再比较其区别。修饰符的不同,方法是否可以被实现,是否存在多继承关系,在java1.8之后的接口中是否可以实现方法。 - String类型是否可以作用在switch上:不可以,Long也不行,不清楚就说没用过,不知道。
- 什么是多态?
答概括一下:在同一时刻调用同一个方法引用,产生不同的结果:类的覆盖,方法的重载,最好可以举例说明。如一个人在不同的国家的语言表达等。
条件:存在继承关系。父类的引用指向子类的对象,覆盖。
异常相关、线程和同步锁等
- 运行时异常是什么,列举几个常见的异常。
答:RuntimeException,指的是程序在运行过程中出现的异常,可人为捕获或者抛出,项目中可作为自定义异常。
常见异常:中断异常、数组越界异常、类找不到异常、SQL异常、类型转换异常、空指针异常、IO流异常等等。 - try、throw、throws,抛出异常和捕获异常形式等。
答:try…with…resource是最为常见的一种,用于捕获异常使用,还有一种为直接捕获try()catch即可,throw代表在方法中抛出,可捕获,throws一般是指在方法抛出异常,交给调用者进行异常处理。一般来说都是catch捕获,finally(执行其他) - 多线程实现方法
答:继承Thead类和实现Runnable接口,同步的实现方式是sychronized和wait+notify。 - 什么是Java序列化?如何实现Java序列化?
答:序列化是指将对象转化为流进行处理,即对流化的对象进行读写操作。
将需要进行序列化的对象实现Serializable接口,转化为流形式,此方法也是进行深拷贝的方法之一。 - 当一个线程进入一个对象的一个sychronized方法后,其它线程是否可以进入此对象的其他方法
答:分为几种情况:
(1)看是否加了sychronized关键字,没加则可以。
(2)方法内部如果调用了wait,则可以进入其他的Sychronized方法
(3)如果其他方法是静态的,同步的是当前类的字节码,与非静态的方法不能同步,因为非静态使用的是this。 - sleep和wait的区别
答:sleep指的是让一个正在运行的线程沉睡,属于静态方法,需要捕获中断异常。
wait是指让线程处于等待转台,释放该线程所持有的锁,由notify或者Allnotify唤醒,让线程处于竞争状态,无法确定线程的优先级,由JVM调用。
集合
-
Collection和Collections的区别。
答:Collections是集合的一个工具类,提供了集合操作的一些方法。
Collection是List和Set集合的一个父接口。List集合包括LinkedList,ArrayList,Vector等,其中Vector是线程安全的,相对来说运行速度比较慢。Set是一个不重复且有序的集合,包括hashSet,TreeSet等。 -
HashMap和Hashtable的区别
答:HashMap和Hashtable都是Map集合中的分支。HashMap是线程不安全的,Hashtable是线程安全的,开发中使用的还有一种叫做CurrentHashMap。 -
HashMap的工作原理是什么?
答:(1)基于Hashing,使用put(key,value)将数据存储到Hashmap中。
(2)在使用get获取对象,利用hashcode找到对应的实体,那种map中的键值对。 -
如果两个对象的hashcode相同会发生什么?
答:线性冲突,即碰撞,可了解数据结构中散列哈希表中解决方法,有两种一种为线性探测,一种为二次探测。 -
hashMap的几个注意点:
答:当一个map填满了负载因在到达0.75时时,会重新调整为原来的两倍,以满足内存需要;
链表长度到达8时,会转化为红黑树(具体问道可以说,暂时没接触,不太了解,大佬无所谓)
Java的JVM相关
- 简单介绍Java的GC垃圾回收机制。
答:作用:防止内存泄漏。
回收机制:
(1)对长时间不使用的对象
(2)占用内存过多的无用对象
(3)调用System.gc()方法。 - Java中内存泄漏的情况:
答:长生命周期的对象持有短生命周期对象的引用。(具体可以说自己没用过,没遇到过,大佬除外) - 堆栈
答:(1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。
(2)堆的优势是可以动态地分配内存空间,需要多少内存空间不必事先告诉编译器,因为它是在运行时动态分配的。但缺点是,由于需要在运行时动态分配内存,所以存取速度较慢。
(3)栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用。
(4)栈的优势是,存取速度比堆快,栈数据可以共享。但缺点是,存放在栈中的数据占用多少内存空间需要在编译时确定下来,缺乏灵活性。 - jvm底层实现
答:讲清楚java文件的编译过程,一般是将java文件转为class文件,由jvm转化为机器码进行识别,具体可以说不清楚。