操作数

JVM介绍(入门知识)

◇◆丶佛笑我妖孽 提交于 2020-01-26 00:17:25
Java 虚 拟 机 (JVM) 是可运行 Java 代 码 的假想 计 算机。只要根据 JVM 规 格描述将解 释 器移植到特定的 计 算机上,就能保 证经过编译 的任何 Java 代 码 能 够 在 该 系 统 上运行。本文首先 简 要介 绍 从 Java 文件的 编译 到最 终执 行的 过 程,随后 对 JVM 规 格描述作一 说 明。       一 .Java 源文件的 编译 、下 载 、解 释 和 执 行    Java 应 用程序的 开发 周期包括 编译 、下 载 、解 释 和 执 行几个部分。 Java 编译 程序将 Java 源程序翻 译为 JVM 可 执 行 字 节码 。 这 一 编译过 程同 C/C++ 的 编译 有些不同。当 C 编译 器 编译 生成一个 对 象的代 码时 , 该 代 码 是 为 在某一特定硬件平台运行而 产 生的。因此,在 编译过 程中, 编译 程序通 过查 表将所有 对 符号的引用 转换为 特定的内存偏移量,以保 证 程序运行。 Java 编译 器却不将 对变 量和方法的引用 编译为 数 值 引用,也不确定程序 执 行 过 程中的内存布局,而是将 这 些符号引用信息保留在字 节码 中,由解 释 器在运行 过 程中 创 立内存布局,然后再通 过查 表来确定一个方法所在的地址。 这样 就有效的保 证 了 Java 的可移植性和安全性。   

JVM(JAVA虚拟机)

↘锁芯ラ 提交于 2020-01-26 00:16:35
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。   一.Java源文件的编译、下载、解释和执行   Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码—字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。   运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时,该类被放在自己的名字空间中

Java编译器、JVM、解释器

徘徊边缘 提交于 2020-01-26 00:15:51
Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。      一.Java源文件的编译、下载 、解释和执行   Java应用程序的开发周期包括编译、下载 、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行的字节码。这一编译过程同C/C++ 的编译有些不同。当C编译器编译生成一个对象的代码时,该代码是为在某一特定硬件平台运行而产生的。因此,在编译过程中,编译程序通过查表将所有对符号的引用转换为特定的内存偏移量,以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用,也不确定程序执行过程中的内存布局,而是将这些符号引用信息保留在字节码中,由解释器在运行过程中创立内存布局,然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。      运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行:代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"(class loader)完成。类装载器负责装入运行一个程序需要的所有代码,这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时

ArrayList源码分析(Java8)

