Java天天10道面试题,跟我走,offer有!(三)java
21.final, finally, finalize的区别程序员
一、final修饰符(关键字)。 被final修饰的类, 就意味着不能再派生出新的子类, 不能做为父类而被子类继承。 所以一个类不能既被abstract声明, 又被final声明。将变量或方法声明为final, 能够保证他们在使用的过程当中不被修改。 被声明为final的变量必须在声明时给出变量的初始值, 而在之后的引用中只能读取。 被final声明的方法也一样只能使用, 即不能方法重写。
2二、finally是在异常处理时面试
提供finally块来执行任何清除操做。 无论有没有异常被抛出、捕获,finally块都会被执行。 try块中的内容是在无异常时执行到结束。 catch块中的内容, 是在try块内容发生catch所声明的异常时, 跳转到catch块中执行。 finally块则是不管异常是否发生, 都会执行finally块的内容, 因此在代码逻辑中有须要 不管发生什么都必须执行的代码, 就能够放在finally块中。 三、finalize是方法名。 java技术容许使用finalize()方法 在垃圾收集器将对象从内存中 清除出去以前作必要的清理工做。 这个方法是由垃圾收集器 在肯定这个对象没有被引用时对这个对象调用的。 它是在object类中定义的, 所以全部的类都继承了它。 子类覆盖finalize()方法以整理系统资源或者被执行其余清理工做。 finalize()方法是在垃圾收集器 删除对象以前对这个对象调用的。 ###2.Overload和Override的区别。 首先重载和重写是应用于两个不一样场景下面的两种不一样的手段: 二者各自的特征: 重载(Overload):首先是位于一个类之中或者其子类中, 具备相同的方法名, 可是方法的参数不一样, 返回值类型能够相同也能够不一样。 (1):方法名必须相同 (2):方法的参数列表必定不同。 (3):访问修饰符和返回值类型能够相同也能够不一样。 其实简单而言:重载就是对于不一样的状况写不一样的方法。 好比,同一个类中, 写不一样的构造函数用于初始化不一样的参数。 重写(override):通常都是表示子类和父类之间的关系, 其主要的特征是: 方法名相同, 参数相同, 可是具体的实现不一样。 重写的特征: (1):方法名必须相同,返回值类型必须相同 (2):参数列表必须相同 (3):访问权限不能比父类中被重写的方法的访问权限更低。 例如:若是父类的一个方法被声明为public, 那么在子类中重写该方法就不能声明为protected。 (4):子类和父类在同一个包中, 那么子类能够重写父类全部方法, 除了声明为private和final的方法。 (5):构造方法不能被重写, 简单而言:就是具体的实现类对于父类的该方法实现不满意, 须要本身在写一个知足于本身要求的方法。
23. Java中的String,StringBuilder,StringBuffer三者的区别?编程
首先说运行速度,或者说是执行速度, 在这方面运行速度快慢为:StringBuilder > StringBuffer > String String最慢的缘由: String为字符串常量, 而StringBuilder和StringBuffer均为字符串变量, 即String对象一旦建立以后该对象是不可更改的, 但后二者的对象是变量,是能够更改的。 而StringBuilder和StringBuffer的对象是变量, 对变量进行操做就是直接对该对象进行更改, 而不进行建立和回收的操做, 因此速度要比String快不少。 String ----> 字符串常量 StringBuffer ----> 字符串变量(线程安全的) StringBuilder ----> 字符串变量(非线程安全的) String:适用于少许的字符串操做的状况 StringBuilder:适用于单线程下在字符缓冲区进行大量操做的状况 StringBuffer:适用多线程下在字符缓冲区进行大量操做的状况
24.GC是什么? 为何要有GC?安全
GC是垃圾收集的意思, 内存处理是编程人员容易出现问题的地方, 忘记或者错误的内存回收 会致使程序或系统的不稳定甚至崩溃, Java提供的GC功能 能够自动监测对象是否超过做用域 从而达到自动回收内存的目的, Java语言没有提供释放已分配内存的显示操做方法。J ava程序员不用担忧内存管理, 由于垃圾收集器会自动进行管理。 要请求垃圾收集, 能够调用下面的方法之一: System.gc()或Runtime.getRuntime().gc(), 但JVM能够屏蔽掉显示的垃圾回收调用。 垃圾回收能够有效的防止内存泄露, 有效的使用可使用的内存。 垃圾回收器一般是做为一个单独的低优先级的线程运行, 不可预知的状况下对内存堆中 已经死亡的或者长时间没有使用的对象进行清除和回收, 程序员不能实时的调用垃圾回收器 对某个对象或全部对象进行垃圾回收。 Java有了GC, 就不须要程序员去人工释放内存空间。 当Java虚拟机发觉内存资源紧张的时候, 就会自动地去清理无用变量所占用的内存空间。 固然,若是须要, 程序员能够在Java程序中显式地使用System.gc() 来强制进行一次当即的内存清理。
顺便在此给你们推荐一个Java架构方面的交流学习群:698581634,进群便可免费获取Java架构学习资料:里面有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系,群里必定有你须要的资料,你们赶忙加群吧。性能优化
25.构造器如何工做?多线程
Java在构造实例时的顺序是这样的: 一、分配对象空间,并将对象中成员初始化为0或者空 ,java不容许用户操纵一个不定值的对象。 二、执行属性值的显式初始化 三、执行构造器 4 、将变量关联到堆中的对象上 而执行构造器的步骤有能够分为如下几步: 一、Bind构造器的参数 二、若是显式的调用了this,那就递归调用this构造器而后跳到步骤5 三、递归调用显式或者隐式的父类构造器,除了Object之外,由于它没有父类 四、执行显式的实例变量初始化(也就是上边的流程中的第二步,调用返回之后执行, 这个步骤至关于在父构造器执行后隐含执行的,看样子像一个特殊处理)
26.构造器Constructor是否可被override?架构
构造器Constructor不能被继承, 所以不能重写Overriding, 但能够被重载Overloading 1). 构造器不能是native,final,static,synchronized 的, 能够是public,private,或什么都没有。 2). 构造器函数里能够写return呢,但后面什么都不准有(包括null) 3). 构造器不能返回值. 但若是有个"构造器"返值了, 它就不是构造器喽,只是个普通方法 4). super();this();这两个方法只能在构造方法里调用. 5). 成员变量声明时候赋值,比构造函数还早.
27.写一个Singleton出来。并发
Singleton模式主要做用是保证在Java应用程序中,分布式
一个类Class只有一个实例存在。
通常Singleton模式一般有几种种形式:
第一种形式: 定义一个类,
它的构造函数为private的,
它有一个static的private的该类变量,
在类初始化时实例话,
经过一个public的getInstance方法获取对它的引用,
继而调用其中的方法。
public class Singleton {
private Singleton(){}
//在本身内部定义本身一个实例,是否是很奇怪?
//注意这是private 只供内部调用
private static Singleton instance = new Singleton();
//这里提供了一个供外部访问本class的静态方法,能够直接访问
public static Singleton getInstance() {
return instance;
}
}
第二种形式:
public class Singleton {
private static Singleton instance = null;
public static synchronized Singleton getInstance() {
//这个方法比上面有所改进,不用每次都进行生成对象,只是第一次
//使用时生成实例,提升了效率!
if (instance==null)
instance=new Singleton();
return instance; }
}
其余形式:
定义一个类,
它的构造函数为private的,
全部方法为static的。
通常认为第一种形式要更加安全些
28.error和exception有什么区别?
Error类和Exception类都继承自Throwable类。 两者的不一样之处: Exception: 1.能够是可被控制(checked) 或不可控制的(unchecked)。 2.表示一个由程序员致使的错误。 3.应该在应用程序级被处理。 Error: 1.老是不可控制的(unchecked)。 2.常常用来用于表示系统错误或低层资源的错误。 3.如何可能的话,应该在系统级被捕捉。 error 表示恢复不是不可能但很困难的状况下的一种严重问题。 好比说内存溢出。 不可能期望程序能处理这样的状况。 exception 表示一种设计或实现问题。 也就是说, 它表示若是程序运行正常, 从不会发生的状况。
29.HashMap和Hashtable的区别?
hashmap: 1.线程不安全 2.容许有null的键和值 3.效率高一点、 4.方法不是Synchronize的要提供外同步 5.有containsvalue和containsKey方法 6.HashMap 是Java1.2 引进的Map interface 的一个实现 7.HashMap是Hashtable的轻量级实现 hashtable: 1.线程安全 2.不容许有null的键和值 3.效率稍低、 4.方法是是Synchronize的 5.有contains方法方法 6.Hashtable 继承于Dictionary 类 7.Hashtable 比HashMap 要旧
30.==和equals()区别?
对于==, 若是做用于基本数据类型的变量, 则直接比较其存储的 “值”是否相等; 若是做用于引用类型的变量, 则比较的是所指向的对象的地址 对于equals方法, 注意:equals方法不能做用于基本数据类型的变量 若是没有对equals方法进行重写, 则比较的是引用类型的变量所指向的对象的地址; 诸如String、Date等类对equals方法进行了重写的话, 比较的是所指向的对象的内容。
原文连接:https://www.jianshu.com/p/de185a685235