社区
Java SE
帖子详情
巨菜的问题!!!!
gao526
2010-04-21 10:45:24
String s="abc"这个"abc"是在那里开辟的空间,栈里还是堆里???
...全文
241
22
打赏
收藏
巨菜的问题!!!!
String s="abc"这个"abc"是在那里开辟的空间,栈里还是堆里???
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
22 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Mars_Ma_OK
2010-04-21
打赏
举报
回复
[Quote=引用 1 楼 wgzhong 的回复:]
值都放在栈里面
引用放在堆里
[/Quote]
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()方法才能保证每次都创建一个新的对象。
ameko_2019
2010-04-21
打赏
举报
回复
我们知道得到String对象有两种办法: String str1="hello"; String str2=new String("hello"); 这两种创建String对象的方法有什么差异吗?当然有差异,差异就在于第一种方法在对象池中拿对象,第二种方法直接生成新的对象。
"abc"属于字符串池中,是放在栈中。
String str = "abc"; 在内存中"abc"存放在栈
String str1 = new String("abc"); 在内存中new String("abc")被存放在堆
程序运行时,我们最好对数据保存到什么地方做到心中有数。特别要注意的是内存的分配。有六个地方都可以保存数据:
(1) 寄存器。这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。
(2) 堆栈。驻留于常规RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆栈指针若向下移,会创建新的内存;若向上移,则会释放那些内存。这是一种特别快、特别有效的数据保存方式,仅次于寄存器。创建程序时,Java编译器必须准确地知道堆栈内保存的所有数据的“长度”以及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。这一限制无疑影响了程序的灵活性,所以尽管有些Java数据要保存在堆栈里——特别是对象句柄,但Java对象并不放到其中。
(3) 堆。一种常规用途的内存池(也在RAM区域),其中保存了Java对象。和堆栈不同,“内存堆”或“堆”(Heap)最吸引人的地方在于编译器不必知道要从堆里分配多少存储空间,也不必知道存储的数据要在堆里停留多长的时间。因此,用堆保存数据时会得到更大的灵活性。要求创建一个对象时,只需用new命令编制相关的代码即可。执行这些代码时,会在堆里自动进行数据的保存。当然,为达到这种灵活性,必然会付出一定的代价:在堆里分配存储空间时会花掉更长的时间!
(4) 静态存储。这儿的“静态”(Static)是指“位于固定位置”(尽管也在RAM里)。程序运行期间,静态存储的数据将随时等候调用。可用static关键字指出一个对象的特定元素是静态的。但Java对象本身永远都不会置入静态存储空间。
(5) 常数存储。常数值通常直接置于程序代码内部。这样做是安全的,因为它们永远都不会改变。有的常数需要严格地保护,所以可考虑将它们置入只读存储器(ROM)。
(6) 非RAM存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。其中两个最主要的例子便是“流式对象”和“固定对象”。对于流式对象,对象会变成字节流,通常会发给另一台机器。而对于固定对象,对象保存在磁盘中。即使程序中止运行,它们仍可保持自己的状态不变。对于这些类型的数据存储,一个特别有用的技巧就是它们能存在于其他媒体中。一旦需要,甚至能将它们恢复成普通的、基于RAM的对象。Java 1.1提供了对Lightweight persistence的支持。未来的版本甚至可能提供更完整的方案。
wgzhong
2010-04-21
打赏
举报
回复
值都放在栈里面
引用放在堆里
lulu0126
2010-04-21
打赏
举报
回复
呵呵 !
lulu0126
2010-04-21
打赏
举报
回复
还是被人误会!
luomf
2010-04-21
打赏
举报
回复
昵称改成 凤儿's_Jhon'
不然又得误会了,呵呵
luomf
2010-04-21
打赏
举报
回复
汗,俺是男滴~
看看我的资料就知道了,凤是我老婆
gao526
2010-04-21
打赏
举报
回复
[Quote=引用 17 楼 gao526 的回复:]
引用 13 楼 luomf 的回复:
一般人就知道栈区和堆区,所以经常不好理解非常正常,
学过C/C++就好理解了
感谢凤姐,学习了!
[/Quote]
再等等看,还能学习到什么,呵呵,完了就给分!
gao526
2010-04-21
打赏
举报
回复
[Quote=引用 13 楼 luomf 的回复:]
一般人就知道栈区和堆区,所以经常不好理解非常正常,
学过C/C++就好理解了
[/Quote]
感谢凤姐,学习了!
luozhangwen
2010-04-21
打赏
举报
回复
String s="abc";
String a="abc";
实际上s 与 a指向的是一片内存
麦田捕手
2010-04-21
打赏
举报
回复
幸好俺还学过数据结构
luomf
2010-04-21
打赏
举报
回复
一般人就知道栈区和堆区,所以经常不好理解非常正常,
学过C/C++就好理解了
luomf
2010-04-21
打赏
举报
回复
麻烦各位不懂的就不要误导人了好不好,对自己的言论要负责任的,就11楼的说的正确!!!
其它的话虽然正确但没针对LZ的问题。
一个由c/c++编译的程序(很遗憾我们的JVM虚拟机基本上使用c/c++写的)占用的内容分以下五个部分:
1、栈区:存放函数的参数值,局部变量的值等,由编译器自动分配释放。对象的引用其实就是一个地址值当然是存放在这里的。
2、堆区:引用所指向的对象就分配在堆里。
例如:A a = new A(); a 在栈里,new A() 就在堆里。这里的a其实就是一个地址值。
3、全局区(静态区):全部变量和静态变量是放在一块的,而且初始化的和未初始化是分开存放的。
4、文字常量区:常量字符串就是放在这里的。
回到楼主的问题:String s="abc"; s在栈里, "abc"就在这个区里面!!!
5、程序代码区:存放函数体的二进制代码
li445970924
2010-04-21
打赏
举报
回复
在常量池
xiaomaha
2010-04-21
打赏
举报
回复
那分的6楼是对的!
s303251680
2010-04-21
打赏
举报
回复
楼上的没事就溜达
liujun3512159
2010-04-21
打赏
举报
回复
路过的,呵呵
fanzi08
2010-04-21
打赏
举报
回复
对象引用和普通数据类型在栈里,java对象放在堆里
zfq642773391
2010-04-21
打赏
举报
回复
String s="abc"
你一看就知道s是个引用,那引用当然存在栈里,那引用指向的就是对象了,所以"abc"是对象,那对象自然就是存放在堆里了
欢乐极客
2010-04-21
打赏
举报
回复
"abc"放在数据段中
s 放在栈中,指向"abc"
加载更多回复(1)
狼、羊、菜、农夫过河
问题
穷举 Python实现
穷举
问题
中的狼、羊、菜和农夫过河
问题
人狼羊菜过河
问题
人狼羊菜过河
问题
: PTA原题: 输入: MWGC -> .... .... <- MWGC 输出: MWGC -> .... .W.C <- M.G. MW.C -> ..G. ...C <- MWG. M.GC -> .W.. ..G. <- MW.C M.G. -> .W.C .... <- MWGC MWGC -> .... .W.C <- M.G. MW.C -> ..G. .W.. <- M.GC MWG.
用Dijkstra算法解决狼羊菜渡河
问题
用Dijkstra算法解决趣味
问题
:狼羊菜安全渡河
人狼羊菜
问题
的简单实现
人狼羊菜的编程实现 作为经典的智力
问题
,人狼羊菜
问题
的编程实现并不复杂,只要将人狼羊菜从高位到低位根据存在与否设置成0、1变量,引入可行变量与运载变量,通过穷举查找匹配得出可行的方案,直到所有变量全部转移到一边岸上即可。 代码如下:#include<iostream>#include<bitset>usingnamespace std;//人狼洋菜...
巨帧(jumbo frame)
最近重新接触到巨帧(jumbo frame)这个概念,第一次接触是在视频传输中,本来以为定义是一个定值的,故没有太大留意,这次重新查看了下,其定义是一个范围值,而且该范围还与厂家设置有关,故需要注意一下。 首先为什么要启用巨帧,具体来源理解还不深,不过带来最大的好处还是效率提高(尤其在高速网络中,该效率体现比较大)。在网络中定义该效率就是真实发送payload的时间/发送完整数据包(包含头部)的
Java SE
62,620
社区成员
307,251
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章