做~自己de王妃 提交于 2020-01-24 02:52:03
ArrayList集合 1、特点: - 底层是Object[] 的数组 - 在内存中是连续的内存空间、并且按照顺序进行存储的 - 允许有空值存在 - 初始化大小为10 *注意: 1、因为是连续的存储空间,所以在查找某个位置数据是很快的,往中间插入数据是很慢的。 2、只有同一种数据类型的数据才可以放在同一个数组当中。 3、在往集合添加数据的时候需要检查集合是否需要扩容,扩容操作对于性能而言消耗是很大的,如果已知数据量多大的情况下,最好指定集合的大小。* 2、构造方法: (1)无参构造方法: public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } (2)指定初始化大小的构造方法: public ArrayList(int initialCapacity) { if (initialCapacity > 0) { // 当初始化大小大于0时: this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) {//当初始化大小等于0时: this.elementData = EMPTY_ELEMENTDATA; } else { //否则参数错误 throw new

栈的应用——表达式求值

雨燕双飞 提交于 2020-01-23 22:50:21
  表达式求值是程序设计语言编译中的一个基本问题,它的实现就是对“栈”的典型应用。本文针对表达式求值使用的是最简单直观的算法“算符优先法”。   本文给出两种方式来实现表达式求值,方式一直接利用中缀表达式求值,需要用到两个栈,操作数栈和操作符栈。首先置操作数栈为空栈, 操作符栈仅有“#”一个元素。依次读入表达式中的每个字符,若是操作数则进操作数栈,若是操作符则和操作符栈的栈顶运算符比较优先权作相应操作,直至整个表达式求值完毕。方式二首先把中缀表达式转换为后缀表达式并存储起来,然后利用读出的后缀表达式完成求值,其本质上是方式一的分解过程。   表达式求值的代码如下: #include <iostream> #include "stack" #include "map" using namespace std; /* 只能求一位整数的加减乘除混合运算 */ map<char, pair<int, int>> priority; // 存放各个操作符的栈内栈外优先级,first是栈内,second是栈外 char infix[50]; // 存放初始的中缀表达式 char postfix[50]; // 存放转化的后缀表达式 int result; void MakePriority() // 构造运算符优先级表 { priority.insert(make_pair('#', make

web前端入门到实战:JS基础-语法+流程控制语句+函数+内置对象【数组】

喜你入骨 提交于 2020-01-23 19:19:05
JS语法: Javascript基本数据类型:undefined/null/Boolean/number/string 复杂数据类型:object typeof用来检测变量的数据类型 typeof的使用方法有两种: (1)typeof 变量 (2) typeof(变量) undefined派生自null,所以undefined==null返回的结果是true 用于任何数据类型,Number()可以将非数值转化为数值,但是有一些数据是不能转化为数值的,如果这类数据通过Number()进行强制转化的话,会返回NaN var a=Number(name_01); 用于把字符串转换为数值 var b=parseInt("28px") var d=parseFloat("12.34.56px"); 不知道值是不是null或者undefined,可以使用String(),可以将任何类型的值转为字符串 var idstr=ids.toString(); console.log(String(m)); 在运算中,除了加法,其余的运算都会将字符串先转换为数字之后再进行计算,但是两个数据相加,如果有一方是字符串的话,加号的作用就是将他们进行拼接 如: 数字5和字符串"5"进行加减乘除运算,结果分别是:55 0 25 1 &&逻辑与: 如果第一个操作数隐式转换后为true,则返回第二个操作数;

C#运算符重载

无人久伴 提交于 2020-01-23 14:30:40
1.运算符重载 通过运算符重载,可以对我们设计的类使用标准的运算符,例如+、-等。这称为重载,因为在使用特定的参数类型时,我们为这些运算符提供了自己的实现代码,其方式与重载方法相同,也是为同名方法提供不同的参数。 要重载运算符,可给类参加运算符类型成员(它们必须是static)。一些运算符有多种用途,因此我们还指定了要处理的多少个操作数,以及这些操作数的类型,一般情况下,操作数的类型与定义运算符的类相同,但也可以定义处理混合类型的运算符。 例如,考虑一个简单类型AddClass1,如下所示: public class AddClass1 { public int val; } 这仅是int值得一个包装器,但可以用于说明原理,对于这个类,下面的代码不能编译: AddClass1 op1 =new AddClass1(); op1.val= 3; AddClass1 op2 = new AddClass1(); op2.val=5; AddClass1 op3 = op1+op2; 其错误是+运算符不能应用于AddClass1类型的操作数,因为我们尚未定义要执行的操作。下面的代码则可执行,但无法得到预期结果: AddClass1 op1 =new AddClass1(); op1.val= 3; AddClass1 op2 = new AddClass1(); op2.val=3;

Java 算术运算符

£可爱£侵袭症+ 提交于 2020-01-23 00:30:42
Java教程 - Java算术运算符 在数学表达式中使用算术运算符。 所有算术运算符 下表列出了算术运算符: 运算符 结果 + 加法 - 减法 * 乘法 / 除法 % 余数 ++ 自增 += 加法分配 -= 减法分配 *= 乘法分配 /= 除法分配 %= 模量分配 - - 自减 算术运算符的操作数必须是数字类型。您不能在 boolean 类型上使用算术运算符,但可以在 char 类型上使用它们。 基本算术运算是加法,减法,乘法和除法。他们的行为正如你所期望的。减运算符也有一个一元形式,它取消它的单个操作数。 下面的快速演示显示了如何在Java中进行简单的计算基本算术运算符。 public class Main { public static void main ( String args [ ] ) { System . out . println ( "Integer Arithmetic" ) ; int a = 1 + 1 ; int b = a * 3 ; int c = b / 4 ; int d = c - a ; int e = - d ; System . out . println ( "a = " + a ) ; System . out . println ( "b = " + b ) ; System . out . println ( "c = " + c

20200109

淺唱寂寞╮ 提交于 2020-01-22 21:18:43
一.回顾/预习 1.流 2.运算符重载:友元单向的、不具备传递性、不能 被继承,所以,应尽力合理使用友元。 注意:友元的声明是不受 public/protected/private 关键字限制的。 运算符重载的实质就是函数重载或函数 多态 。 运算符重载还具有以下规则: 为了防止用户对标准类型进行运算符重载, C++ 规定重载的运算符的操作对象 必须至少有一个是自定义类型或枚举类型 重载运算符之后,其优先级和结合性还是固定不变的。 重载不会改变运算符的用法,原来有几个操作数、操作数在左边还是在右边, 这些都不会改变。 重载运算符函数不能有默认参数,否则就改变了运算符操作数的个数。 重载逻辑运算符( && , || )后,不再具备短路求值特性。 不能臆造一个并不存在的运算符,如@、$等 用成员函数重载双目运算符时,左操作数无须用参数输入,而是通过隐含的 this 指针传入。 自增自减的前置与后置 明显前置形式效率更高 class Complex { public : //... //前置形式 Complex & operator ++ ( ) { ++ _real ; ++ _image ; return * this ; } //后置形式 Complex operator ++ ( int ) //int作为标记,并不传递参数 { Complex tmp ( * this ) ;

JVM运行机制

孤街醉人 提交于 2020-01-22 20:57:10
jvm启动流程 JVM基本结构 JVM内存空间: 1、方法区:    保存装载的类信息 类型常量池   字段、方法信息 方法字节码   通常和永久区(perm) 关联在一起 JDK6时,String等常量信息置于方法 JDK7时,已经移动到了堆 2、PC寄存器 每个线程拥有一个PC寄存器 在线程创建时创建 指向下一条指令的地址 执行本地方法时,PC的值为undefined 3、JAVA堆   和程序开发密切相关 应用系统对象都保存在Java堆中 所有线程共享Java堆 对分代GC来说,堆也是分代的 GC的主要工作区间 4、Java栈 线程私有 栈由一系列帧组成(因此Java栈也叫做帧栈) 帧保存一个方法的局部变量、操作数栈、常量池指针 每一次方法调用创建一个帧,并压栈    JAVA 栈之局部变量表: 包含局部变量 和参数,如下代码在栈帧中的结构: public class StackDemo { public static int runStatic(int i,long l,float f,Object o ,byte b){ return 0; } public int runInstance(char c,short s,boolean b){ return 0; } }   runStatic            runInstance java栈之操作数栈: