02 2023 档案
摘要:
根据 Java 虚拟机规范,Class 文件通过 ClassFile 定义,有点类似 C 语言的结构体。 ClassFile 的结构如下: ClassFile { u4 magic; //每个 Class 文件的头 4 个字节称为魔数(Magic Number),它的唯一作用是确定这个文件是否为一个
阅读全文

摘要:Java编程中new是非常非常频繁的操作,所以其底层实现原理和步骤非常有研究的必要: 1.类加载检查 虚拟机遇到一条 new 指令时,首先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引用,并且检查这个符号引用代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执行相应的类加载过程。
阅读全文
摘要:产生背景 代码测试的工具有很多,比如最常用的单元测试工具Junit、Jupiter、Mockito和PowerMockito,这几个可以说是Java开发者的心头好,代码测试一般都是用这几个里面的某一个或者一组(Mockito和PowerMockito)结合进行使用,现在代码测试的问题可以很好的得到解
阅读全文
摘要:什么是IO IO是输入input输出output的首字母缩写形式,直观意思是计算机输入输出,它描述的是计算机的数据流动的过程; 应用程序的IO操作分为两种动作:IO调用和IO执行。IO调用是由进程发起,IO执行是操作系统的工作。 IO流程 以一个进程的输入类型的IO调用为例,它将完成或引起如下工作内
阅读全文
摘要:简介 IO是Input和Output的简称,即输入和输出,数据读取到计算机内存中的过程就是输入,内存中的数据输出到外部(如文件和数据库)的过程就是输出。IO 流在 Java 中分为输入流和输出流,而根据数据的处理方式又分为字节流和字符流。 Java IO 流的 40 多个类都是从如下 4 个抽象类基
阅读全文
摘要:
出现背景 在以往并发情况下进行累加计数时通常使用AtomicLong,因为其底层是基于cas实现的,高并发下对单一变量进行CAS操作,从而保证其原子性。其它的线程都会进行不断自旋,这就产生了问题,随着并发线程数增加,等待线程的自旋时间也会大幅增加,白白造成了CPU资源的浪费; LongAdder问世
阅读全文

摘要:List代表有序的,元素可以重复的集合。 ArrayList和LinkedList区别 ArrayList的实现是基于数组,LinkedList的实现是基于双向链表; 对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而L
阅读全文
摘要:Java程序编写具有三大特征: 封装、继承和多态; 封装 对类中的方法和属性进行权限访问控制,只提供特定接口供外部访问,这样一方面增加了代码的规范性,另一方面增加了代码的访问安全性; 封装是面向对象编程语言对客观世界的模拟,在客观世界里,对象的状态信息都被隐藏在对象内部,外界无法直接操作和修改。对一
阅读全文
摘要:Java和C、C++不同,C和C++允许多继承多实现,但是Java不能: Java是单继承的(extends),所谓单继承是指当前子类只能有一个直接的父类;在多继承的情况下如果多个父类有相同的方法那么实现的时候会造成含糊不清; Java是多实现的 (implements),一个子类可以同时实现多个接
阅读全文
摘要:JMM中的L1和L2缓存虽然较好地缓解了CPU与内存之间巨大的读取速度差异带来的cpu使用率过低问题,但是同时却不可避免的带来了其它方面问题,比如可见性问题,⼀个线程对共享变量的修改,另外⼀个线程能够⽴刻看到,我们称为可⻅性。譬如主内存中有一个静态变量 x=0,线程A通过复制将x=0先复制到L2再复
阅读全文
摘要:Java内存模型规定,将所有的变量都存放在 主内存 中,当线程使⽤变量时,会把主内存⾥⾯的变量 复制 到⾃⼰的⼯作空间或者叫作 私有内存 ,线程读写变量时操作的是⾃⼰⼯作内存中的变量,这里也就说明了Java的传递方式是值传递而非引用传递。用一张图来描述一下: 为了平衡内存/IO 短板,会在 CPU
阅读全文