引用类型

Java的四种引用类型

核能气质少年 提交于 2019-12-01 22:26:54
作者: 薛勤 出处: https://www.cnblogs.com/yueshutong/p/9531347.html 在Java中提供了四个级别的引用:强引用,软引用,弱引用和虚引用。在这四个引用类型中,只有强引用FinalReference类是包内可见,其他三种引用类型均为public,可以在应用程序中直接使用。引用类型的类结构如图所示。 1.强引用 Java中的引用,类似C语言中最难的指针。(我是C语言入门编程,指针的概念还是很深入我心。)通过引用,可以对堆中的对象进行操作。如: StringBuffer stringBuffer = new StringBuffer("Helloword"); 变量str指向StringBuffer实例所在的堆空间,通过str可以操作该对象。 强引用的特点: 强引用可以直接访问目标对象。 强引用所指向的对象在任何时候都不会被系统回收。JVM宁愿抛出OOM异常,也不会回收强引用所指向的对象。 强引用可能导致内存泄漏。 2.软引用 软引用是除了强引用外,最强的引用类型。可以通过java.lang.ref.SoftReference使用软引用。一个持有软引用的对象,不会被JVM很快回收,JVM会根据当前堆的使用情况来判断何时回收。当堆使用率临近阈值时,才会去回收软引用的对象。因此,软引用可以用于实现对内存敏感的高速缓存。

[随笔][Golang][nil]

╄→гoц情女王★ 提交于 2019-12-01 22:19:54
nil 是不能比较的 不同类型的nil的address是一样的 不同类型的nil是不能比较的 nil 是map, slice, pointer, channel, func, interface的零值 immutable type 不是引用类型,int , string, bool都不是引用类型 在 immutable type 中不存在两个变量内存地址是一样的 map可以在函数内部改变,但是map不是引用类型 go中函数传递参数是按值传递的,在函数内部无法改变函数外部的值,但是map可以。 map不是引用,但是作为参数传递的时候可以在函数内部改变函数实参的值???可能传递的是map的指针??? channel 也是按值传递 map 不是应用类型,为什么可以在函数内部改变??? hashmap的底层是一个指向hmap的指针,由于传递的是指针的拷贝,指针指向底层hmap并没有改变,所以可以在函数内部改变map 来源: https://www.cnblogs.com/person3/p/9238709.html

JVM内存模型入门

拈花ヽ惹草 提交于 2019-12-01 20:50:22
JVM内存模型入门 本文是学习笔记,原文地址在: https://www.bilibili.com/video/av62009886 综述 其实没有太多新东西 JVM主要分为五个区域:栈区、堆区、本地方法栈、程序计数器和方法区(元数据空间)。 本地方法栈是存储C++的native方法运行的栈区 程序计数器指向程序运行的位置 方法区主要存储静态的方法和变量,类加载器classloader等等全局的数据 堆区主要存对象,栈区存储对象的引用类型 栈、本地方法栈和程序计数器合起来是线程私有的,堆区和方法区是全局共享的。 实例讲解 值类型函数调用 在栈空间存储活动记录: 函数运行完成后,栈空间会被释放 Java的基础数据类型都是值类型,但 包装类不是! 包装类是引用类型,数据在堆上! 对象类型函数调用 注意看函数中的那个 Person p=new Person(); ,它在堆上开辟了一段内存并存储对象(由于没有初始化,id默认是0,name默认是null),栈中保存的是引用类型,只占4个字节,此时函数参数也是地址,所以我们对对象的修改会持久反映在对象上,这就是和值类型的不同。 方法区 例如main函数,就是存在于方法区的(因为它是静态方法)。 一个例子 例如如下这段代码: 注意这里的Main和main函数不是一回事,Main是指那个大类。 new Main().func1(p2);

.NET 面试题整理

