自学内容网 自学内容网

Java面试专题——常见面试题1

引入

本文属于专题中的常见面试题模块,属于面试时经常遇到的,适合需要面试的小伙伴做面试前复习准备用,后续会持续补充

1.面向对象基本特征

面向对象的基本特征是什么?怎么理解?

面向对象的基本特征是封装、继承、多态。

封装:
封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。

继承:
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

多态性:
多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

2.hashmap实现原理

HashMap 实现原理是什么?

HashMap 基于hash 原理,我们通过 put()和 get()方法储存和获取对象。

当我们将键值对传递给 put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。

当获取对象时,通过键对象的 equals()方法找到正确的键值对,然后返回值对象。

HashMap 使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

Hash Map在每个链表节点中储存键值对对象。

当两个不同的键对象的hashcode相同时会发生什么?

它们会储存在同一个 bucket 位置的链表中。键对象的 equals()方法用来找到键值对。

3.事务的理解

简述一下事务,并且你对事务的理解?

1、简述事务的基本概念

在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID 特性。

  • 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。
  • 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
  • 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
  • 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

2、结合具体项目或者应用,说一说事务,比如flume

Flume 使用事务的办法来保证 event 的可靠传递。Source 和 Sink 分别被封装在事务中,这些事务由保存 event 的存储提供或者由 Channel 提供。这就保证了event 在数据流的点对点传输中是可靠的。在多级数据流中,如下图,上一级的 Sink和下一级的 Source 都被包含在事务中,保证数据可靠地从一个Channel到另一个Channel转移。

4.gc 算法

常见GC 算法有哪些?

复制收集算法

将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

实现步骤:

  1. 划分两块相同大小的内存区域,分别称为 From 空间和 To 空间。
  2. 程序运行时,在 From 空间中分配对象。
  3. 当 From 空间满时,启动垃圾回收。
  4. 遍历 From 空间,标记出所有存活的对象。
  5. 将存活对象复制到 To 空间。
  6. 清理 From 空间。
  7. 下次垃圾回收时,From 空间和 To 空间角色互换。

优点:不会产生内存碎片,实现简单,回收效率高。

缺点:内存利用率只有 50%。

标记清除算法

分为 “标记” 和 “清除” 两个阶段。首先标记出所有需要回收的对象,然后统一回收被标记的对象所占用的空间。

实现步骤:

  1. 从根节点开始遍历,标记所有可达的对象。
  2. 遍历整个内存空间,清除未被标记的对象。

优点:实现简单。

缺点:容易产生大量不连续的内存碎片,可能导致后续分配大对象时无法找到足够的连续空间。

标记整理算法

标记过程与标记清除算法相同,但后续不是直接清理对象,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。

实现步骤:

  1. 从根节点开始遍历,标记所有可达的对象。
  2. 让所有存活的对象向一端移动。
  3. 清理端边界以外的内存。

优点:解决了内存碎片问题。

缺点:移动存活对象的操作增加了成本,效率相对较低。

5.悲观锁与乐观锁

说说悲观锁和乐观锁?

1、悲观锁(PessimisticLock)

每次拿数据的时候都会担心会被别人修改(疑心重很悲观),所以每次在拿数据的时候都会上锁。确保自己使用的过程中不会被别人访问,自己使用完后再解锁。期间需要访问该数据的都会等待。

2、乐观锁(Optimistic Lock)

每次拿数据的时候都完全不担心会被别人修改(心态好很乐观),所以每次在拿数据的时候都不会上锁。但是在更新数据的时候去判断该期间是否被别人修改过(使用版本号等机制),期间该数据可以随便被其他人读取。

3、两种锁各有优缺点,不能单纯的定义哪个好于哪个。乐观锁比较适合数据修改比较少,读取比较频繁的场景,即使出现了少量的冲突,这样也省去了大量的锁的开销,故而提高了系统的吞吐量。但是如果经常发生冲突(写数据比较多的情况下),上层应用不不断的retry,这样反而降低了性能,对于这种情况使用悲观锁就更合适。

6.连接池

为什么要用连接池?连接池的原理是什么?

1、首先在 Web 开发中,如果使用JDBC 连接数据库,那么每次访问请求都必须建立连接一打开数据库一一存取数据库一一关闭连接等一系列步骤。但是我们知道数据库的连接打开不仅费时,而且消耗比较多的系统资源。如果进行数据库操作的次数比较少,那么还不至于有多大的影响,但是假如频繁的进行数据库操作,那么系统的性能将会受到很大影响。

2、其次,是造成数据库连接泄漏。数据库连接泄漏,指的是如果在某次使用或者某段程序中没有正确地关闭Connection、Statement 和ResultSet 资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。

3、为了解决上述问题,因此就引入了数据库连接池技术。用一句话概括数据库连接池技术那就是负责分配、管理和释放数据库连接。

4、连接池用于创建和管理数据库连接的缓冲池技术,缓冲池中的连接可以被任何需要他们的线程使用。当一个线程需要用JDBC对一个数据库操作时,将从池中请求一个连接。当这个连接使用完毕后,将返回到连接池中,等待为其他的线程服务。

