热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java与abap对比,Java和ABAP中的几种引用类型的分析和比较

Java编程语言中几种不同的引用类型是面试时经常容易被问到的问题:强引用,软引用,弱引用,虚引用。其实除了Java之外&#x

Java编程语言中几种不同的引用类型是面试时经常容易被问到的问题:强引用,软引用,弱引用,虚引用。

其实除了Java之外,某些 其他编程语言也有类似概念,比如ABAP。今天我们就来比较一下。

根据ABAP帮助文档,我们可以把某个对象的引用包在一个Weak Reference的实例里。ABAP的Weak Reference实例通过类CL_ABAP_WEAK_REFERENCE实现。

看下面的例子:首先我在堆上创建了一个新的LCL_PERSON实例,然后包到一个ABAP weak reference里。

lo_person = NEW lcl_person( 'Jerry' ).

lo_weak = NEW cl_abap_weak_reference( lo_person ).

b5417c420e7b75131284376fff369277.png

稍后,我们想拿到被包裹的lo_person引用时,使用weak reference提供的get方法。见下图示例:

lo_person = CAST lcl_person( lo_weak->get( ) ).

引用lo_person什么时候会变成initial呢?如果当ABAP垃圾回收器(Garbage Collector)开始工作时,已经没有任何引用再指向lo_person, 则lo_person会变成initial。

看下面这个例子加深理解。REPORT ztest.

PARAMETERS: clear TYPE char1 as CHECKBOX DEFAULT abap_true,

gc TYPE char1 as CHECKBOX DEFAULT abap_true.

CLASS lcl_person DEFINITION.

PUBLIC SECTION.

DATA: mv_name TYPE string.

METHODS: constructor IMPORTING !iv_name TYPE string.

ENDCLASS.

CLASS lcl_person IMPLEMENTATION.

METHOD: constructor.

me->mv_name = iv_name.

ENDMETHOD.

ENDCLASS.

START-OF-SELECTION.

DATA: lo_person TYPE REF TO lcl_person,

lo_weak TYPE REF TO cl_abap_weak_reference.

lo_person = NEW lcl_person( 'Jerry' ).

lo_weak = NEW cl_abap_weak_reference( lo_person ).

IF clear = abap_true.

CLEAR: lo_person.

ENDIF.

IF gc = abap_true.

cl_abap_memory_utilities=>do_garbage_collection( ).

ENDIF.

lo_person = CAST lcl_person( lo_weak->get( ) ).

IF lo_person IS INITIAL.

WRITE: / 'reference not available'.

ELSE.

WRITE: / 'reference still available'.

ENDIF.

这个report有两个开关,如下图。第一个开关控制lo_person这个引用是否被关键字CLEAR显式地置为INITIAL, 第二个开关决定是否在代码中显式地调用ABAP垃圾回收器。

52ed5c049fed27c29b49d829ab246c0d.png

这两个开关的打开和关闭状态,一共有4种组合。

0b3d6c3555f1bb1e5f66f495636e519e.png

在第一种情况下,通过关键字CLEAR清除了lo_person的引用,从ABAP的内存检查器(事务码s_memory_inspector)能发现,lo_person现在已经不指向任何内存中的对象了。

d7d95844eee49b71c42e2fdb7f4b0d3a.png

对于其他三种情况,LCL_PERSON的实例都不会被ABAP垃圾回收器清除:

098ae49ffae9a08a4a8fa58537d04996.png

Java

Java中的weak reference表现行为和ABAP一致。

我把上面的ABAP测试代码用Java程序重新写一遍:import java.lang.ref.WeakReference;class Person{ private String mName; public Person(String name){ this.mName = name;

} public String getName(){ return this.mName;

}

}public class WeakReferenceTest{ public static void check(Person person){ if (person == null) {

System.out.println("Reference invalid");

} else {

System.out.println("Reference still available");

}

} public static void main(String[] args){

Person jerry = null;

WeakReference person = new WeakReference(new Person( "Jerry"));

jerry = new Person("Ben"); // if you comment out this line, Reference will be availableSystem.gc();

Person restore = person.get();

check(restore);

}

}

ABAP Soft reference - ABAP软应用

在我目前使用的ABAP Netweaver 750 SP4系统中,ABAP软应用尚未实现,

