问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java中 引用类型 和 基本类型 有何区别?

发布网友 发布时间:2022-05-12 09:40

我来回答

2个回答

热心网友 时间:2023-10-01 01:49

这有篇文章,是介绍关于Java堆和栈的,其中也有你的问题的答案,希望对你有用!
http://liufei-fir.javaeye.com/blog/699509

栈与堆都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和 multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。
栈的优势是,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)和对象句柄。
栈有一个很重要的特殊性,就是存在栈中的数据可以共享。假设我们同时定义:
int a = 3;
int b = 3;
编译器先处理int a = 3;首先它会在栈中创建一个变量为a的引用,然后查找栈中是否有3这个值,如果没找到,就将3存放进来,然后将a指向3。接着处理int b = 3;在创建完b的引用变量后,因为在栈中已经有3这个值,便将b直接指向3。这样,就出现了a与b同时均指向3的情况。
这时,如果再令a=4;那么编译器会重新搜索栈中是否有4值,如果没有,则将4存放进来,并令a指向4;如果已经有了,则直接将a指向这个地址。因此a值的改变不会影响到b的值。
要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况a的修改并不会影响到b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。
String是一个特殊的包装类数据。可以用:
String str = new String("abc");
String str = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对 String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。
比较类里面的数值是否相等时,用equals()方法;当测试两个包装类的引用是否指向同一个对象时,用==,下面用例子说明上面的理论。
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2); //true
可以看出str1和str2是指向同一个对象的。
String str1 =new String ("abc");
String str2 =new String ("abc");
System.out.println(str1==str2); // false
用new的方式是生成不同的对象。每一次生成一个。
因此用第二种方式创建多个”abc”字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度,因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc");的代码,则一概在堆中创建新对象,而不管其字符串值是否相等,是否有必要创建新对象,从而加重了程序的负担。
另一方面, 要注意: 我们在使用诸如String str = "abc";的格式定义类时,总是想当然地认为,创建了String类的对象str。担心陷阱!对象可能并没有被创建!而可能只是指向一个先前已经创建的对象。只有通过new()方法才能保证每次都创建一个新的对象。
由于String类的immutable性质,当String变量需要经常变换其值时,应该考虑使用StringBuffer类,以提高程序效率。

热心网友 时间:2023-10-01 01:50

简单的数 引用类型 存储的是地址 即指向内容的地址
如 String str="123"; str存储的是地址 假设如下:&01234 而这个地址里存储的值的123
int i=0; 这个是基本类型它存储的是 值本身
如: int i=0; int j=i; 此时你修改 j=1 并不影响 i的值 i仍然等于0
因引用类型 他负值的时候是把 地址付给了另一个对象 无论你修改哪个对象 都会影响另一个对象的值 注: string 对象有一个特例 就是 string str=="123"; 如此写法(=) 他会从新分配一块内存地址也就是 String str="123"; 起初假如地址是 &0123 如果你继续 str="456"; 此时他存储的地址就变了
希望你帮助到您
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
美的燃气热水器12升电脑版显示FR一pH一PL一dH一nE一qU怎么调好_百度知... 热水器ph什么意思 上海工程技术大学公共管理专业是什么学院 公共事业管理在暨南大学中属于哪个学院? 中央财经大学公共事业管理学生就业去向都有哪些 中飞院公共事业管理是什么专业 广西医科大学公共事业管理属于哪个学院 抖音怎么发视频@抖音小助手 发视频@抖音小助手操作一览 轻颜相机怎么取消自动续费 取消自动续费教程 轻颜相机vip怎么取消 2011年的蒙迪欧致胜能安装无线的行车记录仪吗? 我的苹果手机上半部分没用发烫是怎么回事 常建规{2010}5号文件《常州市称市房屋拆迁补偿估价技术细则》 单片机,个人可以维修吗?需要什么工具? 熟黑芝麻需要磨成粉再吃吗?不磨粉直接吃可以吗 直接吃熟芝麻,可以吗,有什么营养 鲍鱼有几种做法怎么做才好吃啊? ? 便秘经常用开塞露有副作用吗 开塞露用多了会有害处吗 用cad胡桃钳怎么画 cf手游体验资格申请 请问专家经常用开塞露对身体有没有副作用呢? 胡桃钳与球节剪的区别是什么? 智能手机使用的屏幕什么种类的最清晰 开塞露可以经常用吗?对身体有什么副作用? nut cracker什么意思? 华为转了H0系统会打电话不能上网吗 长期使用开塞露会对人体造成危害吗? 只有身份证 怎么贷款 智能手机屏幕是否分为软屏硬屏啊? 求高手指点CAD创建的块都保存在哪里了?能不能更改块的保存路径?怎么改?求高手 用房产证贷款最多可以贷多少 精密过滤器中滤芯多久更换一次,过滤器使用年限 过滤器滤芯须经常检查是否被堵,一般多长时间必须清洗一次 烘干机热胶化过滤器几天清洗一次 把微信好友删除了!我怎么找回他的微信!没有记住,也没有手机号? 目前有什么软件支持3D摄像头视频聊天? 随机视频聊天里面,我这边的摄像头就是不管用!找高手解答!其他各方面都正常,换了摄像头也不行! 把微信好友删除了!我怎么找回他的微信!没有记住,也没有手机号? 把微信好友删了怎么恢复,没有手机号号? 请教下,有什么软件可以在用摄像头视频聊天的时候把视频流录制下来 我的笔记本装的是即插即用的摄像头,为何在进入随机视频聊天的时候,连视频开启提示窗口都没有呢? 我把微信好友删了,我没有他也没有他手机号,他也没有发朋友圈怎么找回他? 把微信好友删了怎么恢复没有手机号和? 微信好友删除了怎么找回,不记得他和名字了? 成功申诉找回密码,为什么还是登不上去,显示密码和账号错误,怎么回事_百度问一问 成功申诉找回密码,为什么还是登不上去,显示密码和账号错误,怎么回事? 学单反你不得不了解的基础知识——感光度(ISO)的使用,你知道吗? 书包网酸胀 电脑用鼠标滑动特慢,如何解决