`
小小黑咖啡
  • 浏览: 11328 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

第五条 避免创建不必要的对象

阅读更多
第五条 避免创建不必要的对象
(1)
String s = new String("S");
String s1 = "s";

二者比较当然是第二种更好,因为第一种比第二种多了一个new了个String。
多new一个String小规模看没什么,所以自己试着写了点代码,扩大这个规模,代码如下:
long l1 = new Date().getTime();
		for(int i = 0; i<1000000; i++) {
			String s = new String("S");
		}
		long l2 = new Date().getTime();
		System.out.println(l2 - l1);
		
		
		long l3 = new Date().getTime();
		String s1;
		for(int i = 0; i<1000000; i++) {
			s1 = "S";
		}
		long l4 = new Date().getTime();
		System.out.println(l4 - l3);

我的机子分别是47 0差别果然很大。。。

所以Sun推荐用StringBuilder或者StringBuffer
package com.util;

public class Test {
	public static void main(String[] args) {
		StringBuilder sd = new StringBuilder();
		sd.append("H").append("ello");
		String s = "World";
		sd.append(s);
		System.out.println(sd);
		
		StringBuffer sb = new StringBuffer();
		sb.append("H").append("ello");
		String s1 = "World";
		sb.append(s1).toString();
		System.out.println(sd);
	}
}

.String,  StringBuffer  StringBuilder的区别。(Core Java)
答:String的长度是不可变的;
StringBuffer的长度是可变的,如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要 String,那么使用StringBuffer的toString()方法;线程安全;
StringBuilder是从 JDK 5
开始,为StringBuffer该类补充了一个单个线程使用的等价类;通常应该优先使用 StringBuilder
类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。
但是好像我写代码时,调不调toString方法都一样。
(2)
注意不要写这种代码
package com.util;

public class Test {
	public static void main(String[] args) {
		Long sum = 0L;
		for(long i = 0; i<Integer.MAX_VALUE; i++) {
			sum +=i;
		}
	}
}

其中有装箱和拆箱主意代码Long和long的区别就行

总之(1)注意选择好String,把String安排到好的位置
(2)在多次循环中小心java的自动装箱拆箱功能,它也会浪费大量的资源。
(3)如果有些变量是不变的话,那就没必要每次都实例化它,只要一个就够了,可以用singleton,枚举或者其他合适的方法
分享到:
评论

相关推荐

    Matlab面向对象编程

    通过抽象,我们可以忽略不必要的细节,只关注问题的关键部分。 2. 封装:封装是指隐藏对象的内部实现细节,只暴露操作接口供外界访问。在MATLAB中,通过类和对象实现封装。类定义了对象的属性和方法,而对象是类的...

    学习javascript面向对象 掌握创建对象的9种方式

    这样做可以减少不必要的输入,同时在视觉上更好地封装原型的功能。 以上介绍了JavaScript中创建对象的前六种方式。后续还有几种方式,但本文中未提及。读者可以继续探索其他创建对象的方式,如组合使用构造函数模式...

    Python计划. 面向对象语法精讲面. 面向对象进阶-对象的引用.pdf

    这种行为在处理大型数据结构时尤其重要,因为它避免了不必要的内存复制,提高了效率。 总结一下,Python的面向对象编程涉及类的定义、对象的实例化、继承、封装和多态等概念。在对象的引用方面,Python采用引用计数...

    JS对象与数组参考大全

    在处理大型数据结构时,理解对象和数组的内部工作原理至关重要,例如,避免不必要的遍历,合理使用引用和深拷贝,以及利用`Map`和`Set`等数据结构提高性能。 以上是JS对象与数组的基本概念和常用方法,掌握这些知识...

    第四章示例代码__对象的作用域

    此外,合理使用局部作用域有助于优化内存管理,防止不必要的内存消耗。 在示例代码中,可能会展示如何在不同作用域内创建和使用对象,包括如何在函数内部创建局部对象,如何在类中定义成员对象,以及如何利用闭包...

    第二十章-开发Delphi对象式数据管理功能(五)

    10. **性能优化**:理解如何优化查询性能,避免不必要的数据库交互,以及正确使用索引和缓存策略,对于开发高效的数据管理功能至关重要。 通过学习这些知识点,并结合实际的项目练习,开发者能够熟练地在Delphi中...

    面向对象设计经验

    过早优化往往会带来复杂性和不必要的开销,反而降低了代码的可读性和可维护性。 ### 8. 明确类与对象的职责 - 类和对象应该具有明确的职责,避免职责混淆。如第31条原则:“在创建类时,类的职责应该是明确的。”...

    java设计 原则61条

    第23页强调了类之间关系的重要性,尤其是在定义继承关系时,必须清楚地认识到子类与父类之间的关系,以避免出现不必要的耦合。 **原则12:统一异常处理策略** 在第30页提到,整个系统应当采用一致的异常处理机制,...

    Visual.C++面向对象与可视化程序设计(第2版)

    9. **性能优化**:探讨C++和MFC中的性能优化策略,如减少内存分配、避免不必要的对象复制等。 10. **实践项目**:通过实例项目将所学知识应用于实际,提升编程技能。 书中的"更多免费资源编程教程.url"可能是指向...

    vs2008下C++对象内存布局

    - 合理规划数据结构,避免不必要的对齐开销。 - 尽量减少动态内存分配,尤其是在循环中,考虑使用容器(如`std::vector`)或预分配内存。 - 使用智能指针(如`std::unique_ptr`或`std::shared_ptr`)管理动态内存...

    61条Java面向对象设计的经验原则.

    - **解释**:类的公有接口应该仅包含用户真正需要使用的功能,避免加入不必要的方法或属性,从而保持接口的清晰和简洁。 #### 原则七:低耦合 - **原则**:类之间应该零耦合,或者只有导出耦合关系。 - **解释**:...

    VC++面向对象与可视化程序设计,黄维通

    8. **性能优化**:面向对象编程可能会带来一定的性能开销,因此书中也会涉及一些优化策略,如合理设计类结构、避免不必要的对象创建和销毁,以及使用STL(Standard Template Library)提高效率。 通过学习《VC++...

    对象和数组

    对象直接量每次计算都会创建一个全新的对象,因此在循环中使用时要注意避免不必要的对象创建。 使用`new`运算符可以创建特定类型的对象,如`Array()`、`Date()`和`RegExp()`等内置构造函数。`Object()`构造函数则...

    根据不同的模式创建单实例应用程序(3kb)

    3. **懒汉式单例模式**:也称为延迟初始化,只在首次需要时才创建实例,这可以避免不必要的资源消耗。然而,如果不考虑线程安全,懒汉式单例可能会导致多个实例的创建。 4. **饿汉式单例模式**:在程序启动时就立即...

    第04章 面向对象(上) 13 单例设计模式

    3. **双检锁/双重校验锁(DCL,线程安全)**:这种方式在多线程环境下也能确保单例的正确性,同时避免了不必要的同步开销。 ```java public class Singleton { private volatile static Singleton instance; ...

    swift-基于MZTimerLabel修复内存问题去掉不必要的初始化

    在这个主题中,我们将深入探讨如何基于`MZTimerLabel`修复内存问题,并避免不必要初始化。 首先,我们需要理解Swift中的内存管理机制。Swift使用自动引用计数(Automatic Reference Counting, ARC)来跟踪和释放...

    面向对象程序设计的61条经验.pdf

    - **解释:** 避免创建过于庞大或复杂的类,这些类通常称为“上帝类”。这类类往往难以维护和理解,因为它们承担了太多的责任。 **原则14:** 对公共接口中定义了大量访问方法的类多加小心。 - **解释:** 大量的...

    通过面向上下文属性获取面向上下文对象的调用情况(日志)

    总结来说,要实现“通过面向上下文属性获取面向上下文对象的调用情况(日志)”,你需要: 1. 定义`IContextAttribute`接口,定义上下文记录的相关方法。 2. 创建一个日志服务,使用内置的`System.Diagnostics....

    面向对象讲解

    这样可以保护数据的安全性,避免不必要的修改,同时提高了代码的可维护性和可重用性。 2. 继承:继承允许一个类(子类)继承另一个类(父类)的属性和方法,从而减少了代码的重复,提高了代码的复用性。子类可以在...

Global site tag (gtag.js) - Google Analytics