《Java程序设计实践精品资料.doc》由会员分享,可在线阅读,更多相关《Java程序设计实践精品资料.doc(315页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java程序设计实践搜索软件开发直通车罗刚2012目录Java程序设计实践1第1章 Java软件开发21.1 软件工具31.1.1 搜索引擎31.1.2 Windows命令行41.1.3 机器翻译41.1.4 Linux41.1.5 源代码比较工具51.2 Java基础61.2.1 准备开发环境71.2.2 类和对象81.2.3 Eclipse101.2.4 变量111.2.5 方法141.2.6 命名规范191.2.7 基本语法201.2.8 读写文件221.3 控制结构251.3.1 条件判断251.3.2 循环271.3.3 数组311.3.4 字符串341.3.5 位运算381.3.6
2、 枚举类型421.3.7 比较器451.3.8 集合类461.3.9 泛型511.3.10 系统属性521.4 安装Java531.4.1 服务器端安装531.4.2 自动安装Java541.5 Java类库571.5.1 使用Java类库581.5.2 构建jar包581.6 内存管理611.6.1 虚拟机的内存611.6.2 程序中的内存管理651.6.3 弱引用671.7 提高代码质量731.7.1 单元测试741.7.2 日志751.7.3 重构821.8 本章小结821.9 术语表82第2章 数据结构832.1 链表83第3章 算法843.1 树算法843.1.1 标准Trie树84
3、3.1.2 二叉搜索树933.1.3 三叉Trie树1023.1.4 Trie树词典1093.2 队列1133.2.1 链表实现的队列1133.2.2 优先队列1143.2.3 找出前k个最大的元素1183.3 堆栈1203.4 实现Deque1223.5 散列表1263.5.1 快速查找的散列表1263.5.2 应用散列表1303.5.3 开放式寻址1313.5.4 布隆过滤器1313.5.5 SimHash1343.6 图算法1363.6.1 表示图1373.6.2 遍历图1463.6.3 动态规划求解1483.7 穷举法1483.8 贪婪法1513.9 分治法1543.9.1 归并排序1
4、553.9.2 折半查找1573.9.3 相似信息1613.10 动态规划1643.10.1 编辑距离1653.10.2 中文分词1683.11 本章小结1713.12 术语表172第4章 面向对象编程1734.1 类1744.2 对象1754.3 继承1764.4 设计模式1784.4.1 单件模式1784.4.2 工厂1784.4.3 链式模式1794.4.4 MVC1804.5 异常1804.5.1 断言1804.5.2 Java中的异常1814.5.3 从方法中抛出异常1824.5.4 处理异常1854.5.5 正确使用异常1864.6 本章小结1894.7 术语表189第5章 软件数
5、学基础1905.1 概率1905.1.1 语料库1915.1.2 条件概率1915.1.3 马尔可夫模型1925.1.4 平滑1955.2 集合操作2005.2.1 集合的秩2005.2.2 合取2005.2.3 析取2005.3 矩阵2005.3.1 向量空间2005.3.2 主成分分析2015.4 相似度2015.5 本章小结2025.6 术语表202第6章 处理文本2036.1 词法分析2036.2 语法分析2056.3 有限状态机2056.3.1 DFA2126.3.2 有限状态转换2146.3.3 模糊匹配2156.4 正则表达式2226.5 本章小结2256.6 术语表225第7章
6、 网络编程2267.1 套接字2267.1.1 客户端2277.1.2 服务器端2297.1.3 TCP2317.2 Web服务器2337.2.1 HTTP协议2337.2.2 Web服务器2387.3 IO流2397.4 异步IO2397.5 下载网页2407.5.1 使用CURL2407.5.2 使用HTTPClient241第8章 并发程序设计2428.1 线程2428.2 线程池2448.3 线程局域变量2458.4 阻塞队列2478.5 并发2488.6 MapReduce2578.7 本章小结257第9章 界面设计与实现2589.1.1 Web程序是从哪里来的2589.1.2 Se
7、rvlet和JSP2599.1.3 AJAX2599.1.4 jQuery259- 305 -搜索引擎的基本功能遍历搜索引擎技术第1章 Java软件开发现代社会,软件已经相当普及。例如,现在的电网都是由计算机控制的,通过相关软件发出指令,来调节电压、相位等关键参数。在美国,每三名工程师中就有一名软件工程师。即使不专职从事软件开发工作,会写代码是一种有竞争优势的技能。管理人员会越来越多的了解技术,而技术人员也会越来越多的参与管理决策。生活就是从一个平衡到另外一个平衡。也许已经习惯了不会软件开发的生活。完成从不会到会的过程,往往需要几个月时间。很多时候,我们的生活经历对于学习技术并无太大帮助。这本
8、书就是试图通过已有的日常生活常识来帮助学习新的知识。有两个和尚住在隔壁,所谓隔壁就是隔壁那座山,他们分别住在相邻的两座山上的庙里。这两座山之间有一条溪,于是这两个和尚每天都会在同一时间下山去溪边挑水,久而久之他么变成为了好朋友。就这样时间在每天挑水中不知不觉已经过了五年。突然有一天左边这座山的和尚没有下山挑水,右边那座山的和尚心想:“他大概睡过头了。”便不以为意。哪知道第二天左边这座山的和尚还是没有下山挑水,第三天也一样。过了一个星期还是一样,直到过了一个月右边那座山的和尚终于受不了,他心想:“我的朋友可能生病了,我要过去拜访他,看看能帮上什么忙。”于是他便爬上了左边这座山,去探望他的老朋友。
9、等他到了左边这座山的庙,看到他的老友之后大吃一惊,因为他的老友正在庙前打太极拳,一点也不像一个月没喝水的人。他很好奇地问:“你已经一个月没有下山挑水了,难道你可以不用喝水吗?” 左边这座山的和尚说:“来来来,我带你去看。”于是他带着右边那座山的和尚走到庙的后院,指着一口井说:“这五年来,我每天做完功课后都会抽空挖这口井,即使有时很忙,能挖多少就算多少。如今终于让我挖出井水,我就不用再下山挑水,我可以有更多时间练我喜欢的太极拳。我们在公司领的薪水再多,那都是挑水。而把握下班后的时间挖一口属于自己的井,对我们来说更重要。岁月不饶人,当我们年龄大了,体力拼不过年轻人了,还是能喝到自己挖出来的井水,而
10、且喝得很悠闲。所以一定要有自己的特长或者技术核心,挖一口属于自己的井,培养自己独特坚实的实力。所谓白天求生存,晚上求发展,昨天的努力就是今天的收获,今天的努力就是未来的希望,多年前不分伯仲的同窗好友,如今的境遇可能大不相同。挖井的过程则告诉我们知识需要日积月累,最终才能达到一个很高的高度。西蒙教授曾提出了这样一个见解:“对于一个有一定基础的人来说,他只要真正肯下功夫,在6个月内就可以掌握任何一门学问。”Java只需要花3个月就可以学会,到6个月后可以掌握它。人生苦短,朝如青丝暮成雪,所以这里选择更先进的语言,有垃圾回收后就不用为释放内存费心思,节省时间。有很多人从开发Java后受益。例如Cut
11、ting以前是一个C+程序员,他在1999年写下第一个Java项目,名字叫做Lucene的全文检索项目。在后来的10多年里,Lucene越来越流行,成为开源组织Apache基金会的项目,并在维基百科网站等项目中得到广泛使用。Cutting后来开发MapReduce的Java版本Hadoop也同样成功。Cutting因此进入Apache基金董事会,并在2010年成为董事会主席。Andy Rubin在2002年把Danger公司以5亿美元卖给微软后,Sidekick手机后来退出市场。而使用Java 标准版本开发应用的Android却取得了巨大的成功。Android底层使用Linux操作系统内核,但
12、是手机应用运行在一个叫做Dalvik的Java虚拟机上。Java是一门投入小,见效快、收益大的编程语言。学习基础Java只是5天的课程。众多的Java开源工具包能让你避免重复发明轮子。开源软件哪里找?和apache.org以及。其中apache.org像是一个品牌店,包括一些知名的项目,例如实现搜索功能的Lucene或者实现下载网页的HTTPClient。而和则包括一些开发人员自己建立的小项目。就好像一个集市,包括各种琳琅满目的小玩意。相对于很多数据库编程语言的昙花一现,专业Web开发语言的不冷不热,Java的持续流行与Oracle和IBM等公司的支持分不开。如果觉得Java程序运行速度慢,可
13、以把Java代码当成伪代码。1.1 软件工具据说人是由学会使用工具的猿进化而来的,要花很长时间才能做好一个趁手的石器工具。首先介绍可以提高学习和工作效率的软件工具。1.1.1 搜索引擎有问题首先到Google上搜索,搜索引擎已经成了人类大脑的外部存储设备。习惯使用搜索引擎的人们会忘记自己能在网上找到的信息,而记住自己认为无法在网上找到的信息。有时候需要方便的同时向多个搜索引擎提交同一个查询词。可以使用英文版本的FireFox,它提供一个搜索工具栏,可以通过下拉列表来选择执行搜索的引擎。还可以在http:/mycroft.mozdev.org/添加其他的搜索引擎到搜索工具栏。专业的搜索引擎一般都
14、会实现一个搜索语法,例如,找Word文档,就可以这样查询:Java filetype:doc。注意,filetype:和后面的关键词之间不要有空格。有时候,您如果知道某个站点中有自己需要找的东西,就可以把搜索范围限定在这个站点中,提高查询效率。使用的方式,是在查询内容的后面,加上“site:站点域名”。例如,要从查找java,就可以这样查询:java site:。注意,“site:”后面跟站点域名,不要带“http:/”。另外,site:和站点名之间,不要带空格。1.1.2 Windows命令行Windows命令行是通过Windows系统目录下的cmd.exe执行的。执行这个程序最直接的方式是
15、找到这个程序,然后双击。但cmd.exe并没有一个桌面的快捷方式,这样太麻烦。可以在开始菜单的运行窗口直接输入程序名,回车后运行这个程序。打开开始-运行,这样就会打开资源管理器中的运行程序窗口。或者使用快捷键窗口键+R,打开运行程序窗口。总之,输入程序名cmd后单击确定,出现命令提示窗口。开始的路径往往是C:UsersAdministrator。可以用cd命令改变路径到要执行的路径,例如C:Program FilesJavajdk1.6.0_10。C:UsersAdministratorcd C:Program FilesJavajdk1.6.0_10如果写cd d:,则是改变当前路径到d:子
16、目录。所以切换盘符不能使用cd命令,而是直接输入盘符的名称。例如切换到d盘,使用命令:C:UsersAdministratord:1.1.3 机器翻译从开始学习英语,到能够阅读专业英文资料要多久?如果从初中开始学习英语,到大学毕业才逐渐掌握。到最后10年时间已经过去了。英语基础不太好的读者可以开始时用在线机器翻译阅读英文技术文档,例如查阅Java Doc形式的API,然后逐渐过渡到阅读英文原文。可以使用Google机器翻译()查看英文网页。例如用机器翻译查看最新的Java开发文档。1.1.4 Linux关于Linux,有这样的比喻:从前,有一个叫Linus的人发明了自助车,把它叫做Linux。
17、后来有个叫Sun的家伙觉得这东西不错,但是开起来有点颠簸,一般人控制不了。于是在Linux牌自助车上装上了一个Java牌减震器。于是变成了企业商用车,用了都说好。再后来又来了个叫Andy的哥们,觉得自助车上装个柴油机还是开不快。他干了两件事:1.把柴油机换成了Dalvik型汽油发动机。2.把自助车轮子加粗了,又装上了漂亮的车壳。他宣布,Android牌摩托诞生了。Andy给Google公司的老板Page发了一封邮件推销,Page觉得这摩托不错,就买下来了。没想到这轿车一下就特别火,很快大街上除了开农用车的果农,就都是开摩托的码农了。Linus跟Sun可不干了,说你这不是剽窃我的么,不过Goog
18、le理直气壮:Sun你看,我发动机都换了,不是你家的了。而Linus呢,我把你底下的轮子都改了,不是原来的自助车轮了。因为Windows图形界面简单,所以大部分时候都是在使用Windows,尝试使用新的操作系统往往很费劲。不能像邯郸学步,还没学会Linux,却牺牲了Windows的方便易用。如果有现成的Linux服务器可用,可以使用支持SSH协议的终端仿真程序SecureCRT连接到远程Linux服务器。因为可以保存登陆秘密,所以比较方便。除了SecureCRT,还可以使用开源软件PuTTY(http:/www.chiark.greenend.org.uk/sgtatham/putty),以及
19、可以保存登录密码的PuTTY Connection Manager。小袋鼠在袋鼠妈妈的袋子里长大。使用VMware,Linux可以运行在Windows系统下。VMware让Linux运行在虚拟机中,而且不会破坏原来的Windows操作系统。首先要准备好VMware,当然仍然需要Linux光盘文件。就好像华山派有剑宗和气宗,Linux也有很多种版本,例如RedHat或者Ubuntu以及SUSE。这里选择CentOS(http:/www.centos.org/)。如果需要安装软件,可以下载RPM安装包,然后使用RPM安装。但操作系统对应的RPM安装包找起来往往比较麻烦。一个软件包可能依赖其他的软件
20、包。为了安装一个软件可能需要下载其他的好几个它所依赖的软件包。为了简化安装操作,可以使用黄狗升级管理器(Yellowdog Updater, Modified),一般简称yum。yum会自动计算出程序之间的相互关联性,并且计算出完成软件包的安装需要哪些步骤。这样在安装软件时,不会再被那些关联性问题所困扰。yum软件包管理器自动从网络下载并安装软件。yum有点类似360软件管家,但是不会有商业倾向的推销软件。例如安装支持wget 和rzsz命令的软件:#yum install wget#yum install lrzsz可以同时安装几个软件包,例如同时安装MySQL服务器和客户端:#yum in
21、stall mysql-server mysql1.1.5 源代码比较工具如果两个图有四处不同,要找出两个图之间存在的所有差异很费劲。同样道理,可能在不止一个地方改动了代码,形成不止一个版本。如果要合并两个版本的源代码,就要使用源代码比较工具。Beyond Compare是一个流行的源代码比较工具。可以比较两个目录中文件内容之间的差别,或者只比较两个文件之间的差别。可以根据内容之间的差异更新某个文件。1.2 Java基础为了适应寒冷干燥的环境,需要鼻子湿润和加热空气。为了解决编程难题,需要先熟悉一些编程基础。Java程序都运行在虚拟机上。为什么要做个虚拟机,而不是直接运行在本机的操作系统上?因
22、为Windows是收费的,而Linux可以免费使用。可以把Windows当作开发环境使用,可以把编译后的程序部署在Linux上。因为运行在指令集相同的虚拟机上,所以Java程序可以不经修改的在不同操作系统之间穿越。并不一定要自己买房子以后才有地方住。并不一定要在本机安装开发环境以后,才能运行第一个Java程序。有一些在线的开发环境可运行Java程序,例如第一个Java程序从一个类中定义的main方法开始执行:public class Personpublic static void main (String args) System.out.println(Hello World!);底层到底
23、做了些什么?首先,源代码定义了一个叫做Person的类。然后虚拟机执行其中的main方法。看足球实况转播需要有解说评论。同理,源代码也需要有说明信息。可以用注释说明。可以把注释写在一行的最后,叫做行注释。从/以后一直到这行结束为止都是注释信息。public class Person /人public static void main (String args) System.out.println(Hello World!);如果注释跨越多行,可以使用块注释。/* 类的说明 版权信息 作者名称 联系方式 */public class Personpublic static void main
24、(String args) System.out.println(Hello World!);1.2.1 准备开发环境Java开发环境简称JDK,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础类库。可以从Java官方网站下载得到JDK。注意不是下的Java虚拟机。下载Java SE,也就是标准版本。Latest Release也就是最新发布的安装程序。下载一个小版本号高的,例如1.7.0不如1.6.22稳定。因为可以在Windows或Linux等多种操作系统环境下开发Java程序,所以有多个操作系统的JDK版本可供选择。因为JDK是有版
25、权的,所以需要接受许可协议(Accept License Agreement)后才能下载。如果在Windows下开发,就选择Windows x86。下载完毕后,使用缺省方式安装JDK即可。JDK相关的文件都放在一个叫做JAVA_HOME的根目录下。JDK根目录的命名格式是:C:Program FilesJavajdk1.6.0_最后以一个数字类型的版本号结尾。例如10或者21等等。因为一台机器可以安装多个JDK和JVM,为了避免混乱,可以新增环境变量JAVA_HOME,指定一个缺省使用的JDK。使用echo命令检查环境变量JAVA_HOME:echo %JAVA_HOME%C:Program
26、FilesJavajdk1.6.0_10如果只需要使用集成开发环境,只配置JAVA_HOME这一个环境变量就可以了。为了检查JAVA_HOME已经正确设置,在任何路径输入java命令都能显示虚拟机的版本号就可以了。java -versionjava version 1.6.0_10-rcJava(TM) SE Runtime Environment (build 1.6.0_10-rc-b28)Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)如果还需要在控制台下执行,则需要访问编译程序的javac.exe或者执行j
27、ava类的java.exe。环境变量PATH指定了从哪里找java.exe这样的可执行文件。可以从多个路径查找可执行文件,这些路径以分号隔开。如果想在命令行运行Java程序,还可以修改已有的环境变量PATH,增加Java程序所在的路径。例如:C:Program FilesJavajdk1.6.0_10bin。然后检查环境变量PATH:echo %PATH%为了检查PATH已经正确设置,在任何路径输入javac命令都能显示javac的用法就可以了。也可以用第一个Java程序试验下。运行:javac Person.javajava Person看控制台是否显示Hello World!。编译和执行J
28、ava程序的基本过程如图1-1。Person.javajavac编译Person.classjava执行图1-1 编译和执行Java程序如果出现Bad version number in .class file的错误。可能是因为装了两个java虚拟机的版本冲突了,如果用一个版本的JDK编译出class文件,再用另外一个版本的JRE执行这个class文件就可能出现这样的错误。有时候可以修改环境变量,指向同一个版本来解决这个问题。1.2.2 类和对象就好像世界有很多各种各样的生物,Java虚拟机的内存中也有很多各种各样的对象。每个生物都属于某一个物种。人是一个物种,每个人都是一个对象,只不过人这个
29、类别已经复制了1064亿次。也就是说有1064亿人曾经生活过。使用类来创建具有相同结构和行为的对象。打印Hello World的例子并没有创建对象。因为main是一个静态方法。不属于任何一个类。就好像世界文化遗产,不属于任何某个人,而是全人类共享的。现在创建一个属于对象的方法。public class Person public void hello() System.out.println(Hello World!); public static void main (String args) Person p = new Person(); /新建一个对象 p.hello(); /调用he
30、llo方法Java源文件的扩展名为.java,而且必须与类名相同。上面这个Person类必须放在Person.java文件中。因为是区分大小写的,所以这里的P只能大写。每个人都是由不同的原子构成。每个对象都占据不同的内存空间。使用关键字new来为对象分配空间,也就是实例化对象。关键字new声明了对象的诞生。但是不是所有的数据类型都是对象。一些基本的数据类型如int、boolean等等都不是对象,不能够用new的方式实例化。存在所有的生物都有的一些共同特征,例如新陈代谢。toString方法返回一个描述对象内部状态的字符串。所有的对象都有toString方法,这些共同的方法在Object类中定义
31、,Object是所有对象的共同祖先。有的对象专门用来存储数据,叫做POJO类,还有些是用来执行任务,例如爬虫类或者搜索类。可以使用UML类图来形象的描述一个类。Java类和对应的UML类图如图1-1所示。public class Person public void hello() / private String name;Person+hello():void-name:String图1-1 UML类图Java基础类库位于jrelibrt.jar。源代码是src.zip,位于JDK根目录,例如:C:Program FilesJavajdk1.6.0_10。Eclipse可以让Java基础类
32、库关联源代码。在打开基础类时,在提示没有源代码的窗口上,有个找源代码的按钮,选择src.zip文件即可。关联源代码还有两种方法:到Project菜单下的Properties Java Build Path Libraries 然后扩展 JRE System Library,也就是jre版本,然后再扩展rt.jar。选择Source attachment,点击编辑. 选择源代码文件(External File) 然后按OK。到Window Preferences Java Installed JRES 然后对想要的JRE点击Edit。扩展 rt.jar,选择Source attachment并点
33、击Source Attachment. 选择源代码文件(External File) 然后按OK。可以通过JDK API文档来学习Java自带的类。还可以使用在线的版本1.2.3 Eclipse就好像理发有推子等专门的理发用具,开发软件也有专门的集成开发环境。开发Java程序最流行的工具叫做Eclipse(http:/www.eclipse.org)。Eclipse也有很多版本,例如有用于开发Java企业应用的版本,或者开发JavaScript的版本。可以选择最简单的一个版本Eclipse IDE for Java Developers。Eclipse有些新版本不够稳定,可以使用小版本号比较高
34、的稳定版本,例如使用3.6.2,而不用3.7.0。有些版本的JDK和Eclipse的某些版本有冲突,如果无法启动Eclipse,可以换个JDK的版本再试。Eclipse是绿色软件,无须安装,解压后就可以直接使用。在Windows下,双击后就可以解压文件。如果需要专门的解压软件,推荐使用7z(http:/www.7-zip.org/)。Eclipse缺省是英文界面,如果习惯用中文界面可以从http:/www.eclipse.org/babel/downloads.php下载支持中文的语言包。点下左边的小红叉,Eclipse会自动提示如何改错。例如会自动导入类生成import语句。Eclipse把
35、软件按项目管理,每个项目的根目录下都有个.classpath文件。指定了源代码路径,编译后输出文件的路径以及这个项目引用的jar包的路径。如果要从外部导入一个项目,需要先删除同名的项目,并且确保硬盘上对应的位置没有这个目录,然后再导入项目文件。混乱的环境容易滋生病菌。混乱的源代码容易滋生错误。Eclipse能够自动整理源代码的格式。这个功能在Source一级菜单下的Format选项。有个方法名字起的不好,想换个名字。但是很多地方引用到这个方法,一个一个重命名太慢。改名要去派出所,对变量重命名叫做重构(Refector)。在上下文菜单中有重构-重命名选项。1.2.4 变量一个变量相当于一个代词,
36、用来指代一个数据结构。他可以用来指任何一个男性。她可以用来指任何一个女性。声明一个变量时,要指定这个变量的数据类型。三至五年的中长期贷款年利率是6.90%。按照复利,亦即通常所说的“利滚利”方式计算还款总额。借1万元,5年后,需要还10000*(1+0.069)5元。用程序表示如下:int years = 5;double total = 10000*Math.pow(1 + 6.9 / 100, years);System.out.println(总还款数:+total);这里的total变量存储了一个数值。计算月还款额。如果采用等额还款的方式,则:例如:总额12万,5年分期付款,这样就是6
37、0个月,月利率为0.575%,则月还款额是:元使用程序计算如下:double month = 120000*0.575*0.01*Math.pow(1+0.01*0.575),60)/(Math.pow(1+0.01*0.575),60)-1);System.out.println(月还款数:+month);输出每个月还款的金额是2370.49元。这里的month变量存储了表示月还款数的数值。在计算过程中,如果参与的值类型不一样,则会低精度的数自动按高精度的方式计算。例如int会自动转换成double类型参与计算。精度从低到高依次如下:byte、short、charintlongfloatdo
38、ublebyte、short和char在计算时首先转换成为int类型。但计算结果不会依据结果类型而自动扩展。例如返回结果定义成双精度类型,但参与计算的都是整数,则整个计算过程都是整数精度,计算完成后,结果再转换成双精度类型:int freq = 10;int n = 10000;double p = freq / n ; /值是0.0车牌号用来唯一标识一辆车。现在创建一个叫做c的车牌号。Car c = null;变量c并没有存储值,而是用来引用一个对象。需要注意:一个对象变量并没有实际包含一个对象,而仅仅是一个对象的引用。这里的c只是类似一个车牌号,并不是车本身。生产一辆车挂这个牌号:Car
39、c = new Car(); /创建一个对象一辆车可以挂两个牌照。Car d = c; /d和c都代表同一辆车相当于一辆车上同时挂了d和c两个车牌号。用箭头表示c和d这样的对象变量。存在的对象cd图1-2 一个对象和引用这个对象的变量使用天平测量两个物体是否相等。看两个变量是否相等时,通常使用“=”关系运算符。int i = 1;int j = 2;if (i = j) System.out.println(两个变量的值相等);对于int或者long这样的基本数据变量可以使用等于号比较。比较两个对象变量有两种意义。一种是判断是否指向同一个对象。还有一种是比较两个对象变量中是否放了等价的东西。例
40、如两个同样批次的药品在效用上是等价的。等于号用于比较两个对象变量是否指向同一个对象。String nameA = jack; String nameB = new String(jack); if (nameA = nameB) / 判断无法成立,因为两个变量所指对象的内存地址不同。 System.out.println(两个变量的值相等);equals方法用于比较两个对象变量内容是否相同。String nameA = jack; String nameB = new String(jack); if (nameA.equals(nameB) / 判断成立,因为两个对象的内容都是jack Sy
41、stem.out.println(两个对象的内容相等);如果没有赋值就使用一个变量,这样的代码连编译都通不过。但是一个对象型的变量可能赋成空值,这时候,调用变量的方法会产生空指针异常。为了避免空指针异常,比较一个常量字符串和变量字符串是否相等时,最好调用常量字符串的equals方法。if (DIV.equals(childName) / 即使childName是null,也不用担心空指针异常/.Object有缺省的equals方法,但是缺省的equals实现效果和=一样。所以往往需要重写equals方法。两个等价的对象往往必须是同一个类的实例。instanceof用来判断一个对象是否是某一个类
42、的实例。Person p = new Person(); /新建一个对象System.out.println(p instanceof Person); /输出true砝码类Weight及其equals方法如下。public class Weight public final static String GRAMS = grams;public final static String OUNCES = ounces;private double amount;private String units;public Weight(double amount, String units) this
43、.amount = amount;this.units = units;Overridepublic boolean equals(Object o) if(!(o instanceof Weight) /判断传入对象的类型return false;Weight that = (Weight)o;return this.units.equals(that.units)&(this.amount = that.amount);有些变量当作常量用,从程序运行开始就一直不变。一般把值不会改变的变量声明成final类型的,表示以后不会再修改它。如果需要动态给这个常量赋值,则可以放在static程序块。
44、而且最好放在一个单独的类,这样其他的类就可以把它当成静态常量访问。例如判断程序运行的Java虚拟机是否64位的:public final class Constants /取得操作系统系统属性public static final String OS_ARCH = System.getProperty(os.arch); public static final boolean JRE_IS_64BIT; /常量static /静态块String x = System.getProperty(sun.arch.data.model);/取得虚拟机系统属性if (x != null) JRE_IS_64BIT = x.indexOf(64) != -1; else if (OS_ARCH != null & OS_ARCH.indexOf(64) != -1) JRE_IS_64BIT = true; else JRE_I