比如有一个 ResultSet类 对象rsStinrg s="";s=rs.getString("aaa"); // aaa字段里的值是 "abc"rs.close();s?       因为s接收的是地址,如果 rs.close() 关闭,会不会影响到s 的值,为保险起见 用 s = new String(rs.getString("aaa")); 这样的写法如何?

解决方案 »

  1.   

    效果上没什么影像,只是s = new String(rs.getString("aaa")); 会有两个对象产生,浪费空间了。
      

  2.   

    不会影响.
    rs已经把值赋给了s
      

  3.   

    rs.close(); 
    放在
    s=rs.getString("aaa"); 
    后面,就不会有什么影响。Stinrg s=""; 
    s=rs.getString("aaa"); 
    这两个语句不要分开写。
    要写成Stinrg s=rs.getString("aaa"); 也不要
    s = new String(rs.getString("aaa")); 
    这样写,会有两个对象产生,浪费空间,影响效率。 
      

  4.   

    s = rs.getString("aaa");
    内存中已经生成了一个String对象
    而s就指向这个对象
    所以和rs关闭没有关系
    rs关闭其实也就是让其指向null,好被垃圾回收
      

  5.   

    如果不是在资源比较紧张的环境下,或者这个操作不是频繁进行的话,产生两个对象也没什么太大关系,因为先产生的一个对象(s=""的结果,或者rs.getString("aaa")的结果)由于在第二次操作(s=rs.getString("aaa")或new String())的时候失去了对其的引用,也就是说在第二次操作之后没有变量再指向它,所以会在以后的GC当中被当作垃圾回收掉,当然,还是建议你尽量不要采取这样的方式声明对象,毕竟还是多了空间和时间消耗。
      

  6.   

    不是的,ResultSet的close方法是立即释放资源的,理由很简单,如果是等GC来回收,GC什么时候运行并不一定,而如果要频繁进行数据库操作的话,消耗的资源很大。具体见API文档:
    void close()
               throws SQLException
    Releases this ResultSet object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed.
    The closing of a ResultSet object does not close the Blob, Clob or NClob objects created by the ResultSet. Blob, Clob or NClob objects remain valid for at least the duration of the transaction in which they are creataed, unless their free method is invoked.When a ResultSet is closed, any ResultSetMetaData instances that were created by calling the getMetaData method remain accessible.Note: A ResultSet object is automatically closed by the Statement object that generated it when that Statement object is closed, re-executed, or is used to retrieve the next result from a sequence of multiple results.Calling the method close on a ResultSet object that is already closed is a no-op.Throws:
    SQLException - if a database access error occurs
      

  7.   

    你看源码了吗,
    源码里关闭操作就是让ResultSet指向NULL
      

  8.   

    关键问题是, 我的s 可能是一个CLASS 变量, 可能在 rs 关闭后还要用到s
      

  9.   


    尽管你的s是一个CLASS变量,它也只是一个引用而已,而你的CLASS变量同样也是引用,都由jvm来决定会后谁,所以没有问题
      

  10.   

    我没看到源代码,API文档上说的是立即释放,实际源代码是怎样的我不知道,在JDK的src.zip里的方法都没有方法体,如果你知道哪里能看到有方法体的源代码麻烦告诉我,我也想看看。
      

  11.   

    那各位
    如果 String s="";s=rs.getString("aaa");
    这样的写法不好,那这样呢:String s;s=rs.getString("aaa");
      

  12.   

    还有,这样呢?应该不会多耗费资源吧String s;s= new String(rs.getString("aaa"));
      

  13.   

    这样可以,不过最好是初始化为null,如果对象生成的时候没有想好要赋什么值,那就初始化为null,这样不会占用额外的空间
      

  14.   

    这样还是生成了两个对象,rs.getString方法本身返回值就是一个String,你又用它new了一个String,所以产生了第二个String对象,即没有必要也浪费空间
      

  15.   

    效果上没什么影像,只是s = new String(rs.getString("aaa")); 会有两个对象产生,浪费空间了。 
      

  16.   

    你所想的功能rs.getString()里就帮你完成了.