String类 的内存是怎样分配的

来源:互联网 发布:阴司守门人网络剧剧照 编辑:程序博客网 时间:2024/06/03 07:04

菜鸟救助 String类 的内存是怎样分配的??  

s1 与 s2 是两个不同的对象, 所以!=
使用new肯定会产生新的对象, 这是不容置疑的

"abcd"是在常量池中的存储的,new String("abcd")是存在于堆内存中的。s1 s2 是分别指向这两块的引用。 s1 == s2 比的是内存地址 所以 为FALSE 堆栈中分配内存空间。
new 是新开辟了一块类存,,当然不相等了
这个和 "=="与“equals()”的区别 有异曲同工之妙
.来自 String 的忧虑上面这段程序中,到底有几个对象呢?
可能很多人脱口而出:两个,s1 和 s2为什么?String 是 final 类,它的值不可变。
看起来似乎很有道理,那么来检测一下吧,稍微改动一下程序就可以看到结果了:
原来,程序在运行的时候会创建一个字符串缓冲池
当使用 s2 = "Monday" 这样的表达是创建字符串的时候,程序首先会
在这个String缓冲池中寻找相同值的对象,在第一个程序中,s1先被
放到了池中,所以在s2被创建的时候,程序找到了具有相同值的 s1
将 s2 引用 s1 所引用的对象"Monday"
第二段程序中,使用了 new 操作符,他明白的告诉程序:
“我要一个新的!不要旧的!”与是一个新的"Monday"Sting对象被创
建在内存中。他们的值相同,但是位置不同,一个在池中游泳
一个在岸边休息。哎呀,真是资源浪费,明明是一样的非要分开做什么呢?
首先你要理解String s1="abcd";这个s1是什么,说到这也就是要理解对象引用和对象的一些知识,在java中对象的引用时存在在堆栈中的,而对象是存放在堆中的,当你这样String s1;定义的时候就定义了一个对象的引用s1,我们在程序中用的其实都是对象的引用,只是根据这个对象的引用我们可以找到我们所创建的对象,至于对象的引用是什么,通俗点你就将对象的引用看成是c语言中所说的"指针",好了,现在我们来看看“==”到底是比较的什么,它比较的是对象引用的地址,既然比较的是地址,他们当然是不相同的了,你有疑问,是觉得上面输出是对的,那是因为你觉得们是相同的,你所说的相同是指他们指向的对象的内容相同,如果是比较内容当然是相同的了,总之,要弄清楚,这个s1、s2是对象的引用,而不是对象
== 不仅比较对象是否相等 同时也是比较地址是否相同
equals 是object类方法,比较的是两个对象是否相等。
如果想比较对象是否相等,请使用 (object).equals(Object b)方法。
对象池问题,s2在对象池中,s1在常量池中
s1每次赋值时,都会先在常量池中找,然后,如果没有,就会重新创建一个常量
== 比较的是对象的引用地址是否相同,也就是说s1,s2指向同一个对象
可以做个群集,就不会掉了。或者用sso,应该能实现你要的东西。
原来应用A的session在应用A中找不到了?
做群集的话,是给server做群集,还是什么,不懂诶??
还有这个是和应用服务器有关的吗,在Tomcat中部署的话,也会这样吗?
如果只是a要得到a的session,可以用ajax来调用b的,在a中处理b的返回,这样,你的a的页面不会关闭的,session也就不会丢了。
但是a应用是提供了一个连接,点击这个连接就要打开应用b,这是一整块大的应用,
我在网上查了下,可能和weblogic的domain有关系。
但是,我模拟了下,
1.在同一个domain下建两个server,每个server下部署不同的应用,
但是在应用间a跳转b时,a中session还是可以找到。
2.在两个不同domain下分别建一个server,每个server下部署不同的应用,
但是在应用间a跳转b时,a中session也还是可以找到。
来源:足球直播




原创粉丝点击