问题描述
srvCtx = webCtx.getServletContext();// 获得application对象// 得到application对象中的访问者列表visitors = (LinkedList<Ippv>) srvCtx.getAttribute("visitors");//visitors 是LinkedList类型的for (int i = 0; i < 100; i++) { saveList.add(visitors.poll());// 获取并移除访问者列表第一个元素,并保存在保存列表中}//再次获得web服务器起中visitors值visitors = (LinkedList<Ippv>) srvCtx.getAttribute("visitors");System.out.println("现在服务器记录数为:" + visitors.size());//竟然也会减少100个元素本来还想处理一下web服务器,application里面visitors列表变量和本程序visitors列表变量同步问题,现在竟然不用了,想不明白什么原因,难道web服务器对于这个处理有类似C++的指针。请问一下这是啥原因? 问题补充:ibadboy 写道
解决方案
visitors = (LinkedList<Ippv>) srvCtx.getAttribute("visitors");visitors变量和srvCtx中visitors对象实际上是一个对象,可以形象地理解为内存中同一个地址,所以poll后srvCtx中的visitors也减少了java中引用(如此处的变量visitors)和c中的指针实际上是一样的,只是java没有指针运算吧
解决方案二:
上面两位已经说的很明白了,两次getAttribute("visitors"); 得到的是内存中同一个对象的两个不同的引用,打个比喻:小牛有两个儿子,小狗和小猪,小狗的爸爸跟小猪的爸爸是一个对象,如果小狗的爸爸变瘦了,相应的小猪的爸爸不也是变瘦了么。
解决方案三:
呵呵,c++忘了,你google看下引用的定义吧,先把基础夯实了。
解决方案四:
visitors其实就是服务器端持久的引用,你删除引用也会影响原始的。 就像你迭代List一样的效果。
解决方案五:
for (int i = 0; i < 100; i++) { saveList.add(visitors.poll());// 获取并移除访问者列表第一个元素,并保存在保存列表中 } 你循环100次当然删除了100个元素了。