首页 > 代码库 > Java 学习

Java 学习

effective+java第三版

2016-09-23 15:25
技术分享

effective+java第三版 相关问答


EffectiveJava第28条中关于泛型的一个疑问?

@又名耶稣谢邀

一、先说说②处编译错误:
List<T>a=list;
a是一个List<T>的类型,而list是参数List<?>,?任意类型。向上转型不用强制转型,而向下转型需要强制类型转换。而此处恰恰是一个向下转型的过程,必须强制类型转换,否则会编译出错,这里必须要改为:
List<T>a=(List<T>)list;
二、再说说①处为什么能编译通过:

先说说Java编译过程

仅仅从Java代码的角度来看,①和②处的确看不出多大区别,这问题必须从java编译器角度来分析:java代码编译的过程其实就是将.java格式源码转换为.class格式的字节码文件,在这个过程中涉及解析与填充符号表、注解处理、分析与生成字节码3个过程。

对于虚拟机其实是不支持泛型的,java泛型只存在于java源码,有一个过程叫做泛型擦除,将编译成字节码文件时会将泛型替换为原生类型,即不管是List<Long>还是List<String>都会转换为List类型,在转换过程中会在相应地方插入强制类型转换的代码,这个过程便是发生在分析与生成字节码的过程。整个过程发生在编译器完成,(并非虚拟机的编译过程,之前说法欠妥帖,多谢@RednaxelaFX提醒)。

何为泛型擦除:

publicclassTest{publicstaticvoidmain(String[]args){ArrayList<String>al=newArrayList<String>();al.add("gityuan");demo(al);}privatestatic<T>voidgenericMethod(List<T>list){System.out.println("ID="+list.get(0));}}
此时T类型为String,那么泛型擦除后,genericMethod等价于
privatestaticvoidgenericMethod(Listlist){System.out.println("ID="+(String)list.get(0));}
再回到题目
①处swapHelper(list)中的list是List<?>类型,也就意味着泛型中E的类型为?,
privatestatic<?>voidswapHelper(List<?>list){}该方法在内容为空,如果内容不为空,那么涉及list的成员的操作都会转换为?类型,即Object类型,这是属于向上转型,不会有编译错误。

再来说说
②处编译错误List<T>a=list,等式的左边为泛型,等式右边是List<?>类型,那么如果传入的T为String,那么等价于List<String>a=list,这明显是向下转型,必须显式申明。如果②处左右交互位置,那么也就是变成了向上转换,也就不会报错。

这才是①处能编译过程,而②处编译错误的真正原因。(之前说法不够精确,更新时间2016.4.6。)
------------------------------------------------------------------------------------------------------


本人偏向于学习C++,如何全面的学习《算法》(第四版)这本用java写的书?

2015-05-07
1.实际上,即使现有的轮子,也不可能满足所有的需求。所以,有需求的情况下(比如:对于像我这样的算法/数据结构菜鸟,实现一遍这些常见的容器能使我更好地掌握数据结构与算法。那么,我重造一遍轮子便是处于“学习”/“涨工资”的需求),还是要自己造轮子的。

比如,C++STL中提供了一套容器,但是Boost中又实现了一套intrusive容器。那么,我们就会想:intrusive容器和non-intrusive容器有什么区别呢?Boost是出于什么样的考虑多设计了一套intrusivecontainers(侵入式容器)呢?它们在什么场景下用起来会比较好呢?假设题主有类似需求,且找不到现有轮子的话,造轮子的必要性就来了。

知其然(会用)还要知其所以然(多少知道它的内部机理),才会游刃有余。

2.那么机会来了!答主可以把这本书上的示例代码用C++敲一遍,在github上开个项目,不也是一种很好的学习吗?兴许还能收集到若干星星,召唤到神龙?想一想就有点激动。

