
Java基础面试题
Starry-
加油呗
展开
-
面试题20211125
在公司使用过redis吗,在什么场景下?使用的redis是什么版本的?redis有哪些持久化的方式?各自的优缺点?你们公司使用哪种方式?是否遇到过生产丢失数据的问题?如何去解决这个问题的?1、使用过,场景:缓存(分页查询:zset+string)、分布式锁(redisson)、限流(aop + redis lua脚本)等2、使用redis的版本:Redis 5.0.0,wget https://download.redis.io/releases/redis-5.0.0.tar.gz3、支持三种持久化原创 2021-11-25 17:42:20 · 504 阅读 · 0 评论 -
面试|你不了解的注解(二)
这篇博文是接着上篇《面试|你不了解的注解(一)》写的,这里简单回顾下上篇博文的主要内容:注解的基本概念;注解内的四种标准注解:@Override,@Deprecated,@SuppressWarnings和@Native;注解内的五种元注解:@Target,@Retention,@Documented,@Inherited和@Repeatable;分析上面九种注解的源码,解析每种注解的...原创 2019-07-13 21:14:28 · 1122 阅读 · 3 评论 -
面试|你不了解的注解(一)
1.注解的概念对于注解的概念,这里直接给出《Think In Java》第四版中的解释:Annotations (also known as metadata) provide a formalized way to add information to your code so that you can easily use that data at some later point.注解...原创 2019-07-11 06:50:49 · 342 阅读 · 2 评论 -
面试|你了解RTTI吗
运行时识别对象和类的信息主要有两种方式:一种是“传统的”RTTI,它默认我们在编译时已经知道了所有的类型;一种是反射,它允许我们在运行时发现和使用类的信息。今天首先来认识下RTTI。1.什么是RTTI以及为什么需要RTTIRTTI的英文全称是Run-Time Type Identification,即运行时类型识别。它可以在程序运行时检查父类型的引用是否可以指向子类型的对象,即确保类型向上转...原创 2019-07-04 06:22:15 · 848 阅读 · 2 评论 -
面试|能说说你理解的泛型吗
这片博文围绕Java语言的泛型特性作了详尽的介绍。主要包括以下几个内容:泛型的概念和作用,产生背景泛型作为一种Java语言特性,如何定义泛型介绍代码层面泛型的表达方式:泛型通配符和有限通配符介绍泛型方法的定义和使用泛型使用过程中的注意事项1.泛型的概念和作用泛型是JDK在1.5版本引入的一个特性,在某种程度上,泛型的出现简化了我们的代码,在编译阶段保证代码的安全性。《Think ...原创 2019-07-17 02:07:43 · 2527 阅读 · 3 评论 -
实战项目|自定义注解实现POJO类到CRUD语句的映射
1.前言前段时间一直在整理Java基础面试题,大大小小共有二十余篇,虽然不足市场上现有面试题的十分之一,但每一个面试题都是从最基础的概念、作用、原理和使用场景等方面来解释的,对我自己而言,这个过程很痛苦也很快乐;痛苦的是深夜撸代码之余还要撸文档,但学完之后能够加深对Java语言的理解并且能够收获各位博友的点赞,瞬间就会有满满的动力继续学下去。感觉写跑题了,回到正题。最近学习的点主要有常用的运行...原创 2019-07-20 13:07:51 · 710 阅读 · 2 评论 -
面试|详细了解Java中的字符流
上一篇博客讲了IO流中的字节流,分别介绍输入字节流和输出字节流的类结构图; 主要介绍字节流的读取方式和输出方式,分表对应着read()方法和write()方法;然后介绍不同形式的来源有不同的读取方式,同时根据输出的目的地不同有不同的输出方式。具体的内容可以看这里,这里我们介绍IO流中的字符流。1 输入字符流输入字符流的父类是抽象类Reader,它除了实现Closeable接口,还需要实现Rea...原创 2019-07-30 06:55:25 · 465 阅读 · 4 评论 -
面试|简述下ThreadPoolExecutor线程池创建过程以及参数含义
线程池是并发里面最经常使用的工具类,所以想要晋升为中级Java工程师,学好并发的前提就是学好线程池。这里会介绍关于线程池的一些内容,比如线程池的创建过程和原理,如何理解线程池的各种状态以及之间的转换,理解面试中常说的FixedThreadPool,singleJava语言关于线程池的类图:ThreadPoolExecutor就是我们口中常说的线程池,ScheduledThreadPoolEx...原创 2019-08-03 09:58:10 · 2136 阅读 · 1 评论 -
面试|ThreadPoolExecutor有哪几种状态以及如何表示?
上一篇分析线程池的创建过程,那么本篇就要学习下线程池如何处理任务。本篇涉及到大量的源码分析,所以可能会有些枯燥,但我会尽量化繁为简,希望能够通俗易懂。在学习线程池如何处理提交的任务之前,有必要了解下线程池的运行状态。我们应该知道一个线程的状态分为创建(NEW)、运行(RUNNABLE)、阻塞(BLOCK)、等待(WAITING/TIMED-WAITING)和结束(TERMINATED),线程是线...原创 2019-08-04 13:03:28 · 2508 阅读 · 3 评论 -
面试|ThreadPoolExecutor中的线程如何从等待队列获取任务
1.问题引出我们知道一个线程创建的时候就会附带一个Runnable任务,如果该Runable任务执行完毕后,该线程如何从线程池的等待队列中获取一个任务呢?上一篇博客讲到线程池中线程和该线程的第一个任务封装在一个Worker类中,这个Worker类本身实现了Runnable接口,源码定义:private final class Worker extends AbstractQueuedSync...原创 2019-08-07 23:58:54 · 7154 阅读 · 1 评论 -
面试|详细了解Java中的字节流
在Java中有一个名为java.io的包定义Java世界数据的输入(input)和输出(output);IO流根据读取的形式和结果的不同分为:字节流和字符流;根据数据流向不同分为:输入流和输出流;1.字节流和字符流的区别字节流,顾名思义就是以字节的形式读取文本内容到内存中;而字符流则是以字符的形式读取文本内容到内存中;字符流是把读取到的字节流按照某种编码的形式转换成字符的形式,所以字符流是对字...原创 2019-07-28 21:29:15 · 1149 阅读 · 6 评论 -
面试|ThreadPoolExecutor处理Runnable任务过程源码分析
本篇博文主要介绍线程池如何接收并处理任务,在此之前你需要了解下面两个知识点:①ThreadPoolExecutor创建过程以及各参数分析;②线程池5种状态的表示方法以及原理;了解上面两个知识点才能更好的理解本篇文章。0.引言线程池处理任务的逻辑决定于当前线程数(workerCount)的大小与核心线程数(corePoolSize)、最大线程数(maximumPoolSize)大小的关...原创 2019-08-07 00:12:02 · 661 阅读 · 1 评论 -
面试|详细分析ScheduledThreadPoolExecutor(周期性线程池)的原理
ScheduledThreadPoolExecutor在进一步了解ScheduledThreadPoolExecutor类之前,先学习下ScheduledFutureTask类的构造。1. ScheduledFutureTask类的继承图:类图显示,该类实现Runnable接口并继承FutureTask类,表明该类是一个被包装的任务,同时该类实现Delayed接口和Comparable&...原创 2019-08-18 23:23:49 · 3173 阅读 · 5 评论 -
面试|newFixedThreadPool,newCachedThreadPool和newScheduledThreadPool的区别
前面主要分析ThreadPoolExecutor类的创建和运行过程,今天学习Executors类。1.Executors类和Executor类的关系Executor是含有执行提交Runnable任务的接口。如果你看了关于ThreadPoolExecutor类的分析,那么就知道线程池间接实现Executor接口。Executors是一个工厂类,它能提供各种形式的线程池。2.Executo...原创 2019-08-13 00:23:44 · 5577 阅读 · 1 评论 -
面试|详细理解优先队列DelayedWorkQueue
DelayedWorkQueue优先队列该队列是定制的优先级队列,只能用来存储RunnableScheduledFutures任务。堆是实现优先级队列的最佳选择,而该队列正好是基于堆数据结构的实现。1.关于堆的一些知识堆结构是用数组实现的二叉树,数组下标可以表明元素节点的位置,所以省去指针的内存消耗;堆内元素节点的位置取决于节点的某一个属性的大小值,根据父节点是否大于左右节点分为最小堆和最大...原创 2019-08-16 19:23:41 · 15204 阅读 · 2 评论 -
数据结构|二叉树基本篇
二叉树1 什么是树以及树的相关概念树(Tree)是n(n>=0)个结点的有限集。n=0时称为空树。在任意一颗非空树中:1)有且仅有一个特定的称为根(Root)的结点;2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1、T2、…、Tn,其中每一个集合本身又是一棵树,并且称为根的子树。此外,树的定义还需要强调以下两点:n>0时根结点是唯一的,不可能存...原创 2019-09-11 00:53:19 · 338 阅读 · 1 评论 -
面试|什么是序列化?怎么实现?有哪些方式?
1 为什么要序列化(背景)以及什么是序列化?对于Java初学者来说,序列化这个概念很难接触到,因为这个阶段还没有接触到系统和框架,没有系统的交互和消息的传递,Java对象以及类的基本信息在JVM内存中随着JVM停止而消失,JVM下次启动又会重新加载字节码。但是假如系统下次启动后,某对象A需要依赖系统本次对象A的值的时候,就需要考虑对象A“持久化”的问题。相信大家看到“持久化”都会想到数据库或者缓...原创 2019-06-24 18:23:19 · 4311 阅读 · 3 评论 -
面试|你怎么理解反射
1.什么是反射及为什么要有反射上一篇文章学到通过RTTI获取对象的运行时类型信息,据此保证类型向上转换的安全。那么这里有个大前提:默认编译器已经知道对象的类型;即在编译时,编译器必须知道所有要通过RTTI来处理的类。换句话说,.class文件是由编译器生成的。那么,如果程序运行时存在的对象并不是通过编译器的.class文件,而是通过其他方式如网络传递获取的对象,那么如何得到它的类型信息呢?这...原创 2019-07-03 07:15:19 · 1661 阅读 · 2 评论 -
面试 | 什么是面向对象(OOP)?
旁白:这是一个很大的问题,我觉得面试官主要想听到的一定是面向对象给编程带来的好处,也就是说它独有的特点,所以重点应该要抓住封装、继承和多态三大特性来说。这里我回答的思路是:①面向对象思想的由来;②如何理解面向对象编程思想;③本人对面向对象思想三大特性的理解。答:①首先面向对象是一种编程思想。在面向对象这种编程思想出现以前,主流的是以c为首的面向过程的语言(cpp可以认为既是面向过程也是面向对象就...原创 2019-03-02 23:51:31 · 13821 阅读 · 4 评论 -
面试 | 重写(Override)与重载(Overload)的区别?
1.概念的不同重載:指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同;重写:是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型;2.使用的特点重载发生在一个类内的两个方法间;而重写发生在有继承关系的子类父类间;重载的方法名称相同,参数个数、类型或者顺序不同,返回类型也可以不同(不能根据返...原创 2019-03-08 17:04:28 · 661 阅读 · 1 评论 -
面试 | 接口和抽象类的区别
旁白:这个面试题经常被问到,我这里从四个方面来总结。虽然面试的时候可能没有那么的时间全部说完,但我觉得概念和设计目的应该要说清楚;因为从这两点就能看出你对两者的理解深度。1.概念的不同接口:是对行为的抽象,是抽象方法的集合。实现接口的类必须遵循契约模式,也就是必须实现接口中的方法。抽象类:是用于抽取子类通用特性的。是被用来创建继承层级里子类的模板,因此它不能被实例化,只能作为父类被子类继...原创 2019-03-06 21:00:09 · 2133 阅读 · 3 评论 -
面试 | String 为什么要设计成不可变的?
1 如何理解不可变不可变通常指这个类声明的对象不可变,即对象初始化完毕就不能改变它的状态。对象的状态就是由它的属性决定的,即全局变量;那么不可变对于基本数据类型的属性(全局变量)就是值无法改变,不可变对于引用类型的属性(全局变量)就是其指向的对象以及对象的状态不可变。2 String不可变体现在什么地方String类在定义时声明为final类型,告诉编译器我是不可变的类;String类全...原创 2019-03-07 00:21:59 · 539 阅读 · 1 评论 -
面试 | 说一下你对内部类的认识
内部类是定义在另一个类中的类;下面类B是类A的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class A{ class B {}}为什么需要内部类?不同的内部类可以满足不同场景下的需要;如在编写回调函数时,利用匿名内部类可以简化代码;局部内部类可以对外部类隐藏自己;内部类可以分为四种:成员内部类,局部内部类,匿名内部类和静态内部类。1.成员内部类...原创 2019-03-13 00:25:56 · 572 阅读 · 1 评论 -
面试|String、StringBuilder、StringBuffer 之间的区别?
String字符串在Java程序中与基本数据类型一样使用频率较高,因此各大公司面试题里面少不了对String的提问,因此有必要好好认识一下String类。1 String类的基本认知有几个基本的知识点作为基础:1 String类是引用类型;2 String类重写Object类的equals()和hashCode(),用于比较内容是否相等,而非引用地址;3 “==”运算符,对基本数据类型...原创 2019-06-19 05:24:53 · 2007 阅读 · 2 评论 -
面试 | 如何理解equals()方法和hashCode()
1 equals()方法Object类中的方法,默认检测一个对象是否等于另外一个对象,即判断两个对象是否具有相同的引用。public class Employee { @Override public boolean equals(Object obj) { // TODO Auto-generated method stub return super.equals(obj); ...原创 2019-06-09 12:32:47 · 490 阅读 · 2 评论 -
面试 |final、finally 和 finalize 的区别?
首先它们之间的关系就像雷锋和雷峰塔的关系一样,压根没关系。之所以经常放在一起被问道是因为它们长的有点像,所以下面会分别进行分析。1 final关键字使用:final是Java里50个关键字的一个,final关键字可以用来修饰类、成员方法和成员变量。final修饰类表示类不可被继承,如String类;final class A{}// 编译器报错class B extends A{}...原创 2019-06-15 06:39:13 · 420 阅读 · 2 评论 -
面试|static 关键字有什么作用
今天主要学习下Java语言中的static关键字。static关键字的含义及使用场景static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)class A { static { System.out.println("A : 静态代码块"); ...原创 2019-06-16 12:43:01 · 26692 阅读 · 31 评论 -
面试 | 自动装箱实现原理?类型转换实现原理?
1 什么是自动装箱?什么是自动拆箱?自动装箱和自动拆箱的示例:public class Test { public static void main(String[] args) { ArrayList<Integer> intList = new ArrayList<Integer>(); intList.add(100); intList.add(15...原创 2019-06-11 07:04:44 · 1661 阅读 · 3 评论 -
面试 | 什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?
1 内部类的概念内部类是定义在另一个类中的类;下面类B是类A的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class A{ class B {}}2 为什么需要内部类?(来自JAVA核心技术)内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。内部类可以对同一个包中的其他类隐藏起来。当想要定义一个回调函数且不想编写大量代码时,使用匿名内...原创 2019-06-05 07:32:55 · 3150 阅读 · 6 评论 -
面试 | 静态属性和静态方法是否可以被继承?是否可以被重写?为什么?
答:首先静态属性和静态方法是可以被子类继承的,但静态属性不能被子类重写。重写的本质是动态绑定,即根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。静态方法属于类的,在编译阶段已经静态绑定到类上,表现出来就是通过类名.方法名进行访问;所以静态方法无法被子类重写。public class Father { protected static String string = "abc"...原创 2019-06-05 07:34:18 · 1620 阅读 · 2 评论 -
面试 | String 转换成 Integer 的方式及原理?
大体思路:示例,调用Integer类的parseInt()方法;public static void method() { String str = "-255"; Integer num = Integer.parseInt(str); System.out.println(num);}默认十进制,也可以手动传其他进制来规定要把str字符串转换成什么进制的数字;public s...原创 2019-06-12 07:22:21 · 3403 阅读 · 5 评论 -
面试|如何理解Java中的多态
1 多态的含义及作用在面向对象(OOP)的程序设计语言中,多态与封装、继承合称为OOP的三大特性。封装,说简单点就是合并属性和行为创建一种新的数据类型,而继承就是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用。简单点说,多态就是把做什么和怎么做分开了;其中,做什么是指调用的哪个方法,我是去吃饭(方法a)还是去睡觉(方法b),怎么做是指实现方案,如果我选择吃饭,那么...原创 2019-06-25 23:31:43 · 8762 阅读 · 5 评论 -
面试|说说Java中的异常体系
1.什么是异常?为什么会有异常?异常(Exception)是Java语言提出的一种错误报告模型,这种错误报告模型在程序和客户端之间传递异常问题。我们应该意识到任何代码不可能是完全正确且永久正确,因此代码中必定存在异常或者错误;对于Java语言来讲,这种异常或者错误越早发现越好,即编译阶段就能把异常找出来;但因为异常的不确定性,所以有些异常有可能发生在运行时;另外,如果异常或者错误发生而没有得到...原创 2019-07-08 09:30:18 · 2294 阅读 · 2 评论 -
算法 | 如何快速判断奇数偶数
public class A { public static void main(String[] args) { int i = 101; String str = i%2 != 0 ? "奇数": "偶数"; System.out.println("out:" + str); String str1 = (i & 1) ==1 ? "奇数": "偶数...原创 2019-03-01 14:43:01 · 6660 阅读 · 2 评论