史上最全Java面试题合集400道(面试20k+程序员必备)
1. final关键字的作用?
被final修饰的类不可以被继承,被final修饰的方法不可以被重写,被final修饰的变量不可以被改变.如果修饰引用,那么表示引用不可变,引用指向的内容可变.被final修饰的方法,JVM会尝试将其内联,以提高运行效率,被final修饰的常量,在编译阶段会存入常量池中.
2. java语言基础题库 abstract class 和interface有什么区别?
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract类的实例。然而可以创建一一个变量, 其类型是-一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final 成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof运算符可以用来决定某对象的类是否实现了接口。
3. Java 集合类: list、 set、queue、 map、stack 的特点与用法?
Map
Map是键值对,键Key是唯一不能重复的, -一个键对应一一个值, 值可以重复。
TreeMap可以保证顺序,HashMap不保证顺序,即为无序的,Map 中可以将Key和Value单
独抽取出来,其中KeySet()方法可以将所有的keys抽取成- -个 Set,而Values() 方法可以
将map中所有的values抽取成一个集合。
Set
不包含重复元素的集合,set 中最多包含一个null元素,只能用Iterator实现单项遍历,
Set中没有同步方法。
List
有序的可重复集合,可以在任意位置增加删除元素,用Iterator实现单向遍历,也可用
ListIterator实现双向遍历。
Queue
Queue遵从先进先出原则,使用时尽量避免add()和remove()方法,而是使用offer ()来添加
元素,使用poll()来移除元素,它的优点是可以通过返回值来判断是否成功,LinkedList
实现了Queue接口,Queue 通常不允许插入null元素。
Stack
Stack遵从后进先出原则,Stack 继承自Vector,它通过五个操作对类Vector进行扩展,允许将向量视为堆栈,它提供了通常的push和pop操作,以及取堆栈顶点的peek()方法、
测试堆栈是否为空的empty方法等。
用法
如果涉及堆栈,队列等操作,建议使用List。
对于快速插入和删除元素的,建议使用LinkedList.
如果需要快速随机访问元素的,建议使用ArrayList.
4.说出ArrayList, Vector, LinkedList 的存储性能和特性?
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便
增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内
存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized 方法(线程安全), .
通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要
进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。.
5.内存泄漏和内存溢出?
内存泄漏(memoryleak),是指应用程序在申请内存后,无法释放已经申请的内存空间,一
次内存泄漏危害可以忽略,但如果任其发展最终会导致内存溢出Coutofmemory) 。如读取
文件后流要进行及时的关闭以及对数据库连接的释放。
内存溢出(outofmemory)是指应用程序在申请内存时,没有足够的内存空间供其使用。如我
们在项目中对于大批量数据的导入,采用分批量提交的方式。
6.反射中,Class. forName ()和ClassLoader. loadClass ()的区别?
lass.forName(lassName)方法,
内.部实际调用的方法是
Class.forName(className,true,lassloader);
第2个boolean参数表示类是否需要初始化,Class.forNamel(lassName)默认 是需要初始化,
一旦初始化,就会触发目标对象的static 块代码执行,static 参数也也会被再次初始
化,CassaderladlasslassName) 方法,内部实际调用的方法是
Classloader.loadClass(className,false);第2个boolean 参数,表示目标对象是否进行链接,
如果需要获取到这个【Java面试知识点整理】文档的话,评论文章+私信资料即可。





版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/2069.html