精选21道Java后端面试题,看完你也能唬住面试官拿30K

  • 时间:
  • 浏览:0

Java反射机制有有助于让亲们在编译期(Compile Time)之外的运行期(Runtime)检查类,接口,变量以及法律依据 的信息。反射还有有助于让亲们在运行期实例化对象,调用法律依据 ,通过调用get/set法律依据 获取变量的值。一并亲们有有助于够通过反射来获取泛型信息,以及注解。还有更高级的应用–动态代理和动态类加载(ClassLoader.loadclass())。

ConcurrentHashMap允五种个多修改操作并发进行,其关键在于使用了锁分离技术。它使用了多个锁来控制对hash表的不同次要进行的修改。ConcurrentHashMap外部使用段(Segment)来表示那先 不同的次要,每个段觉得而且一兩个多 小的hash table,它们有当事人的锁。可是我多个修改操作居于在不同的段上,它们就有有助于并发进行。

CAS作为知名无锁算法,那ConcurrentHashMap就没用锁了么?当然都有,当hash值与链表的头结点相同还是会synchronized上锁,锁链表。

事先一兩个多 对象相同,而且适用于 equals(java.lang.Object) 法律依据 ,这样 五种个多 对象的 hashCode 一定要相同;

Mybatis在处置#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set法律依据 来赋值;

Mybatis在处置${}时,而且把${}替加进去变量的值。

使用#{}有有助于有效的处置SQL注入,提高系统安全性。

JDK 1.8

sleep()和yield()都有释放CPU。

Java NIO的缓冲导向法律依据 略有不同。数据读取到一兩个多 它稍后处置的缓冲区,需用时可在缓冲区中前后移动。这就增加了处置过程中的灵活性。而且,还需用检查是是不是该缓冲区含晒 有所有您需用处置的数据。而且,需确保当更多的数据读入缓冲区时,并不覆盖缓冲区里尚未处置的数据。

NIO(Non-blocking IO)为所有的原始类型提供(Buffer)缓存支持,字符集编码解码处置方案。 Channel :一兩个多 新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。

外部类在声明的事先需用是 Outer.Inner a,就像int a 一样,至于静态外部类和非静态外部类new的事先怪怪的区别:

JDK 1.7及事先

sleep()使当前多tcp连接 进入停滞状况,统统执行sleep()的多tcp连接 在指定的时间内肯定时会执行;yield()而且使当前多tcp连接 重新回到可执行状况,统统执行yield()的多tcp连接 有事先在进入到可执行状况后马上又被执行。

统统编译器会在外部类中生成一兩个多 局部变量的拷贝,五种拷贝的生命周期和外部类对象相同,就时会总出 上述问题。

下面列举五种比较重要的法律依据 :

底层形状存放的是TreeBin对象,而都有TreeNode对象;

事先对象的 equals 法律依据 被重写,这样 对象的 hashCode 也尽量重写,而且产生 hashCode 使用的对象,一定要和 equals 法律依据 中使用的一致,而且就会违反里面提到的第2点;

性能的区别

插入时使用CAS算法:unsafe.compareAndSwapInt(this, valueOffset, expect, update)。 CAS(Compare And Swap)意思是事先valueOffset位置含晒 的值与expect值相同,则更新valueOffset位置的值为update,并返回true,而且不更新,返回false。插入时不允许key或value为null

Java NIO 的 确定器允许一兩个多 单独的多tcp连接 来监视多个输入通道,愿意注册多个通道使用一兩个多 确定器,而且使用一兩个多 单独的多tcp连接 来“确定”通道:那先 通道里事先有有有助于处置的输入,事先确定已准备写入的通道。五种确定机制,使得一兩个多 单独的多tcp连接 很容易来管理多个通道。

Segment虽保留,但事先冗杂属性,仅仅是为了兼容旧版本。

阻塞是是不是阻塞IO

ReentrantLock:具有更好的可伸缩性:比如时间锁等待图片图片、可中断锁等待图片图片、无块形状锁、多个条件变量事先锁投票。

确定器(Selectors)

一兩个多 对象的hashCode相同,不言而喻表示一兩个多 对象就相同,也而且不一定适用于equals(java.lang.Object) 法律依据 ,非要够说明五种个多 对象在散列存储形状中,如Hashtable,亲们“存倒进同一兩个多 篮子里”。

在JDK8事先,编译器并不求外部类访问的局部变量需用被final修饰,但局部变量值非要被修改(无论是法律依据 中还是外部类中),而且会报编译错误。利用javap查看编译后的字节码有有助于发现,编译器事先加进去去了final。

以上代码会总出 编译错误,事先非要静态外部类有有助于定义静态法律依据 。

觉得递增操作++i是五种紧凑的语法,使其看上去而且一兩个多 操作,但五种操作并不原子的,因而它并时会作为一兩个多 不可分割的操作来执行。实际上,它含晒 了一兩个多 独立的操作:读取count的值,将值加1,而且将计算结果写入count。这是一兩个多 “读取 - 修改 - 写入”的操作序列,而且其结果状况依赖于事先的状况。统统在多多tcp连接 环境下不足。

非静态外部类能定义静态法律依据 吗?

Dao接口,而且亲们常说的Mapper接口,接口的全限名,而且映射文件中的namespace的值,接口的法律依据 名,而且映射文件中MappedStatement的id值,接口法律依据 内的参数,而且传递给sql的参数。Mapper接口是这样 实现类的,当调用接口法律依据 时,接口全限名+法律依据 名拼接字符串作为key值,可唯一定位一兩个多 MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,有有助于唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一兩个多 、、、标签,都有被解析为一兩个多 MappedStatement对象。

