
地基之实
文章平均质量分 72
shengjk1
零基础转码,头部大厂程序员,努力构建 通俗易懂的、好玩的编程语言教程。关注我,习得转码经验!翱翔在编程的海洋里!只学习最值得学的内容!
展开
-
JVM如何处理Java中的精度转换: 从源码到字节码
Java中的类型转换机制是其类型系统的重要组成部分。理解自动类型提升和显式类型转换的规则,以及JVM如何处理这些转换操作,对于编写高效、正确的Java代码至关重要。了解类型精度等级,避免不必要的精度损失在需要高精度值的地方使用高精度类型在进行显式类型转换时,注意可能的数据丢失和溢出问题避免在性能敏感代码中进行频繁的类型转换和装箱/拆箱操作理解不同上下文(赋值、运算、方法调用等)中的类型转换规则掌握这些知识将帮助你写出更加健壮和高效的Java代码。原创 2025-03-23 09:39:15 · 778 阅读 · 0 评论 -
在Java中,equals()和contains()谁更快
在大多数情况下,equals()方法比contains()更快,主要得益于其快速失败机制(如长度差异或早期字符不匹配)。但需注意:场景适配:如果目标是判断子串存在性(而非完全相等),只能使用contains()。内容复杂度:若比较的字符串完全相等且较长,两者的耗时差异较小。综上,从性能角度优先选择equals()(当满足功能需求时),而contains()适用于子串匹配的特定场景。原创 2025-02-13 13:24:23 · 280 阅读 · 0 评论 -
计算机寄存器是如何实现的
本文介绍了计算机寄存器的实现原理,包括通用寄存器、特殊寄存器、控制寄存器等,以及基于SRAM和DRAM构建的寄存器。重点介绍了DFF寄存器的实现原理,以及如何通过DFF构建1-Bit寄存器和16位寄存器。原创 2024-05-15 20:30:35 · 682 阅读 · 0 评论 -
计算机的内存是如何实现的
本文介绍了内存的实现原理,从冯诺依曼体系、时钟周期、DFF芯片等方面进行了讲解。同时,还介绍了内存的组成方式和内存的读写操作。总的来说,本文通俗易懂,适合初学者了解内存的基本原理。原创 2024-05-15 20:20:38 · 402 阅读 · 0 评论 -
一文搞懂CPU是如何进行计算的?
本文介绍了CPU的组成和计算原理,重点介绍了ALU的门电路组成和控制指令的输入输出,以及如何通过ALU计算两个数的差或和,并最终在屏幕或显示器上显示结果。原创 2024-05-15 19:56:31 · 2661 阅读 · 0 评论 -
一文搞懂计算机是如何启动的
本文总结了计算机启动的原理,包括打开电源、加电自检、启动固件、BIOS初始化、启动设备选择、引导程序加载、操作系统引导加载程序执行、启动管理器启动、用户选择操作系统、操作系统加载和操作系统初始化等步骤。原创 2024-05-12 18:45:43 · 1452 阅读 · 0 评论 -
计算机字符集产生的历史与乱码
本文通过比较计算机字符的发展史和人类语言的发展史,阐述了计算机字符的发展历程,从语言侏罗纪时代到语言百花齐放,再到语言统一,最后介绍了计算机字符的统一方式UTF。同时,也提到了各种字符转换工具的出现。原创 2024-05-11 19:55:16 · 769 阅读 · 0 评论 -
计算机是如何执行指令的
现在所说的计算机基本上都是冯诺依曼体系的计算机。其核心原理: 冯·诺依曼计算的核心思想是将程序指令和数据以二进制形式存储存储在同一存储器中,并使用相同的数据格式和处理方式来处理它们。这种存储程序的设计理念使得计算机能够以可编程的方式执行不同的任务,而不需要对硬件进行物理修改。在冯·诺依曼计算中,计算机由以下几个主要组件组成:控制器、运算器、存储器、输入设备、输出设备。原创 2024-05-06 21:44:35 · 512 阅读 · 0 评论 -
深入理解JVM设计的精髓与独特之处
首先,只需要替换虚拟机实现部分(有时也被称为编译器的后端程序,backend)就能相对轻松地获取支持不同硬件平台的编译器。不可否认,在这两个编译阶段之间的衔接(具体指明中间处理步骤的精确界定)必须予以谨慎的进行设计。事实上,这个衔接的重要程度之高,甚至应当将其单独定义为一种抽象计算机的语言。从软件工程的视角去深入拆解,无疑极具吸引力:首个阶段仅依赖于源高级语言的细微之处,而第二阶段则仅仅专注于目标机器语言的特质。其次,许多语言的编译器都能够复用相同的JVM后端,使得代码共享和语言交互成为可能。原创 2023-12-13 20:25:20 · 621 阅读 · 0 评论 -
VM实现方式及其优缺点
1. 内存管理方便:栈是一种先进后出(Last-In-First-Out,LIFO)的数据结构,它的内存管理非常简单。当一个方法被调用时,JVM 会为该方法创建一个新的栈帧(Stack Frame),并将该栈帧压入当前线程的栈顶。当方法执行完毕后,该栈帧会被弹出栈顶,释放相应的内存空间。2. 参数传递高效:栈的另一个优点是它可以非常高效地传递参数。当一个方法被调用时,它的参数会被依次压入栈中。由于栈是一种连续的内存结构,因此参数的访问非常快速和高效。原创 2023-12-13 20:20:42 · 461 阅读 · 0 评论 -
写给小白的Java高级编程语言的执行过程
总结一下,Java程序的运行主要由编写、编译和运行三个步骤组成。这三个步骤是Java程序运行的关键。其中的主要细节包括:Java源代码解析、编译为class文件、类加载、类变量的初始化、类构造器和对象构造器的初始化、main方法的初始化、以及多线程的处理等。这些都是我们在编写Java程序时需要注意的地方。Java解释器负责将class文件转化为字节码,并在内存中执行。这样,Java程序就可以在不同的操作系统上,通过Java解释器执行,实现跨平台特性。在Java中,有一些基本的概念和原理是我们必须了解的。原创 2023-12-12 17:06:16 · 445 阅读 · 0 评论 -
强类型语言和弱类型语言,该怎么选择?
优点和缺点是相对的,取决于具体的项目需求和团队背景。有些项目可能更适合使用强类型语言来保证代码质量和稳定性,而有些项目可能更适合使用灵活性更强的弱类型语言。原创 2023-12-11 09:57:13 · 1237 阅读 · 0 评论 -
动态类型语言与静态类型语言的对比与比较
动态编程语言和静态编程语言各有优缺点,因此在选择编程语言时,应该根据具体的项目需求和团队偏好进行选择。例如,动态编程语言在快速开发和跨平台方面表现出色,但可能会出现类型安全问题和运行效率较慢的问题。静态编程语言在类型安全、可重用性和优化性方面表现出色,但可能需要更多的学习时间总之,无论是动态编程语言还是静态编程语言,编写高质量、可维护和易读的代码是至关重要的。通过灵活运用不同的编程语言,开发人员可以更好地解决各种编程问题,提高代码质量,从而提高软件开发的效率和质量。原创 2023-12-05 20:26:15 · 964 阅读 · 0 评论 -
编程语言分类
需要注意的是,实际的编程语言可能具有混合的特性,同时支持编译和解释的方式。例如,Java虽然是解释型语言,但它在运行时将源代码编译为字节码,然后由Java虚拟机解释执行。这种将编程语言分成编译型和解释型的分类方式是比较常见的,但并不是唯一的分类方式,因为现实中存在许多语言具有复杂的特性和实现方式。生成的可执行代码直接在计算机上执行,与底层硬件交互,具有较高的性能和效率。需要显式的编译过程,将源代码转换为机器码或类似形式的可执行代码。具有较高的可移植性,可以在不同的平台上运行。原创 2023-12-05 20:20:57 · 743 阅读 · 0 评论 -
计算机是如何执行指令的
指令区用于存储 Java 程序的字节码指令。字节码是 Java 程序的中间表示形式,由编译器生成。JVM 在指令区中解释和执行字节码指令。由 冯诺依曼体系,我们知道程序想要执行,必需先加载到计算机的内存中。这里以 Java 程序为例。在冯·诺依曼计算中,计算机由以下几个主要组件组成:控制器、运算器、存储器、输入设备、输出设备。借助 JVM 的类加载器,将 HelloWorld.Class 加载到 JVM 中。现在所说的计算机基本上都是冯诺依曼体系的计算机。编译后的文件,加载至 JVM 中并执行。原创 2023-11-24 09:30:00 · 666 阅读 · 0 评论 -
计算机是如何启动的
一直好奇计算机启动的原理是怎么样的?最近刚好想搞一下操作系统,故此总结一下。原创 2023-10-09 22:25:25 · 225 阅读 · 0 评论 -
Java 类-开发规范
类开发规范原创 2023-03-16 10:46:03 · 126 阅读 · 0 评论 -
一文搞懂 Maven Wrapper
Maven Wrappermvnw是Maven Wrapper的缩写。因为我们安装Maven时,默认情况下,系统所有项目都会使用全局安装的这个Maven版本。但是,对于某些项目来说,它可能必须使用某个特定的Maven版本,这个时候,就可以使用Maven Wrapper,它可以负责给这个特定的项目安装指定版本的Maven,而其他项目不受影响。简单地说,Maven Wrapper就是给一个项目提供一个独立的,指定版本的Maven给它使用。安装Maven Wrapper安装Maven Wrapper最简单原创 2022-03-14 19:19:00 · 4115 阅读 · 1 评论 -
一文搞懂 linux 常见的版本区别
背景目前在用 mac 通过虚拟机的方式安装 linux,不要问题为什么这样做,哈哈哈哈。遇到了关于 liunx 版本的问题,特地来总结一下现状Linux的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Red Hat(RHEL红帽)为代表,后者以Debian为代表细节Redhat,应该称为Redhat系列,包括(1)RHEL (Redhat Enterprise Linux,也就是所谓的Redhat Advance Server,收费版本,稳定性原创 2022-03-07 10:56:26 · 4666 阅读 · 0 评论 -
开发模型的演化
开发模型其实是在时代洪流的发展中,不断总结和摸索的结果。1.瀑布模型这是一个经典的模型,也是你们用的最多的模型将项目活动分解为线性顺序阶段,其中每个阶段取决于前一个阶段的可交付成果。优点:由于其强调需求,需求分析,在软件生产周期早期花费的时间可以降低后期阶段的成本强调文档(例如需求文档和设计文档)以及源代码,在设计和记录不够彻底的方法中,如果团队成员在项目完成之前离开,知识就会丢失,并且项目可能难以从损失中恢复。如果存在完整的设计文档,新的团队成员甚至全新的团队应该能够通过阅读文档来熟悉自己原创 2022-02-22 16:45:02 · 638 阅读 · 0 评论 -
什么是IDE
IDE 全称:integrated development environment 集成开发环境,指的是一种将常用的开发工具组合到一个图形界面中,以供开发者构建应用程序的软件。它通常包括三部分:Source code editor( 源代码编辑器 )文本编辑器,它可以帮助编写软件代码,其功能包括使用提示、突出显示语法、提供特定于语言的代码自动补全功能以及在编写过程中的错误检查。Local build automation ( 自动化本地构建 )将简单、可重复的任务自动化,开发人员使用的一部原创 2022-02-21 17:21:04 · 11585 阅读 · 0 评论 -
java deep vs shallow copies
1. 背景2. 根本区别3. 实现 deep copy1.背景讨论 deep copy and shallow copy时,需要明白一点,肯定不是基本数据类型也不是 String,因为它们都是不可变的,都是值传递。换句话说,当讨论 deep copy or shallow copy时,都针对的引用类型,在讨论的是引用如何传递2.根本区别看引用是否指向同一个对象shallow copydeep copy区别引用指向同一个对象引用执行不同的对象特征修改其中一个.原创 2021-03-10 15:32:40 · 238 阅读 · 1 评论 -
结合 Flink 学习装饰者模式
什么是装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。简单的理解就是通过包装来扩展功能,相比于继承,更有弹性Flink 是如何实现观察者模式的@Internalpublic class KafkaDeserializationSchemaWrapper<T> implements KafkaDeserializationSchema<T> { private static final long serialVersionUID =原创 2020-11-10 19:26:02 · 464 阅读 · 0 评论 -
结合 Flink 学习观察者模式
什么是观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新观察者模式实现1.可观察者,也可以称之为主题2.观察者其实类似于订阅邮件,订阅者就是观察者,而发送邮件的就是可观察者( 主题 )/** * @author shengjk1 * @date 2020/11/9 *///主题,注册观察者、remove观察者、// nofity observer 通知完之后,具体 Observer 要做什么完全在于 Observer//原创 2020-11-09 19:40:27 · 432 阅读 · 0 评论 -
一文搞懂 java -jar 发生了什么
之前一直就很好奇 java -jar 到底发生了什么,为什么执行 java -jar 代码就自动运行了。今天我们来说明一下,尽量覆盖操作系统、编译原理、JVM 的一些东西。( 本文将处于一个不断更新的状态,知道上面这些东西覆盖的差不多了为止,如果可以的话,也会加上硬件方面的东西 ),主要的目的就是为了能以最简单的 java 代码来串一些相对来说比较底层的东西,让自己以及让每个读者对计算机能有一个相对全局的了解。我们先约定如下:1.操作系统仅仅指的是unix 或类unix2. 64 位机器3. 64位原创 2020-09-17 15:26:22 · 2010 阅读 · 5 评论 -
java 线程之间是如何通信的
java线程之间的通信方式总共有 8 种,分别是volatile、synchronized、interrupt、wait、notify、notifyAll、join、管道输入/输出,我们一个一个的来说明!volatile线程会将内存中的数据,拷贝到各自的本地内存中( 这里的本地内存指的是 cpu cache ( 比如 CPU 的一级缓存、二级缓存等 ),寄存器)。当某个变量被 vola...原创 2020-01-19 19:42:32 · 1732 阅读 · 2 评论 -
java 如何优雅的停止一个线程
写过多线程的童鞋,可能都会遇到一个问题,那就是线程如何优雅的停止!1.通过 标志位 来终止线程private static class Runner implements Runnable{ private long i; private (volatile) boolean running =true; @Override public void run() { Sys...原创 2020-01-08 11:18:39 · 620 阅读 · 0 评论 -
程序的编译、链接、装载与运行
程序的编译、链接、装载与运行 2018-11-23在Linux操作系统中,一段C程序从被写下到最终被CPU执行,要经过一段漫长而又复杂的过程。下图展示了这个过程目录编译目标文件的格式链接装载运行1. 编译编译就是把程序员所写的高级语言代码转化为对应的目标文件的过程。一般来说高级语言的编译要经过预处理、编译和汇编这几个过程。预处理预编译过程对源代码做了如下的操作删除所有的注释信息删除所有的 #def...转载 2019-11-29 10:24:45 · 2917 阅读 · 0 评论 -
JVM内存模型之方法区
方法区 又称非堆区(Non-Heap)属于 线程共有内容 主要用来存放已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。JDK8之前又被称为永久带 (Permanent Generation),JDK8永久带已被元空间 (MetaSpace)替代,虽然JDK1.7仍然保留永久带,但存储在永久代的部分数据就已经转移到了Java Heap或者是 Native Heap。譬如符号原创 2017-08-23 22:01:18 · 832 阅读 · 0 评论 -
JVM内存模型之栈
2.栈 线程私有 HotSpot将java虚拟机栈与本地方法栈合并成一个了(操作系统中的栈是通过硬件ESP、EBP寄存器来实现的)。虚拟机的栈在细分,分为: 当前栈帧、局部变量表、操作栈、动态链接、返回地址等 至于其原理:怎么样调用下一个方法怎么样返回地址等跟操作系统是一样的,就不细说了。简单的说一下像局部变量表这些东西是干啥的。 局部变量表:方法调用时传递的参数的索引、引用都放在原创 2017-08-22 22:16:45 · 656 阅读 · 0 评论 -
java反射的简单使用
前几天项目中遇到一个吧叫有意思的事情,那就是一个InsertHbase的工具类接收一个对象,然后获取到对象的每一个属性及其值,最后Insert到Hbase中 如:public class People{ private String name; private int age; public People(String name, int age) { this原创 2016-10-08 11:02:18 · 395 阅读 · 0 评论 -
关于编译器与解释器的区别
关于编译器与解释器的区别 文字大小 为了让更多的人能够从本质上理解编译器和解释器的区别,我杜撰了一个小故事来福与旺财的养牛场来福和旺财有一个养 牛场。本来养牛不是一件太难的事情,但是偏偏他俩养的牛都有特别的怪癖。奶牛阿圆只吃切成圆形的牧草,而奶牛阿方和阿三(印度来的?)分别只吃切成正方形 和三角形的牧草。如果来福和旺财拿不和奶牛性格的草去喂食,阿X们不但不产奶而且还会鄙视来福和旺财。于是来福和转载 2017-01-17 15:42:38 · 499 阅读 · 0 评论 -
JAVA的一次编译,到处运行,你知道多少?
一、对AVA的迷茫 以前只是一味的学习VB,.NET,c#。现在轮到学习java了。迷惑了?书上说:JAVA是一种跨平台语言,最大的优势就是它实现了,一次编译,到处运行的机制。这是什么?跟平台无关?我以前做的VB,.NET,c#程序也没有考虑过平台呀?学过编译原理的同学或许都知道“语言处理程序”,其实就是编译器。java的“一次编译,到处运行”就跟这个编译器有关。在具体说之前,我们先要理清楚几个概念转载 2017-01-17 16:56:27 · 717 阅读 · 0 评论 -
java对象的强引用,软引用,弱引用和虚引用
众所周知,Java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活)。为了解决内存操作不灵活这个问题,可以采用软引用等方法。 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及状态,程序才能使用它。这 就像在日常生活中,从商店购买了某样物品后,如果有用,就一转载 2017-01-17 16:27:53 · 277 阅读 · 0 评论 -
Java内存分配分析
Java内存分配分析本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的学习Java。这类文章网上有很多,但大多比较零碎。本文从认知过程角度出发,将带给读者一个系统的介绍。进入正题前首先要知道的是Java程序运行在JVM(Java Virtual Machine,Java虚拟机)上,可以把JVM理解成Java程序和操作系统之间的桥梁,JVM实现了Java的平台无关性,由此可见JVM的转载 2017-01-17 15:58:14 · 280 阅读 · 0 评论 -
JVM内存模型之堆
堆 属于 线程共有的内容 作为我们程序员最关系的部分:堆,也是占用JVM内存最大的一块。主要用来存放对象实例、数组等,也是GC发生最多的地方。java堆可以处在物理上不连续的内存空间,只要逻辑上是连续的即可。 具体来说堆分为2大部分:年轻代、年老代。而年轻代又分为:Eden空间、From Survivor空间、To Survivor空间 错误及样例 没错常见的错误就是java.lang.原创 2017-08-27 16:00:31 · 888 阅读 · 2 评论 -
JVM内存模型之直接内存
直接内存 又称堆外内存,也就是说这不是jvm运行时数据区的一部分,也不是java虚拟机规范中定义的内存区域,但这部分也会被频繁的使用,而且也可能导致OOM。堆外内存有什么优点呢? 1 减少了垃圾回收的工作,因为垃圾回收会暂停其他的工作 2 可以提高性能,避免java堆和native堆(直接内存)来回复制数据。 使用场景 1.在JDK1.4之后加入了NIO,引入了一种基于通道与缓冲区的I/O原创 2017-08-27 18:23:04 · 1090 阅读 · 0 评论 -
JVM之垃圾收集器
前言: 前面已经讨论过jvm内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随着线程而生随着线程而灭,而java堆和方法区则不一样,一个接口中的多个实现类需要的内存可能不一样,一个方法中的多个分支需要的内存也可能不一样,另外我们只有在程序处于运行期间才知道要创建什么对象以及这些对象分配多少内存。如何判断对象已死: 通过可达性分析,如果GC Roots到对象是不可达的,表示这原创 2017-10-07 17:23:14 · 265 阅读 · 0 评论 -
JVM内存模型之运行时常量池
运行时常量池 jdk7之前属于方法区的一部分,jdk8之后属于Metaspace,在heap中。 运行时常量池俗称常量池,主要用于存放编译期生成的各种字面常量以及符号引用,这部分的内容将在类加载后进入常量池中存放。 java语言并不要求常量一定只有编译期才能产生,也就是并非预置入class文件中的常量池的内容才能进入运行时常量池,运行期间也可能将新的常量放入池中其他: 待看完编译原理后再详细原创 2017-10-08 12:06:26 · 542 阅读 · 0 评论 -
JVM内存模型
先磨磨肩擦擦掌,小二很早就听说jvm的内存很是奇特,今日一看果然不同凡响。下面且听小二一一道来。一、.jvm可以看做是对操作系统的模拟,看过《操作系统》或者《深入理解操作系统》这本书的人都知道(虽然我没有看完),操作系统博大精深,jvm想要很好的模拟出操作系统实属不易 二、一次编译到处运行,虽然现在看来很普通,但在当时可谓是创时代之举。当时的设计者既然都考虑到让jvm仅仅作为一个平台,支持更多的语原创 2017-08-22 22:14:45 · 339 阅读 · 0 评论