替换空格---StringBuilder

问题:替换空格请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”限制:0 <= s 的长度 <= 10000
分类: 其他 发布时间: 03-30 10:50 阅读次数: 0

JVM基本架构及生命周期

JVM基本架构及生命周期Java虚拟机是一台执行Java字节码的虚拟计算机,它拥有独立的运行机制,其运行的Java字节码也未必由Java语言编译而成。JVM平台的各种语言可以共享Java虚拟机带来的跨平台性、优秀的垃圾回器,以及可靠的即时编译器。JVM简单架构JVM完整架构Java虚拟机作用:Java虚拟机就是二进制字节码的运行环境,负责装载字节码到其内部,解释/编译为对应平台上的机器指令执行。每一条Java指令,Java虚拟机规范中都有详细定义,如怎么取操作数,怎么处理操作数,处理结果放在
分类: 其他 发布时间: 03-30 10:50 阅读次数: 0

Java虚拟机中 类的加载过程

类的加载过程例如下面的一段简单的代码public class HelloWorld { public static void main(String[] args) { System.out.println("我已经被加载啦"); }}它的加载过程是怎么样的呢?完整的流程如下图所示:加载阶段通过一个类的全限定名获取定义此类的二进制字节流将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构在内存中生成一个代表这个类的java.lang.Clas
分类: 其他 发布时间: 03-30 10:50 阅读次数: 0

类加载器的分类及关系

类加载器分类以及关系,自定义类加载器的实现等
分类: 其他 发布时间: 03-30 10:50 阅读次数: 0

简单的Java双亲委派机制

双亲委派机制Java虚拟机对class文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的class文件加载到内存生成class对象,而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式。工作原理具体原理如下图如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行;如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器;如果父类加载器可以完成类
分类: 其他 发布时间: 03-30 10:50 阅读次数: 0

如何判断Java中两个Class对象是否相同

如何判断两个Class对象是否相同在JVM中表示两个class对象是否为同一个类存在两个必要条件:类的完整类名必须一致,包括包名。加载这个类的ClassLoader(指ClassLoader实例对象)必须相同。换句话说,在JVM中,即使这两个类对象(class对象)来源同一个Class文件,被同一个虚拟机所加载,但只要加载它们的ClassLoader实例对象不同,那么这两个类对象也是不相等的。...
分类: 其他 发布时间: 03-30 10:50 阅读次数: 0

排序算法----桶排序(java版)

桶排序 原理 实现 时间复杂度
分类: 其他 发布时间: 03-30 10:49 阅读次数: 0

排序算法---计数排序(java版)

计数排序原理计数排序(Counting Sort) 使用了一个额外的数组 C,其中第 i 个元素是待排序数组A 中值等于 i 的元素的个数。然后根据数组 C 来将 A 中的元素排到正确的位置。其实计数排序其实是桶排序的一种特殊情况。计数排序实现原理创建数组C,找出待排序的数组中最大和最小的元素;统计数组中每个值为 i 的元素出现的次数,存入数组 C 的第 i 项;对所有的计数累加(从 C 中的第一个元素开始,每一项和前一项相加);反向填充目标数组:将每个元素 i 放在新数组的第 C(i)项,
分类: 其他 发布时间: 03-30 10:49 阅读次数: 0

常用排序算法对比(时间复杂度、稳定性)

常用排序算法对比
分类: 其他 发布时间: 03-30 10:49 阅读次数: 0

排序算法---快速排序(java版)

快速排序原理快速排序(Quick Sort)算法,简称快排,利用的也是分治的思想,快排的思路是:如果要对 m->n 之间的数列进行排序,我们选择 m->n 之间的任意一个元素数据作为分区点(Pivot),然后我们遍历 m->n 之间的所有元素,将小于 pivot 的元素放到左边,大于 pivot 的元素放到右边,pivot 放到中间,这样整个数列就被分成三部分了,m->k-1 之间的元素是小于 pivot 的,中间是 pivot,k+1->n 之间的元素是大于 pivot
分类: 其他 发布时间: 03-30 10:49 阅读次数: 0

排序算法---归并算法(java版)

归并排序原理归并排序(Merge Sort)的核心思想是,如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。归并排序使用的是分治思想。分治思想分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。分治思想一般都是用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧,这两者并不冲突。而对于递归就是要找到递推公式及终止条件,所以写出归并排序的递推公式 merg
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

排序算法---希尔排序(java版)

