首页
学习
活动
专区
工具
TVP
发布

每天学Java

专栏成员
134
文章
196673
阅读量
36
订阅数
彻底搞懂ArrayList
同样是空的数组对象,和EMPTY_ELEMENTDATA区别在于,无参构造函数的空数组会用DEFAULTCAPACITY_EMPTY_ELEMENTDATA赋值,有参构造函数的空数组会用EMPTY_ELEMENTDATA赋值。
每天学Java
2020-09-18
4350
参数注解所引发的思考
在刚接触Spring MVC的时候,个人认为类似@Param注解的作用是用来匹配参数,像 Spring MVC的Controller层的方法是通过反射来实现的,细心的小伙伴们如果对反射机制比较了解, 就会知道通过反射得到的方法参数通常是arg0、arg1......这种格式,出现这种结果的原因是:设计人员认为保留参数名称,不会带来任何好处,只会占用额外的空间,所以出于性能考虑,就没有保留参数名称。所以在刚工作那会我一直认为注解值就是为了匹配参数名称的, 甚至每次注解上设置的别名都不敢和参数名不一样,但是在后续工作中,我们会发现不使用注解,只要请求的参数和方法参数名称相同,仍然是能匹配上的,匹配上的原因也是本篇文章要说明的重点。
每天学Java
2020-09-01
7300
ArrayList并发写出现Null值
在我看百度看到的所有答案中,关于并发写出现Null值,几乎都是将原因归咎到add方法中的size++上,这里我个人认为这种回答应该是错误的,出现null值的原因应该是扩容所造成的。
每天学Java
2020-08-25
2.2K0
非Spring项目管理Quartz
在Spring项目中我们可能并不会过于关注Quartz,因为一些常见的问题(包含上面提到的注入)Spring已经帮我们处理好,如果你在非Spring项目中,集成Quartz后需要注入容器实例,那么这篇文章应该会对你有所帮助(文章不做Quartz的入门介绍)。
每天学Java
2020-08-25
7660
非Spring项目如何注入Mapper
下面mappers标签下的sql/testMapper.xml同样是在resource目录下,这里不支持通配符,Spring配置支持通配符是因为使用Ant通配符匹配。
每天学Java
2020-08-12
1.6K0
类加载器之URLClassLoader
通过源码我们可以发现AppClassLoader和ExtClassLoader都是Launcher的静态内部类,继承自URLClassLoader。
每天学Java
2020-08-05
5.7K0
Java底层-JMX
引言部分摘自百度百科,实际上JMX是java5开始提供的对java应用进行监控的一套接口,或者我们也可以像理解JUC包一样理解JMX,把它当成一个框架。JMX这一套接口/框架实现了jvm的一些监控,比如将操作系统信息,内存使用情况,线程情况,gc情况包装为bean,我们使用的jconsole工具就是对这些包装的bean进行图形化的展示,但是我们常用的jstat,jmap等监控工具是由虚拟机直接支持的,并不是通过JMX。
每天学Java
2020-07-28
1.1K0
Java底层-本地接口(JNI)
为什么会有本地接口的概念呢?我们在之前的文章说过Java语言不是面向硬件的,它无法直接调用操作系统API操控硬件,Java和硬件的交互正常都是通过JVM提供的API来完成的,但是当虚拟机提供的API不足以实现我们个别需求的时候,就需要本地接口了。由于JVM底层就有C++的影子,所以JVM也提供了JNI(Java本地接口:Java Native Interface,)技术作为其它语言(主要是C/C++)通信的API。在本地接口的相关的概念里,Java成为了一个调用方,其他语言成为了主角,这篇文章我们以C++为例,看一下如何调用本地接口,关于C++的部分尽可能简单的描述,如果大家还有疑问可以了解一些C++的基本知识。
每天学Java
2020-07-22
1.2K0
Java底层-GC子系统
在HotSpot虚拟机中,三大子系统核心基本都是为运行时数据区服务,类加载子系统负责将字节码文件加载到运行时数据区, 执行引擎将执行线程中虚拟机栈的栈帧存储的指令集进行执行,而GC子系统(垃圾回收子系统)的目的是对运行时数据区的数据进行回收, 关于GC的知识,我想大多数Java开发都有所了解,毕竟这是面试中很常见的问题。下面我们步入正题:
每天学Java
2020-07-21
5190
Java底层-执行引擎
先回忆一下前面几节内容:一个.java文件经Javac编译器编译为.class文件(字节码文件), 当我们使用java命令执行该class文件时(HotSpot为例),首先会创建JVM实例,开辟内存空间,然后由类加载器将相应的字节码文件加载到虚拟机内存中,最后找到程序执行入口的main函数, 由JVM创建的main线程调用main函数(线程为执行引擎的的一个实例,并为该线程绑定程序计数器,虚拟机栈),main函数调用的过程中会先创建一个main帧,根据编译时期就已经确定的局部变量数组和操作数栈的大小分配内存空间, 将内存空间清零,将main帧压入main线程虚拟机栈中,main帧执行过程中,如遇到其他方法调用,同样会将调用的方法封装为栈帧压入栈中。
每天学Java
2020-07-15
1.2K0
Java底层-运行时数据区
在前面关于HotSpot组成中提到,运行时数据区就类似一个工厂,是Java程序运行所在的内存区域,这个区域被JVM所管理,按照虚拟机规范的规定将其划分为:方法区、堆、程序计数器,虚拟机栈、本地方法栈五个部分(在HotSpot虚拟机中虚拟机栈和本地方法栈功能上已经合并) 其中方法区和堆在JVM实例创建的时候就开始创建且分配好内存,我们在启动程序过程中可以通过一些参数设置,比如通过-Xms、-Xmx设置堆大小, JDK7中通过-XX:PermSize、-XX:MaxPermSize设置方法区大小(永久代),JDK8通过-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N设置方法区大小(元空间), 而程序计数器,虚拟机栈,本地方法栈是在线程创建时进行分配,所以方法区、堆是线程共享的,而程序计数器、虚拟机栈、本地方法栈是和线程绑定的,是线程私有的。
每天学Java
2020-07-07
6400
Java底层-HotSpot
在前面几节我们聊到,Javac编译器将java文件编译为class文件后,由JVM将字节码转为与机器适配的机器码进行执行, 这里我们说的JVM实际上是JVM实例(JVM通常有三种含义,一种是抽象规范概念、一个具体的是实现,比如HotSpot、 一种是运行中的虚拟机实例)。
每天学Java
2020-06-28
5610
Java底层-类加载子系统(二)
其中初始化是类加载的最后一步,使用和卸载不属于类加载的过程、此外在这些动作中, 加载阶段是唯一一个用户可以通过类加载器参与的阶段(非数组类的加载), 后续的其余阶段是完全由虚拟机主导,所以这一篇文章类加载器是重点要说明的,我们首先看类加载器。
每天学Java
2020-06-28
4270
Java底层-类加载子系统(一)
不知道大家对于答案是否存在疑问,如果存在疑问不妨继续看下去, 上一节我们提到,当我们创建JVM实例时,我们需要指定一个要执行的主类,虚拟机会先初始化这个主类, 而初始化是类加载的一个环节。
每天学Java
2020-06-28
2890
Java底层-Javac编译器
当我们执行这个命令后,就会得到一个class文件,这一步其实就是编译,在前面一节我们提及到Java不同于C/C++,它首先需要将Java文件编译成class文件, 然后再由JVM将二进制文件代码转为与机器适配的机器码,而java文件编译成class文件就是由Javac编译器来完成。通常我们也叫Javac编译器为前端编译器,因为一个传统编译器编译结果是由源码到本地机器码的一个过程,而由于Javac编译器只负责源码到字节码这一步,所以叫前端编译器;字节码到本地机器码这一步是由后端运行时编译器来完成的,比如HotSpot VM中的C1、C2编译器。此外对于程序的优化也主要集中在后端运行时编译,这样可以使非Javac编译器产生Class文件(Scala,Groovy等语言的Class文件)也能享受到编译器优化的好处。
每天学Java
2020-06-18
2K0
模拟Javac命令
首先javac命令在JDK的/bin目录下,其实质可以认为是一个脚本,在Mac系统中javac是一个可执行的 Unix文件,这里我们自己简单制作一个Unix可执行文件。
每天学Java
2020-06-18
1.1K0
Java底层-揭开JVM的面纱
在计算机世界里,程序执行的实质是通过高低电位来触发电子元件的(数字电路的知识), 而高低电位可以认为是我们所说的二进制编码,所以最开始的编程其实就是写0、1组合。这种方式编写程序对于人而言太不友好,所以为了更容易编写程序,后面使用字母、单词来代替一个特定的指令来编程,也就是汇编语言,这种编程方式比直接输入二进制要容易理解,汇编之后,出现更加适合人们理解的语言, 像C语言,以C为基础引入面向对象的的C++,Java等等。
每天学Java
2020-06-12
1.4K0
Java常用业务代码-线程篇
join类似于同步,当A线程中调用了B线程的join()方法时,表示只有当B线程执行完毕时,A线程才能继续执行(如下代码), 但是B线程必须已经调用start()方法,否则join就会失效
每天学Java
2020-06-06
5860
委派者模式的使用
在线客服项目算是告一段落了,从结果来看是没有达到自己一开始设想,因为一开始想好的设计,没能完全去实现。于是在平衡反思和甩锅的心态后,抛出原因:能力有限,时间有限,关联的业务无限。
每天学Java
2020-06-02
5890
Spark读写MySQL数据
执行的过程中,出现了很多次的jar冲突,我这边和Hadoop-common 以及 hadoop-dfs有依赖冲突,具体的根据自己实际情况去除
每天学Java
2020-06-02
2.8K0
点击加载更多
社区活动
【纪录片】中国数据库前世今生
穿越半个世纪,探寻中国数据库50年的发展历程
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档