JAVA引用

kischn 2013-12-05 09:51:32
大家猜一下下面的程序会输出什么?~结果什么的我在下面的楼里面贴~我想用这个例子来说一下hibernate

package test.junit;

import java.util.*;
class Nob{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString(){
return "id="+id+",name="+name;
}
}
public class Test {
public static void main(String[] args) {
List<Nob> list = new ArrayList<Nob>();
Nob nob = null;
for(int i = 0 ; i < 5; i ++){
nob = new Nob();
nob.setId(i+1);
nob.setName("test"+(i+1));
list.add(nob);
}
for(Nob n : list){
System.out.println(n);
}
Nob n2 = list.get(2);
n2.setId(10);
n2.setName("modified");
System.out.println("============");
for(Nob n : list){
System.out.println(n);
}
}
}
...全文
203 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
姜小白- 2013-12-06
  • 打赏
  • 举报
回复
引用 13 楼 kischn 的回复:

public class Test {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		Integer test = null;
		for(int i = 0 ; i < 5; i ++){
			test = new Integer(i+1);
			list.add(test);
		}
		for(Integer n : list){
			System.out.println(n);
		}
		Integer test2 = list.get(2);
		test2 ++;
		System.out.println("============");
		for(Integer n : list){
			System.out.println(n);
		}
	}
}
1 2 3 4 5 ============ 1 2 3 4 5 这个是不是没有什么代表性?这个输出说明Integer对象和自己定义的对象在内存中的管理方式不一样,这个和int是差不多的……
传Integer时,我更愿意理解为传引用,传引用进去后,因为Integer是不可变类,值是只读的,要参加运算,就要新new 对象出来,方法内的引用就指向了新new出来的内存地址,但这不影响传之前的Integer的引用。至于说Integer自己转int,我觉得这个说法有点牵强。还有种说法就是java都是传值的,我不太认可那种解释说法。自己理解通了就可以了。楼主可以参考下 http://bbs.csdn.net/topics/390660609
kischn 2013-12-06
  • 打赏
  • 举报
回复
引用 12 楼 magi1201 的回复:
[quote=引用 10 楼 kischn 的回复:]

public class Test {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		Integer test = null;
		for(int i = 0 ; i < 5; i ++){
			test = new Integer(i+1);
			list.add(test);
		}
		for(Integer n : list){
			System.out.println(n);
		}
		Integer test2 = list.get(2);
		test2 ++;
		System.out.println("============");
		for(Integer n : list){
			System.out.println(n);
		}
	}
}
1 2 3 4 5 ============ 1 2 3 4 5 这个是不是没有什么代表性?这个输出说明Integer对象和自己定义的对象在内存中的管理方式不一样,这个和int是差不多的……
午休时候在讲,上班时候不能明目张胆看这个。 [/quote] 好的,等你~
姜小白- 2013-12-06
  • 打赏
  • 举报
回复
引用 10 楼 kischn 的回复:

public class Test {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		Integer test = null;
		for(int i = 0 ; i < 5; i ++){
			test = new Integer(i+1);
			list.add(test);
		}
		for(Integer n : list){
			System.out.println(n);
		}
		Integer test2 = list.get(2);
		test2 ++;
		System.out.println("============");
		for(Integer n : list){
			System.out.println(n);
		}
	}
}
1 2 3 4 5 ============ 1 2 3 4 5 这个是不是没有什么代表性?这个输出说明Integer对象和自己定义的对象在内存中的管理方式不一样,这个和int是差不多的……
午休时候在讲,上班时候不能明目张胆看这个。
kischn 2013-12-06
  • 打赏
  • 举报
回复
引用 9 楼 magi1201 的回复:
[quote=引用 8 楼 kischn 的回复:] [quote=引用 5 楼 magi1201 的回复:] new出来的一般都是引用,直接定义的都是传值。当然不可变类特殊处理。
我用过Integer测试过,好像不是传引用。JAVA会把Integer变成Int吧?[/quote]楼主知道String是不可变类吧,Integer和String相同,是不可变类,这样就想通了。[/quote] 懂了~谢谢~
kischn 2013-12-06
  • 打赏
  • 举报
回复

