日期:2014-05-18  浏览次数:20714 次

高手请进,底层问题


先看如下代码
Users u=new Users();
u.setUname(uname);
u.setUpwd(upwd);
List li=usersdao.findByExample(u);

if(li.size()>0){
u=(Users)li.get(0);
}

这是登陆验证的一个代码段
我用的是hibernate
先创建了一个空的users对象u,并分配了内存地址,通过hibernate查询出一个list,获取出第一条数据,
再把这条数据保存到u.

我的问题是:u在这里起的是指针的作用,“Users u=new Users();”这段代码是创建一块新内存空间,
u指向这块新内存的地址,U成为了这块新内存的指针
“u=(Users)li.get(0);”这段代码是把list中的一条数据去出来,让u指向这条数据,
我想知道的是:list中的数据查找出来后是把这条数据放到u指向的内存中还是u指向list中的这条数据的地址,
要是前者,list中的数据复制到u后,list将会被java的垃圾回收机制回收,要是后者,u之前指向的内存将被回收处理,,

在这里我不是很明白,望各位提点下,越详细越好,我的叙述可能有些绕口,请大家谅解,谢谢!

------解决方案--------------------
是u指向list中的这条数据的地址,然后之前new Users()的内存给java 回收了,u是引用,而不是内存,所以他只能指向内存,其实u只是堆,而new Users()是在栈里面开辟的空间,也就是,在你的内存栈里面目前有2个空间,一个是原来的new users,一个是list,而当你的u 指向list的时候,new User()就给回收了。
------解决方案--------------------
我想知道的是:list中的数据查找出来后是把这条数据放到u指向的内存中还是u指向list中的这条数据的地址, 

后者。

java中变量都是句柄(相当于指针),变量赋值,实际上是句柄指向的切换,

这样就好理解了:

User u=null;//这时候,u只是一个指针,指向空,没有实际User对象的内存空间。

这时候,你依然可以
u=(User)list.get(0);

很显然,如果是你说得前者,在赋值之前,u并没有实际的内存,所以,也无从去拷贝。
所以,这个赋值,就是吧u从原来指向null,改为指向数组中的第一个对象地址,
这时候,实际上数组和u变量同时引用这个对象。



------解决方案--------------------
u被赋予新值的时候,new User就准备进入第二代回收循环了。放心吧!内存回收没那么频繁。
------解决方案--------------------
list中的数据查找出来后是把这条数据放到u指向的内存中还是u指向list中的这条数据的地址
其实,他也就是将List中第一个属性强制转换承数据对象User;也就是说将一个List的东西跟一个对象相联系
------解决方案--------------------
进来学习啰
------解决方案--------------------
探讨
谢谢各位!

U就是一个C中的指针。

------解决方案--------------------
不是搞JAVA的也来学习一下!
------解决方案--------------------
学习 帮顶
------解决方案--------------------
完全可以理解为一个指针。。先指前面的。。然后再指后面的。。
------解决方案--------------------
支持下 赚分
------解决方案--------------------
就是后者.
java中基本类型的赋值是直接把一个地方的内容复制到另一个地方.
对象之间的赋值其实真正操作的是对象的引用,都是把一个对象的引用指到另一个对象上.



------解决方案--------------------
探讨
引用:
谢谢各位!

U就是一个C中的指针。

U的值是堆中对象的地址值,理解为指针也可以

其实和指针不太一样,不象指针一样可以强制类型int*转为long*都可以,在java里是不允许的

而且C里的指针还可以移动........

------解决方案--------------------
我想知道的是:list中的数据查找出来后是把这条数据放到u指向的内存中还是u指向list中的这条数据的地址, 
要是前者,list中的数据复制到u后,list将会被java的垃圾回收机制回收,要是后者,u之前指向的内存将被回收处理,, 
=============================================================================

对象是引用类型,也就是一个引用指向一个地址,你每次用等号“=”对其赋值都只是改变其指向的内存地址,它原来引用的对象还在那里放着,没动

打个比方:
你上学,一年级有个班主任,你知道你班主任的家在XX路XX号,这是“你的班主任”这个对象的地址,
过了一年,你升级了,换了班主任,你新的班主任在YY路YY号住,“你的班主任”这个对象又指向了新的地址,而那个旧的对象还在那儿住着,直到一天你忘了他(JVM回收了,相当于他不在你的世界存在了),其间你再访问你的班主任就是到YY路YY号去

注:JVM搞内存回收不定时,基本上是差不多不够用了它才干活,而不是对象刚刚废掉就回收了

------解决方案--------------------
支持下 赚分
------解决方案--------------------
顶一下!!!
------解决方案--------------------