疯狂java:突破程序员基本功的16课(修订版)---文字版.pdf
疯狂java:突破程序员基本功的16 课(修订版)---文字版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!http:/showmecode.cn/inks/book前言用Java语言进行开发的人越来越多了,大量程序员已经进入或正打算进入Java编程领域。这当然和Java语言木身的优秀不无关系,却也和Java语言入门简单有关。一个亳无编程基础的初学者,只要有点数据库和SoL的基础,大概花不到一个月时间就可以学会编写JSP页面,说不定这样就可以找到一份Jaa编程的工作了。如果他肯再多下点工夫,学习一下编写 StrutsAction类、配置 Action,编写 Spring Bean类和配置Bean,他甚至都自我感觉很不错了。问题是:这种“快餐式”、“突击式”的程序员真的能满足企业要求吗?如果仅仅满足于这些简单的、重复式的开发,他们也许没有太多的问题,但他们可能很少有突破职业瓶颈的机会。究其根木原因,很大程度上是因为他们的基本功不够扎实。对他们而言,与其说Java是一种面向对象的语言,不如说更像一种脚本;他们从源代码层次来看程序运行(甚至只会从 eclipse等集成开发环境中看程序运行),完全无法从底层内存分配的角度来看程序运行;他们天天在用Java类库、用 Struts、用 Spring,但对这些东西的实现却知之甚少—这又如何突破自己、获得更好的提高呢?鉴于此种现状,笔者在“疯狂Java实训营”的训练中,除了采用大量实际项目来驱动教学之外,往往会花很多时间、精力来培养学员的基本功。比如讲授 Spring框架时,如果只关注如何编写Bean类、配置Bean,那么一天的时间就足够了。而笔者往往会深入 Spring框架的底层实现,带领学生从工厂模式、策略模式、门面模式、代理模式、命令模式的角度来深度分析 Spring框架实现,然后进行对比,向学生提出问题,启发他们思考,例如,总结 Spring框架的优势到底在哪里?不使用 Spring框架是否有替换解决方案?从而让学生感受设计模式对实际开发的帮助。上面这些内容,看似“高深”,但其实质依然离不开Java编程的基本功。也可以这样说:旦读者真正把基本功打扎实了,将看得更高、更透彻。http://showmecode.cn/inks/book在这样的背景下,偶然之间我获得了这样一个想法:把这些容易被Java程序员所忽视的内容整理成一本书,也许可以帮助这些需要突破基本功的准程序员、初级程序员。本书的写法对笔者来说,是一种新的尝试:笔者以前所写之书,通常都会围绕某方面知识“画个圆”—把这个方面的相关知识,全面、详细地向读者介绍出来。本书并没有采用这种写法,本书的每课都围绕一个相对独立的专题进行讲解,形式上有点类似于“针对性地补课”。当读者感觉自己在某些方面的基本功不够扎实时,可以直接选择相应的内容进行学习,完全无须从头到尾地按顺序阅读。本书内容《疯狂Java:突破程序员基本功的16课(修订版)》的创作过程非常困难,当初刚刚获得这个想法之时,我也曾感到有些力不从心,程序员的基本功看似非常简单,但覆盖范围却非常广泛,因此似乎很难形成一个完整、系统的知识体系但随着写作过程的不断推进,笔者心中才渐渐明朗起来:该书是一本解惑之书,它如能将Java学习、实际开发中最容易被大家忽视又非常重要的内容收集起来,便足够了期间,ACS(天津)公司邀请笔者为其公司员工进行了一次技术内训,内容主要围绕Java程序的内存管理问题。内训结束时该公司员工反应很好,这给笔者带来了很大的触动。Java程序的内存管理既是Java程序员容易忽视的地方,但又是Java编程的重点。后来,笔者即将此次内训的知识进行整理,并最终形成了本书第1部分(1~4课)的内容木书第3部分(9~12课)所介绍的常见数据结构、排序算法的Java实现,则是笔者一直想介绍的内容。在笔者的“疯狂Java实训营”内,常见数据结构、排序算法是必须掌握的——也许你初涉编程时感受不到这些经典算法的用途,因为你可以直接利用别人的实现,但如果你希望突破自己,上升到另外一个高度时,你就不可避免地需要自己开发类库,而不是总使用别人的类库,那这些经典算法的作用就显现出来了。本书第2部分(5~8课)和第4部分(13~16课)则主要来自于参加“疯狂Java实训营”的学生,正如每个动手编程的初学者,他们都曾经遭遇着各种各样的陷阱,因此笔者总是提醒他们应该将这些陷阱收集起来,以免再次陷进去。本书第2部分收集了Java编程中各种常见的陷阱,第4部分的内容则解决了他们进入实际开发之前的诸多困扰,包括程序开发的基本方法,有效进行程序调试的方法,如何看待、使用IDE工具,软件测试等相关内容。http://showmecode.cn/links/book前修订说明本书的第1版《疯狂Java:突破程序员基本功的16课》自从2010年5月出版以来,受到了广大读者的一致好评,已经多次印刷。许多高等院校、职业学校和培训机构也将本书作为教学参考。许多读者提出了宝贵的意见和中肯的建议。根据读者提出的建议,笔者对本书做了修订。修订主要从4个方面入手。第一,根据读者反馈,修正了书中的一些错误,并且对一些有歧乂的地方进行了说明。第二,理论基础部分删掉了一些过时的内容,同时对一些算法进行了优化改进。第三,对全文案例中所涉及的代码,加粗强调了重点代码行,并添加了相应的注释行。毕竟,一本书的篇幅有限,掌握扎实的基本功不能只靠看书获得,Java初学者可以针对本书的分类,充分利用搜索引擎去挖掘更多宝藏衷心感谢本书得以成书,离不开人民邮电出版社诸位编辑的热心帮助,他们用心地整理出本书的知识结构,并为本书制定了初步大纲,这些工作给笔者提供很大的帮助本书写给谁看如果你是一名Java语言的初学者,并已经学会了Java基本的语法,但却经常在动手编程时感到困难重重,或者你已经是一个Java程序员了,但在实际开发中却经常感觉力不从心那么本书将非常适合你。本书会帮助你找出自己的技术短板,迅速突破Java编程的基本功使你成为一名真正的Java达人。2011-09-15http:/showmecode.cn/inks/book目录第1课数组与内存控制11数组初始化1.1.1Java数组是静态的1.1.2数组一定要初始化吗1.1.3基本类型数组的初始化1.1.4引用类型数组的初始化……………………………91.2使用数组121.2.1数组元素就是变量1.22没有多维数组……151.3小结21第2课对象与内存控制222.1实例变量和类变量……232.1.1实例变量和类变量的属性252.1.2实例变量的初始化时机……272.1.3类变量的初始化时机…3222父类构造器…………………342.2.1隐式调用和显式调用……342.22访问子类对象的实例变量……372.2.3调用被子类重写的方法412.3父子实例的内存控制……43http://showmecode.cn/links/book目录23.1继承成员变量和继承方法的区别…4323.2内存中子类实例472.3.3父、子类的类变量……5224fnal修饰符…………5324.1fina|修饰的变量2.42执行“宏替换”的变量…592.4.3fina方法不能被重写………652.44内部类中的局部变量…672.5小结70第3课常见Java集合的实现细节3.1Set和Map723.1.1Set和Map的关系723.12 HashMap和 Hash Set……793.1.3 TreeMap和 TreeSet……………………………………………903.2Map和List………983.2.1Map的 values(方法……983.22Map和List的关系……1063.3 ArrayList /A LinkedList………1073.3.1 Vector和 ArrayList的区…109332 ArrayList和 Linkedlist的实现差异333 ArrayList和 Linkedlist的性能分析和适用场景……………734 terator迭代器118迭代时删除指定元素……1203.5小结…………123第4课Java的内存回收1244.1Java引用的种类1254.1.1对象在内存中状态…1254.1.2强引用1284.1.3软引用1294.1.4弱引用…132http://showmecode.cn/links/book目录4.1.5虚引用13642Java的内存泄漏………1384.3垃圾回收机制…1424.3.1垃圾回收的基本算法……1434.32堆内存的分代回收…………1444.3.3与垃圾回收的附加选项………1464.3.4常见垃圾回收器………………1474.4内存管理的小技巧1504.4.1尽量使用直接量……1504.42使用 String Builder和 String Buffer进行字符串连接…1544.3尽早释放无用对象的引用1514.44尽量少用静态变量……1524.4.5避免在经常调用的方法、循环中创建Java对象…1524.46缓存经常使用的对象153447尽量不要使用 finalize方法……153448考虑使用 SoftReference1544.5小结………154第5课表达式中的陷阱1555.1关于字符串的陷阱……1565.1.1JM对字符串的处理……1565.1.2不可变的字符串1605.1.3字符串比较…16252表达式类型的陷阱……16452.1表达式类型的自动提升………1655.2.2复合赋值运算符的陷阱………1665.3输入法导致的陷阱··…16854注释的字符必须合法…1695.5转义字符的陷阱-…………………1705.5.1慎用字符的 Unicode转义形式…1705.52中止行注释的转义字符…………1715.6泛型可能引起的错误…………1725.6.1原始类型变量的赋值172■http://showmecode.cn/links/book目录5.6.2原始类型带来的擦除…1755.6.3创建泛型数组的陷阱……1785.7正则表达式的陷阱………1805.8多线程的陷阱5.8.1不要调用run方法…182582静态的同步方法………………1835.8.3静态初始化块启动新线程执行初始化……………1875.8.4注意多线程执行环境……19259小结198第6课流程控制的陷阱…1996.1 switch语句陷阱2006.1.1 default分支永远会执行吗…6.1.2 break的重要性…2016.1.3 switch表达式的类型…20362标签引起的陷阱·…2056.3i语句的陷阱……………2066.3.1else隐含的条件2066.3.2小心空语句………………………20964循环体的花括号…2126.41什么时候可以省略花括号……………212642省略花括号的危险2136.5for循环的陷阱…214651分号惹的祸2146.52小心循环计数器的值……2186.53浮点数作循环计数器…2196.6 foreach循环的循环计数器……22167小结223第7课面向对象的陷阱2247.1 instanceof运算符的陷阱……………2257.2构造器的陷阱………………229http://showmecode.cn/links/book目录7.2.1构造器之前的void…………………2307.2.2构造器创建对象吗…2317.2.3无限递归的构造器2377.3持有当前类的实例…2387.4到底调用哪个重载的方法2407.5方法重写的陷阱…2447.5.1重写 private方法2447.52重写其他访问权限的方法2457.6非静态内部类的陷阱24676.1非静态内部类的构造器……………2467.6.2非静态内部类不能拥有静态成员…………………2487.6.3非静态内部类的子类………2497.7 static关键字……………………………………………………2527.7.1静态方法属于类2527.7.2静态内部类的限制……………………2537.8 native方法的陷阱2547.9小结……256第8课异常捕捉的陷阱2578.1正确关闭资源的方式25882 finally块的陷阱26282.1 finally的执行规则262822 finally块和方法返回值…2658.3 catch块的用法………26783.1 catch块的顺序……2678.32不要用 catch代替流程控制·26833只能 catch可能抛出的异常……2708.34做点实际的修复…………………………27484继承得到的异常…………2768.5小结………………278第9课线性表2795■
用户评论