筅森魡賤 提交于 2019-12-01 16:23:27
1. 值类型和引用类型的区别    1)范围:     值类型:数值类型、bool型、结构、枚举、可空类型。     引用类型:字符串、自定义的类、委托、数组、接口、object   2)内存分配:     值类型:只需要一段单独的内存,用于存放实际数据。     引用类型:需要二段内存。       第一段用于存放实际数据,它始终放在堆中。       第二段用于存放数据在堆中的存放位置   3)存储位置:     数据不是其他类型的成员:值类型的数据或引用类型的引用存放在栈中,引用类型的数据存放在堆中。     数据是其他类型的成员:引用类型的数据始终放在堆中,值类型的数据或引用类型的引用根据实际情况存放。     (栈中内存是自动释放的,堆中内存是由GC来自动释放)   4)场合:     值类型不支持多态,引用类型支持多态。     值类型不可以派生出新的类型,因为值类型都是密封的。引用类型可以。     值类型不可以包含null(除外可空类型),引用类型可以。     值类型变量的赋值-- 复制 包含的值 。引用类型变量的赋值-- 复制对象的引用 。   5)继承:     引用类型和值类型都继承自System.Object。     不同的是引用类型都直接继承System.Object,而值类型继承其子类,即System.ValueType。    

js实现浅拷贝和深拷贝

五迷三道 提交于 2019-12-01 09:59:32
实现浅拷贝和深拷贝 1. 浅拷贝和深拷贝的区别 简单点说,浅拷贝拷贝完后,修改拷贝的内容可能会对源内容产生影响。而深拷贝就是拷贝前后的内容相互不影响。 那为什么拷贝前后的内容会相互影响呢? 那就得知道基本类型和引用类型的区别了。 基本类型 :自然不用说了,它的值就是一个数字,一个字符或一个布尔值。 引用类型 :是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。 而在js中,有三大引用类型即Object、Array、Function。 因此在拷贝他们的时候,应该使用深拷贝来避免于源内容产生影响。 2.实现浅拷贝 3.实现深拷贝 3.1使用JSON var arr = [1, [7, [9]], {a:'1'} , function(){}, null, undefined, NaN]; var result = JSON.parse(JSON.stringify(arr)); 拷贝结果 [1, [7,[9]], {a:'1'}, null, null, null, null] 所以可以看出,使用JSON不能实现对function、undefined、NaN的拷贝。 来源: https://www.cnblogs.com/xuxuya/p/11677533.html

JVM---汇编指令集

女生的网名这么多〃 提交于 2019-12-01 09:52:23
1、 栈和局部变量操作     1.1  将常量压入栈的指令          aconst_null 将null对象引用压入栈 iconst_m1 将int类型常量-1压入栈 iconst_0 将int类型常量0压入栈 iconst_1 将int类型常量1压入栈 iconst_2 将int类型常量2压入栈 iconst_3 将int类型常量3压入栈 iconst_4 将int类型常量4压入栈 iconst_5 将int类型常量5压入栈 lconst_0 将long类型常量0压入栈 lconst_1 将long类型常量1压入栈 fconst_0 将float类型常量0压入栈 fconst_1 将float类型常量1压入栈 dconst_0 将double类型常量0压入栈 dconst_1 将double类型常量1压入栈 bipush 将一个8位带符号整数压入栈 sipush 将16位带符号整数压入栈 ldc 把常量池中的项压入栈 ldc_w 把常量池中的项压入栈(使用宽索引) ldc2_w 把常量池中long类型或者double类型的项压入栈(使用宽索引)    1.2   从栈中的局部变量中装载值的指令   iload 从局部变量中装载int类型值 lload 从局部变量中装载long类型值 fload 从局部变量中装载float类型值 dload

传地址方式 - 引用类型做参数(C++)

爱⌒轻易说出口 提交于 2019-12-01 09:08:54
引用 :用来给一个对象提供一个替代的名字.两个名字都代表同一个值。 特点说明: 传递引用给函数与传递指针效果是一样的,形参变化实参也发生变化。 引用类型做形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量做参数,形参与实参占用不同的存储单元;因此,当参数传递的数据量较大时,用引用的时间和空间效率更好。 引用的阅读性比指针参数好。 例子: 1 #include <iostream> 2 #include<stdio.h> 3 4 using namespace std; 5 //传地址方式 - 引用类型做参数 6 7 8 int main() 9 { 10 int i=5; 11 int &j = i; 12 13 printf("修改前:i=%d, j=%d\n", i, j); 14 15 i=7; 16 printf("修改后:i=%d, j=%d\n", i, j); 17 18 return 0; 19 } 结果: 交换两变量的值: 1 #include <iostream> 2 #include<stdio.h> 3 4 using namespace std; 5 //传地址方式 - 引用类型做参数 6 void swap_yinyong(int &m, int &n){ 7 int t; 8 t = m; 9 m = n; 10 n = t; 11 }

