`
tuhaitao
  • 浏览: 378732 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

高性能的SimpleDateFormat

    博客分类:
  • java
 
阅读更多

以前写过一篇 , 《SimpleDateFormat性能调优http://tuhaitao.iteye.com/admin/blogs/822277

虽然可以解决SimpleDateFormat的线程安全问题,但不能够灵活的配置日期Parten,为了使其能够灵活的配置日期格式,我进行了一番改造。

 

1. 通过配置文件加载Praten,灵活配置日期格式

 

2. 使用FastHashMap结合ThreadLocal,解决多个日期格式的线程安全问题

 

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opencfg.core;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.commons.collections.FastHashMap;
import org.apache.commons.lang.StringUtils;


/**
 * <p>
 * DateFormat Utils
 * <p>
 * 
 * <p>#ThreadSafe#</p>
 * 
 * @author Opencfg Software Foundation
 * @since 0.0.1-SNAPSHOT
 * @version $Id: DateFormatUtils.java 2011-06-14 23:21:53 reymondtu $
 */
public class DateFormatUtils {
	
	private static final FastHashMap datePartenMap = new FastHashMap();
	
	static {
		// load data parten properties files
		List<String> propList = PropertiesUtils.getSimpleList("DateFormatUtils.properties") ;
		datePartenMap.setFast(true);
		for(String dateParten : propList) {
			if(StringUtils.startsWith(dateParten, "#")) continue;
			datePartenMap.put(StringUtils.trim(dateParten), new SimpleDateFormat(dateParten));
		}
	}
	
	/**
	 * String -> Date
	 * 
	 * @param dateParten Parse Date Parten
	 * @param dateStr    Parse Date String
	 * @throws ParseException 
	 */
    public static Date safeParseDate(final String dateParten, final String dateStr) throws ParseException {
		return getFormat(dateParten).parse(dateStr);
    }
    
    /**
	 * Date -> String
	 * 
	 * @param dateParten Format Date Parten
	 * @param date       Format java.util.Date Object
	 */
    public static String safeFormatDate(final String dateParten, final Date date) {
        return getFormat(dateParten).format(date);
    }
  
    private static ThreadLocal<FastHashMap> threadLocal = new ThreadLocal<FastHashMap>(){
        protected synchronized FastHashMap initialValue() {
            return (FastHashMap)datePartenMap.clone();
        }
    };
  
    private static DateFormat getFormat(final String dateParten){
        return (DateFormat)threadLocal.get().get(dateParten);
    }
	
}
 

 

这里使用了apache commons-collections里的FashHashMap类,此类适用于读多写少的高并发操作,很适合写缓存.

 

 

 

下边是读取配置文件的类:

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opencfg.core;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.PropertiesConfiguration;
import org.apache.commons.configuration.reloading.FileChangedReloadingStrategy;
import org.apache.commons.lang.StringUtils;

/**
 * <p>
 * Properties Utils
 * <p>
 * 
 * <p>#ThreadSafe#</p>
 * 
 * @author Opencfg Software Foundation
 * @since 0.0.1-SNAPSHOT
 * @version $Id: PropertiesUtils.java 2011-06-15 01:22:53 reymondtu $
 */
public class PropertiesUtils {
	
	/**
	 * Load Properties File
	 * @throws ConfigurationException 
	 */
	public static PropertiesConfiguration loadClassPathProperties(final String fileName, final long refreshInterval) throws ConfigurationException {
		URL url = PropertiesUtils.class.getClassLoader().getResource(fileName);
		File f = new File(url.getFile());
		if(!f.exists()) {
			throw new IllegalArgumentException("can not load file " + fileName);
		}
		PropertiesConfiguration prop = new PropertiesConfiguration(url.getFile());
		FileChangedReloadingStrategy fcrs = null;
		fcrs = new FileChangedReloadingStrategy();
		fcrs.setRefreshDelay(refreshInterval);
		prop.setReloadingStrategy(fcrs);
		return prop;
	}
	
	public static List<String> getSimpleList(final String fileName) {
		try {
			PropertiesConfiguration prop = loadClassPathProperties(fileName, 500);
			BufferedReader reader = new BufferedReader(new FileReader(prop.getFile()));
	        List<String> list = new ArrayList<String>();
	        String line = null;
	        while ((line =reader.readLine())!= null) {
	        	if(StringUtils.startsWith(line, "#")) {
	        		continue;
	        	}
	            list.add(line);
	            line = reader.readLine();
	        }
			return list;
		} catch (Exception e) {
			throw new IllegalArgumentException("can not load file " + fileName);
		}
	}
	
}

 

 

配置文件DateFormatUtils.properties如下:

 

 

#show all
yyyy-MM-dd HH:mm:ss
yyyy年MM月dd日 HH:mm:ss
yyyy年MM月dd日 HH时mm分ss秒

#only show date
yyyy-MM-dd
yyyy年MM月dd日

#only show hour,minute,second
HH:mm:ss
HH时mm分ss秒
 

这里我跟传统的SimpleDateFormat,apache 的 FastDateForma, DateUtilst做了性能对比:

 

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opencfg.core;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang.time.FastDateFormat;
import org.junit.Before;
import org.junit.Test;

/**
 * DateFormatUtils JUnit4 Test
 * 
 * @author Opencfg Software Foundation
 * @since 0.0.1-SNAPSHOT
 * @version $Id: DateFormatUtilsTest.java 2011-06-15 00:36:53 reymondtu $
 */
public class DateFormatUtilsTest {
	private final int TEST_SIZE = 1000000;
	private Date[] dateArray = new Date[TEST_SIZE];
	private String[] stringArray = new String[TEST_SIZE];
	
	@Before
	public void setUp() {
		for(int i = 0; i < TEST_SIZE; i++) {
			dateArray[i] = new Date();
		}
		
		for(int i = 0; i < TEST_SIZE; i++) {
			stringArray[i] = DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", new Date());
		}
	}
	
	/*  Format */
	
	@Test
	public void test_JDK_SimpleDateFormat_format() {
		long starttime = System.currentTimeMillis();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		for(Date date : dateArray) {
			sdf.format(date);
		}
		long endtime = System.currentTimeMillis();
		System.out.println("JDK     SimpleDateFormat format cost:" + (endtime - starttime) + "ms");
	}
	
	@Test
	public void test_Opencfg_DateFormatUtils_format() {
		long starttime = System.currentTimeMillis();
		for(Date date : dateArray) {
			DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", date);
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Opencfg DateFormatUtils  format cost:" + (endtime - starttime) + "ms");
	}
	
	@Test
	public void test_Apache_FastDateFormat_format() {
		FastDateFormat fastDateFormat = FastDateFormat.getInstance();
		long starttime = System.currentTimeMillis();
		for(Date date : dateArray) {
			fastDateFormat.format(date);
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Apache  FastDateFormat   format cost:" + (endtime - starttime) + "ms");
	}
	
	
	/*  Parse */
	
	@Test
	public void test_JDK_SimpleDateFormat_parse() throws ParseException {
		long starttime = System.currentTimeMillis();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		for(String str : stringArray) {
			sdf.parse(str);
		}
		long endtime = System.currentTimeMillis();
		System.out.println("JDK     SimpleDateFormat parse  cost:" + (endtime - starttime) + "ms");
	}
	
	
	@Test
	public void test_Opencfg_DateFormatUtils_parse() throws ParseException {
		long starttime = System.currentTimeMillis();
		for(String str : stringArray) {
			DateFormatUtils.safeParseDate("yyyy-MM-dd HH:mm:ss", str);
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Opencfg DateFormatUtils  parse  cost:" + (endtime - starttime) + "ms");
	}
	
	@Test
	public void test_Apache_DateUtils_parse() throws ParseException {
		long starttime = System.currentTimeMillis();
		String[] dateParten = new String[]{"yyyy-MM-dd HH:mm:ss"};
		for(String str : stringArray) {
			org.apache.commons.lang.time.DateUtils.parseDate(str, dateParten);
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Apache  DateUtils        parse  cost:" + (endtime - starttime) + "ms");
	}
	


}

 

 

这里分别用100W个string数组 与100W个Date数组做了实验,结果如下

 

 

JDK         SimpleDateFormat  format cost:1313ms
Opencfg  DateFormatUtils     format cost:844ms
Apache   FastDateFormat     format cost:1860ms
JDK         SimpleDateFormat parse  cost:3563ms
Opencfg  DateFormatUtils    parse  cost:3641ms
Apache    DateUtils              parse  cost:16656ms

 

 

在单线程测试中,Opencfg DateFormatUtils的format能力 明显高于JDK 40%、Aapache 50%, parse的能力与单线成下的SimpleDateFormat相当, 与Apache的DateUtils明显不在一个级别,性能高出500%。

 

 

下边我使用多线程测试:

 

 

 

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.opencfg.core;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang.time.FastDateFormat;
import org.junit.Before;
import org.junit.Test;

/**
 * DateFormatUtils JUnit4 Test
 * 
 * @author Opencfg Software Foundation
 * @since 0.0.1-SNAPSHOT
 * @version $Id: DateFormatUtilsMutiThreadTest.java 2011-07-18 23:06:53 reymondtu $
 */
public class DateFormatUtilsMutiThreadTest {

	private final int TEST_SIZE = 1000000;
	private final int TEST_THREAD_COUNT = 10;
	private Date[] dateArray = new Date[TEST_SIZE];
	private String[] stringArray = new String[TEST_SIZE];
	
	@Before
	public void setUp() {
		for(int i = 0; i < TEST_SIZE; i++) {
			dateArray[i] = new Date();
		}
		
		for(int i = 0; i < TEST_SIZE; i++) {
			stringArray[i] = DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", new Date());
		}
	}
	
/*  Format */
	
	@Test
	public void test_Apache_FastDateFormat_format() throws InterruptedException {
		final FastDateFormat fastDateFormat = FastDateFormat.getInstance();
		long starttime = System.currentTimeMillis();
		int avr = TEST_SIZE/TEST_THREAD_COUNT;
		for(int i = 0; i < TEST_THREAD_COUNT; i ++) {
			final int start =    i    * avr;
			final int end   = (i + 1) * avr;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					for(int j = start; j < end ; j ++) {
						fastDateFormat.format(dateArray[j]);
					}
				}
			});
			t.start();
			t.join();
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Apache  Muti-Thread FastDateFormat   format cost:" + (endtime - starttime) + "ms");
	}
	
	@Test
	public void test_JDK_SimpleDateFormat_format() throws InterruptedException {
		long starttime = System.currentTimeMillis();
		final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		int avr = TEST_SIZE/TEST_THREAD_COUNT;
		for(int i = 0; i < TEST_THREAD_COUNT; i ++) {
			final int start =    i    * avr;
			final int end   = (i + 1) * avr;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					for(int j = start; j < end ; j ++) {
						sdf.format(dateArray[j]);
					}
				}
			});
			t.start();
			t.join();
		}
		long endtime = System.currentTimeMillis();
		System.out.println("JDK     Muti-Thread SimpleDateFormat format cost:" + (endtime - starttime) + "ms");
	}
	
	
	@Test
	public void test_Opencfg_DateFormatUtils_format() throws InterruptedException {
		long starttime = System.currentTimeMillis();
		int avr = TEST_SIZE/TEST_THREAD_COUNT;
		for(int i = 0; i < TEST_THREAD_COUNT; i ++) {
			final int start =    i    * avr;
			final int end   = (i + 1) * avr;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					for(int j = start; j < end ; j ++) {
						DateFormatUtils.safeFormatDate("yyyy-MM-dd HH:mm:ss", dateArray[j]);
					}
				}
			});
			t.start();
			t.join();
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Opencfg Muti-Thread DateFormatUtils  format cost:" + (endtime - starttime) + "ms");
	}
	
	/*  Parse */
	
	@Test
	public void test_Apache_DateUtils_parse() throws ParseException, InterruptedException {
		long starttime = System.currentTimeMillis();
		final String[] dateParten = new String[]{"yyyy-MM-dd HH:mm:ss"};
		int avr = TEST_SIZE/TEST_THREAD_COUNT;
		for(int i = 0; i < TEST_THREAD_COUNT; i ++) {
			final int start =    i    * avr;
			final int end   = (i + 1) * avr;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					for(int j = start; j < end ; j ++) {
						try {
							org.apache.commons.lang.time.DateUtils.parseDate(stringArray[j], dateParten);
						} catch (ParseException e) {
							e.printStackTrace();
						}
					}
				}
			});
			t.start();
			t.join();
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Apache  Muti-Thread DateUtils        parse  cost:" + (endtime - starttime) + "ms");
	}
	
	@Test
	public void test_JDK_SimpleDateFormat_parse() throws ParseException, InterruptedException {
		long starttime = System.currentTimeMillis();
		final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		int avr = TEST_SIZE/TEST_THREAD_COUNT;
		for(int i = 0; i < TEST_THREAD_COUNT; i ++) {
			final int start =    i    * avr;
			final int end   = (i + 1) * avr;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					for(int j = start; j < end ; j ++) {
						try {
							sdf.parse(stringArray[j]);
						} catch (ParseException e) {
							e.printStackTrace();
						}
					}
				}
			});
			t.start();
			t.join();
		}
		long endtime = System.currentTimeMillis();
		System.out.println("JDK     Muti-Thread SimpleDateFormat parse  cost:" + (endtime - starttime) + "ms");
	}
	
	
	@Test
	public void test_Opencfg_DateFormatUtils_parse() throws ParseException, InterruptedException {
		long starttime = System.currentTimeMillis();
		int avr = TEST_SIZE/TEST_THREAD_COUNT;
		for(int i = 0; i < TEST_THREAD_COUNT; i ++) {
			final int start =    i    * avr;
			final int end   = (i + 1) * avr;
			Thread t = new Thread(new Runnable() {
				@Override
				public void run() {
					for(int j = start; j < end ; j ++) {
						try {
							DateFormatUtils.safeParseDate("yyyy-MM-dd HH:mm:ss", stringArray[j]);
						} catch (ParseException e) {
							e.printStackTrace();
						}
					}
				}
			});
			t.start();
			t.join();
		}
		long endtime = System.currentTimeMillis();
		System.out.println("Opencfg Muti-Thread DateFormatUtils  parse  cost:" + (endtime - starttime) + "ms");
	}
	
}

 

 

这里还是使用了100W个String,100W个Date, 每个测试开启10个线程, 测试结果如下:

 

 

Apache   Muti-Thread FastDateFormat   format cost:2265ms
JDK         Muti-Thread SimpleDateFormat format cost:766ms
Opencfg  Muti-Thread DateFormatUtils  format cost:891ms
Apache   Muti-Thread DateUtils        parse  cost:16766ms
JDK         Muti-Thread SimpleDateFormat parse  cost:3594ms
Opencfg Muti-Thread DateFormatUtils  parse  cost:3860ms

 

 

从结果中可以看出Opencfg的DateFormatUtils性能接近与SimpleDateFormat,远远高出Apache的FastDateFormat与DateUtils,同时又提供了基于ThreadLocal的线程安全保障。:)

1
0
分享到:
评论
2 楼 tuhaitao 2011-09-06  
heritrix 写道
    private static DateFormat getFormat(final String dateParten){ 
        return (DateFormat)threadLocal.get().get(dateParten); 
    }


这里threadLocal取出来, 怎么不用close?

你说的是ThreadLocal的remove()吧,貌似木有close()方法,

这里肯定不能remove,因为要缓存,如果remove了,每次都要new SimpleDateFormat,性能很低
1 楼 heritrix 2011-07-19  
    private static DateFormat getFormat(final String dateParten){ 
        return (DateFormat)threadLocal.get().get(dateParten); 
    }


这里threadLocal取出来, 怎么不用close?

相关推荐

    高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx

    SimpleDateFormat类的线程安全问题是因为它使用了缓存机制来提高解析和格式化的性能。缓存机制使用了一个缓存数组来存储解析和格式化的结果,但是这个缓存数组是共享的,这意味着在多线程环境中,多个线程可能会同时...

    simpleDateFormat是线程不安全的

    总的来说,理解`SimpleDateFormat`的线程不安全性质是Java开发中的一项重要知识,特别是在设计高并发系统时。开发者应当根据具体需求选择合适的方法来确保日期时间格式化的线程安全性,以保证程序的稳定性和正确性。

    SimpleDateFormat线程不安全的5种解决方案.docx

    在多线程环境中,Lock 提供了更高的并发性能。以下是使用 Lock 的示例: ```java import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.ExecutorService; import java.util....

    深入理解Java:SimpleDateFormat安全的时间格式化

    在Java编程中,`...选择合适的策略来管理和使用`SimpleDateFormat`实例可以避免潜在的并发问题,保证程序的稳定性和性能。在实际开发中,根据项目需求和性能要求,可以选择上述的一种或多种方案来应对。

    Java中的SimpleDateFormat使用详解

    在性能要求较高的场景下,可以考虑使用`java.time`包中的`DateTimeFormatter`类,它是Java 8及更高版本引入的,提供了更高效且更易用的日期时间格式化功能。 总结来说,`SimpleDateFormat`是Java中处理日期和时间...

    基于Java的高性能的JSON处理 Jackson.zip

    Jackson是Java平台上的一个强大的JSON库,它以高性能、易用性以及丰富的功能集著称。本资料主要探讨如何利用Jackson库进行高效的JSON处理。 Jackson库由 FasterXML 组织维护,其核心组件包括: 1. **Jackson-...

    Java在并发环境中SimpleDateFormat多种解决方案

    要在高并发环境下能有比较好的体验,可以使用ThreadLocal来限制SimpleDateFormat只能在线程内共享,这样就避免了多线程导致的线程安全问题。 ```java private static ThreadLocal&lt;DateFormat&gt; threadLocal = new ...

    dateparser:dateparser 是一个智能且高性能的日期解析器库,它支持数百种不同的格式,几乎所有我们可能使用的格式。 这也是“retree”算法的一个展示

    dateparser是一个智能的高性能datetime解析器库,它支持数百种不同的模式。 为了获得更好的性能和灵活性, dateparser不使用SimpleDateFormat或DateTimeFormatter ,而是使用将指定的String解析为多个匹配的部分,...

    java时间日期格式化工具类

    此外,`java.time`包在Java 8及更高版本中引入,提供了更现代、更易用的时间日期API,如`LocalDateTime`、`DateTimeFormatter`等,它们在性能和功能上都优于旧的API。 现在回到`DateUtil`工具类,这个类通常包含了...

    日期类型格式化

    7. **Java 8及更高版本的新特性**:从Java 8开始,引入了`java.time`包,它提供了更现代且性能更好的日期时间API,如`LocalDate`, `LocalTime`, `LocalDateTime`等,以及`DateTimeFormatter`类,它们在处理日期和...

    android日期隐藏年月日,兼容7.0

    3. **性能优化**:频繁的日期格式化操作可能影响性能,可以考虑缓存`SimpleDateFormat`实例或使用`java.time`包的类,它们在性能上通常更好。 在实际应用中,我们还需要考虑到日期格式化的需求可能因业务场景不同而...

    字符串转日期

    3. **性能优化**:在高并发场景下,可以考虑使用线程安全的日期格式化工具类,如`DateTimeFormatter`。 #### 六、总结 通过上述内容的学习,我们不仅了解了如何在Java中实现字符串到日期的转换,还深入探讨了相关...

    Java int 转 时间格式

    - **性能考虑**:如果在高并发环境下频繁调用此方法,可以考虑使用线程安全的`DateTimeFormatter`类(Java 8及以上版本提供)代替`SimpleDateFormat`,后者不是线程安全的。 - **国际化支持**:在处理不同语言环境...

    FastIntMap-master_java_Fastintmap_knowrce_

    1. **高性能**:FastIntMap通过直接使用整数作为数组索引来提高查询速度,减少了对象创建和垃圾回收的开销。 2. **紧凑存储**:相比于HashMap,FastIntMap不需要存储键对象,只存储值,因此在内存使用上更为高效。 3...

    java将数字转换为时间格式

    - **性能考虑**:对于频繁调用的情况,可以考虑重用`SimpleDateFormat`实例以提高性能。 - **国际化支持**:如果应用需要支持多种语言和地区,应当使用`DateTimeFormatter`来实现更好的国际化处理。 通过上述内容,...

    Androd时间戳转化

    如果你的项目支持Java 8或更高版本,可以使用`java.time.format.DateTimeFormatter`,它提供了更强大的功能和更好的性能: ```java LocalDateTime localDateTime = LocalDateTime.ofInstant(Instant....

    DateFormat多线程问题

    虽然这会增加内存开销,但在低并发或者对性能要求不高的场景下,这是一个简单且可行的选择。 3. **同步访问**: 如果必须复用`DateFormat`实例,可以通过同步机制来控制对它的访问。然而,这将降低并行性能,因为...

    日期转字符

    这里,`SimpleDateFormat`的模板与`DateTimeFormatter`类似,但其性能和灵活性略逊于新API。 至于描述中的“翻页”部分,可能是关于滚动或者UI更新的问题。如果内容是TextView的一部分,通常需要处理文本的加载和...

    JavaAPI.rar_random

    其次,`java.util.concurrent.ThreadLocalRandom`是Java 7引入的,它提供了一种线程安全的随机数生成方式,通常在多线程环境下效率更高。它的用法和`Random`类似,但默认就是线程局部的,无需担心并发问题。 然后,...

    JDK1.4.2官方英文API

    JDK 1.4引入了NIO(非阻塞I/O),为Java提供了更高性能和更灵活的I/O操作方式。NIO允许应用程序在处理I/O事件时避免阻塞,提高了并发处理能力,特别适用于高并发网络应用。主要类包括`java.nio.channels`包下的`...

Global site tag (gtag.js) - Google Analytics