Java面经分类以及总结(1)--必会

651 阅读9分钟

导读:


1. 重写和重载的区别

1.定义区别:

①重载是指不同的函数使用相同的函数名,但是函数的参数个数或类型不同。调用的时候根据函数的参数来区别不同的函数。

②覆盖(也叫重写)是指在派生类中重新对基类中的虚函数(注意是虚函数)重新实现。即函数名和参数都一样,只是函数的实现体不一样。

2.类的关系区别

覆盖是子类和父类之间的关系,是垂直关系;重载是同一个类中方法之间的关系,是水平关系。

3.产生方法区别

覆盖只能由一个方法或只能由一对方法产生关系;重载是多个方法之间的关系。

4.参数列表要求区别

覆盖要求参数列表相同;重载要求参数列表不同。

5.调用方法区别

覆盖关系中,调用方法体是根据对象的类型来决定;而重载关系是根据调用时的实参表与形参表来选择方法体的。

2. 子类能够重写父类中声明为 private 的方法吗?protected 方法呢?

private是私有的,其他类是不能访问的,子类也不可以访问,所以你可以重新实现父类的该方法,不会有冲突,但是你重新实现的方法,不叫重写也不叫重载,是一个该子类新增的方法,和子类的一般扩展方法一样

protected修饰符可以应用于类中的数据和方法。公共类中保护的数据或方法可以被它的子类或同一包中的任何类访问,即使子类在不同的包中也可以。

也就是说用protected修饰的方法,在同包的条件下的子类中可以被覆盖,而在不同包下的子类中只能被调用,是不能被覆盖的。

3. 父类中被 final 关键字修饰的方法可以被重写吗

  1. final修饰的类,为最终类,该类不能被继承。如String 类

  2. final修饰的方法可以被继承和重载,但不能被重写

  3. final修饰的变量不能被修改,是个常量

4. 重载是编译时决定的还是运行时决定的?

对于重载(overloaded),调用方法的选择是在编译时确定的,是静态选择的; 而对于覆盖(overridden)方法的选择是动态的,在运行时确定的,选择的依据是被调用方法所在对象的运行时类型。

5. Java Object 类中有哪些方法?

equals:判断两个对象"相等"

hashCode:获取对象的哈希值

toString:把对象转为字符串

getClass:返回运行时的class,这个方法在Object中是个native方法。

以下5个都和多线程有关系。

notify

notifyAll

wait

wait(long timeout)

wait(long timeout, int nanos)

2个protected方法:

clone:

finalize:

1个private方法

registerNatives: 详细不知道是啥

6. 有重写过 hashcode 和 equals 方法吗?重写 equals 方法时需要遵守什么原则?

因为不重写 equals 方法,执行 user1.equals(user2) 比较的就是两个对象的地址(即 user1 == user2),肯定是不相等的

 既然比较两个对象是否相等,使用的是 equals 方法,那么只要重写了 equals 方法就好了,干嘛又要重写 hashCode 方法呢?

其实当 equals 方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

  • 自反性。对于任何非null的引用值x,x.equals(x)应返回true。

  • 对称性。对于任何非null的引用值x与y,当且仅当:y.equals(x)返回true时,x.equals(y)才返回true。

  • 传递性。对于任何非null的引用值x、y与z,如果y.equals(x)返回true,y.equals(z)返回true,那么x.equals(z)也应返回true。

  • 一致性。对于任何非null的引用值x与y,假设对象上equals比较中的信息没有被修改,则多次调用x.equals(y)始终返回true或者始终返回false。

  • 对于任何非空引用值x,x.equal(null)应返回false。

7.MySQL 默认的隔离级别

第1级别:Read Uncommitted(读取未提交内容)

