史上最全Java面试题之相关概念篇!(带所有答案)

面向对象的三个特征
封装,继承,多态,这个应该是人人皆知,有时候也会加上抽象。java

多态的好处
容许不一样类对象对同一消息作出响应,即同一消息能够根据发送对象的不一样而采用多种不一样的行为方式(发送消息就是函数调用)。主要有如下优势:c++

1.可替换性:多态对已存在代码具备可替换性面试

2.可扩充性:增长新的子类不影响已经存在的类结构sql

3.接口性:多态是超类经过方法签名,向子类提供一个公共接口,由子类来完善或者重写它来实现的。缓存

4.灵活性架构

5.简化性并发

代码中如何实现多态框架

实现多态主要有如下三种方式:分布式

  1. 接口实现
  2. 继承父类重写方法
  3. 同一类中进行方法重载

虚拟机是如何实现多态的函数

动态绑定技术(dynamic binding),执行期间判断所引用对象的实际类型,根据实际类型调用对应的方法。

接口的意义

接口的意义用三个词就能够归纳:规范,扩展,回调。

抽象类的意义

抽象类的意义能够用三句话来归纳:

为其余子类提供一个公共的类型

封装子类中重复定义的内容

定义抽象方法,子类虽然有不一样的实现,可是定义时一致的

接口和抽象类的区别

clipboard.png

父类的静态方法可否被子类重写

不能。重写只适用于实例方法,不能用于静态方法,而子类当中含有和父类相同签名的静态方法,咱们通常称之为隐藏。

什么是不可变对象

不可变对象指对象一旦被建立,状态就不能再改变。任何修改都会建立一个新的对象,如 String、Integer及其它包装类。

静态变量和实例变量的区别?

静态变量存储在方法区,属于类全部。实例变量存储在堆当中,其引用存在当前线程栈。

可否建立一个包含可变对象的不可变对象?

固然能够建立一个包含可变对象的不可变对象的,你只须要谨慎一点,不要共享可变对象的引用就能够了,若是须要变化时,就返回原对象的一个拷贝。最多见的例子就是对象中包含一个日期对象的引用。

java 建立对象的几种方式

  • 采用new
  • 经过反射
  • 采用clone
  • 经过序列化机制

前2者都须要显式地调用构造方法。形成耦合性最高的刚好是第一种,所以你发现不管什么框架,只要涉及到解耦必先减小new的使用。

switch中可否使用string作参数

在idk 1.7以前,switch只能支持byte, short, char, int或者其对应的封装类以及Enum类型。从idk 1.7以后switch开始支持String。

switch可否做用在byte, long上?

能够用在byte上,可是不能用在long上。

String s1=”ab”, String s2=”a”+”b”, String s3=”a”, String s4=”b”, s5=s3+s4请问s5==s2返回什么?

返回false。在编译过程当中,编译器会将s2直接优化为”ab”,会将其放置在常量池当中,s5则是被建立在堆区,至关于s5=new String(“ab”);

你对String对象的intern()熟悉么?

intern()方法会首先从常量池中查找是否存在该常量值,若是常量池中不存在则如今常量池中建立,若是已经存在则直接返回。

好比

String s1=”aa”;

String s2=s1.intern();

System.out.print(s1==s2);//返回true

Object中有哪些公共方法?

equals()

clone()

getClass()

notify(),notifyAll(),wait()

toString

java当中的四种引用

强引用,软引用,弱引用,虚引用。不一样的引用类型主要体如今GC上:

强引用:若是一个对象具备强引用,它就不会被垃圾回收器回收。即便当前内存空间不足,JVM也不会回收它,而是抛出 OutOfMemoryError 错误,使程序异常终止。若是想中断强引用和某个对象之间的关联,能够显式地将引用赋值为null,这样一来的话,JVM在合适的时间就会回收该对象。

软引用:在使用软引用时,若是内存的空间足够,软引用就能继续被使用,而不会被垃圾回收器回收,只有在内存不足时,软引用才会被垃圾回收器回收。

弱引用:具备弱引用的对象拥有的生命周期更短暂。由于当 JVM 进行垃圾回收,一旦发现弱引用对象,不管当前内存空间是否充足,都会将弱引用回收。不过因为垃圾回收器是一个优先级较低的线程,因此并不必定能迅速发现弱引用对象。