a20d7ca0b0b0f701369d802115826595.png

Java和ABAP中的几种引用类型的分析和比较

那么我们就来试试Java的软应用 Soft Reference:package reference;import java.lang.ref.SoftReference;import java.util.ArrayList;class Person2{ private String mName; public Person2(String name){ this.mName = name;

} public String getName(){ return this.mName;

} public void finalize(){

System.out.println("finalize called: " + this.mName);

} public String toString(){ return "Hello, I am " + this.mName;

}

}public class SoftReferenceTest{ public static void main(String[] args){

SoftReference person = new SoftReference(new Person2( "Jerry"));

System.out.println(person.get());

ArrayList big &#61; new ArrayList(); for (int i &#61; 0; i <10000; i&#43;&#43;) {

big.add(new Person2(String.valueOf(i)));

}

System.gc();

System.out.println("End: " &#43; person.get());

}

}

控制台打印出的输出&#xff1a;

Hello, I am Jerry

End: Hello, I am Jerry

即便我创建了1万个Person对象的实例&#xff0c;确实消耗了一些内存&#xff0c;然后内存消耗还远远没有大到会导致包含在软应用中的Person2类的引用被JDK删除掉的程度。因此我在代码中调用Java的垃圾回收器System.gc()之后&#xff0c;该引用仍然存在。

在Java中&#xff0c;软应用通常被用来实现在内存资源很有限的环境下的缓存机制&#xff0c;比如Android手机开发中。

Java 虚引用 PhantomReference

使用下面的代码测试虚引用&#xff1a;package aop;import java.lang.ref.PhantomReference;import java.lang.ref.ReferenceQueue;public class PhantomReferenceTest{ public static void main(String[] args){

Object phantomObj;

PhantomReference phantomRef, phantomRef2;

ReferenceQueue phantomQueue;

phantomObj &#61; new String("Phantom Reference");

phantomQueue &#61; new ReferenceQueue();

phantomRef &#61; new PhantomReference(phantomObj, phantomQueue);

System.out.println("1 Phantom Reference:" &#43; phantomRef.get());

System.out.println("2 Phantom Queued: " &#43; phantomRef.isEnqueued());

phantomObj &#61; null;

System.gc();

System.out.println("3 Anything in Queue? : " &#43; phantomQueue.poll()); if (!phantomRef.isEnqueued()) {

System.out.println("4 Requestion finalization.");

System.runFinalization();

}

System.out.println("5 Anything in Queue?: " &#43; phantomRef.isEnqueued());

phantomRef2 &#61; (PhantomReference) phantomQueue.poll();

System.out.println("6 Original PhantomReference: " &#43; phantomRef);

System.out.println("7 PhantomReference from Queue: " &#43; phantomRef2);

}

}

测试输出&#xff1a;

1. Phantom Reference: null

2. Phantom Queued: false

3. Anything in Queue? : null

5. Anything in Queue?: true

6. Original PhantomReference: java.lang.ref.PhantomReference&#64;2a139a55

7. PhantomReference from Queue: java.lang.ref.PhantomReference&#64;2a139a55

和之前介绍的弱引用(WeakReference)和软引用(SoftReference)不同&#xff0c;包裹在虚引用(PhantomReference)中的对象实例无法通过需引用的get方法返回&#xff0c;因此在第一行输出我们会看到&#xff1a; “1. Phantom Reference: null”.

在上面示例代码中虚引用PhantomReference的构造函数里, 我传入了一个队列作为输入参数。当包裹在虚引用实例中的对象引用被Java垃圾回收器删除时&#xff0c;虚引用实例本身会自动被JVM插入我之前指定到虚引用构造函数输入参数的那个队列中去。

在System.runFinalization()执行之前&#xff0c;phantomRef.isEnqueued()返回false&#xff0c;phantomQueue.poll()返回空。

当phantomObj实例被JVM删除后, 虚引用PhantomReference本身被加入到队列中&#xff0c;并且能够通过队列提供的API所访问&#xff1a;phantomQueue.poll(). 打印输出的第6行和第7行也说明了这一点。

要获取更多Jerry的原创技术文章&#xff0c;请关注公众号"汪子熙"



推荐阅读
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
author-avatar
心有阳光2502937567_240
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有