Java教程

java面试基础(一)

本文主要是介绍java面试基础(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

1、接口和抽象类的相同与区别?

相同:
两者都不能被实例化。
只有接口的实现类和抽象类的子类实现接口或抽象类中方法才能实例化。
不同:
接口只能定义方法,不能实现方法,抽象类可以定义和实现方法。
一个类可以实现多个接口,但只能继承一个抽象类。

2、Java提供的多态机制?

重载和覆盖
重载:同一个类中有多个同名方法,但这些同名方法的参数列表不同,在编译时期可以调用不同参数的方法。
覆盖:当一个子类继承了父类后,也同时继承了父类的属性和方法,当父类的方法不能满足子类的需求时,可以在子类中对父类的方法进行改造,即覆盖。在覆盖的过程中,需要提供与父类中被覆盖方法相同的方法名,参数列表即返回类型。

3、覆盖与重载的区别?

1、覆盖是父类与子类之间的关系,是垂直关系,重载是一个类中多个方法直接的关系,是平行关系。
2、覆盖是一个或一对方法产生关系,重载是多个方法。
3、覆盖要求是相同的参数列表,重载要求是不同的参数列表。
4、覆盖中,调用方法是根据对象的类型来决定的,而重载中,调用方法是根据调用时实参与形参来选择方法体。
5、覆盖方法可以改变方法的返回值类型,而重载方法不能改变方法的返回值类型。

4、为什么要把String设计为不变量?

节省空间:字符串常量存储在JVM的字符串池中,可以被用户共享。
提高效率:String会被不用的线程共享,是线程安全的。在涉及多线程操作中不需要同步操作。
安全:String常被用于用户名,密码,文件名,不容易被黑客篡改。

5、Java异常的分类?

Error(程序无法处理的错误),Exception(程序本身可以处理的异常),这两个类均继承Throwable。
Error常见的有StackOverFlowError(堆栈异常)和OutOfMemoryError(内存溢出异常)。
Exception分为运行时异常和非运行时异常,运行时异常可以try/catch捕获或者不处理,但是非运行时异常必须处理,不然无法通过编译。

6、throw和thorws的区别?

一般throw是在定义在方法体中的,用于程序出现异常时主动抛出异常信息。
而throws一般用于方法声明上,代表该方法可能会抛出的异常列表。

7、泛型

泛型,即“参数化类型”,用来解决不确定对象具体类型的问题,在编译阶段有效。

8、内部类及其作用

成员内部类:作为成员对象的内部类。可以访问private及以上外部类的属性和方法。外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。外部类也可访问private修饰的内部类属性。
局部内部类:存在于方法中的内部类。访问权限类似局部变量,只能访问外部类的final变量。
匿名内部类:只能使用一次,没有类名,只能访问外部类的final变量。
静态内部类:类似类的静态成员变量。

9、String,StringBuilder,StringBuffer

String类采用final修饰,不可变,想要修改对象,需要new对象来修改,同时将旧串和新串存进去。
StringBuilder采用无final修饰的字符数组进行保存,可变,但是线程不安全
StringBuffer采用无final修饰的字符数组进行保存,可变,线程安全,可以认为成线程安全的StringBuilder

10、Java中的List

List是一个有序列表,分为以下两种实现方式:
ArrayList使用数组实现,容量可变,非线程安全,随机访问快,扩容时会创建一个更大容量的数组,将旧数组复制到新数组。
LinkedList本质是双向链表,与ArrayList相比插入和删除快,随机访问元素很慢。
​
如果涉及到多线程,那么就选择Vector(当然,你也可以使用ArrayList并自己实现同步)。
​
如果不涉及到多线程就从LinkedList、ArrayList中选。 LinkedList更适合从中间插入或者删除(链表的特性)。 ArrayList更适合检索和在末尾插入或删除(数组的特性)。

11、Java中线程安全的基本数据类型?

HashTable:哈希表的线程安全版,效率低
ConcurrentHashMap:哈希表的线程安全版,效率高,用于替代HashTable
Vector:线程安全的ArrayList
Stack:线程安全的Blocking
Queue及其子类:线程安全版队列

这篇关于java面试基础(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!