引用类型

值类型和引用类型

时光怂恿深爱的人放手 提交于 2020-03-23 12:11:47
1.值类型(ValueType) 值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型。 值类型的变量直接存储数据,分配在托管栈中。变量会在创建它们的方法返回时自动释放,例如在一个方法中声明Char型的变量name=’C’,当实例化它的方法结束时,name变量在栈上占用的内存就会自动释放 C#的所有值类型均隐式派生自System.ValueType。 结构体:struct(直接派生于System.ValueType)。 数值类型:整型,sbyte(System.SByte的别 名),short(System.Int16),int(System.Int32),long(System.Int64),byte(System.Byte),ushort(System.UInt16),uint(System.UInt32),ulong(System.UInt64),char(System.Char)。 浮点型:float(System.Single),double(System.Double)。 财务计算的高精度decimal型:decimal(System.Decimal)。 bool型:bool(System.Boolean的别名)。 用户定义的结构体(派生于System.ValueType)。 枚举:enum(派生于System.Enum)。 可空类型

Java有几种引用类型?

拟墨画扇 提交于 2020-03-23 06:17:05
  有这样一类对象:当内存空间还足够,则可保留在内存中;如果内存空间在gc之后还是非常紧张,则可抛弃这些对象。很多系统的缓存功能适合这样的场景,所以jdk1.2以后 java将引用分为了强引用、软引用、弱引用、虚引用四种,引用强度一次减弱。 强引用:类似Object a=new Object()这类,永远不会被回收。 软引用:SoftReference,当系统快要发生内存溢出异常时,将会把这些对象列入回收范围进行二次回收,如果这次回收还是没有足够内存,则抛出内存溢出异常。 弱引用:比软引用更弱,活不过下一次gc。无论当前内存是否足够,下一次gc都会被回收掉。 虚引用:又叫幻引用,最弱,一个对象时候有虚引用的存在,不会对它的生存时间构成影响,唯一目的就是能在这对象被回收以后收到一个系统通知。。 来源: https://www.cnblogs.com/akaneblog/p/6783703.html

值类型和引用类型及参数传递

☆樱花仙子☆ 提交于 2020-03-20 18:29:54
值类型和引用类型: C#数据类型分为两大类:值类型和引用类型。 值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型。 引用类型数据主要有:数组,字符串,接口,委托,类。 值类型和引用类型的区别:   引用类型继承自System.Object,值类型继承自System.ValueType。   引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中。在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放。   引用类型可以派生出新的类型,而值类型不可以。引用类型可以包含null值,而值类型不可以。   引用类型变量赋值只复制对象的引用,不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。 下面一个小例子可以简单说明值类型和引用类型: class PointR { public int x, y; } struct PointV { public int a, b; } class Program { static void Main(string[] args) { //给一个引用类型赋值将复制到一个对象的引用,而给一个值类型赋值将复制一个对象的值 PointR r; PointV v; r = new PointR(); v = new PointV(); r.x = 7; v.a = 7; PointR

JS原型和原型链

江枫思渺然 提交于 2020-03-20 12:32:30
构造函数 function Foo(name, age){ this.name = name; this.age = age; this.class = 'class-1'; } var f =new Foo('zhangsan',20); 命名规则:大写字母开头; 那么,在使用new操作符来调用一个构造函数的时候,发生了什么呢?其实很简单,就发生了四件事: var obj ={}; obj.__proto__ = Foo.prototype; Foo.call(obj); return obj; 第一行,创建一个空对象obj。 第二行,将这个空对象的 proto 成员指向了构造函数对象的prototype成员对象,这是最关键的一步,将新生成的对象的 prop 属性赋值为构造函数的prototype属性,使得通过构造函数创建的所有对象可以共享相同的原型。 第三行,将构造函数的作用域赋给新对象,因此Foo函数中的this指向新对象obj,然后再调用Foo函数。于是我们就给obj对象赋值了。 第四行,返回新对象obj。 构造函数 - 扩展 var a = {} 其实是 var a = new Object()的语法糖; var a = [] 其实是 var a = new Array() 的语法糖; function Foo(){...} 其实是 var Foo = new

