java中强,软,弱,虚引用  以及WeakHahMap   一:强软引用: 参考:http://zhangjunhd.blog.51cto.com/113473/53092/进行分析   package reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.util.WeakHashMap; public class ReferenceObject {   …
引用的应用场景 我们都知道垃圾回收器会回收符合回收条件的对象的内存,但并不是所有的程序员都知道回收条件取决于指向该对象的引用类型.这正是Java中弱引用和软引用的主要区别. 如果一个对象只有弱引用指向它,垃圾回收器会立即回收该对象,这是一种急切回收方式. 相对的,如果有软引用指向这些对象,则只有在JVM需要内存时才回收这些对象. 弱引用和软引用的特殊行为使得它们在某些情况下非常有用. 例如:软引用可以很好的用来实现缓存,当JVM需要内存时,垃圾回收器就会回收这些只有被软引用指向的对象. 而弱引用…
  题目如下: private static void change(StringBuffer str11, StringBuffer str12) { str12 = str11; str11 = new StringBuffer("new world"); str12.append("new world");} public static void main(String[] args) { StringBuffer str1 = new StringBuffe…
值传递: (形式参数类型是基本数据类型和String):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值. 引用传递: (形式参数类型是引用数据类型参数除去String):也称为传地址.方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数…
Java 中的值传递和引用传递问题 public class Operation { int data = 50; void change(int data) { data = data + 100; } public static void main(String[] args) { Operation op = new Operation(); System.out.println("before change: " + op.data); op.change(200); Syst…
Java中的值传递和引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?     答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的. Java参数,不管是原始类型还是引用类型,传递的都是副本(有另外一种说法是传值,但是说传副本更好理解吧,传值通…
1.强引用(StrongReference) 强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题. Person p = new Person(); 2.软引用(SoftReference) 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它:如果内存空间不足了,就会回收这些对象的内存.只要垃圾回收器没有回收它,该…
java的弱,虚,软引用介绍 1.弱,虚,软引用的介绍 对于绝大部分的对象而言,在程序中是存在着一个引用变量引用该对象,这是常见的引用方式,也就是常说的 强引用,对于强引用引用的对象,系统JVM是不会随意的回收资源,但是区别于强引用,对于内存敏感的程序,我们 这个内存敏感我也不清楚是啥,书上是这样说的,个人理解可能就是对于内存开支需求比较大的 也常常可以使用java.lang.ref下提供的三个包: SoftReference PhantomReference WeakReference 这三个…
Java的强引用,软引用,弱引用,虚引用及其使用场景   从 JDK1.2 版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用(Strong Reference) 强引用就是我们经常使用的引用,其写法如下: Object o = new Object(); 特点: 只要还有强引用指向一个对象,垃圾收集器就不会回收这个对象. 显式地设置 o 为 null,或者超出对象的生命周期,此时就可以回收这个对象…
http://zh.wikipedia.org/wiki/%E5%BC%B1%E5%BC%95%E7%94%A8 有些语言包含多种强度的弱引用.例如Java,在java.lang.ref[1]包中定义了软引用.弱引用和虚引用,引用强度依次递减.每种引用都有相对应的可访问性概 念.垃圾回收器(GC)通过判断对象的可访问性类型来确定何时回收该对象.当一个对象是软可访问的,垃圾回收器就可以安全回收这个对象,但如果垃圾回收器 认为JVM还能空出可用内存(比如JVM还有大量未使用的堆空间),则有可能不会立…
不同的引用类型,主要体现在对象的不同可达性(reachable)状态和对垃圾收集的影响. 1.强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还"活着",垃圾收集器不会碰这个对象.对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显示的将其强引用赋值为null,就是可以被垃圾收集的,其具体回收的时机还要看垃圾收集策略. 2.软引用是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当jvm认为内存不足时,才会去试图回收软引用指向的…
一.Java中的强.软.弱.虚引用 在JDK中我们能够看到有一个java.lang.ref的包.这个包中就是Java中实现强.软.弱.虚引用的包,例如以下: PhantomReference 虚引用:假设一个对象持有虚引用,就和没有持有引用一样,在不论什么时候都可能被垃圾回收器回收. 虚引用主要用来跟踪对象被垃圾回收的活动,虚引用另一个和弱.软引用不同的地方是虚引用必须和引用队列联合使用.当垃圾回收器准备回收一个对象时.假设发现它还有虚引用,就会在回收对象内存之前,把这个虚引用加入到与之关联的引…
java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中修改参数值时,无论是基本类型的参数还是引用类型的参数,修改的只是该参数的拷贝,不影响函数实参的值,如果修改的是引用类型的成员值,则该实参引用的成员值是可以改变的,例子如下.   首先是定义改变参数的 public static void changeInt(int i) {// 改变int型变量的函…
一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32717,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数…
这是个老生常谈的问题了,引起过无数争论,但可以说一直没有一个令人满意的回答. 有人总结过: 对象是按引用传递的 Java 应用程序有且仅有的一种参数传递机制,即按值传递 按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本 按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本 简单总结: 对象就是传引用(引用地址的拷贝,实质也是传值) 原始类型就是传值 String等immutable类型因为没有提供自身修改的函数,每次操作都是新生成一个…
1.基本类型和引用类型在内存中的保存 Java中数据类型分为两大类,基本类型和对象类型.相应的,变量也有两种类型:基本类型和引用类型. 基本类型的变量保存原始值,即它代表的值就是数值本身: 而引用类型的变量保存引用值,”引用值”指向内存空间的地址(存放对象(数据)的首地址),代表了某个对象的引用,而不是对象本身, 对象本身存放在这个引用值所表示的地址的位置. 基本类型包括:byte,short,int,long,char,float,double,Boolean,returnAddress, 引…
java中基本数据类型有8种:byte,short,int,long,char,float,double,boolean 整型有四种:byte short,int,long byte:   1字节  -128--127 short:  2字节   -32768 -- 32767 int:  4个字节   -2147483648  -- 2147483647(超过20亿) long: 8个字节   -9223372036854775808  -- 9223372036854775807 注:jav…
一.基本数据类型: byte:Java中最小的数据类型,在内存中占8位(bit),即1个字节,取值范围-128~127,默认值0 short:短整型,在内存中占16位,即2个字节,取值范围-32768~32767,默认值0 int:整型,用于存储整数,在内在中占32位,即4个字节,取值范围-2147483648~2147483647,默认值0 long:长整型,在内存中占64位,即8个字节-2^63~2^63-1,默认值0L float:浮点型,在内存中占32位,即4个字节,用于存储带小数点的数…
java中的参数传递——值传递.引用传递   参数是按值而不是按引用传递的说明 Java 应用程序有且仅有的一种参数传递机制,即按值传递. 在 Java 应用程序中永远不会传递对象,而只传递对象引用.因此是按引用传递对象.Java 应用程序按引用传递对象这一事实并不意味着 Java 应用程序按引用传递参数.参数可以是对象引用,而 Java 应用程序是按值传递对象引用的. Java 应用程序中的变量可以为以下两种类型之一:引用类型或基本类型.当作为参数传递给一个方法时,处理这两种类型的方式是相同的…
1.何谓对象? 在Java中有一句比较流行的话,叫做“万物皆对象”,这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: “按照通俗的说法,每个对象都是某个类(class)的一个实例(instance),这里,‘类’就是‘类型’的同义词.” 从这一句话就可以理解到对象的本质,简而言之,它就是类的实例,比如所有的人统称为“人类”,这里的“人类”就是一个类(物种的一种类型),而具体到每个人,比如张三这个人,它就是对象,就是…
额....java中其实没有引用传递 对于引用类型 ,在调用方法后,直接拷贝了引用的副本,但是它们指向了相同的堆地址,所以看起来像引用传递,但其实是值传递,只不过传递的引用的副本. 说一说为什么String这个对象类型.调用方法参数后,直接在栈内存(常量值)中拷贝了一份,所以在方法中对String的改变和原来的是无关的.另外可以通过new 的方法在堆中建立一个String对象 至于其他的基本数据类型,就不用多说了,因为在内存拷贝了一份副本,所以方法中对基本类型的操作和原来的当然是无关的.…
先看看Java中如何使用new关键字创建一个对象的. [java] view plain copy public class Student { public String name; public int id; public static void main(String[] args) { Student s = new Student();//看这句话 } } 语句Student s = new Student();可以拆成两句话: 语句1:Student s;在 栈 中创建一块空间,该…
在 Java 的代码开发过程中,为了尽可能提高方法的复用性,明确方法的作用,同时防止一个方法内部过于臃肿的问题,往往会创建许多方法,那么不可避免地会涉及到参数传递的问题.通常来说,我们将 Java 中的参数传递分为两种:值传递和引用传递. 值传递:参数在进入方法时,将入参深度复制一个副本,在方法内部操作的是入参的副本,在方法执行完毕之后,外部的入参没有发生任何变化. 引用传递:在方法内部操作的是参数本身,对入参做出的修改会保留到方法的外部. 那么在 Java 中,哪些情况属于值传递,哪些情况属于…
一.基本数据类型 byte.short.int.long(整数类型) float.double(浮点数类型) char(字符型) boolean(布尔类型 ) Java数据大多数存放在堆栈中. 栈区:存放局部变量,对象声明的引用等. 堆区:存放new关键字创建的类(包含成员变量)和数组等. 堆与栈的优缺点 栈的优点:栈数据可以共享,存取速度比堆快.   缺点是:存在栈中数据大小与生命周期是确定的. 堆的优点:可以动态分配内存大小,生存期也不必事先告诉编译器.缺点是:存取速度较慢. 举个栗子,如下…
一.数据类型 Java中的数据类型分为两大类,基本数据类型和引用数据类型. 1.基本数据类型 基本数据类型只有8种,可按照如下分类 ①整数类型:long.int.short.byte ②浮点类型:float.double ③字符类型:char ④布尔类型:boolean No. 数据类型 大小/位 可表示数据范围 默认值 1 byte(字节型) 8 -128~127 0 2 short(短整型) 16 -32768~32767 0 3 int(整型) 32 -2147483648~2147483…
import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; public class TestGC { /** * * 软引用 当内存满的时候,才会回收软引用指向的对象 * 弱引用 每次进行垃圾回收时,不论内存是否满,都是回收弱引用指向的对象 * * @param args */ public static void main(String[] args) { String str = new String("a…
这几天一直再纠结这个问题,今天看了这篇文章有点思路了,这跟C++里函数参数为引用.指针还是有很大区别. 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?     答:是值传递.Java 编程语言只有值传递参数.当一个对象实例作为一个参数被传递到方法中时,参数的值就是该对象的引用一个副本.指向同一个对象,对象的内容可以在被调用的方法中改变,但对象的引用(不是引用的副本)是永远不会改变的. Java参数,不管是原始类型还是引用…
java交换两个变量的值 1.幼儿园版 package tst; public class Test { public static void main(String[] args) { String x = "xx"; String y = "yy"; exchange(x, y); System.out.println(); System.out.println(x+"<->"+y); } private static void…
首先,Java没有 引用传递 这么一说. Java仅仅有值传递.传递的都是值,基本数据类型传递的是值.引用类型传递的是地址值. 我来理一下这当中宛如米线跟米面绞在一起了,再跟粉丝混在一起的关系. 好的,我们来看第一个样例: public static void main(String[] args) { int a = 1; int b = 4; System.out.println("Before : a=" + a + "," + "b="…
值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值. 引用传递:(形式参数类型是引用数据类型参数):也称为传地址.方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数.   测试…