public class Test {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		Integer test = null;
		for(int i = 0 ; i < 5; i ++){
			test = new Integer(i+1);
			list.add(test);
		}
		for(Integer n : list){
			System.out.println(n);
		}
		Integer test2 = list.get(2);
		test2 ++;
		System.out.println("============");
		for(Integer n : list){
			System.out.println(n);
		}
	}
}
1 2 3 4 5 ============ 1 2 3 4 5 这个是不是没有什么代表性?这个输出说明Integer对象和自己定义的对象在内存中的管理方式不一样,这个和int是差不多的……
姜小白- 2013-12-06
  • 打赏
  • 举报
回复
引用 8 楼 kischn 的回复:
[quote=引用 5 楼 magi1201 的回复:] new出来的一般都是引用,直接定义的都是传值。当然不可变类特殊处理。
我用过Integer测试过,好像不是传引用。JAVA会把Integer变成Int吧?[/quote]楼主知道String是不可变类吧,Integer和String相同,是不可变类,这样就想通了。
kischn 2013-12-06
  • 打赏
  • 举报
回复
引用 5 楼 magi1201 的回复:
new出来的一般都是引用,直接定义的都是传值。当然不可变类特殊处理。
我用过Integer测试过,好像不是传引用。JAVA会把Integer变成Int吧?
kischn 2013-12-06
  • 打赏
  • 举报
回复
引用 3 楼 huxiweng 的回复:
输出是对的。List里面存得是对象的。没什么问题。
嗯,这是我没事的时候想的,就是为什么要把对象交给hibernate管理,现在知道了其中的一点,就是Hibernate会把对象之间的关系通过引用关连起来,拿对象的时候比任何方式都高效,其它要么去map要么去list等……
坚持就是幸福 2013-12-06
  • 打赏
  • 举报
回复
引用 5 楼 magi1201 的回复:
new出来的一般都是引用,直接定义的都是传值。当然不可变类特殊处理。
kischn 2013-12-06
  • 打赏
  • 举报
回复
引用 14 楼 magi1201 的回复:
[quote=引用 13 楼 kischn 的回复:]

public class Test {
	public static void main(String[] args) {
		List<Integer> list = new ArrayList<Integer>();
		Integer test = null;
		for(int i = 0 ; i < 5; i ++){
			test = new Integer(i+1);
			list.add(test);
		}
		for(Integer n : list){
			System.out.println(n);
		}
		Integer test2 = list.get(2);
		test2 ++;
		System.out.println("============");
		for(Integer n : list){
			System.out.println(n);
		}
	}
}
1 2 3 4 5 ============ 1 2 3 4 5 这个是不是没有什么代表性?这个输出说明Integer对象和自己定义的对象在内存中的管理方式不一样,这个和int是差不多的……
传Integer时,我更愿意理解为传引用,传引用进去后,因为Integer是不可变类,值是只读的,要参加运算,就要新new 对象出来,方法内的引用就指向了新new出来的内存地址,但这不影响传之前的Integer的引用。至于说Integer自己转int,我觉得这个说法有点牵强。还有种说法就是java都是传值的,我不太认可那种解释说法。自己理解通了就可以了。楼主可以参考下 http://bbs.csdn.net/topics/390660609[/quote] 看完了,懂了,结贴了~
姜小白- 2013-12-05
  • 打赏
  • 举报
回复
new出来的一般都是引用,直接定义的都是传值。当然不可变类特殊处理。
sjlzcj 2013-12-05
  • 打赏
  • 举报
回复
找一本关于JVM的书,看看关于JVM内存的部分,,你会更清楚
teemai 2013-12-05
  • 打赏
  • 举报
回复
输出是对的。List里面存得是对象的。没什么问题。
kischn 2013-12-05
  • 打赏
  • 举报
回复
我今天测试的时候发现JAVA的对对象操作的时候通过引用来操作的(勿喷~),就算是在list里面,也是存的引用(我也不是很清楚,也可能是list存的对象,给别人的都是引用),这样说来,如果J2EE里面用HIBERNATE等持久化的工具,并设置好对象之间的关系后,对系统效率会提升很多~
kischn 2013-12-05
  • 打赏
  • 举报
回复
不知道有什么对这个感兴趣的~我测试的结果是 id=1,name=test1 id=2,name=test2 id=3,name=test3 id=4,name=test4 id=5,name=test5 ============ id=1,name=test1 id=2,name=test2 id=10,name=modified id=4,name=test4 id=5,name=test5

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