Java基础知识
文章平均质量分 92
Starry-
加油呗
展开
-
数据结构|二叉搜索树
二叉搜索树1 定义二叉搜索树,也称为二叉查找树或者二叉排序树。假设节点node是二叉搜索树中的某个结点,结点node包含左右指针和数据值x,如果node结点的左结点上存在left结点(数据值为y),则y值小于x值,如果node结点的右结点上存在right结点(数据值为z),则z值大于x值。因为这个特性,它经常用于二分查找。2 性质若树中任意结点的左子树不为空,则左子树上的所有结点的值均小...原创 2019-09-28 17:49:37 · 608 阅读 · 0 评论 -
面试|你了解RTTI吗
运行时识别对象和类的信息主要有两种方式:一种是“传统的”RTTI,它默认我们在编译时已经知道了所有的类型;一种是反射,它允许我们在运行时发现和使用类的信息。今天首先来认识下RTTI。1.什么是RTTI以及为什么需要RTTIRTTI的英文全称是Run-Time Type Identification,即运行时类型识别。它可以在程序运行时检查父类型的引用是否可以指向子类型的对象,即确保类型向上转...原创 2019-07-04 06:22:15 · 821 阅读 · 2 评论 -
面试|你不了解的注解(一)
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 · 318 阅读 · 2 评论 -
面试|你不了解的注解(二)
这篇博文是接着上篇《面试|你不了解的注解(一)》写的,这里简单回顾下上篇博文的主要内容:注解的基本概念;注解内的四种标准注解:@Override,@Deprecated,@SuppressWarnings和@Native;注解内的五种元注解:@Target,@Retention,@Documented,@Inherited和@Repeatable;分析上面九种注解的源码,解析每种注解的...原创 2019-07-13 21:14:28 · 1103 阅读 · 3 评论 -
面试|什么是序列化?怎么实现?有哪些方式?
1 为什么要序列化(背景)以及什么是序列化?对于Java初学者来说,序列化这个概念很难接触到,因为这个阶段还没有接触到系统和框架,没有系统的交互和消息的传递,Java对象以及类的基本信息在JVM内存中随着JVM停止而消失,JVM下次启动又会重新加载字节码。但是假如系统下次启动后,某对象A需要依赖系统本次对象A的值的时候,就需要考虑对象A“持久化”的问题。相信大家看到“持久化”都会想到数据库或者缓...原创 2019-06-24 18:23:19 · 4164 阅读 · 3 评论 -
面试|你怎么理解反射
1.什么是反射及为什么要有反射上一篇文章学到通过RTTI获取对象的运行时类型信息,据此保证类型向上转换的安全。那么这里有个大前提:默认编译器已经知道对象的类型;即在编译时,编译器必须知道所有要通过RTTI来处理的类。换句话说,.class文件是由编译器生成的。那么,如果程序运行时存在的对象并不是通过编译器的.class文件,而是通过其他方式如网络传递获取的对象,那么如何得到它的类型信息呢?这...原创 2019-07-03 07:15:19 · 1627 阅读 · 2 评论 -
面试|说说Java中的异常体系
1.什么是异常?为什么会有异常?异常(Exception)是Java语言提出的一种错误报告模型,这种错误报告模型在程序和客户端之间传递异常问题。我们应该意识到任何代码不可能是完全正确且永久正确,因此代码中必定存在异常或者错误;对于Java语言来讲,这种异常或者错误越早发现越好,即编译阶段就能把异常找出来;但因为异常的不确定性,所以有些异常有可能发生在运行时;另外,如果异常或者错误发生而没有得到...原创 2019-07-08 09:30:18 · 2251 阅读 · 2 评论 -
面试|如何理解Java中的多态
1 多态的含义及作用在面向对象(OOP)的程序设计语言中,多态与封装、继承合称为OOP的三大特性。封装,说简单点就是合并属性和行为创建一种新的数据类型,而继承就是建立数据类型之间的某种关系(is-a),而多态就是这种关系在实际场景的运用。简单点说,多态就是把做什么和怎么做分开了;其中,做什么是指调用的哪个方法,我是去吃饭(方法a)还是去睡觉(方法b),怎么做是指实现方案,如果我选择吃饭,那么...原创 2019-06-25 23:31:43 · 8664 阅读 · 5 评论 -
面试 | 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 · 3339 阅读 · 5 评论 -
Eclipse中关联并调试JDK源码
eclipse关联JDK源码的一般步骤:1.依次选择Window -> Preferences;2.依次选择Java -> Installed JREs -> Jre… -> Edit…3.按照顺序依次选择…注意:这是普遍的做法,但这样做断点并不能进入class文件进行debug。因为JDK下的src.zip文件并不是和 rt.jar 完全一样。官方在编译时去...原创 2019-06-12 00:28:29 · 912 阅读 · 1 评论 -
面试 | 静态属性和静态方法是否可以被继承?是否可以被重写?为什么?
答:首先静态属性和静态方法是可以被子类继承的,但静态属性不能被子类重写。重写的本质是动态绑定,即根据运行时对象的类型来决定调用哪个方法,而不是根据编译时的类型。静态方法属于类的,在编译阶段已经静态绑定到类上,表现出来就是通过类名.方法名进行访问;所以静态方法无法被子类重写。public class Father { protected static String string = "abc"...原创 2019-06-05 07:34:18 · 1532 阅读 · 2 评论 -
面试 | 什么是内部类?成员内部类、静态内部类、局部内部类和匿名内部类的区别及作用?
1 内部类的概念内部类是定义在另一个类中的类;下面类B是类A的内部类。即内部类对象引用了实例化该内部对象的外围类对象。public class A{ class B {}}2 为什么需要内部类?(来自JAVA核心技术)内部类方法可以访问该类定义所在的作用域中的数据,包括私有数据。内部类可以对同一个包中的其他类隐藏起来。当想要定义一个回调函数且不想编写大量代码时,使用匿名内...原创 2019-06-05 07:32:55 · 3097 阅读 · 6 评论 -
面试 | 自动装箱实现原理?类型转换实现原理?
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 · 1635 阅读 · 3 评论 -
工作小技巧|Map调用toString()之后如何还原成Map?
今天被一个问题搞得头痛,解决了就决定记录下来。问题描述:页面text文本框直接传map格式的字符串到后台,如何还原成Map格式?这里给出一个map格式的字符串:{历史=100, 数学=88, 语文=64, 英语=50}由于key和value之间是“=”,而不是“:”,所以无法通过fastJson包直接转换成JSONObject对象。某度出来的结果都是下面这种方式:Map<St...原创 2019-07-16 16:03:45 · 8511 阅读 · 6 评论 -
面试|能说说你理解的泛型吗
这片博文围绕Java语言的泛型特性作了详尽的介绍。主要包括以下几个内容:泛型的概念和作用,产生背景泛型作为一种Java语言特性,如何定义泛型介绍代码层面泛型的表达方式:泛型通配符和有限通配符介绍泛型方法的定义和使用泛型使用过程中的注意事项1.泛型的概念和作用泛型是JDK在1.5版本引入的一个特性,在某种程度上,泛型的出现简化了我们的代码,在编译阶段保证代码的安全性。《Think ...原创 2019-07-17 02:07:43 · 2492 阅读 · 3 评论 -
算法|最长公共前缀
题目:编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-zJava代码class Solution { ...原创 2019-08-17 07:19:53 · 277 阅读 · 2 评论 -
面试|详细理解优先队列DelayedWorkQueue
DelayedWorkQueue优先队列该队列是定制的优先级队列,只能用来存储RunnableScheduledFutures任务。堆是实现优先级队列的最佳选择,而该队列正好是基于堆数据结构的实现。1.关于堆的一些知识堆结构是用数组实现的二叉树,数组下标可以表明元素节点的位置,所以省去指针的内存消耗;堆内元素节点的位置取决于节点的某一个属性的大小值,根据父节点是否大于左右节点分为最小堆和最大...原创 2019-08-16 19:23:41 · 14948 阅读 · 2 评论 -
面试|newFixedThreadPool,newCachedThreadPool和newScheduledThreadPool的区别
前面主要分析ThreadPoolExecutor类的创建和运行过程,今天学习Executors类。1.Executors类和Executor类的关系Executor是含有执行提交Runnable任务的接口。如果你看了关于ThreadPoolExecutor类的分析,那么就知道线程池间接实现Executor接口。Executors是一个工厂类,它能提供各种形式的线程池。2.Executo...原创 2019-08-13 00:23:44 · 5482 阅读 · 1 评论 -
面试|详细分析ScheduledThreadPoolExecutor(周期性线程池)的原理
ScheduledThreadPoolExecutor在进一步了解ScheduledThreadPoolExecutor类之前,先学习下ScheduledFutureTask类的构造。1. ScheduledFutureTask类的继承图:类图显示,该类实现Runnable接口并继承FutureTask类,表明该类是一个被包装的任务,同时该类实现Delayed接口和Comparable&...原创 2019-08-18 23:23:49 · 3137 阅读 · 5 评论 -
面试|ThreadPoolExecutor处理Runnable任务过程源码分析
本篇博文主要介绍线程池如何接收并处理任务,在此之前你需要了解下面两个知识点:①ThreadPoolExecutor创建过程以及各参数分析;②线程池5种状态的表示方法以及原理;了解上面两个知识点才能更好的理解本篇文章。0.引言线程池处理任务的逻辑决定于当前线程数(workerCount)的大小与核心线程数(corePoolSize)、最大线程数(maximumPoolSize)大小的关...原创 2019-08-07 00:12:02 · 637 阅读 · 1 评论 -
面试|详细了解Java中的字节流
在Java中有一个名为java.io的包定义Java世界数据的输入(input)和输出(output);IO流根据读取的形式和结果的不同分为:字节流和字符流;根据数据流向不同分为:输入流和输出流;1.字节流和字符流的区别字节流,顾名思义就是以字节的形式读取文本内容到内存中;而字符流则是以字符的形式读取文本内容到内存中;字符流是把读取到的字节流按照某种编码的形式转换成字符的形式,所以字符流是对字...原创 2019-07-28 21:29:15 · 1119 阅读 · 6 评论 -
面试|ThreadPoolExecutor中的线程如何从等待队列获取任务
1.问题引出我们知道一个线程创建的时候就会附带一个Runnable任务,如果该Runable任务执行完毕后,该线程如何从线程池的等待队列中获取一个任务呢?上一篇博客讲到线程池中线程和该线程的第一个任务封装在一个Worker类中,这个Worker类本身实现了Runnable接口,源码定义:private final class Worker extends AbstractQueuedSync...原创 2019-08-07 23:58:54 · 7081 阅读 · 1 评论 -
面试|ThreadPoolExecutor有哪几种状态以及如何表示?
上一篇分析线程池的创建过程,那么本篇就要学习下线程池如何处理任务。本篇涉及到大量的源码分析,所以可能会有些枯燥,但我会尽量化繁为简,希望能够通俗易懂。在学习线程池如何处理提交的任务之前,有必要了解下线程池的运行状态。我们应该知道一个线程的状态分为创建(NEW)、运行(RUNNABLE)、阻塞(BLOCK)、等待(WAITING/TIMED-WAITING)和结束(TERMINATED),线程是线...原创 2019-08-04 13:03:28 · 2418 阅读 · 3 评论 -
面试|简述下ThreadPoolExecutor线程池创建过程以及参数含义
线程池是并发里面最经常使用的工具类,所以想要晋升为中级Java工程师,学好并发的前提就是学好线程池。这里会介绍关于线程池的一些内容,比如线程池的创建过程和原理,如何理解线程池的各种状态以及之间的转换,理解面试中常说的FixedThreadPool,singleJava语言关于线程池的类图:ThreadPoolExecutor就是我们口中常说的线程池,ScheduledThreadPoolEx...原创 2019-08-03 09:58:10 · 2099 阅读 · 1 评论 -
面试|详细了解Java中的字符流
上一篇博客讲了IO流中的字节流,分别介绍输入字节流和输出字节流的类结构图; 主要介绍字节流的读取方式和输出方式,分表对应着read()方法和write()方法;然后介绍不同形式的来源有不同的读取方式,同时根据输出的目的地不同有不同的输出方式。具体的内容可以看这里,这里我们介绍IO流中的字符流。1 输入字符流输入字符流的父类是抽象类Reader,它除了实现Closeable接口,还需要实现Rea...原创 2019-07-30 06:55:25 · 445 阅读 · 4 评论 -
实战项目|自定义注解实现POJO类到CRUD语句的映射
1.前言前段时间一直在整理Java基础面试题,大大小小共有二十余篇,虽然不足市场上现有面试题的十分之一,但每一个面试题都是从最基础的概念、作用、原理和使用场景等方面来解释的,对我自己而言,这个过程很痛苦也很快乐;痛苦的是深夜撸代码之余还要撸文档,但学完之后能够加深对Java语言的理解并且能够收获各位博友的点赞,瞬间就会有满满的动力继续学下去。感觉写跑题了,回到正题。最近学习的点主要有常用的运行...原创 2019-07-20 13:07:51 · 678 阅读 · 2 评论 -
面试|static 关键字有什么作用
今天主要学习下Java语言中的static关键字。static关键字的含义及使用场景static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)class A { static { System.out.println("A : 静态代码块"); ...原创 2019-06-16 12:43:01 · 26625 阅读 · 31 评论 -
面试 |final、finally 和 finalize 的区别?
首先它们之间的关系就像雷锋和雷峰塔的关系一样,压根没关系。之所以经常放在一起被问道是因为它们长的有点像,所以下面会分别进行分析。1 final关键字使用:final是Java里50个关键字的一个,final关键字可以用来修饰类、成员方法和成员变量。final修饰类表示类不可被继承,如String类;final class A{}// 编译器报错class B extends A{}...原创 2019-06-15 06:39:13 · 384 阅读 · 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 · 447 阅读 · 2 评论 -
面试 | 接口和抽象类的区别
旁白:这个面试题经常被问到,我这里从四个方面来总结。虽然面试的时候可能没有那么的时间全部说完,但我觉得概念和设计目的应该要说清楚;因为从这两点就能看出你对两者的理解深度。1.概念的不同接口:是对行为的抽象,是抽象方法的集合。实现接口的类必须遵循契约模式,也就是必须实现接口中的方法。抽象类:是用于抽取子类通用特性的。是被用来创建继承层级里子类的模板,因此它不能被实例化,只能作为父类被子类继...原创 2019-03-06 21:00:09 · 2075 阅读 · 3 评论 -
面试 | 重写(Override)与重载(Overload)的区别?
1.概念的不同重載:指同一个类中的多个方法具有相同的名字,但这些方法具有不同的参数列表,即参数的数量或参数类型不能完全相同;重写:是存在子父类之间的,子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型;2.使用的特点重载发生在一个类内的两个方法间;而重写发生在有继承关系的子类父类间;重载的方法名称相同,参数个数、类型或者顺序不同,返回类型也可以不同(不能根据返...原创 2019-03-08 17:04:28 · 631 阅读 · 1 评论 -
面试 | 什么是面向对象(OOP)?
旁白:这是一个很大的问题,我觉得面试官主要想听到的一定是面向对象给编程带来的好处,也就是说它独有的特点,所以重点应该要抓住封装、继承和多态三大特性来说。这里我回答的思路是:①面向对象思想的由来;②如何理解面向对象编程思想;③本人对面向对象思想三大特性的理解。答:①首先面向对象是一种编程思想。在面向对象这种编程思想出现以前,主流的是以c为首的面向过程的语言(cpp可以认为既是面向过程也是面向对象就...原创 2019-03-02 23:51:31 · 13680 阅读 · 4 评论 -
Spring最新架包下载路径
最近在学习Spring的原理,想用用最新架包,于是就下载的过程记录下来。如果你不想看下面的流程,可以直接通过网址进入:http://repo.spring.io/libs-release-local/org/springframework/spring/1 进入到Spring官网:Spring.io2点击“PROJECTS”进入Spring工程页面,并点击“Spring Framewor...原创 2019-02-20 09:51:53 · 2326 阅读 · 1 评论 -
java编译器源码分析之语法分析器
token流到抽象语法树的过程是语法分析。前面认识到token流,这部分将介绍抽象语法树(AST)。那么什么是抽象语法树(AST)?AST长啥样?我们的token流是如何转变成AST的?下面围绕这三个问题展开讨论。针对什么是抽象语法树以及语法树长啥样两个问题。可以看看这篇博客,文章对于语法树的结构和原理阐述的很清楚。在这里我想说的是:①抽象语法树是源代码抽象树结构的另一种表示;②抽象语法树是...原创 2018-11-12 21:47:06 · 2228 阅读 · 0 评论 -
实战java高并发程序设计之CyclicBarrier源码分析
前面一篇博客介绍了CountDownLatch并发类,从源码的角度理解它。这篇博客讲讲另外一个并发类:CyclicBarrier!使用场景CyclicBarrier字面意思是循环栅栏,即这个栅栏可以循环使用。栅栏可以理解为挡住多个线程运行的挡板,即声明一个CyclicBarrier对象表示栅栏,把栅栏放到每个线程内部,线程调用栅栏方法的时刻就是线程等待的时刻。具体过程如下:CyclicBa...原创 2018-10-12 00:23:14 · 792 阅读 · 0 评论 -
java并发编程实战之理解显示锁ReentrantLock
前面两篇博客分别介绍了通过synchronized关键字(内置锁机制)和volatile关键字实现同步机制。由于volatile实现的同步不能保证操作的原子性,因此一般常用内置锁实现同步机制,但java5.0版本的内置锁在功能上有很多缺陷:如无法中断一个正在等待获取锁的线程、无法在请求获取一个锁时无限地等待下去等,基于这些原因,ReentrantLock孕育而生。1.ReentrantLock如...原创 2018-09-20 21:09:59 · 359 阅读 · 0 评论 -
实战java高并发程序设计之CountDownLatch源码分析
上篇文章讲到线程和进程的概念,并结合源码理解线程的各种状态,包括创建过程init(),启动过程start(),运行run(),退出exist(),等待和阻塞等。这篇博文主要讲JUC包中常用的并发工具类:CountDownLatch,CyclicBarrier,ReadWriteLock,Semaphore。首先看第一个!CountDownLatch使用场景CountDownLatch类是常...原创 2018-10-11 08:38:13 · 557 阅读 · 0 评论 -
java并发编程实战之理解同步的可见性
同步机制可以保证**“读取-修改-写入”**复合操作的原子性,从而保证线程安全。同步机制其实还有一个特性:可见性。何为可见性?看下面一段代码:public class NoVisibility { private static boolean ready; private static int number; private static class ReadThread exte...原创 2018-09-19 09:59:45 · 400 阅读 · 0 评论 -
web.xml中DispatcherServlet的作用
DispatcherServlet是前端控制器设计模式的实现,提供SpringWebMVC的集中访问点,而且负责职责的分派,而且与spring IOC容器无缝集成,从而可以获得Spring的优势。 其主要职责是调度工作,本身用于控制流程,具体为:1.文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;2.通过HandlerMapping,将请求映...原创 2018-04-22 15:24:35 · 23228 阅读 · 2 评论 -
web.xml中Filter类的基础知识
Filter,过滤器,即是对数据等的过滤,预处理过程。为什么要引入呢?用于对敏感的请求信息用*字符替代,即过滤器对信息进行了处理;同时,过滤器可以对服务器返回的响应进行预处理,可大大减少服务器的压力。1.过滤器的概念:过滤作用,对从客服端向服务端发送的请求进行过滤,也可以对服务器端返回的响应进行处理。它使用户可以改变一个request和修改一个response。Filter其实是一个客户端与ser...原创 2018-04-22 15:18:00 · 1261 阅读 · 0 评论