dofilter在java中_关于java:Servlet的doFilter方法中的StringBuffer或StringBuilder?

本问题已经有最佳答案,请猛点这里访问。

我正在实现我的自定义筛选器:

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是显而易见的选择。

当然,除非该方法中有多个线程同时对其进行修改:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值