本问题已经有最佳答案,请猛点这里访问。
我正在实现我的自定义筛选器:
public class MyFilter implements javax.servlet.Filter
我应该在这个doFilter方法中使用哪一个?stringbuffer或stringbuilder?
我想用这种方式:
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(MY_CODE_HERE);
response.sendRedirect(stringBuffer.toString());
或者…
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(MY_CODE_HERE);
response.sendRedirect(stringBuilder.toString());
我知道StringBuffer是线程安全的,但是StringBuilder是否足够?
stackoverflow.com/questions/12961254/…
正如JavaDoc所建议的,如果可以的话,应该始终使用StringBuilder。注意:只有当您对它执行一个操作时,StringBuffer才是线程安全的,对于多个操作来说,它不是线程安全的,这使得它非常无用。
这根本不像是一个复制品——这指的是过滤器中StringBuffer的含义,而不是两者之间的实际差异。
局部变量是线程安全的,在doFilter()方法中声明的变量是线程安全的。为您的目的使用StringBuilder,因为您不应该不必要地招致StringBuffer中使用的同步开销。
此外,servlet请求和响应对象是为每个新的请求和响应重新创建的,因此根据其性质,它们是线程安全的。对于每个请求,将在单独的线程中执行doFilter()方法。
建议阅读:
为什么局部变量在Java中是线程安全的。
Java中的StringBuilder和StrugBuffic
servlet过滤器标记wiki
因为它是一个局部变量,而不是由线程共享,所以可以使用StringBuilder。
StringBuilder设计为不带synchronization的StringBuffer的替代品。
只需使用StringBuilder,除非您真正尝试在线程之间共享缓冲区。StringBuilder是原始synchronized StringBuffer类的非同步相对类。
在你的例子中,StringBuilder是完全合理的。即使在其他情况下,也要考虑同步方法,然后使用StringBuffer。
StringBuilder是一个更好的选择,因为它具有非同步特性,速度更快。每个请求的servletfilter-dofilter都在自己的线程中运行,因此您不需要同步的数据结构。如果它只是一个局部变量,那么StringBuilder就是选择。
只要它是在dofilter()方法中,它的thread-safe和request scoped中。因此,StringBuilder是显而易见的选择。
当然,除非该方法中有多个线程同时对其进行修改:)