2015-08-17T13:37+08:00
最近在看《EffectiveC++3rdEdition》。看到Item38的时候,书中有这样一个例子:
Unfortunately,setimplementationstypicallyincuranoverheadofthreepointersperelement.Thisisbecausesetsareusuallyimplementedasbalancedsearchtrees,somethingthatallowsthemtoguaranteelogarithmic-timelookups,insertions,anderasures.Whenspeedismoreimportantthanspace,thisisareasonabledesign,butitturnsoutthatforyourapplication,spaceismoreimportantthanspeed.Thestandardlibrary‘ssetthusoffersthewrongtrade-offforyou.Itseemsyou‘llneedtowriteyourowntemplateafterall.在学习编程的过程中,我们会看到各种各样的折中、妥协、取舍。在为自己的系统选择合适的数据结构的时候也是(虽然,现在PC内存越来越大,诸如“时间和空间效率”这些问题也很少再困扰到我们)。而只有深入地了解了它们的时间、空间效率,我们才可能做出更好的设计。

---


学javaee的三大框架,求推荐本有关三大框架底层的书?

TIJ,EFFECTIVEJAVA


一个即将步入大学对编程感兴趣的学生,3年能将Java学到什么程度,应怎样合理分配这3年?

作为一个工作8年的javacoder,回答一下你这个问题。
我觉得只要勤于思考,作为学生,每天认真写一个小时JAVA已经绰绰有余了。
重复的代码没必要写第二次。
深刻想明白你的每一行代码的目的。
关键不是单纯的复制粘贴,而是cleancode的能力啊~

强烈推荐headfirst的设计模式,这本书一定要看。
如果有余力,看看effectivejava,这本书也很不错。
这两本书通读下来其他java书你基本就不用再去看了。

如果你一开始理解不了io流,这很正常,如果你对线程很困惑,这也非常正常。

很多工作了10年的人也不敢说自己这些就做得很好。

能真的想明白JAVA为什么要有接口在我看来已经是一个能干活的程序员了。

强烈不推荐thinkinjava,这本书很多人推荐但是我真心不推荐新人看,我觉得这本书完全就是替有C++基础的人写的。

培养耐心的耐心的耐心的看日志的能力。
我面试新人的时候,通常会关心他对设计模式的理解,常见Struts,Spring用到了哪些模式,能大致理解为什么要写单元测试。
至于算法什么的其实不强求,工作中常见的都交给工具类去处理了。
当然刚读好大学,数据结构几个基本算法还是应该懂的,这个是态度问题。。。。。


我们如何学好Java?

