美文网首页Spring-Boot微服务架构和实践程序员
Java面试必问之20道经典试题(附答案)

Java面试必问之20道经典试题(附答案)

作者: b81958a6edee | 来源:发表于2019-03-20 21:27 被阅读5次

    基础不牢,地动山摇。在众多的面试过程中,我们不难发现,基础知识在面试过程中占据了极大的一部分分值,若想在面试中能稳如泰山,拿下心意offer,这些题目将是我们必备的面试法宝。如有错误,望加以斧正补充,自当深表感激。

    Java基础面试题

    1、java中==和equals()的区别???

    答:简单来说==适合应用于基本数据类型的比较,而重写后equals()方法适合应用于引用类型的比较。原因在于基本类型变量直接存储的是值本身,而引用类型变量存储的是对象的引用,当引用相同时,用==比较,自然会是true,当引用不同时,用==比较,则会是false.equlals方法是object中的方法,对于所有继承于object的类都会有该方法,当使用equals方法是需对此方法进行重写,如果没有对equals方法重写,则比较的是引用类型的,变量所指向的对象的地址,没有重写的equals,和==效果相同,只有重写了equals,比较的才会是所指对象的内容。

    2、java中String、StringBuild、StringBuffer的区别???

    答:String是不可变类,因此对String进行操作都会产生新的String对象,容易导致效率低下,浪费内存空间。因此,为了应对经常性的字符串操作,引入了StringBuffer、StringBuild这种字符串变量。StringBufffer和StringBuild最大的区别,就是StringBuffer线程安全,但效率低,而StringBuild线程不安全,但效率高,且此两者只能通过构造函数的方式初始化。而String可以通过构造函数和字面量复制两种方式。

    3、java中重载(overload)、重写(override)的区别???

    答:1)重载是通过不同的方法参数来区分的,例如不同的参数个数、不同的参数类型、或者不同的参数顺序。不能通过方法的访问权限、返回值类型、和抛出异常类型类进行重载。2)覆盖是指子类函数覆盖父类函数,覆盖一个方法,并对其重写。重写需要注意,子类必须与父类中,被重写的方法有相同的函数名、相同的参数、相同的返回值、以及抛出异常也必须保持一致。

    4、java中接口和抽象类的区别???

    答:1)、抽象类和接口都不能直接实例化

    2)、抽象类要被子类继承(extends),接口要被类实现(implements)

    3)、接口只能做方法的声明,且所有方法访问权限必须是public,抽象类中可以做方法声明,也可以做方法的实现。

    4)、接口中定义的变量只能是公共的静态常量,抽象类中的变量可以是普通变量。

    5)、抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类的抽象方法,那么该子类只能是抽象类。同理如果在实现接口的时候,如果不能实现接口方法,那么该类也只能为抽象类。

    6)、抽象方法只能声明,不能实现,接口是设计的结果,抽象类是重构的结果。

    7)、抽象类里可以没有抽象方法。

    8)、一个类里有抽象方法,那么这个类只能是抽象类。

    9)、抽象方法需要被实现,因此不能是私有的,也不能是静态的。

    10)、接口可以继承接口,并可多继承接口,但类只能单根继承。

    5、java中this和super的区别???

    答:1)、this三大作用

    1、普通的直接引用(指向当前对象的指针)

    2、形参与成员名字重名(用this区分)

    3、引用构造函数

    2)、super三大作用

    1、普通的直接引用(指向当前对象的父类)

    2、子类中的成员变量或者方法和父类成员变量和方法重名。

    3、引用构造函数

    super(参数):调用基类中的某一个构造函数(应该为构造函数中的第一条语句)

    this(参数):调用本类中另一种形成的构造函数(应该为构造函数中的第一条语句)

    super: 它引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名 super.成员函数据名(实参)

    this:它代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名)

    调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。

    super()和this()类似,区别是,super()从子类中调用父类的构造方法,this()在同一类内调用其它方法。

    super()和this()均需放在构造方法内第一行。尽管可以用this调用一个构造器,但却不能调用两个。

    this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。

    this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。

    从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

    6、java中Static关键字有哪些特点???

    答:

    1)、static成员变量

    静态变量:属于类,内存中只有一个复制,所有实例都指向同一个内存地址,只要类被加载,静态变量就会本分配空间,调用方式有两种。类.静态变量 和 对象.静态变量

    实例变量:属于对象,只有对象被创建,实例对象才会被分配空间,调用方式:对象.实例变量

    2)、static成员方法

    静态方法:属于类,不需要创建对象,就可以被调用。调用方式:类.静态方法 和 对象.静态方法

    非静态方法:属于对象,只能在对象被创建出来之后才可以被使用。

    注意:static方法中,不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和静态成员方法。

    7、java中length属性与length()方法有什么区别???

    答:length属性属于数组,用来获取数组的长度;而length()方法属于String 用来计算字符串长度。

    8、java中Collections框架是什么???

    答:Collection是整个集合框架的基础,它里面存储了一组对象,用于表示不同类型的Collections.主要有一下三种,其特点如下。

    1)、set 主要特点集合中元素不能重复。

    2)、list有序的Collection,按照对象的进入顺序保存对象,可以重复。

    3)、map提供了从键映射到值得数据结构,值可以重复单键必须唯一。

    9、java中ArrayList 、Vector 、LinkedList有什么区别???

    答:ArrayList 、Vector 、LinkedList类均在java.util包,均为可伸缩数组,即可以动态改变长度的数组。

    ArrayList 、Vector 都是基于数组来实现的,数据存储是连续的,支持下标访问元素,查询快,插入慢。

    区别在于:ArrayList提供的方法都不是同步的,且线程不安全,但效率高。Vector大部分方法都是同步的,且线程安全,效率低。

    LinkedList 采用双向链表来实现,因此访问效率低,插入效率高,且该容器是非线性安全的。

    10、java中HashTable与HashMap有什么区别???

    答:

    1、父类不同:

    HashMap是继承自AbstractMap类,而HashTable是继承自Dictionary。但都是实现了Map方法。

    2、null值不同:

    HashMap可以允许存在一个为null的key和任意个null的value,但是HashTable中的key和value都不允许为null。

    3、线程安全性:

    hashtable是线程安全的,hashmap不之初线程同步,不是线程安全的

    11、同步与异步的区别???

    答:所谓的同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不会放回,或继续执行后续操作。简单来说,同步就是必须一件一件的来做,等前一件事做完了,才能做下一件事。

    异步,当异步过程调用发出后,调用者在没有得到结果之前就可以执行后续操作,

    当这个调用完成之后,一般通过状态,通知和回调通知,调用者。对于异步调用,其返回并不受调用者控制。

    12、HashCode()与equals的关系???

    答:

    1)、hashcode是object类的一个方法,返回值是该对象的哈希码值,同一个对象的哈希码值一定相等,但是不同的对象的哈希码值也是有可能相等的。

    2)、equals同样是object类的一个方法,比较两个对象是否是同一个对象,其内部实现是通过==来比较两个对象的内存地址是否相等的,如果需要比较两个对象的内容是否相等,则需要重写equals方法,重写的equals方法用于比较对象的内容是否相等。

    3)、因此如果两个对象根据equals()方法比较相等,那么这两个对象的hashcode()返回值一定相等,如果两个对象的hashcode()返回值相等,其equals()比较结果也不一定是true。

    13、String类通过new创建和直接赋值字符串的区别???

    答:

    方式一:String a = “aaa” ;

    方式二:String b = new String(“aaa”);

    两种方式都能创建字符串对象,但方式一要比方式二更优。

    因为字符串是保存在常量池中的,而通过new创建的对象会存放在堆内存中。

    一:常量池中已经有字符串常量”aaa”

    通过方式一创建对象,程序运行时会在常量池中查找”aaa”字符串,将找到的”aaa”字符串的地址赋给a。

    通过方式二创建对象,无论常量池中有没有”aaa”字符串,程序都会在堆内存中开辟一片新空间存放新对象。

    二:常量池中没有字符串常量”aaa”

    通过方式一创建对象,程序运行时会将”aaa”字符串放进常量池,再将其地址赋给a。

    通过方式二创建对象,程序会在堆内存中开辟一片新空间存放新对象,同时会将”aaa”字符串放入常量池,相当于创建了两个对象。

    14、Java中Int与integer用==比较详解???

    答:

    ①、无论如何,Integer与new Integer不会相等。不会经历拆箱过程,因为它们存放内存的位置不一样。(要看具体位置,可以看看这篇文章:点击打开链接)

    ②、两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。

    ③、两个都是new出来的,则为false。

    ④、int和integer(new或非new)比较,都为true,因为会把Integer自动拆箱为int,其实就是相当于两个int类型比较。

    15、Java中final关键字的理解 ???

    答:final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。

    1)、final关键字可以用于成员变量、本地变量、方法以及类。

    2)、final方法不能被重写。

    3)、final类不能被继承。

    4)、final关键字不同于finally关键字,后者用于异常处理

    5)、final关键字容易与finalize()方法搞混,后者是在Object类中定义的方法,是在垃圾回收之前被JVM调用的方法。

    16、Java中public、private、protected关键字的理解 ???

    答:

    1)、public 表明该成员变量或者方法,对所有类或者对象都是可见的,所有类和对象都可以直接访问。

    2)、private 表明该成员变量或者方法是私有的,只有当前类对其具有访问权限。

    3)、protected 表明成员变量或者方法对该类自身,与它在同一个包中的其他类可见,在其他包中的该类的子类都可见。

    4)、dafault 表明该成员变量或者方法只有自己和与其位于同一个包中的类可见,若父类和子类位于同一个包中,则具有访问权限,如父类和子类不在同一个包中,则没有访问权限。

    17、什么是构造函数 ???

    答:

    1)、构造函数必须和类名相同,并且不能有返回值(返回值也不能为void)

    2)、每个类可以有多个构造函数,构造函数可以有多个参数。

    3)、构造函数总是伴随new 操作一起调用,且不能直接调用,必须由系统调用。

    4)、构造函数主要作用完成对象的初始化工作。

    5)、构造函数不能被继承,因此,不能被覆盖,但是可以重载。

    18、多态的实现机制是什么 ???

    答:多态主要有一下两种表现形式。

    1)、方法的重载(overload)。重载是指同一个类中有多个同名的方法,但是这些方法具有着不同的参数,重载可以被看做一个类中方法的多态性。

    2)、方法的覆盖(overide)。子类可以覆盖父类的方法,因此同样的方法会在父类和子类中有着不同的表现形式。这种形式,因为只有在调用时才能确定调用的是哪个方法,因此被称为运行时多态。

    19、什么是线程,什么是进程,它们之间的区别是什么 ???

    答:

    线程:程序执行过程中,能够执行代码的一个执行单元。四种状态(运行、就绪、挂起、结束)

    进程:是指一段正在执行的程序。

    其关系如下:

    1)、一个线程只能属于一个进程,而一个进程可以有多个线程,但是至少有一个线程,线程是操作系统可识别的最小执行和调度单位。

    2)、资源分配给进程,同一个进程中的所有线程共享该进程中的所有资源,同一个进程多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程用有独立的栈段,栈段用来存放所有的局部变量和临时变量。

    3)、处理机分给线程,即真正的处理机上运行的是线程。

    4)、线程在执行过程中,需要协作同步。不同的进程的线程间要利用通信的办法实现同步。

    20、Http中GET与POST方法有什么区别???

    答:

    1)、采用get方式向服务器上传数据,一般将数据添加到url后面,并且二者用“?”连接,各个变量之间用“&”连接,由于url长度存在限制,因此采用这种方式上传数据量非常小。而post方式传递的数据是通过http请求的附件进行的,传送的数据量比较大,一般默认不受限制。

    2)、由于get方式将数据追加在url之后,数据彻底暴露出来,本身存在安全隐患,而post方式向服务器上传数据时,对用户是不可见的,安全性比get方式会更优。

    相关文章

      网友评论

        本文标题:Java面试必问之20道经典试题(附答案)

        本文链接:https://www.haomeiwen.com/subject/vzrxvqtx.html