`
Michael.solofly
  • 浏览: 59043 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

指针!!指针!!第一次在Java中感受到指针!!

阅读更多
第一次在Java中感受到指针
可能很多人认为我大惊小怪,可是确实比较激动。
于是发上来分享。
这是我感受到指针的代码。
  public List search( List<String> organizationIds) throws Exception {
    try {
      begin();
      List<String> orgList = organizationIds;
        for (int i = 0; i < organizationIds.size(); i++) {
          List<String> list = DAO.get(organizationIds.get(i));
          for (String str:list) {
            orgList.add(str);
          }
      }
      commit();
      return usersDatas;
    } catch (Exception e) {
      rollback();
      log.error(e.getMessage(), e);
      throw e;
    }
  }

我把参数中organizationIds这个list赋值给了orgList
我的原意是想把organizationIds的值给orgList
然后后面用orgList去进行操作。
可是我发现。我这样的做法。导致我的程序变成了死循环。
从逻辑代码没看出有什么问题。
于是使用断点功能去追查。
最后发现。每次当我orgList进行add的时候
organizationIds的值也会一起变化。
这是什么情况?以前没遇到过啊。以为是代码没有编译
于是费了很大的力气进行编译……
编译的结果。还是跟之前一样。代码反复的查验。。无果。。

忽然反映过来。 难道是指针???
我的orgList没有进行一次 new操作。所以没有给他开辟一个内存空间。
当把organizationIds赋值给orgList的时候。
只是把orgList的指针指向了organizationIds的内存地址????
于是把代码改为如下:
  public List search( List<String> organizationIds) throws Exception {
    try {
      begin();
      List<String> orgList = new ArrayList<String>();
        for (int i = 0; i < organizationIds.size(); i++) {
          orgList.add(organizationIds.get(i));
          List<String> list = DAO.get(organizationIds.get(i));
          for (String str:list) {
            orgList.add(str);
          }
      }
      commit();
      return usersDatas;
    } catch (Exception e) {
      rollback();
      log.error(e.getMessage(), e);
      throw e;
    }
  }


果然这一次没有问题了。并且orgLIst的值完全正确……

其实Java也是一样。还是有指针的嘛…………
0
3
分享到:
评论
8 楼 wenxiang_tune 2010-12-01  
呵呵,有意思的讨论,MS楼主是有道理的
7 楼 youjianbo_han_87 2010-11-29  
mqlfly2008 写道
不过是对象间地址的值传递而已


哈哈。楼主多想了。。。。
6 楼 jilen 2010-11-25  
C语言指针可以随意的指向任何内存,可以参与计算,java里则不是这样,String s="abc"+"d";这样的显然不是地址运算。

C语言指针指向内存需要自己管理,Java中如果引用不可达则成为垃圾,虚拟机会在适当时候回收。

虽然这帖子看起来很新手。但不难看出作者突然领悟的那种感觉,我想这种感觉是很重要的。
5 楼 numen_wlm 2010-11-25  
唉,这孩子。。。
4 楼 hu437 2010-11-25  
这还真不算是指针
3 楼 beautyOfProgram 2010-11-25  
试试这个

   public void swap(int a, int b){
          int c = a;
          a = b;
          b = c;
   } 
  外面看看 a,b 的值

  public void swap ( Integer a ,Integer b){

     Integer c = a;
      a = b;
      b = c;
 }
  外面看看 a,b 的值



再用C的指针写试试
2 楼 Michael.solofly 2010-11-25  
mqlfly2008 写道
不过是对象间地址的值传递而已

并不是地址传递
而是公用一个内存地址。
这不就是指针么?
1 楼 mqlfly2008 2010-11-25  
不过是对象间地址的值传递而已

相关推荐

Global site tag (gtag.js) - Google Analytics