虚引用:顾名思义,就是形同虚设,若是一个对象仅持有虚引用,那么它至关于没有引用,在任什么时候候均可能被垃圾回收器回收。

WeakReference与SoftReference的区别?

这点在四种引用类型中已经作了解释,这里简单说明一下便可:

虽然 WeakReference 与 SoftReference 都有利于提升 GC 和 内存的效率,可是 WeakReference ,一旦失去最后一个强引用,就会被 GC 回收,而软引用虽然不能阻止被回收,可是能够延迟到 JVM 内存不足的时候。

为何要有不一样的引用类型

不像C语言,咱们能够控制内存的申请和释放,在Java中有时候咱们须要适当的控制对象被回收的时机,所以就诞生了不一样的引用类型,能够说不一样的引用类型实则是对GC回收时机不可控的妥协。有如下几个使用场景能够充分的说明:

利用软引用和弱引用解决OOM问题:用一个HashMap来保存图片的路径和相应图片对象关联的软引用之间的映射关系,在内存不足时,JVM会自动回收这些缓存图片对象所占用的空间,从而有效地避免了OOM的问题.

经过软引用实现Java对象的高速缓存:好比咱们建立了一Person的类,若是每次须要查询一我的的信息,哪怕是几秒中以前刚刚查询过的,都要从新构建一个实例,这将引发大量Person对象的消耗,而且因为这些对象的生命周期相对较短,会引发屡次GC影响性能。此时,经过软引用和 HashMap 的结合能够构建高速缓存,提供性能。