泛型

↘锁芯ラ 提交于 2019-12-01 06:58:27
程序= 算法 + 数据。编程人员设计好一种算法,例如排序、比较、交换等等。这些算法应该应用于不同的数据类型,而不是为每个数据类型都写一个专有的算法。 CLR 允许创建:泛型引用类型,泛型值类型,泛型接口,泛型委托。 CLR 不允许创建:泛型枚举类型。 在FCL 中泛型最明显的应用就是集合类,FLC 在 System.Collections.Generic 和 System.Collections.ObjectModel 命名空间中提供了多个泛型集合类。System.Collections.Concurrent 命名空间则提供了线程安全的泛型集合类。 开放类型和封闭类型 具有泛型类型参数的类型任然是类型,CLR 同样会为它创建内部的类型对象。这一点适合引用类型(类)、值类型(结构)、接口类型和委托类型。具有泛型类型的参数类型称为开放类型,CLR 禁止构造开放类型的任何实例。这类似于CLR 禁止构造接口类型的实例。 代码引用泛型类型时可指定一组泛型类型实参。为所有类型参数都传递了实际的数据类型,类型就成了封闭类型。CLR允许构造封闭类型的实例。 using System; using System.Collections.Generic; // A partially specified open type internal sealed class

Java引用类型

隐身守侯 提交于 2019-12-01 06:28:29
Java引用结构 强引用: 当内存不足时,JVM进行内存回收,但是,对强引用的对象,JVM就算发生OOM也不会回收 把一个对象赋值给一个引用,这个引用就是强引用,表明这个对象还活着,即这个对象是可达的,即不会被JVM回收,即使以后不会用到这个对象。因此强引用是Java发生内存泄露的主要原因。 一个普通的对象,如果没有其他的引用关系,只要超过了对象的作用域或者显式的将强引用赋值为null,一般认为是可以被垃圾回收的。 Object o1 = new Object(); Object o2 = o1; o1 = null; System.gc(); System.out.println(o2)//o2不会被回收 软引用: 软引用是一种被弱化的引用,当内存足够时,不会被回收,内存不足时,软引用被回收。 Object o1 = new Object(); SoftReference<Object> s = new SoftReference<>(o1); System.out.println(o1); System.out.println(s.get()); o1 = null; System.out.println(o1);//null System.out.println(s.get());//内存足够,不回收 //配置小内存,构造大对象,导致内存回收 -xmx5m -xms5m

php和java语法区别

六月ゝ 毕业季﹏ 提交于 2019-11-30 19:25:06
Java和PHP的基本语法基本相同,其实大部分的语言的基本语法也都相同,但是他们还是有一些细微的区别:   1.PHP是一种脚本语言,代码在服务器上执行,而结果以纯文本返回浏览器。   2.PHP能够运行在各种不同的平台中:比如windows,linux,MaxOS等。   3.PHP的脚本能够存放在文档的任何位置,且以 <?php 开头,以 ?> 结尾。   4.PHP的注释: PHP支持三种注释方式:     A.双斜杠 例如://这是申明一个变量     B.#符号 例如:#这是申明一个变量     C./**/ 例如:/*这是申明一个变量*/   java同样支持三种注释方式:     A.双斜杠 例如: //这是申明一个变量     B./**/ 例如: /*这是申明一个变量*/     C./***/ 例如: /** *这是申明一个变量 */   5.PHP中的大小写敏感问题: 在 PHP 中,所有用户定义的函数、类和关键词(例如 if、else、echo 等等)都对大小写不敏感,而变量则是大小写敏感的。   而在java中,所有函数名,关键字,类,变量等都是大小写敏感的。   6.PHP的变量申明:PHP类似于Javascript,两者都属于是若引用类型,申明的时候不用指明其类型。 而java则是强引用类型,申明时必须指明其类型。   PHP中申明变量的方式是:$X