- 浏览: 2616641 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (880)
- 每日总结 (26)
- java (37)
- lucene 2.4源码学习 (11)
- 庖丁分词的源码分析 (5)
- cindy源码阅读 (10)
- jetty (3)
- java基础 (49)
- hadoop (37)
- python (7)
- 那些蛋疼的事 (15)
- 测试 (5)
- spring (3)
- redis (4)
- git (4)
- 我的开源项目 (2)
- linux (15)
- mysql (8)
- bootsharp (1)
- idea (1)
- Disruptor源码分析 (11)
- 高并发 (22)
- jdk (4)
- 领域驱动 (1)
- 坑 (6)
- 表达式框架 (7)
- 游戏 (3)
- Guava (1)
- 缓存 (1)
- 数据库 (1)
- 游戏项目 (3)
- java8 (1)
最新评论
-
hsluoyz:
PyCasbin是一个用Python语言打造的轻量级开源访问控 ...
权限管理的一个简单后台 -
liuyachao111:
谢谢 问题解决了
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
jnjeC:
多谢博主分享,在配置文件里的&也要改成& ...
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾 -
大维啊:
同志,你这不行啊!
java 的 AccessController.doPrivileged使用 -
lisha2009:
解决了我的问题,多谢博主分享!
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾
Calendar.getInstance()看起来应该是个单例,但实际上并不是。
一次在JProfile中查看CPU的消耗的时候,发现 Calendar.getInstance() 消耗的CPU占比比较大,具体看了下代码才发现实际上是每次都创建对象的。
public static Calendar getInstance(TimeZone zone, Locale aLocale) { return createCalendar(zone, aLocale); } private static Calendar createCalendar(TimeZone zone, Locale aLocale) { CalendarProvider provider = LocaleProviderAdapter.getAdapter(CalendarProvider.class, aLocale) .getCalendarProvider(); if (provider != null) { try { return provider.getInstance(zone, aLocale); } catch (IllegalArgumentException iae) { // fall back to the default instantiation } } Calendar cal = null; if (aLocale.hasExtensions()) { String caltype = aLocale.getUnicodeLocaleType("ca"); if (caltype != null) { switch (caltype) { case "buddhist": cal = new BuddhistCalendar(zone, aLocale); break; case "japanese": cal = new JapaneseImperialCalendar(zone, aLocale); break; case "gregory": cal = new GregorianCalendar(zone, aLocale); break; } } } if (cal == null) { // If no known calendar type is explicitly specified, // perform the traditional way to create a Calendar: // create a BuddhistCalendar for th_TH locale, // a JapaneseImperialCalendar for ja_JP_JP locale, or // a GregorianCalendar for any other locales. // NOTE: The language, country and variant strings are interned. if (aLocale.getLanguage() == "th" && aLocale.getCountry() == "TH") { cal = new BuddhistCalendar(zone, aLocale); } else if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja" && aLocale.getCountry() == "JP") { cal = new JapaneseImperialCalendar(zone, aLocale); } else { cal = new GregorianCalendar(zone, aLocale); } } return cal; }
代码中可以清楚的看到是每次都创建的。
那么创建对象的成本怎么样呢?
public static void main(String[] args) { int runs = 10000; long start = System.nanoTime(); Calendar cal = null; for(int i=0;i<runs;i++) cal = Calendar.getInstance(); long time = System.nanoTime() - start; System.out.println("Calendar.getInstance() took on average "+time/runs+" ns. "+cal); long start2 = System.nanoTime(); long now = 0; for(int i=0;i<runs;i++) now = System.currentTimeMillis(); long time2 = System.nanoTime() - start2; System.out.println("System.currentTimeMillis() took on average "+time2/runs+" ns. "+now); }
测试结果:
Calendar.getInstance() took on average 8264 ns. java.util.GregorianCalendar[time=1481014104709,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Asia/Chongqing",offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2016,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=6,DAY_OF_YEAR=341,DAY_OF_WEEK=3,DAY_OF_WEEK_IN_MONTH=1,AM_PM=1,HOUR=4,HOUR_OF_DAY=16,MINUTE=48,SECOND=24,MILLISECOND=709,ZONE_OFFSET=28800000,DST_OFFSET=0]
System.currentTimeMillis() took on average 105 ns. 1481014104711
可以看到是System.currentTimeMillis()的80多倍。性能其实是很差了的。
建议Calendar对象可以缓存起来,不用每次都创建。
具体的讨论在stackoverflow上也有: http://stackoverflow.com/questions/4587878/creating-java-object-general-question
发表评论
-
获取字符长度的正确姿势
2017-05-23 16:09 1138public static void main(String[ ... -
解决tomcat中反序列化找不到class
2017-05-19 09:59 2184tomcat反序列化的过程中一直报ClassNotFoundE ... -
java的sun.jnu.encoding有什么用
2017-02-10 15:45 5550目前看到的影响有两个:影响类名的读取和Main方法参数的读取。 ... -
jsckson序列化处理泛型
2017-01-10 15:02 3402我有这样两个类 package com.vipshop. ... -
Quartz 1.8.0版本的死锁问题
2017-01-05 15:04 5993先说问题的结论:https:/ ... -
java的double乘法精度问题
2016-12-22 09:31 5609项目中实际的代码,我们实际的金额单位是元,精确到分,另外一个系 ... -
针对jquery的when方法做的应变
2016-10-13 17:09 1116需求:a,b两个任务都处理(不管a,b是成功还是失败)后,执行 ... -
http的501错误
2016-10-09 15:37 8745普通的url请求是get put之类的,如果是乱七八糟的,比如 ... -
java对象初始化的顺序
2016-10-08 17:18 1041public class Son extends F ... -
java线程池自己掉进去的坑
2016-08-18 17:59 2144java线程池的maximumPoolSize的生效条件真的是 ... -
java序列化框架性能比较
2016-05-24 09:22 33151. Kryo 2. FST 3. java 原生序列化 ... -
java 关闭main方法中的定时器线程(2)
2016-05-20 15:49 1825import java.util.concurrent ... -
java 关闭main方法中的定时器线程
2016-05-20 15:29 1236public class TestTreadClose { ... -
java比AtomicLong 更高效的LongAdder
2016-04-14 21:05 3235AtomicLong 是通过cas来实现的,已经很高效了,还有 ... -
java避免缓存伪共享
2016-04-14 20:15 957java8之前的做法: 加6个无用的long字段 如: ... -
java重复批次执行
2015-04-21 20:39 1507方案1 使用Phaser 方案2 使用CyclicBarr ... -
两个线程,分别打印[1,3,5]和[2,4,6],写一个程序,打印[1,2,3,4,5,6]。
2015-04-21 17:13 3974两个线程,分别打印[1,3,5]和[2,4,6],写一个程序, ... -
mina实现相同session后到的请求一定后处理的原理
2015-03-26 22:04 3757mina后面的业务处理是一个线程池去处理的,在线程池的多线程的 ... -
简单实现一个java公平策略的锁
2015-03-24 21:40 1421代码是: package com.eyu.gift.loc ... -
对java的BitSet的多线程并发的探索
2015-03-23 14:45 4237java的BitSet不是线程安全的,所以多线程的时候h要加锁 ...
相关推荐
在Java编程中,`new Date()` 和 `Calendar.getInstance().getTime()` 都是获取当前系统时间的方法,但有时可能会出现获取到的时间与预期不符的情况。这种问题通常与时区设置、系统时间、Java运行环境以及代码逻辑...
Calendar calendar = Calendar.getInstance(); calendar.set(2015, 9, 1, 20, 10, 30); String str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(calendar.getTime()); System.out.println(str); //...
在Java中处理日期和时间非常常见,而`java.util.Calendar`类则是进行此类操作的核心工具之一。`Calendar`类提供了一系列的功能来帮助开发者处理复杂的日期计算问题,比如日期的加减、获取特定日期组件等。 #### 二...
1. **实例化**:由于`Calendar`是抽象类,不能直接实例化,通常我们通过`Calendar.getInstance()`静态方法获取一个具体的`Calendar`实例,如`GregorianCalendar`。 2. **设置日期**:`set`方法用于设置年、月、日、...
格式与电脑日历一致,包括从1970年至今。
Calendar c = Calendar.getInstance(); c.setTime(date); int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); // 处理返回结果 switch (dayOfWeek) { case 1: return "星期日"; case 2: return "星期一"; case...
此外,`java.util.Calendar` 类(尤其是它的子类 `java.util.GregorianCalendar`)也常被用来进行日期的计算和操作。 ### 二、获取当前时间 在代码片段第22行中,通过调用 `getNowTime` 方法来获取当前日期。该...
Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, -1); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM"); String time = format.format(c.getTime()); ``` 二、获取一个月最后一天 获取一...
Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); int month = calendar.get(Calendar.MONTH); int day = calendar.get(Calendar.DAY_OF_MONTH); DatePickerDialog ...
Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(Calendar.YEAR, year); calendar.set(Calendar.MONTH, month); Date currMonthFirst = calendar.getTime(); return ...
开发过程中,我常常先编写方法,如Calendar.getInstance(),然后通过ctrl+2快捷键将方法的计算结果赋值于一个本地变量之上。 这样我节省了输入类名,变量名以及导入声明的时间。Ctrl+F的效果类似,不过效果是把方法...
Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getTime().toString()); ``` 2. 修改日期和时间: ```java calendar.set(Calendar.YEAR, 2022); calendar.set(Calendar.MONTH, Calendar...
Calendar time = Calendar.getInstance(); time.clear(); time.set(Calendar.YEAR, year); time.set(Calendar.MONTH, i-1); int day = time.getActualMaximum(Calendar.DAY_OF_MONTH); ``` 2. Calendar 和 Date 的...
import java.util.Calendar; import java.util.Date; import javax.microedition.rms.RecordStoreException; /* * 创建日期 2006-12-6 * * TODO 要更改此生成的文件的模板,请转至 * 窗口 - 首选项 - Java - ...
calendar=Calendar.getInstance(); alarmManager=(AlarmManager) getSystemService(ALARM_SERVICE); } public void myclick(View v){ new TimePickerDialog(MainActivity.this, 0, new ...
AndroidSkin.getInstance().saveSkinAndApply(skinFilePath, SkinLoader.ASSETS); 执行之后,app即完成换肤,你将看到华丽的换肤效果; Demo Usage 1、在 app/buil.gradle 添加 compile '...
它不直接用于创建特定日期或时间的实例,而是通过`Calendar.getInstance()`方法获取特定区域设置的`Calendar`实例。例如: ```java Calendar calendar = Calendar.getInstance(); ``` `Calendar`类提供了丰富的API...
Calendar now = Calendar.getInstance(); now.setTime(date); int today = now.get(Calendar.DAY_OF_WEEK); int first_day_of_week = now.get(Calendar.DATE) + 2 - today; // 星期一 now.set(Calendar....
final Calendar c = Calendar.getInstance(); mYear = c.get(Calendar.YEAR); mMonth = c.get(Calendar.MONTH); mDay = c.get(Calendar.DAY_OF_MONTH); mHour = c.get(Calendar.HOUR_OF_DAY); ...
Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 2006); c.set(Calendar.MONTH, 10); c.set(Calendar.DATE, 3); ``` 上面的代码将设置当前日期为 2006 年 11 月 3 日。 获取当前日期 使用 Calendar ...