我正在实施自定义过滤器:
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
是否足够?
答案 0 :(得分:9)
局部变量是线程安全的,在doFilter()
方法中声明的变量将是线程安全的。使用StringBuilder
表示您的目的,因为您不应该不必要地承担StringBuffer
中使用的同步开销。
此外,Servlet请求和响应对象是为每个新请求和响应重新创建的,因此它们本质上是线程安全的。 doFilter()
方法将在每个请求的单独线程中执行。
建议阅读:
答案 1 :(得分:3)
由于它是局部变量而不是线程共享,因此可以使用StringBuilder。
答案 2 :(得分:1)
StringBuilder是一个更好的选择,因为它的非同步特性更快。 ServletFilter doFilter用于在其自己的线程中运行的每个请求,因此您不需要同步的数据结构。如果它只是一个局部变量,那么可以选择StringBuilder。
答案 3 :(得分:1)
StringBuilder
被设计为StringBuffer
的{{1}}的插入式替换。
除非您真的尝试在线程之间共享缓冲区,否则只需使用synchronization
。 StringBuilder
是原始同步StringBuffer类的未同步相对。
在你的情况下,StringBuilder
非常有意义。即使在其他情况下,也可以考虑使用StringBuilder
答案 4 :(得分:0)
只要它在方法doFilter()中,它的thread-safe
和request scoped
。因此,StringBuilder
是显而易见的选择。
当然,除非在该方法中产生多个线程并同时修改它:)