java 中的指针_Java中的指针

java 中的指针

Java中有指针吗? 简短的答案是“不,没有”,这对于许多开发人员来说似乎是显而易见的。 但是,为什么对其他人却不那么明显呢?

  • http://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-java
  • http://stackoverflow.com/questions/2629357/does-java-have-pointers
  • https://www.google.hu/search?q=pointers+in+java

这是因为Java用于访问对象的引用与指针非常相似。 如果您有Java之前的C编程经验,则可能更容易考虑将变量中存储的值作为指向保存对象的某些内存位置的指针的想法。 或多或少都可以。 多于少,但这就是我们现在要看的。

引用和指针之间的区别

正如Brian Agnew在stackoverflow上总结的那样 ,有两个主要区别。

  1. 没有指针算法
  2. 引用不“指向”内存位置

缺少指针算法

当您在C中有一个struct数组时,为该数组分配的内存将一个接一个地包含结构的内容。 如果你有类似的东西

struct circle {double radius;double x,y;
}
struct circle circles[6];

它会在连续区域中占用6*3*sizeof(double)字节的内存(在64位体系结构中通常为144字节)。 如果您在Java中有类似的东西,则需要一个类( 直到我们使用Java 10或更高版本 ):

class Circle {double radius;double x,y;
}

和数组

Circle circles[6];

将需要6个引用(大约48个字节)和6个对象(除非其中一些为null),每个24bytes数据(大约)和对象标头 (16bytes)。 在64位体系结构上,总计为288bytes,并且内存区域不是连续的。

访问元素时,说出C语言数组的circles[n] ,代码将使用指针算术。 它使用存储在指针circles的地址加上nsizeof(struct circle) (字节),也就是数据所在的位置。

Java方法有些不同。 它查看对象circles ,它是一个数组,计算第n个元素(与C相似),并获取存储在其中的参考数据。 在参考数据可用之后,它使用它从参考数据所处的某个不同存储位置访问对象。

请注意,在这种情况下,Java的内存开销为100%,并且读取内存的次数为2而不是1,以访问实际数据。

引用不指向内存

Java引用不是指针。 它们包含某种指针数据或某些指针数据,因为它们来自当今计算机体系结构的本质,但这完全取决于JVM实现,它存储在参考值中以及如何访问它所引用的对象。 尽管不是很有效的实现,但是拥有一个巨大的指针数组(每个指针指向JVM的一个对象),并且引用是该数组的索引,这绝对是可以的。

实际上,JVM将引用实现为一种指针混合,其中某些位是标志,而某些位“指向”相对于某个区域的某个内存位置。

JVM为什么这样做而不是指针?

原因是垃圾回收。 为了实现有效的垃圾回收并避免内存碎片,JVM定期在内存中移动对象。 当由不再被引用的对象占用的内存被释放并且我们恰好在一个巨大的可用内存块中间有一个仍在使用和引用的小对象时,我们不希望该内存块被拆分。 而是,JVM将对象移动到另一个内存区域,并更新对该对象的所有引用以跟踪新位置。 一些GC实现会在发生这些更新时停止其他Java线程,以便没有Java代码使用未更新的引用而是移动了对象。 其他GC实现与底层OS虚拟内存管理集成在一起,从而在发生此类访问时导致页面错误,从而避免了应用程序线程的停止。

但是,问题是引用不是指针,而是JVM实现如何管理所有这些情况的责任。

与该领域密切相关的下一个主题是参数传递。

参数是通过值传递还是通过Java引用传递?

我在大学学习的第一门编程语言是Niklaus Wirth发明的PASCAL。 用这种语言,过程和函数参数可以通过值或引用来传递。 当参数通过引用传递时,则在过程或函数头中的参数声明之前带有关键字VAR 。 在使用函数的地方,不允许程序员将表达式写为实际参数。 您必须使用变量,并且函数(过程)中对参数的任何更改都将影响作为参数传递的变量。

当您使用语言C编程时,总是传递一个值。 但这实际上是一个谎言,因为您可以传递指向该函数可以修改的变量的指针的值。 就是说,当您将诸如char *s作为参数编写时,如果函数使用指针算术,则该函数可以更改s指向的字符或整个字符串。

在PASCAL中,值传递或引用传递的声明位于函数(或过程)的声明中。 在C语言中,您必须明确地编写一个类似于&s的表达式&s以将指针传递给变量s以便调用者可以对其进行修改。 当然,还必须声明该函数以使用指向s具有的任何类型s指针。

当您读取PASCAL代码时,您无法在实际函数调用的位置知道参数是否按值传递,因此可能会被函数修改。 如果使用C,则必须在两个位置都对其进行编码,并且每当看到传递了参数值&s ,就可以确保该函数能够修改s的值。

