`
小女墙
  • 浏览: 111795 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA深度解析4(51CTO)

    博客分类:
  • JAVA
阅读更多

原文地址:http://bbs.51cto.com/thread-604335-1.html

1.  关于集合框架类
相信学过Java的各位对这个名词并不陌生,对  java.util.*这个package肯定也不陌生。不知道大家查询API的时候怎么去审视或者分析其中的一个package,每个包最重要的两个部分就是interfaces和classes,接口代表了它能做什么,实现类则代表了它如何去做。关注实现类之前,我们应该先理解清楚它的来源接口,不管在j2se还是j2ee中,都应该是这样。那么我们先看这三个接口:List、Set、Map。
也许有些人不太熟悉这三个名字,但相信大部分人都熟悉ArrayList,LinkedList,TreeSet,HashSet,HashMap,    Hashtable等实现类的名字。它们的区别也是满容易理解的,List放可以重复的对象集合,Set放不可重复的对象组合,而Map则放  <Key,Value  > 这样的名值对,  Key不可重复,Value可以。这里有几个容易混淆的问题:

到底Vector和ArrayList,Hashtable和HashMap有什么区别?
很多面试官喜欢问这个问题,其实更专业一点应该这样问:新集合框架和旧集合框架有哪些区别?新集合框架大家可以在这些包中找since  jdk1.2的,之前的如vector和Hashtable都是旧的集合框架包括的类。那么区别是?
a.  新集合框架的命名更加科学合理。例如List下的ArrayList和LinkedList
b.  新集合框架下全部都是非线程安全的。建议去jdk里面包含的源代码里面自己去亲自看看vector和ArrayList的区别吧。当然如果是jdk5.0之后的会比较难看一点,因为又加入了泛型的语法,类似c++的template语法。

那么大家是否想过为什么要从旧集合框架默认全部加锁防止多线程访问更新到新集合框架全部取消锁,默认方式支持多线程?(当然需要的时候可以使用collections的静态方法加锁达到线程安全)
笔者的观点是任何技术的发展都未必是遵循它们的初衷的,很多重大改变是受到客观环境的影响的。大家知道Java的初衷是为什么而开发的麽?是为嵌入式程序开发的。记得上一篇讲到classLoader机制麽?那正是为了节约嵌入式开发环境下内存而设计的。而走到今天,Java成了人们心中为互联网诞生的语言。互联网意味着什么?多线程是必然的趋势。客观环境在变,Java技术也随着飞速发展,导致越来越脱离它的初衷。据说Sun公司其实主打的是J2se,结果又是由于客观环境影响,J2se几乎遗忘,留在大家谈论焦点的一直是j2ee。

技术的细节这里就不多说了,只有用了才能真正理解。解释这些正是为了帮助大家理解正在学的和将要学的任何技术。之后讲j2ee的时候还会再讨论。
多扯句题外话:几十年前的IT巨人是IBM,Mainframe市场无人可比。微软如何打败IBM?正是由于硬件飞速发展,对个人PC的需求这个客观环境,让微软通过OS称为了第二个巨人。下一个打败微软的呢?Google。如何做到的?如果微软并不和IBM争大型机,Google借着互联网飞速发展这个客观环境作为决定性因素,避开跟微软争OS,而是走搜索引擎这条路,称为第3个巨人。那么第4个巨人是谁呢?很多专家预言将在亚洲或者中国出现,  Whatever,客观环境变化趋势才是决定大方向的关键。当然笔者也希望会出现在中国,^_^~~

2.  关于Java设计模式
身边的很多在看GOF的23种设计模式,似乎学习它无论在学校还是在职场,都成了一种流行风气。我不想列举解释这23种Design  Pattern,  我写这些的初衷一直都是谈自己的经历和看法,希望能帮助大家理解。
首先我觉得设计模式只是对一类问题的一种通用解决办法,只要是面向对象的编程预言都可以用得上这23种。理解它们最好的方法就是亲自去写每一种,哪怕是一个简单的应用就足够了。如果代码实现也记不住的话,记忆它们对应的UML图会是一个比较好的办法,当然前提是必须了解UML。
同时最好能利用Java自身的类库帮助记忆,例如比较常用的观察者模式,在java.util.*有现成的Observer接口和Observable这个实现类,看看源代码相信就足够理解观察者模式了。再比如装饰器模式,大家只要写几个关于java.io.*的程序就可以完全理解什么是装饰器模式了。有很多人觉得刚入门的时候不该接触设计模式,比如图灵设计丛书系列很出名的那本《Java设计模式》,作者:  Steven  John  Metsker,大部分例子老实说令现在的我也很迷惑。但我仍然不同意入门跟学习设计模式有任何冲突,只是我们需要知道每种模式的概念的和典型的应用,这样我们在第一次编写  FileOutputStream、BufferedReader、PrintWriter的时候就能感觉到原来设计模式离我们如此之近,而且并不是多么神秘的东西。

另外,在学习某些模式的同时,反而更能帮助我们理解java类库的某些特点。例如当你编写原型(Prototype)模式的时候,你必须了解的是  java.lang.Cloneable这个接口和所有类的基类Object的clone()这个方法。即深copy和浅copy的区别:
Object.clone()默认实现的是浅copy,也就是复制一份对象拷贝,但如果对象包含其他对象的引用,不会复制引用,所以原对象和拷贝共用那个引用的对象。
深copy当然就是包括对象的引用都一起复制啦。这样原对象和拷贝对象,都分别拥有一份引用对象。如果要实现深copy就必须首先实现  java.lang.Cloneable接口,然后重写clone()方法。因为在Object中的clone()方法是protected签名的,而  Cloneable接口的作用就是把protected放大到public,这样clone()才能被重写。

那么又有个问题了?如果引用的对象又引用了其他对象呢?这样一直判断并复制下去,是不是显得很麻烦?曾经有位前辈告诉我的方法是重写clone方法的时候直接把原对象序列化到磁盘上再反序列化回来,这样不用判断就可以得到一个深copy的结果。如果大家不了解序列化的作法建议看一看  ObjectOutputStream和ObjectInputStream

归根结底,模式只是思想上的东西,把它当成前人总结的经验其实一点都不为过。鼓励大家动手自己去写,例如代理模式,可以简单的写一个Child类,  Adult类。Child要买任何东西由Adult来代理实现。简单来说就是Adult里的buy()内部实际调用的是Child的buy(),可是暴露在main函数的却是Adult.buy()。这样一个简单的程序就足够理解代理模式的基本含义了。

分享到:
评论

相关推荐

    较好的几个技术网站(有JAVA,ORACLE)

    51CTO的优势在于其内容的全面性和时效性,每天更新的技术新闻、深度解读文章和技术博客,使读者能够及时掌握行业动态。此外,51CTO还提供了在线教育服务,包括视频课程、实战培训等,帮助用户实现技术能力的快速提升...

    51CTO下载-基于Activiti5工作流实战企业协同OA办公系统教程

    《基于Activiti5工作流实战企业协同OA办公系统教程》是一门深度解析如何利用Activiti5框架构建高效、协同的企业办公自动化(OA)系统的专业课程。该教程旨在帮助IT从业者和对企业信息化有兴趣的学习者掌握工作流引擎...

    深入理解Android:卷I--详细书签版

    深入理解Android:卷I(51CTO网站“2011年度最受读者喜爱的原创IT技术图书”) 基本信息 作者: 邓凡平 出版社:机械工业出版社 ISBN:9787111357629 上架时间:2011-9-13 出版日期:2011 年9月 开本:16开 页码:488...

    mysql学习资料(9本)

    5. **51CTO下载-MYSQL高效编程.pdf**:这本书可能关注于编写高效的MySQL代码,包括最佳实践、避免常见的性能陷阱以及使用高级特性来提升代码效率。 6. **涂抹MySQL 跟着三思一步一步学MySQL.pdf**:这可能是一本以...

    spring资料收集

    4. "5_3_3 使用Spring对JDBC的DAO支持类 - 51CTO_COM.mht":这部分可能深入讲解了如何使用Spring的JDBC模板(JdbcTemplate)来实现DAO层,这是Spring提供的一种简化数据库操作的工具。 5. "Spring3_0_2 使用 ...

    ajax学习电子书资料大全收集

    通过其搜索功能,用户可以找到众多关于Ajax技术的文章,涵盖各种实践经验和深度解析。 ##### Ajax技术应用开发专题: 链接指向了“51CTO”网站上关于Ajax技术应用开发的专题页面。51CTO是一家知名的IT职业在线教育...

    android学习资料(网站,论坛)

    3. **TiGERTiAN博客(http://www.blogjava.net/TiGERTiAN/archive/2010/02/03/311827.html)**:专注于Java和Android技术的深度解析。 4. **CSDN博客...

    Hadoop学习网址

    - **网址**: [Hadoop Hive SQL 语法解释](http://jeffxie.blog.51cto.com/1365360/317524) - **内容概述**: - **Hive简介**: 简要介绍了Hive作为数据仓库工具的基本功能和优势。 - **SQL语句**: 提供了Hive SQL...

    WebServices学习资料

    2. [ITEYE博客关于REST风格服务的深度解析](http://fuyanqing03.iteye.com/blog/478684) #### 基于XFire的SOAP服务 SOAP(Simple Object Access Protocol)是一种基于XML的协议,用于交换结构化的信息,尤其是在...

Global site tag (gtag.js) - Google Analytics