class Person {
private int id;
private String name;
//构造方法和getter、setter方法
}class Mapping {
private static Map<String, Person> personMap;
//static的getter和setter方法
}在Filter的init方法中,或者在Servlet的init方法中初始化Mapping中的personMap,代码如下:
 public void init(FilterConfig fConfig) throws ServletException {
 Map<String, Person> map = new HashMap<String, Person>();
for(int i = 0 ; i < 100 ; i ++ ) {
String name = "name_" + i;
Person person = new Person(i, name);
map.put(name, person);
}
Mapping.setPersonMap(map);
}
服务器(Tomcat)在启动时,会调用该Filter的init方法(代码如上)。
服务器一直运行了1000天,请问:
Mapping类中的personMap一直存在吗?personMap里面的所有person的id和name的值一直存在吗?补充:
如果该网站,自第一天,有人浏览了(即发送了请求),往后100天没有访问,(服务器仍在运行),直到101天,又一人访问了,(注意:我测试过,Filter的init不会重复执行,只在服务器启动时执行),请问,此时,Mapping中的所有person连同它们的id和name还会存在吗?

解决方案 »

  1.   

    只要不第二次 Mapping.setPersonMap(map);
    里面的Person一存在.
      

  2.   

    Map 作用域在方法之内,出了这个方法。那么这个引用所指的堆里面的内容就会被自动回收! 很显然。。是不存在的! 
    我很好奇。。你问题是 关健字static 但是,所列代码没一个static !
      

  3.   

    我指的Mapping类中的静态变量:
    private static Map<String, Person> personMap;
      

  4.   


    public void init(FilterConfig fConfig) throws ServletException {
         Map<String, Person> map = new HashMap<String, Person>();
        for(int i = 0 ; i < 100 ; i ++ ) {
            String name = "name_" + i;
            Person person = new Person(i, name);
            map.put(name, person);
        }
        Mapping.setPersonMap(map);
    }这个map不是可能保存的!
     public class MyFilter implements Filter{

    private static Map<String, Person> map; public void destroy() {


    } public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {


    } public void init(FilterConfig config) throws ServletException {
     map = new HashMap<String, Person>();
        for(int i = 0 ; i < 100 ; i ++ ) {
            String name = "name_" + i;
            Person person = new Person(i, name);
            map.put(name, person);
        }
        Mapping.setPersonMap(map); }
    }
    staic 是类的成员,与对象无关。对象没有产生时他产生了! 如果这下面这样。
    自然而然是在web服务器当中的
      

  5.   

    sorry!
    你说的那样是会存在的!刚才看走眼了! 下面Mapping一个类!你可以在容器开了后去测试!
    任何一个地方去
    Maping.personMap.size();
    除非你后面重新  去set(null)那么原来的就销毁!
      

  6.   


    Filter的静态成员,能持久存在,那么其他类(如Mapping)的静态成员(personMap)能不能持久存在?
    我测试时,Mapping中的personMap是一直存在的(当其他的请求,在别处调用Mapping.getPersonMap()时,值是存在的),但不知道会不会因为100天内不访问时,会不会被回收掉?
      

  7.   

    你为什么总是以100为边界呢?如果会回收,那么 你就不能访问任何一个资源了!任何一个servlet,任何服务器的任何组件也不能为你处理请求了!因为同样销毁了!很显然是不会的!