(1)所有事务都可以看到其他未提交事务的执行结果
(2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少
(3)该级别引发的问题是——**脏读(Dirty Read):读取到了未提交的数据**

第2级别:Read Committed(读取提交内容)

(1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)
(2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变
(3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。

 |——>导致这种情况的原因可能有:
 (1)有一个交叉的事务有新的commit,导致了数据的改变;
 (2)一个数据库被多个实例操作时,同一事务的其他实例在该实例处理其间可能会有新的commit

第3级别:Repeatable Read(可重读)

(1)这是MySQL的默认事务隔离级别
(2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行
(3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行
(4)InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题

第4级别:Serializable(可串行化)

(1)这是最高的隔离级别
(2)它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。
(3)在这个级别,可能导致大量的超时现象和锁竞争

8.Java序列化

  1. 序列化和反序列化的概念
  • 序列化:把对象转换为字节序列的过程称为对象的序列化。
  • 反序列化:把字节序列恢复为对象的过程称为对象的反序列化。

在代码运行的时候,我们可以看到很多的对象(debug过的都造吧), 可以是一个,也可以是一类对象的集合,很多的对象数据,这些数据中, 有些信息我们想让他持久的保存起来,那么这个序列化。 就是把内存里面的这些对象给变成一连串的字节描述的过程。 常见的就是变成文件 我不序列化也可以保存文件啥的呀,有什么影响呢?我也是这么问的。

  1. 什么情况下需要序列化
  • 当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
  • 当你想用套接字在网络上传送对象的时候;
  • 当你想通过RMI传输对象的时候; (老实说,上面的几种,我可能就用过个存数据库的)
  1. 如何实现序列化

实现Serializable接口即可

9.排序算法的时间复杂度与空间复杂度

10. HashMap

11.说一下 JVM 的内存分配,详细的说一下每一块是存啥,堆分配

  • 1、堆是虚拟机管理内存最大的一块,也是被所有线程共享的一块内存区域。对象实例及数组会在堆上进行内存分配,但也不是绝对。另外堆也是垃圾收集的主要区域,根据垃圾收集的分带收集算法,堆还可以细分为新生代和老年代。而在物理空间上堆处于不连续的内存空间中,只要是逻辑上连续即可,既可实现固态大小,也可以实现可扩展性(可配置-Xmx 和-Xms控制)。当内存不足无法完成实例分配,同时堆也无法进行扩展时会抛出OOM。

  • 2、方法区,也是各个线程共享的一块区域,主要存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。也被称为“永久代”,不过在不同的虚 拟机中这两者还是有本质的区别。方法区同样支持固定大小及可扩展性,还可以选择不实现垃圾收集。同时也会出现OOM的异常。

  • 运行时常量池也是方法区的一部分,存放编译期产生的各种字面量和符号引用,常量池受方法区内存限制,当无法扩展时会抛出OOM。

  • 3、虚拟机栈,是线程私有的。在方法执行时会创建一个栈帧,每一个方法从调用到执行完成的过程也就是一个栈帧在虚拟机中出栈入栈的过程。虚拟机栈在编译器存放了基本数据类型,对象引用及局部变量。要注意的是在基本数据类型中long和double类型的数据会占用两个局部变量的空间,其余只占用一个。在异常情况中与堆相比除了因固定长度时(也支持动态扩展)无法扩展申请足够内存会抛出OOM还有因线程请求的栈深度大鱼虚拟机所允许的深度会抛出StackOverflowError异常。

  • 4、本地方法栈 与虚拟机栈发挥作用相似,虚拟栈为执行Java方法(也就是字节码)服务,而本地方法栈则为虚拟机使用的Native服务。sun HOST POST 把二者合二为一,同虚拟机栈一样也会抛出OOM和StackOverflowError异常。

  • 5、程序技术器是唯一一个没有任何规定OOM情况的区域,是一块比较小的内存空间。每条线程都需要一个独立的程序计数器,来保证线程切换后能恢复到正确的执行位置,在字节码解释器工作就是通过改变这个技术器的值来选取下一条需要执行的字节码指令,分支,循环,跳转,异常处理,线程恢复等功能。线程正在执行一个Java方法,计数器记录的是正在执行的虚拟机字节码指令地址,而如果正在执行Native方法,则技术器为空。

12. 珍爱网面经