首先先搞懂JavaSE的部分,Swing和swt部分就可以少看或不看,因为现在用的比较少。重点是看懂Java中的面向对象、集合框架、JDBC、异常、IO、线程和网络编程。JavaSE搞定后再学习Servlet、JSP,然后才是经典的Struts2、Hibernate和Spring,学习框架时重点理解框架的运行原理,甚至可以尝试自己写个轻量级的框架。理解运行原理的最好方法就是阅读源代码,还是要感谢Java中的开源项目。这期间还要多找各种大小的项目去完成,不一定要大,但是要精致,功能要完整,这样可以练习所学知识,并且可以在做项目中发现自己的知识体系中不足的地方。关于看视频,我不推荐,很多同学一天到晚就知道看视频,殊不知,编程真理在于“练习,练习,不停练习”!
再补充下:当学习Java的期间,会碰到各种各样的异常,请积累这些异常信息,以及如何出现的异常和如何处理的,因为java中常见的异常就那么几种,积累的多了,处理问题的能力就提高,这样水平会提高的很快!
-----------------2015年1月5日修改---------------
这个答案最开始是11年回答的,不少留言的同学问现在这个答案是否还有效,答案是依然有效。因为这几年的发展,从招聘的角度看,使用Java的IT的公司对技术的要求变化不大,依然要求你有扎实的JavaSE功底,会使用常用的框架。
SpringMVC这几年的占有率迅速的提高,可能之后会取代Struts2,但是无论怎么变化,这些还都是MVC模式,理解了这个模式,上手任何的MVC框架都应该很快。
企业需要的变化还体现在大数据方面,因为Hadoop的流行,Java的应用场景又多了一个。所以,不喜欢web的可以考虑学习大数据方面的知识。
另一个流行的场景自然就是Android,学习Android依然需要你有JavaSE的底子+HTTP协议的理解,再配合上Linux的知识就可以开始了。
再说下找项目的问题,初学者可能会碰到不知道做什么的问题,其实最开始大家都是从模仿开始的,例如你学会了jsp+Servlet,那就可以模仿一个v2ex这样的论坛出来。学会了SpringMVC,那就试着将论坛的代码重构,提供restful接口供客户端访问(Android、IOS、web等)。论坛做的没难度了,那就模仿一个团购网站,依然是不一定要做全部的功能,但是做出的功能要稳定,要精致。或者一个微信公众平台的开发都是不错的项目。
初学者看源代码有的人推荐看Struts2、spring的,但是我相信10个初学者9个看不懂,那就从简单的开始,例如Apache的Commons库,例如lang、dbutils、io等,这些都是非常不错的代码,类的数量不多而且质量也不错,这些看懂之后,你的基础水平增长的不是一点点。
再次提醒初学者,学习编程没有你想的那么简单,必须要多练习,多思考,最主要的是你对这个有兴趣。现在不少网站和媒体都宣传1个月学会前端、3个月入职BAT的口号,那也就是口号而已,别太认真。这条路没有捷径,写你的代码就是了!
暂时就这么多,有问题的可以留言!感谢大家捧场!
(利益相关,我是Java培训师)
------------------2016年6月29日更新推荐书单-------------------------------
Java基础部分
JAVA核心技术(卷1)(豆瓣)HeadFirstJava(豆瓣)
重构(豆瓣)
Effectivejava中文版(第2版)(豆瓣)
HeadFirst设计模式(中文版)(豆瓣)
严重不推荐《Java编程思想》,这句话一出,估计很多人会喷死我,因为这本书被很多人奉为Java中的圣经级的书籍。但是我真的想问问这些人,你们真的看过这本书吗?真的适合初学者去看吗?多少初学者就是看了这本书做到了从入门到放弃的过程。所以,我的观点是,有一定Java开发经验了再看这圣经数据库部分
MySQL必知必会(豆瓣)
JSP和Servlet部分
HeadFirstServlets&JSP(中文版)(豆瓣)
HTTP权威指南(豆瓣)
图解HTTP(豆瓣)
框架部分
Spring实战(第3版)(豆瓣)
Spring技术内幕(豆瓣)
JavaPersistencewithMyBatis3(豆瓣)
深入浅出Hibernate(豆瓣)虽然老,但是经典
Struts2实战(豆瓣)
Android
Android编程权威指南(第2版)(豆瓣)
其他
Redis实战(豆瓣)
Redis设计与实现(豆瓣)
Redis入门指南(豆瓣)未完,待续...


如何系统地学习javaweb技术?

我正好有一点javaweb开发的经验,可以解答一下。
1.如果有现有项目使用到javaweb技术,很幸运,你不需要“系统地学习”,阅读里面的代码,并弄清楚如何实现,就可以学习到非常多的东西;
2.如果你需要自行学习的话,你也不需要那么“系统”,很多时候是在应用的过程中不断地提升、查漏补缺;
“系统学习”的想法,从某种程度上来说让人感觉良好,但实际上并不那么实用。更需要在实际实用的过程中不断学习、探索和总结。

3.掌握springMVC+ibatis+jQuery+Ajax主流框架是非常有必要的;
4.在掌握主流框架能够开发实际应用的时候,持续定期补充基础:servlet规范、JDBC接口、JDK库等;
5.学习一些关于软件开发、代码可读性的知识:《EffectiveJava》,《代码整洁之道》,《Writingsolidcode》、《编写可读代码的艺术》、《Unix/Linux设计思想》,《敏捷技能修炼》、《程序员修炼之道:从小工到专家》、《Codersatwork》等;
6.如果你也想学习一点前端的知识,至少懂HTML/JS/CSS的基础知识,严格应用DIV+JS+CSS的原则进行内容、行为与外观分离。使用DIV划分页面结构,并为元素加上id和class,CSS为元素增加外观样式,JS添加行为和交互。
7.掌握Java并发编程,学习一些中间件,比如RMS,分布式缓存等;
8.学习设计模式、系统架构相关的知识;
9.广学博收,这是我读过的一些书籍,有兴趣你可以读读。http://www.cnblogs.com/lovesqcc/archive/2012/09/07/4037805.html

