撩课-Java每天10道面试题第3天
21.final, finally, finalize的区别
1、final修饰符(关键字)。
被final修饰的类,
就意味着不能再派生出新的子类,
不能作为父类而被子类继承。
因此一个类不能既被abstract声明,
又被final声明。将变量或方法声明为final,
可以保证他们在使用的过程中不被修改。
被声明为final的变量必须在声明时给出变量的初始值,
而在以后的引用中只能读取。
被final声明的方法也同样只能使用,
即不能方法重写。
22、finally是在异常处理时
提供finally块来执行任何清除操作。 不管有没有异常被抛出、捕获,finally块都会被执行。 try块中的内容是在无异常时执行到结束。 catch块中的内容, 是在try块内容发生catch所声明的异常时, 跳转到catch块中执行。 finally块则是无论异常是否发生, 都会执行finally块的内容, 所以在代码逻辑中有需要 无论发生什么都必须执行的代码, 就可以放在finally块中。 3、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()
来强制进行一次立即的内存清理。
25.构造器如何工作?
Java在构造实例时的顺序是这样的: 1、分配对象空间,并将对象中成员初始化为0或者空 ,java不允许用户操纵一个不定值的对象。 2、执行属性值的显式初始化 3、执行构造器 4 、将变量关联到堆中的对象上 而执行构造器的步骤有可以分为以下几步: 1、Bind构造器的参数 2、如果显式的调用了this,那就递归调用this构造器然后跳到步骤5 3、递归调用显式或者隐式的父类构造器,除了Object以外,因为它没有父类 4、执行显式的实例变量初始化(也就是上边的流程中的第二步,调用返回以后执行, 这个步骤相当于在父构造器执行后隐含执行的,看样子像一个特殊处理)
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方法进行了重写的话,
比较的是所指向的对象的内容。