1.使用构造函数 string() 带来的内存性能隐患和缓解
用户自己构建缓存,这种方式的优点是更加灵活。创建HashMap,将需缓存的String作为key和value存放入HashMap。假设我们准备创建的字符串为 key,将Map cacheMap作为缓冲池,那么返回 key 的代码如下:
private String getCacheWord(String key) {
String tmp = cacheMap.get(key);
if(tmp != null) {
return tmp;
} else {
cacheMap.put(key, key);
return key;
}
}
2.在拼接动态字符串时,尽量用StringBuffer或StringBuilder的append,这样可以减少构造过多的临时String对象。
如果知道StringBuilder的大小的话,最好初始化容量
StringBuffer sb = new StringBuffer("Hello" + getWorld());
sb.append("Calling From " + getJava());
正确的做法:
StringBuffer sb = new StringBuffer("Hello");
sb.append(getWorld());
sb.append("Calling From ");
sb.append(getJava());
3.如果只是查找单个字符的话,用charat()代替startswith() .
4.在字符串相加的时候,使用 ' ' 代替 " ",如果该字符串只有一个字符的话
5.不要在循环中调用synchronized(同步)方法
6.整合try/catch.将try/catch块移出循环.也尽量不要嵌套
7.用stringtokenizer代替indexof()和substring()
8.使用'system.arraycopy ()'代替通过来循环复制数组
9.不用new关键字创建对象的实例
用new关键词创建类的实例时,构造函数链中的所有构造函数都会被自动调用。但如果一个对象实现了Cloneable接口,我们可以调用她的clone()方法。clone()方法不会调用任何类构造函数。
下面是Factory模式的一个典型实现。
public static Credit getNewCredit()
{
return new Credit();
}
改进后的代码使用clone()方法,
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit()
{
return (Credit)BaseCredit.clone();
}
10.HaspMap的遍历
Map<String, String[]> paraMap = new HashMap<String, String[]>();
for( Entry<String, String[]> entry : paraMap.entrySet() )
{
String appFieldDefId = entry.getKey();
String[] values = entry.getValue();
}
利用散列值取出相应的Entry做比较得到结果,取得entry的值之后直接取key和value
11.尽量指定类为final
如果指定一个类为final,则该类所有的方法都是final。Java编译器会寻找机会内联(inline)所有的final方法(这和具体的编译器实现有关)。此举能够使性能平均提高50%.
12.尽量使用局部变量-调用中创建的临时变量都保存在栈(Stack)中,速度较快
13.常常记得将不使用的对象设为null
14.尽量使用方法同步代替代码块同步(在使用同步机制时)
15.尽量减少对变量的重复计算
例如:for(int i = 0;i < list.size(); i ++) { // 每次循环都要计算一次list的size()
…
}
应替换为:
for(int i = 0,int len = list.size();i < len; i ++) {
…
}
16.用移位操作替代乘法和除法
17.array(数组) 和 ArryList的使用:尽可能使用array
array([]):最高效;但是其容量固定且无法动态改变;
ArrayList:容量可动态增长;但牺牲效率;
基于效率和类型检验,应尽可能使用array,无法确定数组大小时才使用ArrayList
18.尽量使用HashMap 和ArrayList ,除非必要,否则不推荐使用HashTable和Vector ,后者由于使用同步机制,而导致了性能的开销。
19.在循环外创建变量
20.用长度为0来判断字符串为空字符串
21.不要多此一举
StringBuffer buf = new StringBuffer();
buf.append("Hello").append(" ").append("World");
正确的做法:
StringBuffer buf = new StringBuffer();
buf.append("Hello World");
22.A Thread which is created without specifying a run method does nothing other than a delay in performance.
public void method() throws Exception
{
new Thread().start();
}
正确的做法:
public void method(Runnable r) throws Exception
{
new Thread(r).start();
}
23.Creation of constant immutable objects that are not assigned to static final variables lead to unnecessary memory consumption.
public class Test
{
protected Object[] getObjects()
{
return new Object[0];
}
publicstatic Integer convertToInt(String s)
{
if (s == null || s.length() == 0)
{
return new Integer(-1);
}else {
return new Integer(s);
}
}
}
修改为:
public class Test
{
public static final Object[] NO_OBJECTS = new Object[0];
protected Object[] getObjects()
{
return NO_OBJECTS;
}
private static final Integer INT_N1 = new Integer(-1);
public static Integer convertToIn(String s) {
if (s == null || s.length() == 0)
{
return INT_N1;
}else{
return new Integer(s);
}
}
}
24.如果计算可以放到循环外,就尽量放到循环外
25.避免重复else if的重复判断
26.使用entrySet()代替keySet()
public void method()
{
Map m = new HashMap();
Iterator it = m.keySet().iterator();
Object key = it.next();
Object v = m.get(key);
}
正确的做法:
public void method()
{
Map m = new HashMap();
Set set = m.entrySet();
Object keyValuePair = it.next();
}
附keySet使用实例:
public void someMethod(HashMap collection)
{
Set keySet = collection.keySet();
Iterator keyIter = keySet.iterator();
while (keyIter.hasNext())
{
keyIter.remove();
}
}
27.移除一个集合的某一项
public void someMethod(Collection collection)
{
Iterator iter = collection.iterator();
while (iter.hasNext())
{
Object element = iter.next();
collection.remove(element);
}
}
正确的做法:
public void someMethod(Collection collection)
{
Iterator iter = collection.iterator();
while (iter.hasNext())
{
iter.remove();
}
}
28. Do not declare members accessed by inner class private.
public class Do_not_declare_members_accessed_by_inner_class_private_violation
{
private int iVar = 0;
class inner
{
int var2;
public void foo()
{
var2 = iVar;
// ...
}
}
}
正确应该是:
public class Do_not_declare_members_accessed_by_inner_class_private_correction
{
int iVar = 0;
class inner
{
int var2;
public void foo()
{
var2 = iVar;
// ...
}
}
}
29.Use BufferedInputStream and BufferedOutputStream or equivalent buffered methods wherever possible.
30.Use instanceof only on interfaces and avoid null check before checking instanceof.
if (o instanceof MyInterface) { }
31.use .class instead of .getClass()
32.The inner class that doesn't require the outer class reference, should be declared static.
33.Instead of calling executeUpdate, use executeBatch.
34.Use toArray(Object[]) instead of toArray() on collection.
35. 避免使用yield()方法,可使用wait()代替。
36.ArrayList的话初始化容量最好了,不过如果知道大小就不用它了,直接用Array了
37.优先使用DataSource获取Connection对象,而不是DriverManager
38.出于性能方面的考虑,尽量不要使用Thread.sleep(),可使用this.wait()代替。
39.Use char[] representation of the string instead of using String.charAt()
for(int i=0; i<str.length(); i++)
{
System.out.println(str.charAt(i));
}
比较正确的做法:
char[] carr = str.toCharArray();
for(int i=0; i<carr.length; i++)
{
System.out.println(carr[i]);
}
40.避免使用java.lang.reflect包
Class c = Class.forName(classname);
Method m = c.getMethod("getData",null);
m.invoke(c.newInstance(), null);
可优化为:
Class c = Class.forName(classname);
IDataProvider dataprovider = (IDataProvider) c.newInstance();
return dataprovider.getData();
还妄对尔等有些用处,如没有,仅当娱乐则已。(资料积累)
分享到:
相关推荐
【完整课程列表】 完整版 Java编程基础入门教程 Java语言程序设计 第10章_网络编程(共68页).ppt 完整版 Java编程基础入门教程 Java语言...完整版 Java编程基础入门教程 Java语言程序设计 第9章_Applet(共40页).ppt
《Java程序设计之网络编程》是一本专注于Java网络编程的教材,它涵盖了网络通信的基础理论以及Java语言在实现网络应用中的各种技术。该资源包括课件和源码,旨在帮助学习者通过实践来深入理解Java网络编程的核心概念...
JAVA 编程题全集知识点总结 本资源提供了一个完整的 JAVA 编程题全集,涵盖了大量的题目和经典的解法,非常适合刷学完基础、刷题前的知识总结与开拓。以下是从资源中提取的重要知识点: 1. JAVA 基础知识:资源中...
[Wrox] Java 编程面试揭秘 英文版 [Wrox] Java Programming Interviews Exposed E Book ☆ 图书概要:☆ If you are a skilled Java programmer but are concerned about the Java coding interview process ...
本资源“java程序设计例题全集”显然是一份涵盖了大学Java程序设计课程中各种实例的集合,旨在帮助学习者深入理解和掌握Java编程。 标题中的“java程序设计例题全集”意味着这份资料包含了大量关于Java编程的实践...
本书内容由浅入深,紧密结合实际,利用大量典型实例,详细讲解Java面向对象的编程思想、编程语法和设计模式,介绍常见Java类库的用法,总结优化 Java编程的各种宝贵经验,深入阐述Java虚拟机执行Java程序的原理。...
Java程序设计基础是编程学习的重要领域,主要涵盖了Java语言的基础概念、语法结构和特性。Java是一种全面面向对象的编程语言,由Sun公司的...这些内容构成了Java编程的基石,对于开发高效、可靠的软件系统至关重要。
Hbase JAVA编程开发实验报告以及代码,1 按照“Hbase应用开发实验1.pdf”中给出的说明,完成相关相关实验及JAVA程序的编写、调试和运行,提交JAVA源程序(AccessObject.java, HBaseTester.java, User.java)及运行...
该标签清晰地表明了该资源的主要内容是关于 JAVA 编程和程序设计的。该标签包括三个部分:java、开发、程序设计。 知识点: * JAVA 是一种编程语言,主要用于开发大型应用程序。 * JAVA 编程需要学习和掌握各种...
本资源主要介绍了JAVA程序设计的基础知识和实践经验,涵盖了JAVA程序的编辑、编译和运行环境、JAVA基本数据类型、运算符与表达式、JAVA程序语法结构、顺序结构、选择结构和循环结构语法等方面的内容。 一、JAVA程序...
《Java网络编程第三版》是Java开发者深入理解网络编程的重要参考资料。这本书主要涵盖了Java平台上的网络应用程序开发,从基础概念到高级技术,为读者提供了一套全面的学习路径。以下是本书中涉及的一些关键知识点:...
通过以上内容的学习,学生将逐步建立起Java编程的知识框架,为后续更复杂的编程挑战做好准备。此外,课程还鼓励学生积极参与实践,通过实际编程项目来巩固所学,提高问题解决能力,最终形成具备职业竞争力的Java...
本资源摘要信息总结了Java程序设计的真题集锦,涵盖了Java程序设计的各个方面,包括Java基础知识、Java数组、Java GUI编程、Java事件处理、Java集合框架、Java文件输入输出、Java异常处理、Java多线程编程、Java网络...
理解类的定义、对象的创建以及封装、继承和多态等概念是Java编程的基础。封装使数据和方法安全,继承则允许代码重用,多态则为程序提供了灵活性。 2. **类和对象**:类是创建对象的蓝图,包含了属性(数据成员)和...
《Java数据库应用程序编程指南》是一本深入探讨如何在Java环境中进行数据库编程的著作。随书源码包含了书中讲解的关键示例代码,以及用于创建数据库的SQL脚本,这对于读者理解和实践书中理论至关重要。通过这些资源...
《Java程序设计》通过对Java编程语言的全面介绍,引导读者快速地掌握Java编程语言的核心内容并学会灵活运用所学的语言知识及面向对象的编程思想。《Java程序设计》共分12章,内容包括Java语言概述、面向对象编程初步...
《洪恩JAVA编程之道》是一本深入探讨Java编程技术的书籍,其随碟代码提供了丰富的实践示例,帮助读者巩固理论知识,提升编程技能。在Java编程的世界里,理解和掌握这些知识点至关重要,因为它们构成了Java程序员的...
整个教程的目标是使读者能够从零基础开始,逐步掌握Java编程的各个方面,无论是进行简单的控制台应用程序开发,还是构建复杂的分布式系统。通过学习这些章节,开发者不仅可以熟悉Java语言本身,还能了解如何利用Java...
Java程序设计之网络编程是Java开发中的重要领域,它涵盖了如何使用Java API进行网络通信的各种技术。网络编程允许应用程序在不同的计算机之间交换数据,这对于构建分布式系统、Web应用和服务至关重要。在Java中,...
Java是一种广泛使用的高级编程语言,以其跨平台、安全性强...总的来说,这些题目覆盖了Java程序设计的基础概念,包括语法、面向对象、数据类型、控制流、数组以及类和对象的使用,是学习和理解Java编程的良好练习材料。