hashcode() 返回该对象的哈希码值,支持该法律依据 是为哈希表提供五种优点,这类,java.util.Hashtable 提供的哈希表。

以下状况都有必需的:事先根据 equals(java.lang.Object) 法律依据 ,一兩个多 对象不相等,这样 在一兩个多 对象中的任一对象上调用 hashCode 法律依据 必定会生成不同的整数结果。而且,多多tcp连接 员应该知道,为不相等的对象生成不同整数结果有有助于提高哈希表的性能。

有有助于含晒 :字母、数字、$、_(下划线),不可用数字开头,非可是我 Java 的关键字和保留字。

synchronized是托管给JVM执行的,而lock是java写的控制锁的代码。在Java1.5中,synchronize是性能低效的。事先这是一兩个多 重量级操作,需用调用操作接口,由于分析有事先加锁消耗的系统时间比加锁以外的操作还多。相比之下使用Java提供的Lock对象,性能更高五种。而且到了Java1.6,居于了变化。synchronize在语义上很清晰,有有助于进行统统优化,有适应自旋,锁消除,锁粗化,轻量级锁,偏向锁等等。由于分析在Java1.6上synchronize的性能并不比Lock差。

Java IO的各种流是阻塞的。这由于分析,当一兩个多 多tcp连接 调用read() 或 write()时,该多tcp连接 被阻塞,直到有五种数据被读取,或数据完整写入。该多tcp连接 在此期间非要再干任何事情了。 Java NIO的非阻塞模式,是多tcp连接 向某通道发送请求读取数据,仅能得到目前可用的数据,事先目前这样 数据可用时,就那先 都有会获取,当然它时会保持多tcp连接 阻塞。统统直至数据变的有有助于读取事先,该多tcp连接 有有助于继续做五种的事情。 非阻塞写也是这样 。统统一兩个多 单独的多tcp连接 现在有有助于管理多个输入和输出通道。

重写loadClass()法律依据 。

用数组实现队列需用注意 溢出 问题,这时亲们有有助于采用循环数组的法律依据 来处置,即将数组收尾相接。使用front指针指向队列首位,tail指针指向队列末位。

流与缓冲

Dao接口里的法律依据 ,是非要重载的,事先是全限名+法律依据 名的保存和寻找策略。

在 Java 应用多多tcp连接 执行期间,在同一对象上多次调用 hashCode 法律依据 时,需用一致地返回相同的整数,前提是对象上 equals 比较中所用的信息这样 被修改(equals默认返回对象地址是是不是相等)。事先根据 equals(Object)法律依据 ,一兩个多 对象是相等的,这样 在一兩个多 对象中的每个对象上调用 hashCode 法律依据 都需用生成相同的整数结果。

使用法律依据 的区别

要处置自增操作在多多tcp连接 环境下多tcp连接 不安全的问题,有有助于确定使用Java提供的原子类,如AtomicInteger事先使用synchronized同步法律依据 。

微信公众号:慕容千语的架构笔记。欢迎关注一并进步。

实际上,由 Object 类定义的 hashCode 法律依据 觉得会针对不同的对象返回不同的整数。(五种般是通过将该对象的外部地址转加进去一兩个多 整数来实现的,而且 JavaTM 编程语言不需用五种实现技巧I。)

获取法律依据 的泛型参数:

事先生命周期不同。局部变量在法律依据 刚现在开始后就会被销毁,但外部类对象不言而喻,原本就会由于分析外部类引用了一兩个多 不居于的变量。

通过反射获取法律依据 注解的参数:

但原本就由于分析了其中一兩个多 变量被修改,一兩个多 变量值事先不同的问题。为了处置五种问题,编译器就要求局部变量需用被final修饰,以保证一兩个多 变量值相同。

hashCode的居于主而且用于查找的快捷性,如 Hashtable,HashMap等,hashCode 是用来在散列存储形状中确定对象的存储地址的;

欢迎关注微信公众号:慕容千语的架构笔记 一并学习提升

new是一兩个多 关键字,它是调用new指令创建一兩个多 对象,而且调用构造法律依据 来初始化五种对象,有有助于使用带参数的构造器

与Java8的HashMap有相通之处,底层依然由“数组”+链表+红黑树;

动态代理:

newInstance()是Class的一兩个多 法律依据 ,在五种过程中,是先取了五种类的不带参数的构造器Constructor,而且调用构造器的newInstance法律依据 来创建对象。

Class.newInstance非要带参数,事先要带参数需用取得对应的构造器,而且调用该构造器的Constructor.newInstance(Object … initargs)法律依据

Java NIO和IO之间第一兩个多 最大的区别是,IO是面向流的,NIO是面向缓冲区的。 Java IO面向流由于分析每次从流中读一兩个多 或多个字节,直至读取所有字节,它们这样 被缓居于任何地方。此外,它非要前后移动流中的数据。事先需用前后移动从流中读取的数据,需用先将它缓存到一兩个多 缓冲区。

Dao接口的工作原理是JDK动态代理,Mybatis运行都有使用JDK动态代理为Dao接口生成代理proxy对象,代理对象proxy会拦截接口法律依据 ,转而执行MappedStatement所代表的sql,而且将sql执行结果返回。

sleep()可使优先级低的多tcp连接 得到执行的事先,当然有有助于够让同优先级和高优先级的多tcp连接 有执行的事先;yield()非要使同优先级的多tcp连接 有执行的事先。

folat类型的还有double类型的,那先 小数类型在趋近于0的事先直接等于0的事先性很小,一般都是是不是限趋近于0,而且非要用==来判断。应该用|x-0|

根据代码的计算结果,s的值应该是-1371654655,这是事先Java中右侧值的计算默认是int类型。