`
jubin2002
  • 浏览: 40459 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Effective JAVA2 学习

J# 
阅读更多
1:将局部变量的作用域最小

2:for-each循环优先于传统的for循环

/**
 * Can you spot the bug:
 */
enum Suit {1, 2, 3, 4, 5}
enum Rank {10, 9, 8, 7, 6}

...
Collection<Suit> suits = Arrays.asList(Suit.values());
Collection<Rank> ranks = Arrays.asList(Rank.values());

List<Card> deck = new ArrayList<Card>();
for(Iterator<Suit> i = suits.itertor(); i.hasNext()) {
    for(Iterator<Rank> j = ranks.iterator(); j.hasNext()) {
        deck.add(new Card(i.next() + j.next()));//Here!
    }
}


for-each循环在简洁性和预防bug方面有着传统的for循环无法比拟的优势,并且没有性能损失。遗憾的是,有三种常见的情况无法用for-each循环:
1.过滤-----如果需要遍历集合,并删除选定的元素,就需要显式的迭代器,以便可以调用它的remove方法。
2.转换-----如果需要遍历列表或者数组,并取代它部分或者全部的元素值,就需要选择列表迭代器或者数组索引,以便设定元素的值。
3.平行迭代-----如果需要平行的遍历多个集合,就需要显式的控制迭代器或者索引变量,以便所有迭代器或者索引变量都可以得到同步前移。

3:如果需要精确的答案,请避免使用float和double
正确方法是使用BigDecimal,int或者long

然而使用BigDecimal有两个缺点,与使用基本运算类型相比,这样做很不方便,而且很慢。
如果数值范围没超过9位十进制数字,用int,如果不超过18位,使用long,如果超过了18位,只能用BigDecimal

4:基本类型优先于装箱基本类型
基本类型与装箱基本类型之间由三个主要区别:
第一,基本类型只有值,而装箱基本类型则具有与他们的值不同的同一性。换句话说,两个装箱基本类型可以具有相同的值和不同的同一性。第二,基本类型只有功能完备的值,而每个装箱基本类型除了它对应基本类型的所有功能值之外,还有个非公能值:null。最后一点区别是基本类型通常比装箱基本类型更节省时间和空间。

看例子:
//Broken comparator - can you spot the flaw?
Comparator<Integer> naturalOrder = new Comparator<Integer>() {
    public int compare(Integer first, Integer second) {
        return first < second ? -1 : (first == second ? 0 : 1);//Here
    }
};

对装箱基本类型运行==操作符几乎总是错误的

再看一个:
public class Unbelievable {
    static Integer i;
    public static void main(String[] args) {
        if(i == 42)
            System.out.println("Unbelievable!");
    }
}

它不是打印出Unbelievable----它在计算表达式(i == 42)的时候抛出了NullPointerException异常。问题在于,i是Integer,而不是int,就像所有的对象引用一样,它的初始值是null。(i == 42)时,当在一项操作中混合使用基本类型和装箱基本类型时,装箱基本类型就会自动拆箱。如果null对象自动拆箱,就会得到一个NullPointerException异常。

最后一个例子:
//Hideously slow program! Can you spot the object creation?
public static void main(String[] args) {
    Long sum = 0L;
    for(long i = 0; i < Integer.MAX_VALUE; i++) {
        sum += i;
    }
    System.out.println(sum);
}

程序不小心将一个局部变量(sum)声明为装箱基本类型Long,变量被反复的装箱,拆箱导致明显的性能下降。

5,谨慎进行优化

有三条有关优化的格言
“很多计算上的果实都被归咎于效率(没有必要达到的效率),而不是任何其他的原因---甚至包括盲目的做事。”

“不要去计较效率上的一些小小的得失,在97%的情况下,不成熟的优化才是一切问题的根源。”

“在优化方面,我们应该遵守两条规则:
规则1:不要进行优化。
规则2(仅针对专家):还是不要进行优化---也就是说,在你还没有绝对清晰的为优化方案之前,请不要进行优化。”

不要因为性能而牺牲合理的就够。要努力编写好的程序而不是快的程序。这并不意味着,在完成程序之前就可以忽略性能问题。必须在设计过程中考虑到性能问题。努力避免那些限制性能的设计决策。

6,覆盖equals时请遵守通用约定
equals方法实现了等价关系
自反性(reflexive):对于任何非null的引用值,x.equals(x)必须返回true。
对称性(symmetric):对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true。
传递性(transitive):对于任何非null的引用值x,y和z,如果x.equals(y)为true,y.equals(z)为true,那么x.equals(z)也为true。
一致性(consistent):对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true,或者一致地返回false。
对于任何非null的引用值x,x.equals(null)必须返回false

实现高质量equals方法的诀窍:
1.使用==操作符检查“参数是否为这个对象的引用”
2.使用instanceof操作符检查“参数是否为正确的类型”
3.把参数转换成正确的类型
4.对于该类中的每个“关键(significant)”域,检查参数中的域是否与该对象中对应的域相匹配。其中float和double域要分别调用Float.compare和Double.compare,对他们进行特殊处理是有必要的,因为存在着Float.NaN,-0.0f以及类似的double常量。有些对象引用域包含null可能是合法的,所以,为了避免可能NullPointerException异常,则使用下面的习惯来比较这样的域 (field == null ? o.field == null : field.equals(o.field))
5.当你编写完成了equals方法之后,应该问自己三个问题:它是都是对称的,传递的,一致的

告诫:
覆盖equals时总是覆盖hashCode
不要企图让equals方法过于智能
不要将equals声明中的Object对象替换为其他的类型因为它只是重载了原来的equals(Object o)方法
分享到:
评论

相关推荐

    Effective java 3 学习记录.docx

    Effective Java 3 学习记录 本学习记录主要介绍了 Effective Java 3 中的静态工厂方法和 Builder 模式两部分内容。 一、静态工厂方法 静态工厂方法是指返回类实例的命名规则,例如:from、of、valueOf、instance ...

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    Effective.Enterprise.Java.中文版 高清pdf 下载

    2. "Java学习者论坛提供 www.javaxxz.com.txt" - 这可能是一个指向额外资源的链接,如讨论区或网站,读者可以在这里找到与书籍相关的讨论、解答或者其他学习材料,扩展自己的学习资源。 总的来说,《Effective ...

    effective-java 配套代码

    《Effective Java》是Java开发领域的一本经典著作,由Joshua Bloch撰写,书中提出了一系列编程最佳实践和设计模式,帮助开发者写出更高效、更可靠、更易于维护的Java代码。配套代码`effective-java-examples-master`...

    Effective Java.zip

    《Effective Java》是一本经典Java编程指南,作者是Joshua Bloch,这本书深入探讨了...以上内容仅是《Effective Java》各章节的部分知识点概述,书中还有更多关于Java编程的最佳实践和深入理解等待读者去发掘和学习。

    读书笔记:Effective Java中文版学习项目.zip

    读书笔记:Effective Java中文版学习项目

    Effective Enterprise Java

    通过学习《Effective Enterprise Java》,开发者不仅能掌握Java EE的关键技术和工具,还能理解如何在实际项目中运用这些知识,以解决企业级软件开发中的挑战。这本书是Java EE开发者必备的参考资料,无论你是初学者...

    effectiveJava的笔记

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。...通过深入学习这些内容,开发者可以提升自己的Java编程技艺,编写出更加高效、可维护的代码。

    effective Java(第3版)各章节的中英文学习参考(已完成).zip

    Effective Java 第 3 版 中英双语effective Java(第3版)各章节的中英文学习参考,希望对Java技术的提高有所帮助,欢迎通过issue或pr提出建议和修改意见。目录(Contents)第 2 章 创建和销毁对象(创建和气氛对象...

    Effective-Java:Effective Java中文版第二版示例代码

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch撰写,中文版第二版更是深受广大Java开发者喜爱。这本书提供了许多实用的编程实践和经验教训,帮助开发者编写出更高效、可维护的Java代码。这里我们将...

    Effective Java 第三版

    《Effective Java 第三版》是由Joshua Bloch所著的一本关于Java编程的书籍,旨在向Java开发者传授...在学习这些内容时,读者将被引导深入理解Java语言的细节,并能够应用这些知识点来编写出更加优雅和高效的Java代码。

    java学习书籍

    "book2"这个文件名可能是书籍的电子版,可能包含了上述提及的某一本或几本Java学习书籍的PDF或者其他格式。如果这个文件包含的是《Java编程思想》(Bruce Eckel),那么这将是一个非常全面的资源,涵盖了从基础到高级...

    Java学习网站大全

    "Java学习网站大全"这个资源集合就是为了满足这样的需求,它为你提供了丰富的学习平台和工具,帮助你在Java的世界里稳步前行。 1. **学习资源** - **Oracle官方文档**:Java的官方教程,涵盖了从基础到高级的所有...

    1_Effective_Java_2nd_Edition_proglib_java_Joshua_

    10. **最后但同样重要的是,持续学习和改进**:《Effective Java》鼓励程序员不断更新自己的知识,适应语言的发展,通过不断学习和实践来提升编程技巧。 这些只是《Effective Java》第二版中部分核心知识点的概述。...

    java学习PDF下载地址全 百度云盘下载

    本资源集合提供了一份完整的“Java学习PDF”,旨在帮助学习者系统地理解和掌握Java编程。 这份PDF教程可能涵盖以下关键知识点: 1. **Java简介**:介绍Java的历史、特点、应用领域以及与其它编程语言的对比,使...

    java学习必读书目

    以下是一些推荐的Java学习必读书目及其详细解析: 1. **《Java2核心技术(第6版)卷I:基础知识》** - 由Cay S. Horstmann和Gary Cornell合著,这是一本经典的Java入门书籍。它详细介绍了Java的基础概念,包括语法、...

    5本java学习用书

    2. **《Effective Java》**:由Joshua Bloch撰写,是Java开发者的经典之作。书中列举了23个编程实践,讲解如何编写高效、可维护的Java代码。例如,它涵盖了枚举优于常量、避免使用原始类型、优先考虑泛型、以及何时...

    Joshua Bloch 所著《Effective Java 第二版》一书摘要.zip

    Joshua Bloch 所著《Effective Java 第二版》一书摘要这是我对 Joshua Bloch 所著《Effective Java 第 2 版》的总结。我在学习时会用到它,也可以作为快速参考。它并不是这本书的独立替代品,所以如果你真的想学习...

    Effective-Java读书笔记

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。...通过深入学习和实践,开发者可以极大地提升其Java编程的水平。

    Effective Enterprise Java Ant Sleepless in Java

    《Effective Enterprise Java》、《Ant权威指南》以及《Sleepless in Java》这三本书涵盖了广泛的Java开发和企业级应用实践的知识。以下是对这些书籍主要内容的详细解析: 《Effective Enterprise Java》是一本关于...

Global site tag (gtag.js) - Google Analytics