阿里二面面试题:请你说一下对受检异常和非受检异常的理解?
面试题: 请你说一下对受检异常和非受检异常的理解?
面试考察点考察目的: 异常的设计,在程序开发中时非常重要的。好的异常设计能够合理清晰的反馈程序的问题,提供排查思路。同时,还能够很好的处理资源回收问题。所以作为有经验的程序员,必须要了解异常,以及异常的差异和特性。
考察人群: 工作3年以上,3年左右一般都会参与项目中部分核心代码的编写。
背景知识分享在Java中,所有的异常都继承自java.lang.Throwable,Throwable有两个直接子类,Error和Exception,如图所示。
Throwable 类是 Java 语言中所有错误(errors)和异常(exceptions)的父类。只有继承于Throwable类或者其子类的异常才能够被抛出.
下面分别解释一下这些异常以及特性。
Error错误Error通常是程序无法处理的错误,这些错误大多数与代码编写者执行的操作无关,并且它们是无法被捕获的,因为它们在应用程序的控制和处理能力之外,比如。
OutOfMemoryError, 内存溢出,比较常见的错误,是值内存空间不足以再提供新对象的分配。
StackOverf ...
阿里P7面试官:请你简单说一下类加载机制的实现原理?
面试题:类加载机制的原理
面试官考察点考察目标: 了解面试者对JVM的理解,属于面试八股文系列。
考察范围: 工作3年以上。
技术背景知识在回答这个问题之前,我们需要先了解一下什么是类加载机制?
类加载机制简述什么是类加载机制?
简单来说:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构。
经过类加载这个过程后,我们才能在程序中构建这个类的实例对象,并完成对象的方法调用和操作。
基本的工作原理下图所示。
我们编写的.java后缀的原始代码,通过JVM编译之后得到.class文件。
类加载机制,就是把.class文件加载到JVM中,我们知道JVM的运行时数据区又分为堆内存、虚拟机栈、元空间、本地方法栈、程序计数器等空间,当类被加载后,会根据JVM内存规则,把数据保存到对应区域内。
了解类加载器大家想想,在实际开发中,运行一个程序,有哪些地方的类需要被加载?
从本地系统直接加载,如JRE、CLASSPATH。
通过网络下载.class文件
从zip ...
震惊!没看这篇文章之前,我以为真的懂深克隆和浅克隆
面试题:深克隆和浅克隆的实现方式
面试官考察点考察目的: 深克隆和浅克隆,考察的是Java基础知识的理解。
考察人群: 2到5年开发经验。
背景知识详解先了解下浅克隆和深克隆的定义:
浅克隆:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
深克隆:除去那些引用其他对象的变量,被复制对象的所有变量都含有与原来的对象相同的值。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。
如何实现克隆我么先不管深克隆、还是浅克隆。首先,要先了解如何实现克隆,实现克隆需要满足以下三个步骤
对象的类实现Cloneable接口;
覆盖Object类的clone()方法(覆盖clone()方法,访问修饰符设为public,默认是protected,但是如果所有类都在同一个包下protected是可以访问的);
在clone()方法中调用super.clone();
实现一个克隆先定义一个score类,表示分数信息。
public class Score { ...
因为一个小小的Integer问题导致阿里一面没过,遗憾!
面试题:new Integer(112)和Integer.valueOf(112)的区别
面试官考察点猜想这道题,考察的是对Integer这个对象原理的理解,关于这道题的变体有很多,我们会一一进行分析。
理解这道题,对于实际开发过程中防止出现意想不到的Bug很有用,建议大家认真思考和解读。
背景知识详解关于Integer的实现Integer是int的一个封装类,它的构造实现如下。
/** * The value of the {@code Integer}. * * @serial */private final int value;/** * Constructs a newly allocated {@code Integer} object that * represents the specified {@code int} value. * * @param value the value to be represented by the * {@code In ...
重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分
面试题: 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分
面试官考察点猜想这道题纯粹只是考查基础理论知识,对实际开发工作中没有太多的指导意义,毕竟编辑器都有语法提示功能,如果没写正确,会有错误提示。
背景知识详解关于重载(Overload)和重写(Override),在实际开发中使用非常频繁,涉及到的背景知识并不难。
重写重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写是发生在类的继承关系,或者类的实现关系中的,重写后的方法和原方法需要保持完全相同的返回值类型、方法名、参数个数以及参数类型,简单来说,就是子类重写的方法必须和父类保持完全一致
类的继承关系我们来看下面这个基于继承关系的例子。
class Animal{ public void move(){ System.out.println("动物可以移动"); }} class Bird extends Animal{ publi ...
问题:两个对象值相同(x.equals(y) == true),但是可能存在hashCode不同吗?
这道题仍然是考察JVM层面的基本知识,面试官认为,基本功扎实,才能写出健壮性和稳定性很高的代码。
涉及到的技术知识(x.equals(y)==true),这段代码,看起来非常简单,但其实里面还是涉及了一些底层知识点的,首先我们基于equals这个方法进行探索。
equals这个方法,在每个对象中都存在,以String类型为例,其方法定义如下
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { //判断对象实例是否是String String anotherString = (String)anObject; //强转成string类型 int n = value.length; if (n == anotherString.value.length) { //如果两个字符串相等,那么它们的长度自然相等。 //遍历两个比较的 ...
面试题系列:new String("abc")创建了几个对象
new String(“abc”)创建了几个对象面试官考察点猜想这种问题,考察你对JVM的理解程度。涉及到常量池、对象内存分配等问题。
涉及背景知识详解在分析这个问题之前,我们先来了解一下JVM的组成,如图所示。
在JVM1.8中,内存划分为堆、程序计数器、本地方发栈、方法区(元空间)、虚拟机栈。
JVM知识点普及下面分别解释一下JVM运行时内存的功能。
堆内存空间堆是 JVM 内存中最大的一块内存空间,该内存被所有线程共享,几乎所有对象和数组都被分配到了堆内存中。堆被划分为新生代和老年代,新生代又被进一步划分为 Eden 和 Survivor 区,最后 Survivor 由 From Survivor 和 To Survivor 组成。
但需要注意的是,这些区域的划分因不同的垃圾收集器而不同。大部分垃圾收集器都是基于分代收集理论设计的,就会采用这种分代模型。而一些新的垃圾收集器不采用分代设计,比如 G1 收集器就是把堆内存拆分为多个大小相等的 Region。
方法区在 jdk8 之前,HotSopt 虚拟机的方法区又被称为永久代,由于永久代的设计容易导致内存溢出等问题,jdk8 ...
基于Apache Zookeeper手写实现动态配置中心(纯代码实践)
相信大家都知道,每个项目中会有一些配置信息放在一个独立的properties文件中,比如application.properties。这个文件中会放一些常量的配置,比如数据库连接信息、线程池大小、限流参数。
在传统的开发模式下,这种方式很方便,一方面能够对配置进行统一管理,另一方面,我们在维护的时候很方便。
但是随着业务的发展以及架构的升级,在微服务架构中,服务的数量以及每个服务涉及到的配置会越来越多,并且对于配置管理的需求越来越高,比如要求实时性、独立性。
另外,在微服务架构下,会涉及到不同的环境下的配置管理、灰度发布、动态限流、动态降级等需求,包括对于配置内容的安全与权限,所以传统的配置维护方式很难达到需求。
因此,就产生了分布式配置中心。
传统的配置方式不方便维护
配置内容的安全和访问权限,在传统的配置方式中很难实现
更新配置内容时,需要重启
配置中心的工作流程
图11-1
Spring Boot的外部化配置在这篇文章中,我们会Zookeeper集成到Spring Boot的外部化配置中,让用户无感知的使用配置中心上的数据作为数据源,所以我们需要先了解Spring Boot ...
Apache Zookeeper客户端Curator使用及权限模式详解
这篇文章是让大家了解Zookeeper基于Java客户端Curator的基本操作,以及如何使用Zookeeper解决实际问题。
Zookeeper基于Java访问针对zookeeper,比较常用的Java客户端有zkclient、curator。由于Curator对于zookeeper的抽象层次比较高,简化了zookeeper客户端的开发量。使得curator逐步被广泛应用。
封装zookeeper client与zookeeper server之间的连接处理
提供了一套fluent风格的操作api
提供zookeeper各种应用场景(共享锁、leader选举)的抽象封装
依赖jar包<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.2.0</version></dependency>
建立连接curat ...
如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer!!
很多同学或多或少都用到了Zookeeper,并知道它能实现两个功能
配置中心,实现表分片规则的统一配置管理
注册中心,实现sharding-proxy节点的服务地址注册
那么Zookeeper到底是什么?以及为什么能实现这样的功能?接下来我们就来了解一下Zookeeper。
Zookeeper的前世今生Apache ZooKeeper是一个高可靠的分布式协调中间件。它是Google Chubby的一个开源实现,那么它主要是解决什么问题的呢?那就得先了解Google Chubby
Google Chubby是谷歌的一个用来解决分布式一致性问题的组件,同时,也是粗粒度的分布式锁服务。
分布式一致性问题什么是分布式一致性问题呢?简单来说,就是在一个分布式系统中,有多个节点,每个节点都会提出一个请求,但是在所有节点中只能确定一个请求被通过。而这个通过是需要所有节点达成一致的结果,所以所谓的一致性就是在提出的所有请求中能够选出最终一个确定请求。并且这个请求选出来以后,所有的节点都要知道。
这个就是典型的拜占庭将军问题
拜占庭将军问题说的是:拜占庭帝国军队的将军们必须通过投票达成一致来决定是否 ...