java.util.GregorianCalendar
是轻量级对象吗?换句话说,在Web应用程序设置中调用构造函数是否每次请求只提取一个微不足道的性能损失,或者是否支付缓存对象的副本供应用程序共享使用?
答案 0 :(得分:4)
您可以通过缓存/共享不可变的TimeZone
和Locale
来提高GregoianCalendar的性能。
java GregorianCalendar是一个轻量级对象吗?
如果用轻量级你的意思是;就像一个由混凝土制成的气球。 ;)
在Web应用程序设置中调用构造函数,每个请求只提取一个微不足道的性能损失
与你正在做的其他事情相比,它可能相对微不足道。在cpu描述应用程序之前,你无法知道。
支持缓存对象的副本以供应用程序共享使用
只有将对象视为不可变(可能不是很有用)
使用共享的可变GregorianCalendar可能会引入比运行速度慢得多的错误。
顺便说一句:我会考虑使用JodaTime。它略快但通常更好使用。
答案 1 :(得分:1)
使用JODA datetime。它也被添加到java 8中。
答案 2 :(得分:1)
现代方法使用Java 8及更高版本中内置的 java.time 类。尽可能避免麻烦的遗留类。
而不是GregorianCalendar
,请使用ZonedDateTime
。
您甚至可以转换,以便与旧代码互操作。调用添加到旧类的新方法。
ZonedDateTime zdt = myGregCal.toZonedDateTime() ; // From legacy to modern.
GregorianCalendar gc = GregorianCalendar.from( zdt ) ; // From modern to legacy.
缓存GregorianCalendar
对象的一个大问题是它不是thread-safe。通过保留它,您可以通过进行不安全的调用在运行时生成异常或错误数据。
相比之下,java.time使用immutable object。而不是修改现有对象的某些方面,而是生成新对象。 java.time类被设计为线程安全的。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。