一年纯手工打造的Java老A上册开始预售了
Java老A这本书写了很久,昨天终于开始在china-pub、京东、天猫上开始预售了,不过既然叫预售,就肯定还没到货。
有兴趣的人可以去看看哈(后续其它网站地址也会在这里公开):
china-pub:
http://search.china-pub.com/s/?key1=java%cc%d8%d6%d6%b1%f8&type=&pz=1
京东:
http://search.jd.com/Search?keyword=Java%E7%89%B9%E7%A7%8D%E5%85%B5&enc=utf-8
天猫:
http://list.tmall.com/search_product.htm?q=Java%CC%D8%D6%D6%B1%F8&type=p&vmarket=&spm=3.7396704.a2227oh.d100&from=mallfp..pc_1_searchbutton
关于本书内容,请参考:http://blog.csdn.net/xieyuooo/article/details/38373409
里面有本书的所有目录信息,封面等。
关于写这本书的初衷和历史可参看:
http://blog.csdn.net/xieyuooo/article/details/8915934
http://blog.csdn.net/xieyuooo/article/details/12493383
前期将手稿样章贴了一个小节到博客,可参考:
http://blog.csdn.net/xieyuooo/article/details/17452383
开始预售,我顺便将前言、第一章部分内容贴出,前言是写给读者朋友的,大家可以参考下该书是否适合自己,如下:
本书会谈到一些成长性的内容,因此我们可以先大概定位下一些不同层次的人会怎样思考,怎样做事情,让大家有个形象上的认识。
□ 适合对象
(1)有一定Java基础,并希望能在Java技术上有所成长的人。
本书学习有一定门槛,如果是初学者,则可以先以书中的一些例子为引导,希望了解为什么的时候,再来看其中的解释。
虽然有一定门槛,不过初学者只要能静心,迭代着读几次后,你或许也能体会出里面有很多思想、方法、解决问题的手段、看问题的侧面,甚至面对问题的心态,那么也可以受益良多。
(3)本书是一个载体,一个推崇自我修为、内外双修的载体,修行看个人,所以适合于想要以自我提升为主要目的的读者。
(4)工作一段时间,对知识和发展的方向很迷茫,甚至对某些观念也比较迷茫,但是又渴望去解决这些问题,渴望自己成长,渴望自己能找到道路的人。
□ 不适合对象
(1)Java方面的高手和牛人,因为这本书并不能助你从牛人变成大师。
(2)做客户端(如Android)或嵌入式的Java程序员,因为书中大多内容是以服务器端Java来讲解的,极少考虑客户端的问题。
(3)如果你对自己或周围的一切很绝望,看到的所有东西都是邪恶、虚伪的,也没有想过要让自己进步。
(4)希望这本书成为技术字典的同学不适合读,因为这本书不是代码大全,也不是知识点精准解释的汇聚,更不是API的列表。
(5)希望系统性学习某些专业知识的同学不适合看本书,因为本书讲解的是一种“碎片化”学习方式,或者说是以一些小例子为基础,进一步处理相关问题的方式。
如果是初学者,希望你不要期望每天看太多内容,而是希望你看了后尽量去思考,不用完全看懂,每天能够有一个心得,当你在实践中遇到某些问题开始拥有灵感时,本书或许会印证这一切。
□本书将采用HotspotVM 1.6作为讲解的例子(可通过命令“java –version”得到JVM版本),而测试的例子如果是在具体的OS环境下测试,则会单独说明。书中也会提到JDK 1.7的内容,相应的代码如果要运行,也要选择JDK 1.7。
□本书中“部分例子”,必须采用-server模式来运行和模拟,尤其是第5章并发编程中的许多例子,在例子中通常会有专门的备注和说明,请读者注意参看。
□篇幅所限,本书中的例子大多只是片段,以说明实际的问题为主,需要完整的例子,请参看配书光盘中的相关demo信息,书中的例子都有与之对应的实际代码,除十分复杂的代码外,从demo中获取的代码进行相关的配置后,均可直接在对应平台上按照指定结果运行。
□本书的代码分源码和代码两种,源码为第三方源码,可以到官方网站下载参看,书中会介绍源码的版本和思路,并贴出部分关键源码的功能和设计思路。
□本书从第2篇开始,每一篇都会有“致读者言”,目的是让读者更好地了解这部分内容应该从何种角度去理解,它会说些什么,会给你带来什么,你为什么需要这些。
□网络上大家都称作者为“小胖哥”或“胖哥”,所以在本书中,也会以这两个称呼作为作者本人的代名词。
内容简介
本书分上下册,总共5篇,上册两篇内容分别是功底篇和源码篇,强调个人修为的提升,也是本书主旨所在,希望能帮助各位读者朋友提升“功力”;下册中,将基于上册的内容融入设计、实现的细节。
上册
第1篇 Java功底篇
建议所有本书的读者朋友都读下本篇的内容,所谓“练武不练功,到老一场空”,你是否要成为一个老A级程序员,功底的提升是十分重要的,通过对第1篇的学习,希望读者能知道如何验证自己的功底,如何提升自己的功底,而能提升多少,完全要靠你自己的属性哦!
第1章从简单的角度来验证功底,通过一些简单的例子来说明我们应当如何去掌握Java的基础,同时也包含一个“老A级程序员”除功底外还需要有面对逆境的心态。
第2章和第3章分别介绍关于计算机的工作原理和Java虚拟机的基础知识。胖哥认为一个优秀的Java程序员,应当知道自己的程序在计算机内部是如何运行的,更需要知道虚拟机是如何运行的,效率对比怎样,此好比“习武之人,需要知道何为武学”。
第4章讲解Java通信,在了解了运行基本原理后,你应当了解很多网络交互已经被Java的框架包装得不再像通信程序了,就像是“被装修后的房子,你不再知道房屋本身是用什么建造的”。但如果你是老A,就应当知道这些,这样才能知道遇到各种怪异的问题时如何去解决,你会发现:“一切源自基础,偶然问题隐藏必然”。
第2篇 源码篇
达到一定程度的程序员一般会开始对实现本身感兴趣,想了解为什么,了解别人是如何设计和实现的。
本篇并不是网络天下源码,也不会对某种源码做全面讲解,而是通过阅读源码来说明我们应当如何阅读源码。
在本篇开始部分会先介绍为何要阅读源码,讲解哪些源码,如何阅读源码,请有疑问的小伙伴们关注一下哦。
第3篇 设计篇
老A虽然不像军师那样:“运筹帷幄之中,决胜千里之外”,但也同样需要有全局的部署思想,对临场应变以及撤退方案和路径要有全局把控,能“在万军之中取上将首级”,使用最低牺牲得到最高的成果。
在设计篇中,胖哥希望给你带来的不仅仅是现有老A的技术,也包含了他们的许多思想。既然是思想,自然是结合场景最佳,它需要融入老A的智慧,不限于表达的形式,因为这些形式只是一种思想传承的载体。
第4篇 实现篇
在原计划中胖哥并没有打算写关于“实现”方面的内容,不过胖哥发现在实际工作中,小白“童鞋”们所面对的可能最多是实现,于是增加了这部分内容。但是在实现篇并不是拿一个业务实例来写代码,谈什么呢?
第5篇 扩展篇之论道
扩展篇为杂谈,也是论道篇,读者可以先看第5篇的内容,本篇是对知识面和思想的一个扩展。一个老A,应当知道业界的一些技术,所谓:“知己知彼,百战百胜”,接触任何一种问题,都要有相应的解决方案。
上面部分为前言的主要部分,下面贴一点点第一章的小内容,大家可以参考下是否适合自己的口味:
1.1 String的例子,见证下我们的功底
哇塞,第1节就开始讲代码例子,受不了啦,胖哥,你坏死了!所有的书第1节都是写这个领域有什么东西的。
哈哈,小胖哥天生就是个逆天之人哦,希望你能先实践有了感性认识后,再进行理论了解内在。
下面的代码改编于网络牛人的一段程序,先看代码清单1-1。
代码清单1-1 一段String的比较程序
private static void test1() {
String a = "a" + "b" +1;
String b = "ab1";
System.out.println(a == b);
}
胖哥,你是不是考我智商呀?我们平时对比两个对象不是用equals()吗?老师告诉我:两个字符串用等号是匹配不了的,结果应该是false吧。那么结果到底是多少呢?
运行结果:
true
什么?竟然是true?为什么是true?这是要逆天吗?这小段程序彻底颠覆了我的经验和老师教我的真理!“我和我的小伙伴们惊呆了……”
胖哥告诉你这不能怪老师,老师带进门,修行靠个人!
也许有朋友做出了true或猜出了true,那么可否知道原因呢?如果你知道,那么本节跳过,无须再看;如果还不知道,就听听胖哥给你说说他所理解的原因。
要理解这个问题,你需要了解些什么?
◎关于“==”是做什么的?
◎ equals呢?
◎ a和b在内存中是什么样的?
◎编译时优化方案。
下面的内容会很多,现在我们可以站起来简单运动一下,端一杯咖啡,慢慢解读下面的内容。
1.1.1 关于“==”
首先要知道“==”用于匹配内存单元上的内容,其实就是一个数字,计算机内部也只有数字,而在Java语言中,当“==”匹配的时候,其实就是对比两个内存单元的内容是否一样。
如果是原始类型byte、boolean、short、char、int、long、float、double,就是直接比较它们的值。这个大家应该都清楚,这里不再详谈。
如果是引用(Reference),比较的就是引用的值,“引用的值”可以被认为是对象的逻辑地址。如果两个引用发生“==”操作,就是比较相应的两个对象的地址值是否一样。换一句话说,如果两个引用所保存的对象是同一个对象,则返回true,否则返回false(如果引用指向的是null,其实这也是一个JVM赋予给它的某个指定的值)。
理解寓意:大家各自拿到了一个公司的offer,现在我们看看哪些人拿到的offer是同一个公司的。
1.1.2 关于“equals()”
equals()方法,首先是在Object类中被定义的,它的定义中就是使用“==”方式来匹配的(这一点大家可以参看Object类的源码)。也就是说,如果不去重写equals()方法,并且对应的类其父类列表中都没有重写过equals()方法,那么默认的equals()操作就是对比对象的地址。
equals()方法之所以存在,是希望子类去重写这个方法,实现对比值的功能,类似的,String就自己实现了equals()方法。为什么要自己去实现呢?因为两个对象只要根据具体业务的关键属性值来对比,确定它们是否是“一致的或相似的”,返回true|false即可。
迷惑1:equals()不就是对比值的吗?为何说相似?
答曰:一日偶遇怪侠“蜗牛大师”一枚,赐予神剑于数人,猎人将其用于打猎;农夫将它用于劈材;将军用它保家卫国;侠客用它行侠仗义、惩奸除恶,等等。
例如:在对比一些工程的图纸尺寸的时候,由于尺寸都会存在细节误差,可以认为宽度和高度比较接近,就可以返回true,而不一定非要精确匹配。另外,图纸纸张的属性除了长度、宽度外,还有如名称、存放位置、卷号等属性,但是我们可能只需要对比它的长度与宽度,在这个范围内其余的属性不会考虑。也就是说,两个对象的值是否相同是自己的业务决定的,而不是Java语言来决定的。
感悟:变通,让标准变为价值,给你一种思想和标准,你可以有不同的使用,不能死扣定理,我们要解决问题!
迷惑2:equals()重写后,一般会重写hashCode()方法吗?
要说明这个问题,我们先要补充一些概念。
Java中的hashCode是什么——hashCode()方法提供了对象的hashCode值,它与equals()一样在Object类中提供,不过它是一个native(本地)方法,它的返回值默认与System.identityHashCode(object)一致。在通常情况下,这个值是对象头部的一部分二进制位组成的数字,这个数字具有一定的标识对象的意义存在,但绝不等价于地址。
hashCode的作用——它为了产生一个可以标识对象的数字,不论如何复杂的一个对象都可以用一个数字来标识。为什么需要用一个数字来标识对象呢?因为想将对象用在算法中,如果不这样,许多算法还得自己去组装数字,因为算法的基础是建立在数字基础之上的。那么对象如何用在算法中呢?
例如,在HashMap、HashSet等类似的集合类中,如果用某个对象本身作为Key,也就是要基于这个对象实现Hash的写入和查找,那么对象本身如何能实现这个呢?就是基于这样一个数字来完成的,只有数字才能真正完成计算和对比操作。
hashCode只能说是标识对象,因此在Hash算法中可以将对象相对离散开,这样就可以在查找数据的时候根据这个key快速地缩小数据的范围。但不能说hashCode值一定是唯一的,所以在Hash算法中定位到具体的链表后,需要进一步循环链表,然后通过equals()来对比Key的值是否是一样的。这时hashCode()与equals()似乎就成为“天生一对”。换句话说,一个是为了算法快速定位数据而存在的,一个是为了对比真实值而存在的。
与equasls()类似,hashCode()方法也可以重写,重写后的方法将会决定它在Hash相关数据结构中的分布情况,所以这个返回值最好是能够将对象相对离散的数据。如果发生一个极端的情况,即hashCode()始终返回一个值,那么它们将存在于HashMap的同一个链表中,将会比链表查询本身还要慢。
在JDK 1.7中,Hash相关的集合类对使用String作为Key的情况,不再使用hashCode方式,而是有了一个hash32属性,其余的类型保持不变。
换个思路,hashCode()与equals()并不是必须强制在一起,如果不需要用到这样的算法,也未必要重写对应的方法,完全由你自己决定,没有语法上强制的规约。
寓意:此好比,宝剑是否需要有剑鞘?宝贝是否需要有宝箱?雄性是否必须需要雌性?地球是否需要有月亮?
而并非是,树是否需要土壤?生命是否需要食物?鱼儿是否必须需要水?世界是否需要阳光?
感悟:一切在于场景与需求,十分需要,但也可以在某些情况下放弃。
有人说:对比两个对象是否一致,可以先对比hashCode值再对比equals()。
这似乎听上去挺有道理的,但是胖哥本人可并不这么认为!为什么呢?胖哥认为hashCode值根本不是为了对比两个对象是否一致而存在的,可以说它与两个对象是否一致“一点关系都没有”。
假如你希望对比两个对象是否是同一个对象,则完全可以直接用“==”来对比,而不需要用hashCode(),因为直接对比地址值说明两个对象是否为同一个对象才是最靠谱的。另外,默认的hashCode()方法还会发起native调用,并且两个对象都会分别发起native调用(native调用的开销也是不小的)。
假如不是对比地址,而是对比值,自然就需要对象中的某些属性来对比。拿String类型的对象来讲,如果调用某个String对象的hashCode()方法,它至少会在第1次调用这个方法时遍历所有char[]数组相关元素来计算hashCode值(这里之所以说至少,是因为这个String如果并发调用hashCode()方法,则可能被遍历多次),遍历过程中还需要外加一些运算。如果对比的两个对象分别获取hashCode,自然两个String对象都会分别遍历一次char[]数组。
即使hashCode一样了,也同样证明不了这两个String是一样的(这个hashCode是根据char[]数组的值算出来的,不同的String完全可以算出一样的值),还得再次循环两个String中所有的字符来对比一次才能证明两个对象是一样的。其实遍历了两个char[]数组已经是最坏的情况了,equals()还未必会这样做(在后文的图1-2中会详细说明)。
换一个角度来讲,如果是两个其它的自定义类型的对象(不是String类型的对象)之间判定出来hashCode不一样,也不能说它们的值不一样(有可能equals()匹配的是一个综合值,与hashCode一点关系都没有),还是要进行equals(),这样绕来绕去往往是把简单问题复杂化了。
equals()内部要怎么做就去怎么做嘛,想要优化,完全可以像JDK自带的许多类那样,先对比一些简单的属性值,再对比复杂的属性值,或者先对比业务上最快能区分对象的值,再对比其它的值,或者先对比地址、长度等处理方式,将那些不匹配的情况尽快排出。
有人说重写后的hashCode()内部操作确实比equals()简单许多倍,其实这个动作判定也是可以放在equals()方法的第1步中来完成的,无需外部程序关注。
补充:String的equals()方法中默认就要先对比传入的对象与当前的this是不是同一个对象。在HashMap等集合类的查找过程中,也不是单纯的equals(),也会先对比两个对象是不是同一个对象。
好累,休息休息!左三圈、右三圈,再来看看胖哥为你做解读!
a和b的内存情况是什么样的?
回到“代码清单1-1”的例子中,其中的等号说明a和b是指向同一块内存空间的,就像两个人拿到同一个公司的Offer一样,他们像什么呢?见图1-1,“死冤家,又在一起了!”
图1-1 两个冤家又拿到同一个公司的Offer
为什么a、b两个引用都引用到同一块空间了呢?请看1.1.3节的内容解释,不过在这一节中我们先感性认识下JVM的一些“东东”,在第3章中会有更详细的介绍。小伙伴们不要着急,我们一步一步来学习。
1.1.3 编译时优化方案
a引用是直接赋值的,b引用是通过“+”赋值的,a和b两个引用为什么会指向同一个内存单元?这就是JVM的“编译时优化”。如此神奇!小伙伴们惊呆了吧!
当编译器在编译代码:String a ="a" + "b" + 1;时,会将其编译为:Stringa = "ab1";。
为何?因为都是“常量”,编译器认为这3个常量叠加会得到固定的值,无须运行时再进行计算,所以就会这样优化。
疑惑:编译器为何要做此优化?
寓意:“小胖”说我的报销单写好了并盖章了,“小明”说我的也OK了,那么就合并一起邮寄报销单吧。“小锐”说我的快写好了,不过还没盖章,那你写好后再说吧。
寓意:为提升整体工作效率和节约资源,能提前做的事情就提前做。我们自己设计一种平台或语言的时候是否会考虑这些呢?
补充:编译器类似的优化还有许多(在后文中会有介绍),例如,当程序中出现int i = 3 * 4 + 120时,并不是在实际运行时再计算i的值,而是在编译时直接变成了i= 132。
容易出错:JVM只会优化它可以帮你优化的部分,它并不是对所有的内容都可以优化。例如,就拿上面叠加字符串的例子来说,如果几个字符串叠加中出现了“变量”,即在编译时,还不确定具体的值是多少,那么JVM是不会去做这样的编译时合并的。而JVM具体会做什么样的优化,不做什么样的优化,需要我们不断去学习,才能把工作做得更好。
同理证明的道理:String的“+”操作并不一定比StringBuilder.append()慢,如果是编译时合并就会更快,因为在运行时是直接获取的,根本不需要再去运算。同理,千万不要坚定地认为什么方式快、什么方式慢,一定要讲究场景。而为什么在很多例子中StringBuilder. append()比String的“+”操作快呢?在后文中,胖哥会继续介绍原因。
====>篇幅所限,就贴这些吧。
PS:
如果一些小伙伴在试读样章、前言后,感觉本书真的很适合自己,但是个人经济方面存在压力(例如还在待业找工作、学生之类),那么可以联系小胖,小胖可以掏钱买这本书送给相应的小伙伴!这方面不要觉得不好意思,为求知没什么大不了的,小胖觉得如果自己的书能帮助到别人内心也会很开心的,到目前小胖也送书给不少有类似需求的小伙伴了!
一年纯手工打造的Java老A上册开始预售了相关推荐
- 原创:纯手工打造CSS像素画--笨笨熊系列图标
纯手工打造CSS像素画--笨笨熊系列图标 作者:冰极峰 转载请注明出处 在cssplay网站看到有一组CSS像素画,于是也想摩仿一下,于是在网络上找到一组头像图标,看其结构比较简单,就拿它开刀吧!先看 ...
- 广工学生“纯手工”打造赛车 将出征F1赛道
转播到腾讯微博 一辆红银色流线型方程式赛车昨日亮相广东工业大学图书馆广场.这辆赛车为该校二十余名学生"纯手工"打造,本月将登陆上海国际赛车场.南都记者邹卫摄 南都讯 记者刘黎霞 实 ...
- html格子像素画,HTML_纯手工打造CSS像素画,在cssplay网站看到有一组CSS像素 - phpStudy...
纯手工打造CSS像素画 在cssplay网站看到有一组CSS像素画,于是也想摩仿一下,于是在网络上找到一组头像图标,看其结构比较简单,就拿它开刀吧!先看看预览图 图一 基本原理: 没有什么技术含量,主 ...
- IOS学习之道:使用UIButton纯手工打造的黑白快小游戏.
由于代码量比较多,有兴趣的同学可以去我的资源页进行下载. http://download.csdn.net/detail/tx874828503/8637445 // // RootViewContr ...
- 后渗透篇:纯手工打造服务器自解压shift后门【详细演示】
当你的才华 还撑不起你的野心时 那你就应该静下心来学习 目录 纯手工打造服务器自解压shift后门 0x01 介绍 0x02 实例演示 纯手工打造服务器自解压shift后门 0x01 介绍 很多时候我 ...
- 消防管件做的机器人图片_报废消防器材变身“机器人” 由消防官兵纯手工打造(图)...
原标题:报废消防器材变身"机器人" 由消防官兵纯手工打造(图) 由报废的消防零配件组成的机器人模型. 厦门网讯 (厦门日报记者林路然通讯员阙凤芳曾德猛)远看好似变形金刚,凑近还会说 ...
- 这个B站up主太硬核了!纯手工打造AI小电视:硬件自己焊接,驱动代码全手写...
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 晓查 发自 凹非寺 本文转自自:量子位(QbitAI) 一个低调的 ...
- 纯手工打造AI小电视,这个B站up主太硬核了!硬件自己焊接,驱动代码全手写...
点击上方"码农突围",马上关注 这里是码农充电第一站,回复"666",获取一份专属大礼包 真爱,请设置"星标"或点个"在看&quo ...
- 19岁「天才少年」自制CPU!1200个晶体管,纯手工打造
大家好,我是张巧龙,在推特上看到一个19岁的博主,耗时整整3年,纯手工自制1200个晶体管的CPU. 这位叫做 Sam Zeloof 的美国大学生,最终打造出1200个晶体管的CPU! 在10微米 ...
最新文章
- 安波副教授:分布式人工智能进展与趋势
- 《交互式程序设计 第2版》一3.5 捕获简单用户交互行为
- JS的instanceof
- MyBatis与Hibernate比较
- CodeForces - 1088E Ehab and a component choosing problem(树形dp)
- mysql不能存字母,使用不常見的字母/符號時,MySql數據庫不能正確存儲數據
- 可实现的python拟牛顿法的DFP算法
- springboot的学习笔记,这个很重要
- ExtJs4学习(一):正确认识ExtJs4
- win10 Abaqus2018 血泪备注
- duilib开发(六):基本控件介绍
- 蓝桥杯(李白喝酒Java)
- 为什么面试完,总是让你回去等通知?
- Exception】Chrome浏览器提示:此网页正试图从未经验证的来源加载脚本
- 苹果充电线android头断了,【黑科技数据线!断了都能用!】 苹果安卓数据线 快速修复永不断线...
- ESP32 的 I2C 原理 应用入门
- Wacom 数位板 和冠 手绘笔 Photoshop MacOS 延时卡顿丢笔解决办法
- ITOM(IT运维管理软件)
- 怎么给word文档注音_如何为整篇word文档加拼音标注
- 在System.Timers.Timer的处理程序中调用MessageBox.Show()弹出的确是非模态的
热门文章
- python 入门一(数据结构)
- html移动端语音波纹,html5 +css3 点击后水波纹扩散效果 兼容移动端
- Goolg Maps android API V2版详解(一)配置eclipse得到map包
- 瑞典安百拓集团将把日本工厂搬到南京;好时在马来西亚开设新研发中心 | 美通企业日报...
- ofo的snapchat效应:成功从校园走出去已成功一半
- 深度学习中的normalization总结(BN、LN、WN、IN、GN)
- Ubuntu16.04安装系统监控器System Monitor
- MMRotate 全面升级,新增 BoxType 设计
- IEEE 802 标准概述
- 【流程标准化】标准操作规程(SOP)基础知识