我在《黑客简史》中学到最重要的一点:Thethoeryinthebook,Thetruthinthecode.到源代码中去探索所有的真相吧,尽量少读技术性书籍,少读一些学院派的方法论,多阅读科技论文、多多与他人探讨交流,直接从项目官网和文档中学习,提升自己的互联网学习能力。编程是自由的创造性活动。


金融工程(包括程序化交易和超短线交易中)对于Java的要求大约是什么水平?如何学习?

这个问题题主要问的其实是:如果学java的话考哪个?
似乎挺多人已经跑题了,跑到了到底是应该用c,c++还是java。一句话简单回答就是java可以无限接近于c(要求tunejvm),但是易于维护和开发。c++如果整个交易系统规模不大还好,如果规模大的话很容易写烂掉,具体可见google对c++的规范非常严格。如果有该类的问题,欢迎tag我我可以展开回答。
我大学本科写了四年c++,研究生阶段和在实验室写过一些c,java则在工作中有大量ee,se的经验。
ok,回答正题。SE,EEorME?
SE指的是javastandardedition,其实你真要是用起来可以写到非常底层,和c在金融行业的应用区别不大。
EE指的是enterpriseedition,主要的应用是web方面,金融行业里面做后台应用比较多(比如生成一个报表之类的给会计看,一个portfolio的信息给trader看,etc。个别会拿来做webtrading),会要求学习诸如applicationserver(tomcatetc)的知识,数据库知识由于包装比较多并且使用heavy的httpprotocol很难用在performancecritical的地方比如quant类的。
ME顾名思义是mobile类的开发,quant更加不会用。

所以综上所诉,应该坚定地走SE方向。

如何走SE方向?最简单暴力和有效率的-考试。作为一个成年人,我们有时候讲求动力,亦或是压力,或推动你去学习。那么可以考虑报名一个Suncertifiedjavaprogrammer的证书(似乎被收购以后改名叫OCJP-oraclecertifiedjavaprogrammer)。这里面会学习编程的逻辑思维,java的语法,面向对象的思想等。

似乎又有更多的人在回答java的性能的问题,我实在觉得这里有太多的不严谨的地方:
1.GC
连gc都控制不好的居然还在做认真严肃的交易系统,areyoukidding?基本你用好memorycache没有什么memoryleak在多少用一下objectpool,threadpool的东西,几乎可以做到nogcformarketdata了,order/quotetransaction的gc是难免的不过基本都是非常非常快的gc几乎可以忽略不计。

2.latency
250ms的latency都开始说快了,实在是有趣,我们写的java交易系统都是在谈tuningunder100microsecond以下的latency,行情update都是在谈5microsecond的latency。这种差了百倍的量级实在是随手写一个java的tcp/ipserver都能实现。
PS:中国市场的瓶颈根本不在交易系统,而在于交易所,股票和期货的行情更新都不是tick级别的,只是过了一段时间的SNAPSHOT,这个速度慢的实在不在高频的讨论范围内。


JAVA如何学习啊?

深夜来一发,手机党,格式莫介意学习任何东西之前首先问自己学为什么要学?这个问题题主的答案显然是找工作弄明白为什么之后,剩下的就简单了第一,选JAVA你没有选错,因为大多数的人都会告诉你JAVA就业前景好第二,选JAVA你要往哪方面走?走之前记得先把基础JAVASE弄好,接下来就是往哪里走,安卓开发,web开发,一新一旧,自己想想第三,时间问题,时间真的还够么?我的情况和题主差不多,我认识到我要学习JAVA这个问题可能要比你早几个月,在比你多的几个月里,我复习了两边基础,一次web开发基础,期间还看了一些java中比较有名的书,JAVA核心技术effectiveJAVA,还有thinkinJAVA,看这些书的目的不是说要证明自己有多牛,而是时刻反省自己,因为看这些说我看到一部分就会看不下去。因为这样我才会一遍又一遍的复习基础。第四,我的现状。尝试着投过几次简历,直接无情悲剧,这个结果显然。过去的几个星期学完了strust2,这两天在练习项目,下星期准备学习hibernate(一周),最后到spring(两周),最后在总结汇通第五,最后的办法,很多人其实会不联系别人去参加一些培训机构,我倒是觉得如果平时时间够多,参加一个就业班是可以的,但是如果你的决心足够大,自学能力好的话,还是建议找个伙伴一起学习(没错,可以找我)
第六,会有很多人会告诉你要学习算法,数据结构,等等。在我看来。除非兴趣或者是面试准备,少碰那些玩意!!
第七,百度其实可以解决你很大部分的问题,很多人会告诉你,用谷歌好,谷歌妙,但是谷歌要FQ,谷歌对中文不大友好,不到最后时候我反正是不用谷歌
第八,英语对于程序猿的重要性,只是锦上添花,千万不要舍本逐末
【最后一点,知乎喷子多,人也良莠不齐,得到别人的帮助记得感谢,有人讽刺你也不要介意,今天别人瞧不起你,明天你让他高攀不起!!】


