servlet中有个destroy()方法,servlet每次被调用完成后,都将被销毁不推荐使用后一种方法

解决方案 »

  1.   

    我想是销毁也好还是象无状态会话bean那样保留副本也好,应该取决与不同的web服务器,我想不同的web服务器会提供不同的 优化
      

  2.   

    1.该对象不一定立刻销毁,但已经是不可访问的了,什么时候销毁,由JVM决定。
    2.多耗内存(影响不大)、执行效率低、没了编译时类型检查,易出错(最大的损失)。
      

  3.   

    想补充一点,对于ejb来说,如果在远程调用中,粗粒度的访问的性能可能更佳一些。要看具体情况了。
      

  4.   

    执行效率低、没了编译时类型检查
    对于第一点:执行效率低
    因为一般程序里大量的都是String类型变量,所以在程序里都直接将HashMap.get出来的直接转换为String,在执行时,没什么过多的类型转换,应该没多大影响?
    对于第二点:编译时类型检查
    还是前面所说的,因为都是String类型,也转换成了String类型,也没多少类型检查,关于其他类型转换,内部控制一下就完了,少很多代码。非常高效。
    我只是想这样在性能上会有多大影响。这种方式主要的问题在性能上。对JAVA实现的底层机制不清楚,所以弄不清在性能上有什么不同
      

  5.   

    1. 对于执行效率,请看jdk1.3.1_01中HashMap的get和put方法的实现:
    public Object get(Object key) {
    Entry tab[] = table;        if (key != null) {
                int hash = key.hashCode();
                int index = (hash & 0x7FFFFFFF) % tab.length;
                for (Entry e = tab[index]; e != null; e = e.next)
                    if ((e.hash == hash) && key.equals(e.key))
                        return e.value;
    } else {
                for (Entry e = tab[0]; e != null; e = e.next)
                    if (e.key==null)
                        return e.value;
            } return null;
        }public Object put(Object key, Object value) {
    // Makes sure the key is not already in the HashMap.
    Entry tab[] = table;
            int hash = 0;
            int index = 0;        if (key != null) {
                hash = key.hashCode();
                index = (hash & 0x7FFFFFFF) % tab.length;
                for (Entry e = tab[index] ; e != null ; e = e.next) {
                    if ((e.hash == hash) && key.equals(e.key)) {
                        Object old = e.value;
                        e.value = value;
                        return old;
                    }
                }
            } else {
                for (Entry e = tab[0] ; e != null ; e = e.next) {
                    if (e.key == null) {
                        Object old = e.value;
                        e.value = value;
                        return old;
                    }
                }
            } modCount++;
    if (count >= threshold) {
        // Rehash the table if the threshold is exceeded
        rehash();            tab = table;
                index = (hash & 0x7FFFFFFF) % tab.length;
    } // Creates the new entry.
    Entry e = new Entry(hash, key, value, tab[index]);
    tab[index] = e;
    count++;
    return null;
        }
    想必不用多说吧2. 对于编译时类型检查,指的是如果通过方法调用,编译器能检查出调用的方法对不对,而用HashMap,key的大小写不对,或有拼写错误,要到运行时才能发现,或者运行时也不能发现,当由于这些错误引起页面中某个数据出不来,而数据库中确实有数据时,查起错来很痛苦的。而在编程时,很多错误都是拼写错误。
      

  6.   

    如果一个对象有几十上百个属性,你也是get,set这样来处理?那不是死人了。
    牺牲点性能没什么关系,在某些情况下,这些都是不同程度的妥协。
    如果从绝对的角度上要讲究性能,那根本不用OO,只用以前的面向过程,性能不是更好。
    如果系统上了,某些地方性能不如意,再进行针对性的优化,更好。
    所以,这些都是从综合角度去考虑的。
    其次,拼写错误,从来没犯过,因为KEY一般都对应数据库字段。直接从字段名COPY过来,绝不会错。