希尔排序原理先将待排序表分割成若干相隔某个“增量”的记录组成一个子表,对各个子表分别进行直接插入,当整个表中的元素已成基本有序是,再对全体记录进行一次直接插入排序。希尔排序主要解决直接插入排序因表中元素基本有序,但是部分元素离自己位置较远而引起交换次数较多的问题。希尔排序的排序过程如图所示代码实现public class ShellSort { public static void main(String[] args) { shellSort(); }
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

排序算法---插入排序(java版)

直接插入排序原理直接插入排序(Insertion Sort)的原理是:将数组中的数据分为两个区间,已排序区间和未排序区间。初始已排序区间只有一个元素,就是数组的第一个元素。插入算法的核心思想是取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。算法过程如下图所示算法描述如下:从第一个元素开始,该元素可以认为已经被排序;取出下一个元素,在已经排序的元素序列中从后向前扫描;如果该元素(已排序)大于新元素
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

排序算法---选择排序(java版)

简单选择排序原理选择排序(Selection Sort)的原理有点类似插入排序,也分已排序区间和未排序区间。但是选择排序每次会从排序区间中找到最小的元素,将其放到已排序区间的末尾。简单选择排序执行过程如下图代码实现public class SelectSort { public static void main(String[] args) { int arr[] = {34,1,139,101}; for (int i = 0; i < arr.l
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

排序算法---冒泡排序(java版)

冒泡排序原理冒泡排序(Bubble Sort)是一种简单的排序算法,它通过依次比较两个相邻的的元素,看两个元素是否满足大小关系要求,如果不满足则交换两个元素。每一次冒泡会让至少一个元素移动到它应该在的位置上,这样 n 次冒泡就完成了 n 个数据的排序工作。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。算法过程描述比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;针对所有的元素
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

JVM---运行时数据区概述

运行时数据区概述运行时数据区,见下图,它是在类加载完成后的阶段。当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化这几个阶段完成后,就会用到执行引擎对我们的类进行使用,同时执行引擎将会使用到我们运行时数据区。内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行,JVM规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行。不同的JVM对于内存的划分方式和管理机制存在着部分差异。而
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

JVM---程序计数器

程序计数器介绍程序计数器(Program Counter Register)中的Register的命名源于CPU的寄存器,寄存器存储相关指令的现场信息。CPU只有把数据装载到寄存器才能够运行。JVM中的PC寄存器是对物理PC寄存器的一种抽象模拟。程序计数器是一块很小的内存空间,几乎可以忽略不记,它也是运行速度最快的存储区域。在JVM规范中,每个线程都有它自己的程序计数器,它是线程私有的,生命周期与线程的生命周期保持一致。任何时间的一个线程都只有一个方法在执行,也就是所谓的当前方法。程序计数器会
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

JVM---Java虚拟机栈

虚拟机栈虚拟机栈概述由于跨平台性的设计,Java的指令都是根据栈来设计的。由于不同平台CPU架构不同,所以不能设计为基于寄存器的。 其优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。为什么不少Java开发人员一提到Java内存结构,就会非常粗粒度地将JVM中的内存区理解为仅有Java堆(heap)和Java战(stack)?首先栈是运行时的单位,而堆是存储的单位。栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

JVM---虚拟机栈(操作数栈)

虚拟机栈—操作数栈概念操作数栈:Operand Stack每一个独立的栈帧除了包含局部变量表以外,还包含一个后进先出的操作数栈,也可以称之为 表达式栈(Expression Stack);操作数栈,在方法执行过程中,根据字节码指令,往栈中写入数据或提取数据,即入栈(push)和 出栈(pop);某些字节码指令将值压入操作数栈,其余的字节码指令将操作数取出栈,使用它们后再把结果压入栈,比如:执行复制、交换、求和等操作;操作数栈,主要用于保存计算过程的中间结果,同时作为计算过程中变量临时的存储空
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0

JVM---虚拟机栈(动态链接与方法返回地址)

虚拟机栈—动态链接动态链接、方法返回地址、附加信息 :有些地方被称为帧数据区;每一个栈帧内部都包含一个指向运行时常量池中该栈帧所属方法的引用,这个引用的目的就是为了支持当前方法的代码能够实现动态链接(Dynamic Linking),比如:invoke指令;Java源文件被编译到字节码文件中时,所有的变量和方法引用都作为符号引用(symbolic Reference)保存在class文件的常量池里。比如:一个方法调用了另外的其他方法时,就是通过常量池中指向方法的符号引用来表示的,那么动态链接的
分类: 其他 发布时间: 03-30 10:48 阅读次数: 0