Java到底是什么? 您可能已经对Java进行了多年编程,可能没有遇到这个问题或对此没有任何想法。 Java自动解决问题? 还是只是给出了一个如此简单的解决方案,以至于不存在双重按值传递/引用方法?

可悲的事实是,Java实际上是隐藏了问题,并没有解决问题。 只要我们仅处理Java通过引用传递的对象。 当结果是一个对象时,无论您写入实际函数调用的任何表达式,对该对象的引用都将传递给该方法。 如果表达式是一个变量,则传递该变量包含的引用(这是变量的值,因此这是一种按值传递)。

当您传递基元( intboolean等)时,参数将按值传递。 如果所求值的表达式结果为原语,则按值传递它。 如果表达式是变量,则传递该变量包含的原始值。 这样,我们可以说查看三种示例语言,

  • PASCAL声明如何传递参数
  • C计算传递给它的实际值
  • Java根据参数的类型决定

我认为Java有点混乱。 但是我没有意识到这一点,因为这种混乱局面是有限的,并且由于原语的盒装版本是不可变的,因此被很好地隐藏了。 如果无论如何都无法修改值,为什么还要关心参数传递的基本机制。 如果按值传递:可以。 如果它通过引用传递,则仍然可以,因为对象是不可变的。

如果装箱的原始值是可变的,是否会引起问题? 我们将查看是否以及何时将在Java中使用值类型 。

翻译自: https://www.javacodegeeks.com/2016/01/pointers-in-java.html

java 中的指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/336636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

发送结构化网络数据Server端

#include<iostream> #include<Windows.h> using namespace std;struct DataPack {int age;char name[32];};int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOC…

concat合并的数组会有顺序么_JS 数组操作 记录 笔记

Array数组的方法Mutator方法————"突变方法"会改变数组自身的值&#xff1b;Accessor方法————"访问方法"不会改变数组自身的值&#xff1b;Iteration方法————"遍历的方法" Establish方法————"创建新方法"Mutator方法(会…

工厂模式理解_工厂模式

工厂模式理解工厂模式是一种创新的设计模式&#xff0c;其目的是提供一个接口&#xff0c;用于创建相关或相关对象的族&#xff0c;而无需指定其具体类。 创建逻辑封装在工厂中&#xff0c;该工厂提供创建逻辑的方法或将对象的创建委托给子类。 客户端不知道接口或类的不同实现…

服务器双向认证 原理,什么叫SSL双向认证 SSL双向认证过程是怎样的

我们都知道SSL认证能够分成SSL双向认证和SSL单向认证。那么&#xff0c;什么是SSL双向认证&#xff1f;SSL双向认证过程又是怎样的&#xff1f;小编就在接下来的内容为各位详细讲述。什么叫SSL双向认证SSL双向认证则是需要是服务端需要客户端提供身份认证&#xff0c;只能是服务…

发送结构化数据Client端

#include<iostream> #include<Windows.h> using namespace std;struct DataPack {int age;char name[32];};int main() {//初始化ws2_32.dllWORD ver MAKEWORD(2, 2);WSADATA wsaData;WSAStartup(ver, &wsaData);//对应WSACleanup的调用//1.建立一个socketSOC…

依赖: ros-melodic-desktop 但是它将不会被安装_npm系列之依赖管理

1. 版本控制npm依赖包使用语义化的版本号&#xff0c;让开发者可以从版本号中推测修改。版本号格式为&#xff1a;X.Y.ZX&#xff1a;代表主版本号&#xff0c;只有更新了不向下兼容的API时才需要修改Y&#xff1a;次版本号&#xff0c;当模块增加了向下兼容的功能时需要修改Z&…

java编写代理服务器_如何编写Java代理

java编写代理服务器对于vmlens &#xff08;轻量级Java竞争条件捕获器&#xff09;&#xff0c;我们使用Java代理来跟踪字段访问。 这是我们学习的实现此类代理的经验教训。 开始 使用“静态公共静态无效值premain&#xff08;String args&#xff0c;Instrumentation inst&am…

怎么修改ipv4服务器,如何修改ipv4 wins 服务器地址

如何修改ipv4 wins 服务器地址 内容精选换一换IPv6的使用&#xff0c;可以有效弥补IPv4网络地址资源有限的问题。如果当前云服务器使用IPv4&#xff0c;那么启用IPv6后&#xff0c;云服务器可在双栈模式下运行&#xff0c;即云服务器可以拥有两个不同版本的IP地址&#xff1a;I…

C++ 【随想录】(二)指针常量与常量指针精解【一次掌握】