java中==和eqauls()的区别,equals()和`hashcode的区别

==是运算符,用于比较两个变量是否相等,而equals是Object类的方法,用于比较两个对象是否相等。默认Object类的equals方法是比较两个对象的地址,此时和==的结果同样。换句话说:基本类型比较用==,比较的是他们的值。默认下,对象用==比较时,比较的是内存地址,若是须要比较对象内容,须要重写equal方法。

equals()和hashcode()的联系

hashCode()是Object类的一个方法,返回一个哈希值。若是两个对象根据equal()方法比较相等,那么调用这两个对象中任意一个对象的hashCode()方法必须产生相同的哈希值。

若是两个对象根据eqaul()方法比较不相等,那么产生的哈希值不必定相等(碰撞的状况下仍是会相等的。)

a.hashCode()有什么用?与a.equals(b)有什么关系

hashCode() 方法是相应对象整型的 hash 值。它经常使用于基于 hash 的集合类,如 Hashtable、HashMap、LinkedHashMap等等。它与 equals() 方法关系特别紧密。根据 Java 规范,使用 equal() 方法来判断两个相等的对象,必须具备相同的 hashcode。

将对象放入到集合中时,首先判断要放入对象的hashcode是否已经在集合中存在,不存在则直接放入集合。若是hashcode相等,而后经过equal()方法判断要放入对象与集合中的任意对象是否相等:若是equal()判断不相等,直接将该元素放入集合中,不然不放入。

有没有可能两个不相等的对象有相同的hashcode

有可能,两个不相等的对象可能会有相同的 hashcode 值,这就是为何在 hashmap 中会有冲突。若是两个对象相等,必须有相同的hashcode 值,反之不成立。

能够在hashcode中使用随机数字吗?

不行,由于同一对象的 hashcode 值必须是相同的

a==b与a.equals(b)有什么区别

若是a 和b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才会返回 true,而 a.equals(b) 是进行逻辑比较,因此一般须要重写该方法来提供逻辑一致性的比较。例如,String 类重写 equals() 方法,因此能够用于两个不一样对象,可是包含的字母相同的比较。

3*0.1==0.3返回值是什么

false,由于有些浮点数不能彻底精确的表示出来。

a=a+b与a+=b有什么区别吗?

+=操做符会进行隐式自动类型转换,此处a+=b隐式的将加操做的结果类型强制转换为持有结果的类型,而a=a+b则不会自动进行类型转换。如:

byte a = 127;

byte b = 127;

b = a + b; // error : cannot convert from int to byte

b += a; // ok

(译者注:这个地方应该表述的有误,其实不管 a+b 的值为多少,编译器都会报错,由于 a+b 操做会将 a、b 提高为 int 类型,因此将 int 类型赋值给 byte 就会编译出错)

short s1= 1; s1 = s1 + 1; 该段代码是否有错,有的话怎么改?

有错误,short类型在进行运算时会自动提高为int类型,也就是说s1+1的运算结果是int类型。

short s1= 1; s1 += 1; 该段代码是否有错,有的话怎么改?

+=操做符会自动对右边的表达式结果强转匹配左边的数据类型,因此没错。

& 和 &&的区别

首先记住&是位操做,而&&是逻辑运算符。另外须要记住逻辑运算符具备短路特性,而&不具有短路特性。

public class Test{

static String name;

public static void main(String[] args){

if(name!=null&userName.equals("")){

          System.out.println("ok");

      }else{

          System.out.println("erro");

      }

  }

}

以上代码将会抛出空指针异常。

一个java文件内部能够有类?(非内部类)

只能有一个public公共类,可是能够有多个default修饰的类。

如何正确的退出多层嵌套循环?

使用标号和break;

经过在外层循环中添加标识符

内部类的做用

内部类能够有多个实例,每一个实例都有本身的状态信息,而且与其余外围对象的信息相互独立.在单个外围类当中,可让多个内部类以不一样的方式实现同一接口,或者继承同一个类.建立内部类对象的时刻不依赖于外部类对象的建立。内部类并无使人疑惑的”is-a”管系,它就像是一个独立的实体。

内部类提供了更好的封装,除了该外围类,其余类都不能访问。

final, finalize和finally的不一样之处

final 是一个修饰符,能够修饰变量、方法和类。若是 final 修饰变量,意味着该变量的值在初始化后不能被改变。finalize 方法是在对象被回收以前调用的方法,给对象本身最后一个复活的机会,可是何时调用 finalize 没有保证。finally 是一个关键字,与 try 和 catch 一块儿用于异常的处理。finally 块必定会被执行,不管在 try 块中是否有发生异常。

clone()是哪一个类的方法?

java.lang.Cloneable 是一个标示性接口,不包含任何方法,clone 方法在 object 类中定义。而且须要知道 clone() 方法是一个本地方法,这意味着它是由 c 或 c++ 或 其余本地语言实现的。

深拷贝和浅拷贝的区别是什么?

浅拷贝:被复制对象的全部变量都含有与原来的对象相同的值,而全部的对其余对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:被复制对象的全部变量都含有与原来的对象相同的值,而那些引用其余对象的变量将指向被复制过的新对象,而再也不是原有的那些被引用的对象。换言之,深拷贝把要复制的对象所引用的对象都复制了一遍。

static都有哪些用法?

几乎全部的人都知道static关键字这两个基本的用法:静态变量和静态方法。也就是被static所修饰的变量/方法都属于类的静态资源,类实例所共享。

除了静态变量和静态方法以外,static也用于静态块,多用于初始化操做:

public calss PreCache{

static{

        //执行相关操做

  }

}

此外static也多用于修饰内部类,此时称之为静态内部类。

最后一种用法就是静态导包,即import static.import static是在JDK 1.5以后引入的新特性,能够用来指定导入某个类中的静态资源,而且不须要使用类名。资源名,能够直接使用资源名,好比:

import static java.lang.Math.*;

public class Test{

public static void main(String[] args){

//System.out.println(Math.sin(20));传统作法

      System.out.println(sin(20));

  }

}

final有哪些用法

final也是不少面试喜欢问的地方,能回答下如下三点就不错了:

1.被final修饰的类不能够被继承

2.被final修饰的方法不能够被重写

3.被final修饰的变量不能够被改变。若是修饰引用,那么表示引用不可变,引用指向的内容可变。

4.被final修饰的方法,JVM会尝试将其内联,以提升运行效率

5.被final修饰的常量,在编译阶段会存入常量池中。

回答出编译器对final域要遵照的两个重排序规则更好:

1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操做之间不能重排序。

2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操做之间不能重排序。


本文的重点是你有没有收获与成长,其他的都不重要,但愿读者们能谨记这一点。同时我通过多年的收藏目前也算收集到了一套完整的学习资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、Jvm性能调优、Spring,MyBatis,Nginx源码分析,Redis,ActiveMQ、、Mycat、Netty、Kafka、Mysql、Zookeeper、Tomcat、Docker、Dubbo、Nginx等多个知识点高级进阶干货,但愿对想成为架构师的朋友有必定的参考和帮助

须要更详细架构师技能思惟导图和如下资料的能够加一下技术交流分享群:“708 701 457”免费获取




相关文章
相关标签/搜索