JS中的栈和堆

回眸只為那壹抹淺笑 提交于 2020-03-20 01:06:22
一.栈和堆 栈(stack) :栈会自动分配内存空间,会自动释放,存放 基本类型 ,简单的数据段,占据固定大小的空间。 基本类型 :String,Number,Boolean,Null,Undefined 堆(heap) :动态分配的内存,大小不定也不会自动释放,存放 引用类型 ,指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。 引用类型 :Function,Array,Object 二.区别 栈 :所有在方法中定义的变量都是放在栈内存中,随着方法的执行结束,这个方法的内存栈也自然销毁。 优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享; 缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 堆 :堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(参数传递)。创建对象是为了反复利用,这个对象将被保存到运行时数据区。 三.栈和堆的溢出 栈 :可以递归调用方法,这样随着栈深度的增加,JVM维持着一条长长的方法调用轨迹,知道内存不够分配,产生栈溢出。 堆 :循环创建对象,通俗点就是不断的new 一个对象。 下面来看看传值和传址的区别 其实这两者区别就是基本类型和引用类型的区别,话不多说看栗子 var a = [1,0,9,8,7]; var b = a;

JS 基本数据类型和引用数据类型

佐手、 提交于 2020-03-18 02:03:32
本文章已收录于: /*--> */ /*--> */ 基本类型和引用类型 ECMAScript包含两个不同类型的值:基本类型值和引用类型值。 基本类型值 指的是简单的数据段; 引用类型值 指由多个值构成的对象。当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值。 常见的五种基本数据类型是: Undifined、Null、Boolean、Number和String。这五种基本数据类型可以直接操作保存在变量中的 实际值 。 看下面例子: var a = 10; var b = a; b = 20; console.log(a); // 10 var bl = true; var bl1 = bl; bl1 = false; console.log(bl); // true 上面,b获取值是a值的一份拷贝,虽然,两个变量的值是相等,但是两个变量保存两不同的基本数据类型值。b只是保存了a复制的一个副本。所以,当b的值改变时,a的值依然是10; 下面,两个Boolean变量bl和bl1同样是基本数据类型,同样保存两个不同的基本数据据类型值,bl1保存bl复制的一个副本。 下图演示了这种基本数据类型赋值的过程: 下面看一下引用类型数据: JavaScript 引用数据类型是保存在堆内存中的对象,与其它语言不同的是

JVM性能优化概念

╄→尐↘猪︶ㄣ 提交于 2020-03-17 15:34:25
Java虚拟机中,数据类型可以分为两类:基本类型和引用类型。基本类型的变量保存原始值,即:他代表的值就是数值本身;而引用类型的变量保存引用值。“引用值”代表了某个对象的引用,而不是对象本身,对象本身存放在这个引用值所表示的地址的位置。基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress引用类型包括:类类型,接口类型和数组。堆与栈 堆和栈是程序运行的关键,很有必要把他们的关系说清楚。 栈是运行时的单位,而堆是存储的单位。 栈解决程序的运行问题,即程序如何执行,或者说如何处理数据;堆解决的是数据存储的问题,即数据怎么放、放在哪儿。 在Java中一个线程就会相应有一个线程栈与之对应,这点很容易理解,因为不同的线程执行逻辑有所不同,因此需要一个独立的线程栈。而堆则是所有线程共享的。栈因为是运行单位,因此里面存储的信息都是跟当前线程(或程序)相关信息的。包括局部变量、程序运行状态、方法返回值等等;而堆只负责存储对象信息。 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗? 第一,从软件设计的角度看,栈代表了处理逻辑,而堆代表了数据。这样分开,使得处理逻辑更为清晰。分而治之的思想。这种隔离、模块化的思想在软件设计的方方面面都有体现。 第二,堆与栈的分离,使得堆中的内容可以被多个栈共享