Java转Python,是对是错?

看了几个排名靠前的回答,我感觉各位答主忽略到一个题主的问题:通过看马士兵老师的java入门课程和小组内的小伙伴一起入门开始学习java所以题主所上过的关于java的课程是马士兵那类的培训类课程而不是正规大学课程甚至不是正规大学公开课那样的?那时flex基本上在网上提问能获得回复的可能性很小所以题主遇到flex问题的时候没想到自己看书或者看文档来解决而是在网上当伸手党?
我周日去达内咨询,是不是通过培训能提升我的技术所以题主始终在寄希望于有人可以把现成的技术知识手把手教给你而不是自己通过实践去钻研学习而掌握?
最大的困惑就是没有人能问问题,因为做Flex,遇到问题基本上没有人能回答,在做程序之路上特别孤单,最大的困惑就是没有属于自己的圈子所以题主一直认为做技术的这个圈子就是大家相互问问题的圈子?如果这样的话题主即使在这个圈子里也认识不到身在其中。
Java转Python,是对是错?题主你的问题不是java转python的问题,你的问题是你从来没有踏踏实实地在技术中钻研与学习。你自以为是个渔夫,其实你干的事就是始终寻找能给你鱼的人,你没有想过自己去出海打鱼,所以你觉得你没有自己的圈子,因为真正的渔夫都在海上打鱼。渔夫们相互提问也是问“怎样打鱼更快更安全?”而不是“你的鱼可不可以给我?”所以渔夫觉得知道怎么在海里打鱼就自然知道怎么在河里打鱼,而题主会认为去海里打鱼和去河里打鱼是互斥的事情。

下面是一些经典教材,题主有时间参加那些没用的培训,不如坐下来把书看啃完:
HeadFirstJava(第二版·中文版)
ThinkinginJava
Effectivejava中文版(第2版)
Java数据结构和算法

想上课?
https://www.coursera.org/course/pkujava
https://www.coursera.org/course/algs4partI


三本计科大三,自学javase,求知乎程序员给我指点指点之后的路?

我说下后端工程师吧。

做后端工程师看javase相当于会一点java语法,面试的时候百分百不会靠这方面的知识点。

后台用到的知识主要是javaEE你要看的书应该包括《java编程思想》,这是一定要看的书,类似的还有java面向对象之类的书。这类都是帮助你了解java的基本语法。

下面才是提升技能的书,工作面试的加分点。要看的书分前台和后台,java工程师用后台写逻辑,前台显示数据效果,两个是分不开的。前台是指用浏览器看页面效果。


后台需要看的书有:struts,spring,hibernate,《java核心技术》《java并发编程》。

前台要看的书有《serlvetandjsp》,《javascript》《jquery》《html5andcss》还要会用编程工具啊,你可能已经会用了eclipse和tomcat,但不了解其中原理,建议你看看tomcat》还有weblogic,大公司基本不用tomcat而用weblogic。

你大三,时间并不多,也看不完这么多书,建议你先看java编程思想,最起码了解接口和抽象类的区别,集合类的知识要知道啊。

最后补充重要的,c++数据结构要看懂且会写,基本的排序算法要能写出来,数据库的基本语句要写的出来,索引,存储过程,函数的知识要能答得上吧。后台不看数据库,数据存到哪里去?所以要看数据库的书有mysql,oracle,即使你不安装数据库,不实际操作,也要看这两本书,了解其中的知识。

Java 学习