7.多线程

怎么理解多线程的?

1) 提到多线程,必须先提到进程和线程两个概念,进程指的是系统中正在运行的一个应用程序,而进程想要执行任务,就必须要有线程,一个进程至少有一条线程,程序在启动的时候会默认开启一条线程,我们称为主线程.

2)多线程的优点 一个进程可以开启多条线程,每个线程执行不同的任务.它可以适当的提高程序的运行效率和资源利用率.一般我们在开发中将耗时任务放到后台去处理,例如网络请求数据,文件读写,用户输入等.此外可以使得界面更加吸引人, 比如用户在点击了一个按钮去触发某些事件的处理,可以弹出进度条来显示处理的进程,减少用户等待的焦虑心理.

3)多线程的缺点 但是线程并不是开的越多越好, 因为多线程的同时执行,是 CPU 在多条线程之间来回切换造成的, 由于切换速度太快,造成了多条线程同时执行的感觉.如果线程开启的过多,一方面会占用大量的内存空间,另一方面,CPU 在线程之间来回切换也会消耗大量 CPU 资源.此外,线程过多也会使得程序的设计更加复杂, 比如线程之间的通信和多线程数据的共享.

8.Java设计模式

java 有哪些设计模式?单例模式有哪些特点?

1)总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

其实还有两类:并发型模式和线程池模式。

2)java 单例模式是一种常见的设计模式,单例模式有以下特点:

  1. 单例类只能有一个实例。
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

9.Java 访问控制权限

说说 Java 的几个访问控制权限?

Java 中的访问控制权限有 4 种,按照权限从大到小依次为:public->protected ->包访问权限(没有权限修饰词)->private。

(1)使用 public 关键字,就意味着被声明的成员或方法对所有人都是可以访问的。

(2)protected 也提供包访问权限,也就是说,派生类以及相同包内的其他类都可以访问 protected 成员或方法。例如:子类继承父类后可以访问父类的 protected 成员。

(3)使用 private 关键字,就意味着被声明的成员或方法,除了本类,其他任何类都无法访问。

10.hashmap 与 hashTable 的区别与优缺点

Hash Map、HashTable的区别及其优缺点?

1)Hash Map 不是线程安全的。HashMap 是 map 接口的子类,是将键映射到值的对象,其中键和值都是对象,并且不能包含重复键,但可以包含重复值。Hash Map 允许 null key 和 null value,而 hashtable 不允许。

2)HashTable 是线程安全。Hash Map 是Hashtable 的轻量级实现(非线程安全的实现),他们都完成了Map 接口,主要区别在于HashMap 允许空(null)键值(key),由于非线程安全,效率上可能高于 Hashtable。

3)Hash Map 允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。Hash Map 把 Hashtable 的 contains 方法去掉了,改成 containsvalue 和 containsKey。因为 contains 方法容易让人引起误解。Hashtable 继承自 Dictionary 类,而 Hash Map 是Java1.2 引进的 Map interface 的一个实现。最大的不同是,Hashtable 的方法是 Synchronize 的,而 Hash Map 不是,在多个线程访问 Hashtable 时,不需要自己为它的方法实现同步,而 HashMap 就必须为之提供外同步。Hashtable 和 Hash Map 采用的 hash/rehash 算法都大概一样,所以性能不会有很大的差距。

11.ArrayList 和 LinkedList 的区别

ArrayList 和 Linked List 的区别?

1)ArrayList、Vector 是实现了基于动态数组的数据结构,LinkedList 基于链表的数据结构。

2)对于随机访问 get 和 set,ArrayList 觉得优于 LinkedList,因为 LinkedList 要移动指针。对于新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数据。

3)ArrayList,Linked List 是不同步的,而 Vestor 是同步的。所以如果不要求线程安全的话,可以使用 ArrayList 或 LinkedList,可以节省为同步而耗费的开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。

12.Java 中的重写和重载的区别

Java 中的重写和重载的区别?

重写方法的规则:

1、参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载。
2、返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
3、访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常。例如:父类的一个方法申明了一个检查异常IOException,在重写这个方法是就不能抛出 Exception,只能抛出IOException 的子类异常,可以抛出非检查异常。

重载的规则:

1、必须具有不同的参数列表;
2、可以有不责骂的返回类型,只要参数列表不同就可以了;
3、可以有不同的访问修饰符;4、可以抛出不同的异常;重写与重载的区别在于:重写多态性起作用,对调用被重载过的方法可以大大减少代码的输入量,同一个方法名只要往里面传递不同的参数就可以拥有不同的功能或返回值。

13.内存泄漏和内存溢出

内存泄漏和内存溢出有什么区别?

内存溢出:out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现 out of memory;比如申请了一个 integer,但给它存了long 才能存下的数,那就是内存溢出。

内存泄露:memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。memory leak会最终会导致out of memory!在 C/C++中可能会出现这类问题。

 


原文地址:https://blog.csdn.net/qq_41478243/article/details/145250126

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!