Optional优雅的使用null

[亡魂溺海] 提交于 2020-03-17 05:56:37
在我们学习和使用Guava的Optional之前,我们需要来了解一下Java中null。因为,只有我们深入的了解了null的相关知识,我们才能更加深入体会领悟到Guava的Optional设计和使用上的优雅和简单。   null代表不确定的对象:   Java中,null是一个关键字,用来标识一个不确定的对象。因此可以将null赋给引用类型变量,但不可以将null赋给基本类型变量。   Java中,变量的使用都遵循一个原则:先定义,并且初始化后,才可以使用。例如如下代码中,我们不能定义int age后,不给age指定值,就去打印age的值。这条对对于引用类型变量也是适用的(String name也同样适用),在编译的时候就会提示为初始化.   在Java中,Java默认给变量赋值:在定义变量的时候,如果定义后没有给变量赋值,则Java在运行时会自动给变量赋值。赋值原则是整数类型int、byte、short、long的自动赋值为0,带小数点的float、double自动赋值为0.0,boolean的自动赋值为false,其他各供引用类型变量自动赋值为null。    null本身不是对象,也不是Objcet的实例:   null只是一个关键字,用来标识一个不确定的对象,他既不是对象,也不是Objcet对象的实例。null不属于java.lang.Object类型,可见

c# 装箱和拆箱相关知识点整理

大兔子大兔子 提交于 2020-03-15 20:53:40
1.装箱和拆箱是一个抽象的概念,.NET中,NET的所有类型都是由基类System.Object继承过来的,数据类型划分为值类型和引用(不等同于C++的指针)类型,与此对应,内存分配被分成了两种方式,一为栈,二为堆,注意:是托管堆。 值类型只会在栈中分配,引用类型分配内存与托管堆。托管堆对应于垃圾回收 。通过装箱和拆箱操作,能够 在值类型和引用类型中架起一做桥梁 .换言之,可以轻松的实现值类型与引用类型的互相转换 2. 装箱 是将值类型转换为引用类型 ; 拆箱 是将引用类型转换为值类型。 3.利用装箱和拆箱功能,可通过允许值类型的任何值与Object 类型的值相互转换。  int val = 100;    object obj = val;    Console.WriteLine (“对象的值 = {0}", obj);   //这是一个装箱的过程,是将值类型转换为引用类型的过程    int val = 100;   object obj = val;   int num = ( int ) obj;   Console.WriteLine ( "num: {0}" , num);   //这是一个拆箱的过程,是将值类型转换为引用类型,再由引用类型转换为值类型的过程 4. 为何需要装箱?(为何要将值类型转为引用类型?)   一种最普通的场景是

值类型和引用类型及参数传递

☆樱花仙子☆ 提交于 2020-03-13 13:05:35
值类型和引用类型: C#数据类型分为两大类:值类型和引用类型。 值类型数据主要有:结构体struct,枚举体enum,布尔型bool,浮点型,整型。 引用类型数据主要有:数组,字符串,接口,委托,类。 值类型和引用类型的区别:   引用类型继承自System.Object,值类型继承自System.ValueType。   引用类型保存到内存的堆heap中,值类型保存在内存的堆栈stack中。在.net中,栈的内存是自动释放的,而堆会有垃圾回收器GC来释放。   引用类型可以派生出新的类型,而值类型不可以。引用类型可以包含null值,而值类型不可以。   引用类型变量赋值只复制对象的引用,不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值。 下面一个小例子可以简单说明值类型和引用类型: class PointR { public int x, y; } struct PointV { public int a, b; } class Program { static void Main(string[] args) { //给一个引用类型赋值将复制到一个对象的引用,而给一个值类型赋值将复制一个对象的值 PointR r; PointV v; r = new PointR(); v = new PointV(); r.x = 7; v.a = 7; PointR