关于指针常量和常量指针 const int *x int *const y 在前先读&#xff0c;在前不变 *&#xff08;指针&#xff09;和const(常量&#xff09;谁在前先读谁&#xff1b; *代表被指的数据&#xff0c;名字代表指针地址 const在谁前谁不变

python 追加到字典_使用Python读取,写入和解析JSON

JSON是用于数据交换的轻量级数据格式&#xff0c;可以很容易地被人类读取和写入&#xff0c;也可以由机器轻松解析和生成。它是一种完全独立于语言的文本格式。为了处理JSON数据&#xff0c;Python有一个名为的内置包json。示例&#xff1a; s {“ id”&#xff1a;01&#xff…

couchbase_适用于具有Couchbase和WildFly的多容器和多主机应用程序的Docker Machine,Swarm和Compose...

couchbase该博客将说明如何使用Docker创建部署在多个主机上的多容器应用程序。 这将使用Docker Machine&#xff0c;Swarm和Compose实现。 是的&#xff0c;这三个工具一起使这个博客变得更加有趣&#xff01; 该图说明了关键组件&#xff1a; Docker Machine用于配置多个D…

云服务器可以文件服务器,云服务器 可以上传文件

云服务器 可以上传文件 内容精选换一换安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。在本地主机和Windows云服务器上分别安装数据传输工具&#xff0c;将文件上传到云服务器。例如QQ.exe。本地磁盘映射(推荐使…

机智云代码移植_IoT开发者 | 基于STM32F103的机智云宠物屋外加4路继电器开源教程...

[ 写在前面 ]自智云社区开辟IoT开源项目专区以来&#xff0c;一直有IoT开发者在贡献案例。玛莉甄选了一些具有代表性的案例分享给IoT爱好者们&#xff0c;本文亦如此。若你有好的案例&#xff0c;想和IoT爱好者们分享&#xff0c;欢迎投稿&#xff0c;一经采纳&#xff0c;我们…

drools。drools_Drools:fireAllRules,fireUntilHalt和Timers内部代码清理的详细说明

drools。drools在六月&#xff0c;我们在博客上发布了一个新的内部状态机&#xff0c;用于管理用户&#xff0c;计时器和引擎线程之间的交互。 现在&#xff0c;我们对该代码进行了另一次大的内部清理&#xff0c;以使其更易于阅读和理解。 如前所述&#xff0c;所有操作&…

云服务器文件打包,云服务器文件打包

云服务器文件打包 内容精选换一换Winscp无法连接到服务器。SSH连接工具例如Xshell可以正常连接云服务器。其他SSH工具连接云服务器正常&#xff0c;但是Winscp无法连接到服务器。说明SSH服务是没有问题的&#xff0c;Winscp连接基于的是SFTP协议。查看/etc/ssh/sshd_config文件…

完全复制一个dict_Redis主从复制getshell技巧

Redis未授权漏洞常见的漏洞利用方式&#xff1a;Windows下&#xff0c;绝对路径写webshell 、写入启动项。Linux下&#xff0c;绝对路径写webshell 、公私钥认证获取root权限 、利用contrab计划任务反弹shell。基于Redis主从复制的机制&#xff0c;可以完美无损的将文件同步到…

关于select中fd_set变量的一些通俗宏解释

FD_ZERO(fd_set*fdset) 将fd_set变量的所有位初始化为0&#xff1b; FD_SET(int fd,fd_set*fdset) 在参数fdset指向的变量中注册文件描述符fd的信息 FD_CLR(int fd,fd_set*fdset) 在参数fdset指向的变量中清除文件描述符fd的信息 FD_ISSET(int fd,fd_set*fds…

pcl_openmap_OpenMap教程3 –使用MapHandler构建基本的地图应用程序–第2部分

pcl_openmap1.简介 在上一教程中&#xff0c;我们了解了MapHandler如何将各种组件连接在一起&#xff08;更具体地说&#xff0c;是从MapHandlerChild派生的类&#xff09;。 我们看到了如何以编程方式执行此操作&#xff0c;但是还有另一种声明性地使用openmap.properties 。 …

文件服务器缓存加速,存储缓存为文件传输提速

存储缓存为文件传输提速本文首次刊登于《网络世界》。著作权&复制权属于《网络世界》。保留所有权利。 一种新型产品实现了WAN上的文件缓存&#xff0c;使以LAN速度长距离存取数据成为可能。存储缓存设备消除了通常困扰远程文件共享的延迟难题。 在当前的办公室环境…

xy轴坐标图数字表示_【相机标定】四个坐标系之间的变换关系

点击上方“新机器视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达世界坐标系&#xff0c;相机坐标系&#xff0c;图像物理坐标系&#xff0c;像素坐标系之间的关系&#xff1a;首先看下几个坐标系在放在一块的样子&#xff1a;1&#xff…