java程序设计经典300例


前 言 软件开发的目标是满足用户需求,一个软件往往包含很多复杂的功能,作为一名程序员, 需要在有限的时间内实现它们。对于一名新手,显然并不容易。为什么有开发经验的程序员编 程效率非常高?原因就在于他们做过很多类似的程序,通过适当地修改以前的代码就可以满足 现在的需求。因此如何快速地加强编程经验的积累就成了新手程序员的当务之急。 本书图文并茂,汇集了 300 多个日常开发中广泛使用的实例。希望各位读者能在本书的引 领下跨入 Java 世界的大门,并成为一名开发高手。本书最大的特色就是结合大量的说明插图, 全面、形象、系统、深入地介绍了 Java 实例开发程序。学习完本书后,读者应该可以具备独立 进行项目开发的能力。 本书特色 1.以基础知识为框架,透彻解析各部分知识框架中的常用开发实例 为了方便读者阅读,我们将每个例子分为了实例描述、实现过程、代码解析和知识扩展 4 部分,每一部分都进行了细致的说明。实例描述是对实例功能的介绍;实现过程给出了实现程 序的核心代码;代码解析对例子中的核心知识进行说明;知识扩展则告诉了读者一些 Java 实例 开发中要注意的问题和其他有用的开发窍门。 2.配备大量的多媒体语音教学视频,体验全新教学课堂 作者专门录制了大量的配套多媒体语音教学视频,以便读者更加轻松、直观地学习本书内 容,提高学习效率。这些视频与本书源代码一起收录于本书配套光盘中。 3.讲解由浅入深,循序渐进,适合各个层次的读者阅读 本书从 Java 语言的基础开始讲解,逐步深入到 Java 语言的高级开发技术及应用,内容梯 度从易到难,讲解由浅入深,循序渐进,适合各个层次的读者阅读,并使他们均有所获。 4.穿插大量的开发实例和技巧,迅速提升开发水平 本书的内容就是丰富多彩而且简单实用的 Java 实例。我们在知识扩展栏目中还给出了大 量的开发技巧,以便读者更好地理解各种概念和开发技术,体验实际编程,迅速提高开发水平。 本书内容及体系结构 第 1 篇 基础篇(第 1~5 章) 本篇主要内容包括:Java 语言基础、流程控制、数组、字符串和面向对象编程。通过本篇 的学习,读者可以掌握 Java 开发环境的配置和 Eclipse 开发工具的应用过程,并可以掌握 Java 面向对象编程的核心技术与应用。 第 2 篇 应用篇(第 6~11 章) 本篇主要内容包括:Java 多线程、集合框架、枚举和泛型、异常处理、Java 的输入输出流 等技术。通过本篇的学习,读者可以掌握 Java 语言的一些高级开发技术。 Java 程序设计经典 300 例 IV 第 3 篇 开发篇(第 11~19 章) 本篇主要内容包括:图形界面编程和数据库编程等方面的知识。通过本篇的学习,读者可 以掌握 Java 语言在图形界面和数据库方面的核心技术及应用。 本书读者对象  从未接触过 Java 的初学者;  了解一些 Java 知识,希望进一步学习的自学者;  想学习一门技术,以方便找工作的求职者;  Java 开发爱好者;  大中专院校的学生和相关授课教师;  社会培训班学员;  Java 专业开发人员;  需要一本案头必备手册的程序员。 致谢 本书主要由张敬东(营口理工学院)编写,编写中难免有所疏漏和不妥之处,尽请不吝 指正。 目 录 第一篇 基础篇 第 1 章 Java 语言基础 1 实例 001 输出“HelloWorld”语句 1 难度指数 ★ ☆ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 002 用“*”直接输出三角形 3 难度指数 ★ ☆ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 003 可爱的符号表情 3 难度指数 ★ ☆ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 004 计算机支持的最大整数值是多少? 4 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 005 获取浮点类型的最大最小值 5 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 006 常见字母的大小写转换 7 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 007 实现基本类型的类型转换 9 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 008 判断一个数字的奇偶性 11 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 009 不借助第三者实现两个变量值的互换 12 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 前 言 V 实例 010 实现输入字符的加密和解密 13 难度指数 ★★★★☆☆ 占用时间 ○○ 第 2 章 Java 流程控制 15 实例 011 判断某一年是否为闰年 15 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 012 验证用户登录信息 17 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 013 QQ 等级活跃天数计算器 18 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 014 根据收入情况计算个人所得税 20 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 015 你的公司有多少奖金? 22 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 016 判断用户输入月份的季节 23 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 017 根据消费金额计算折扣 25 难度指数 ★★★★☆☆ 占用时间 ○○ 示例 018 招聘计算机语言程序员 26 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 019 计算 1+1/2!+1/3!+…+1/10!的值 27 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 020 实现输出杨辉三角 29 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 021 空心菱形如何表示 30 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 022 打印九九乘法表 33 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 023 猴子分桃问题 34 难度指数 ★★★★☆☆ 占用时间 ○○ 第 3 章 数组 36 实例 024 获取一维数组中的最大最小值 36 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 025 实现矩阵的转置 38 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 026 求矩阵的迹(主对角线之和) 40 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 027 1、2、3、4 能组成多少个互不相同的三位数? 41 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 028 统计出数组中各种字符的个数 42 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 029 使用最简单的 for 循环对数组进行排序 44 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 030 使用选择排序法对数组进行排序 45 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 031 使用冒泡排序法对数组进行排序 47 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ Java 程序设计经典 300 例 VI 实例 032 使用快速排序法对数组进行排序 48 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 033 使用直接插入法对数组进行排序 50 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 034 使用 sort()方法对数组进行排序 53 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 035 猴子选大王 54 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 036 九宫格问题 56 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 037 使用数组实现电话号码加密 57 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 038 幸运观众是如何产生的 58 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 039 使用数组来实现计算器页面 61 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 040 使用数组实现复选框设置 63 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 041 反转输出数组元素 65 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 4 章 字符串 68 实例 042 输入的用户名找回用户密码 68 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 043 将数字货币金额转换为大写格式 69 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 044 将数字格式化为货币字符串 72 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 045 实现不同字符串的连接 73 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 046 字符串大小写转换 74 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 047 计算字符串中子串出现的次数 76 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 048 当前日期的格式化 77 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 049 判断字符串是否为数字 78 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 050 判断网页请求和 FTP 请求 79 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 051 验证 IP 地址的有效性 80 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 052 鉴别非法的电话号码 82 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 053 ASCII 编码查看器 83 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 054 对用户名进行比较排序 84 前 言 VII 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 055 批量替换特定的字符串 85 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 056 去掉字符串中的空格 87 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 057 获取字符串中汉字的个数 89 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 058 字符串的编码转换 90 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 059 海量字符串的快速操作 91 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 第 5 章 面向对象 94 实例 060 自定义学生类 94 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 061 成员变量的默认初始化值 96 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 062 查看类的声明 97 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 示例 063 查看类的成员 99 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 064 查看内部类信息 101 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 065 同名方法的使用 102 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 066 动态调用类中的方法 103 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 067 实现类的动态实例化 105 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 068 摄氏温度与华氏温度的转换 106 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 069 统计商品销售量 107 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 070 汉诺塔问题的解决 108 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 071 领导和员工的差异 110 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 072 重写(覆盖)父类中的方法 112 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 073 计算几何图形的面积 114 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 074 简单的长度单位转换器 116 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 075 使用字符串输出对象 118 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 076 使用策略模式保存图片类型 120 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ Java 程序设计经典 300 例 VIII 实例 077 使用局部内部类实现闹钟的应用 121 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 078 使用静态内部类获取数组中的最大最小值 123 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 079 创建长度可变的数组 125 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 080 简单的手机销售流程 126 难度指数 ★ ★ ★ ★ ★★ 占用时间 ○○ 第二篇 应用篇 第 6 章 Java 集合类 128 实例 081 不重复地进行随机数组排序 128 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 082 实现 List 集合中数组的自动排序 129 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 083 使用动态数组保存用户名 131 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 084 使用 For 循环遍历 ArrayList 133 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 085 使用 Iterator 遍历 ArrayList 134 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 086 使用 ListIterator 逆序遍历 ArrayList 135 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 087 简单的电子词典 137 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 088 猴子选大王 2 138 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 089 使用 HashSet 实现学生信息管理 139 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 090 使用 TreeSet 管理学生成绩信息 141 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 091 二分查找字符串中指定关键字 144 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 092 使用 HashMap 实现常用的查找功能 146 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 093 使用 TreeMap 实现学生成绩的查找功能 147 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 094 使用 Vector 类管理图书书目信息 150 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 095 使用 Stack 栈实现字符串的逆序输出 151 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 096 读写 Properties 文件 152 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 第 7 章 多线程 154 实例 097 线程的启动与结束 154 前 言 IX 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 098 查看线程的运行状态 157 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 099 设置线程优先级分配 CPU 运行时间 159 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 100 篮球运动员的比赛安排(线程的休眠和唤醒) 161 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 101 CSDN 资源搜索与下载(线程等待和通报) 163 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 102 非诚勿扰,爱情对对碰(线程 join()等待方法) 165 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 103 诺贝尔奖莫言作品集的获取(yield()让步方法) 167 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 104 ATM 存取机的实现(线程的同步) 169 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 105 模拟淘宝购物买卖双方交易 172 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 106 房门终于被打开了(解决死锁的方法) 175 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 107 创建自己的任务定时器 178 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 108 医院手术任务(线程池任务) 179 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 8 章 Java 异常处理 183 实例 109 算数异常(ArithmeticException) 183 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 110 数组下标越界异常(ArrayIndexOutOfBoundsException) 184 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 111 数组元素类型不匹配异常(ArrayStoreException) 185 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 112 强制类型转换异常(ClassCastException) 186 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 113 空指针异常(NullPointerException) 187 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 114 数字格式转换异常(NumberFormatException) 188 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 115 字符串索引越界异常(StringIndexOutOfBoundsException) 189 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 116 操作错误异常(UnsupportedOperationException) 190 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 117 找不到指定类时异常(ClassNotFoundException) 191 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 118 try-catch 捕获异常 192 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 119 try-catch-finally 捕获异常 193 难度指数 ★★★★☆☆ 占用时间 ○○ Java 程序设计经典 300 例 X 实例 120 嵌套 try-catch-finally 捕获异常 195 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 121 非法访问异常(IllegalAccessException) 196 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 122 未发现文件异常(FileNotFoundException) 197 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 123 throws 抛出异常 198 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 124 throw 抛出异常 199 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 125 自定义异常 200 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 126 数据库操作异常(SQLException) 202 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 127 同时捕获多个异常 203 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 9 章 Java 常用工具类 205 实例 128 求圆周率 π 的近似值 205 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 129 四舍五入运算器 206 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 130 高精度整数的运算 207 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 131 高精度浮点运算 208 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 132 指数与对数函数的使用方法 209 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 133 三角函数和反三角函数的使用方法 210 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 134 生成任意类型的随机数 211 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 135 随机生成不同格式的验证码 214 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 136 使用 Date 类获取当前系统时间 215 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 137 使用 SimpleDateFormat 类格式化输出时间 217 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 138 使用 Calendar 显示当前的时间和日期 219 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 139 使用 GregorianCalendar 类输出日历 220 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 140 显示某年某月某一周的信息 222 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 141 Formatter 类的格式化输出 223 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 142 使用时间格式转换符输出时间和日期 224 前 言 XI 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 143 记录程序执行的时间 226 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 144 获取程序运行环境的信息 227 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 145 简单的计时器 229 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 146 Java 内存管理 231 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 147 正则表达式匹配方法的应用 232 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 148 正则表达式替换方法的应用 234 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 149 E-mail 格式合法性验证与自动修改 235 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 第 10 章 枚举和泛型 238 实例 150 查看枚举类型定义 238 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 151 同一服装不同尺寸的价格查询 240 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 152 使用枚举进行数据库连接 241 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 153 枚举元素集合的应用 243 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 154 枚举元素映射的应用 244 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 155 使用泛型实现栈结构 245 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 156 带两个类型参数的泛型的应用 247 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 157 使用通配符增强泛型 248 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 158 使用泛型方法获得对象类型 250 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 159 使用泛型接口获得数组的最大最小值 251 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 160 泛型类的继承应用 253 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 161 泛型的强制类型转换 254 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 162 泛型的集合类应用 255 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 第 11 章 Java 的输入输出及文件操作 257 实例 163 创建文件和目录 257 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 164 显示文件的基本信息 259 Java 程序设计经典 300 例 XII 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 165 显示目录的基本信息 261 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 166 创建、修改与删除文件的综合操作 263 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 167 以字节为单位读取文件内容 264 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 168 以字符为单位读取文件内容 267 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 169 以行为单位读取文件内容 269 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 170 以字节为单位写文件 271 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 171 以字符为单位写文件 273 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 172 以行为单位写文件 274 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 173 按顺序创建文件 276 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 174 按顺序读取文件 277 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 175 移动指定目录下的文件和目录 278 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 176 快速查找指定类型的文件 281 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 177 复制指定目录下的文件 283 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 178 以遍历方式显示文件中的字符 285 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 179 将数据保存到指定的文件中 286 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 180 将一个大文件分割为多个小文件 287 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 181 将多个小文件合并为一个大文件 289 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 182 统计指定文件中的字符个数 291 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 183 使用 I/O 流生成 Word 文件 293 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 184 使用 I/O 流读取 Word 文件 295 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 185 使用 I/O 流生成 Excel 文件 296 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 186 使用 I/O 流读取 Excel 文件 299 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 187 使用 I/O 流生成 PDF 文件 301 前 言 XIII 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 188 使用 I/O 流读取 PDF 文件 303 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 189 生成 ZIP 压缩文件 304 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 190 解压缩 zip 文件 307 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 191 读取 JAR 包文件 309 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 192 文件的加密/解密操作 311 难度指数 ★★★★☆ 占用时间 ○○ 第三篇 开发篇 第 12 章 Swing 基础入门 313 实例 193 创建一个窗口及面板 313 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 194 设置窗体的大小 315 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 195 动态的窗体大小调整 316 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 196 创建对话框 317 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 197 设置窗体标签 319 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 198 同一按钮实现不同功能 320 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 199 文本框和密码框的创建 322 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 200 多行文本框的创建 324 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 201 创建单选按钮 326 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 202 复选框的使用 328 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 203 列表框使用实例 331 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 204 组合框应用实例 333 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 205 滚动条应用实例 335 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 206 进度条应用实例 337 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 207 表格的使用 339 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ Java 程序设计经典 300 例 XIV 实例 208 树形结构的创建 340 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 209 创建菜单 342 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 210 创建弹出式菜单 345 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 211 工具栏的使用 348 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 212 FlowLayout 布局管理 350 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 213 边框布局 BorderLayout 布局设计 351 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 214 网格布局 GridLayout 版面设计 353 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 215 如何使用卡片布局管理器 355 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 216 应用网格包布局 GridBagLayout 设计版面 358 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 217 用户对话框 JOptionPane 的使用 360 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 218 文件选择对话框 JFileChooser 的使用 363 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 219 颜色选择对话框 JColorChooser 的使用 366 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 220 使用 ActionEvent 监听组件 368 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 221 使用 MouseListener 监听鼠标事件370 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 222 使用 MouseMotionListener 监听鼠标移动 371 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 223 使用 KeyListener 监听键盘 373 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 224 使用 WindowListener 监听窗口事件 375 难度指数 ★ ★ ★ ★ ★ ☆ 占用时间 ○○ 第 13 章 Swing 应用进阶 378 实例 225 设置闪烁的标题栏 378 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 226 实现带背景图片的窗体 379 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 227 对窗体背景进行随机更换 381 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 228 建立钻石型窗体 383 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 229 打开指定类型的文件 385 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 230 震动效果的提示信息 387 前 言 XV 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 231 建立简单的时钟布局 388 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 232 文本区设置背景图片 391 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 233 简单的字符统计工具 392 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 234 我最喜爱的小品演员投票 394 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 235 快捷的日期显示器 397 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 236 包含图片的弹出菜单 400 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 237 文本框内容的显示方法设定 402 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 238 设置表格的列的高度 404 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 239 对于表格中列的宽度设置 405 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 240 快速查找表格记录 407 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 241 提示信息的应用 409 难度指数 ★★★★☆☆ 占用时间 ○○ 第 14 章 Java Applet 小应用程序 412 实例 242 不断逼近的文字 412 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 243 舞动的彩文 414 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 244 文字的 3D 效果 416 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 245 绚烂的字体闪烁 419 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 246 闪亮登场的文字 422 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 247 简易图片放大镜 424 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 248 带波纹的水面倒影 426 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 249 夜空中璀璨的烟火 428 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 250 百叶窗翻页效果 432 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 251 自制 QQ 空间欢迎界面 434 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 252 雷电中的纽约市 436 难度指数 ★★★★☆☆ 占用时间 ○○ Java 程序设计经典 300 例 XVI 实例 253 动态边框图片 439 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 254 我的风景相册薄 441 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 255 遥远的星球 443 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 15 章 网络通信编程 446 实例 256 获取自己的计算机名与 IP 地址 446 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 257 获得特定网站的 IP 地址 447 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 258 使用 URL 访问网页 449 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 259 根据 URL 获取因特网上的图像 451 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 260 根据 URL 获取因特网网页源文件 452 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 261 根据 URL 获取因特网上的音频 453 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 262 自制浏览器 455 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 263 实现网络文件的下载 457 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 264 实现网络的一对一通讯 459 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 265 实现网络的一对多通讯 461 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 266 实现网络的图片传输 463 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 267 实现网络的音频传输 466 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 268 实现网络的视频传输 469 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 269 模仿 QQ 创建实时聊天室 471 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 16 章 Java 安全机制 475 实例 270 加密解密的始祖——凯撒密码 475 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 271 密钥的创建 477 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 272 对称加密 479 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 273 非对称加密 480 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 274 CBC 方式的加密 482 难度指数 ★★★★☆☆ 占用时间 ○○ 前 言 XVII 实例 275 CBC 方式的解密 483 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 276 数字签名 484 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 277 使用消息保存口令 486 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 278 使用消息验证口令 487 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 279 破解简单的加密口令 488 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 280 输入流的加密算法 490 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 281 输入流的解密算法 492 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 282 输出流的加密算法 493 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 283 输出流的解密算法 494 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 284 使用 RSA 算法进行加密 495 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 285 使用 RSA 算法进行解密 497 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 286 使用公钥计算消息验证码 498 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 17 章 Java 多媒体程序设计 501 实例 287 常用图形的绘制 501 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 288 不规则图形的绘制 506 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 289 图片的旋转 507 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 290 图片缩放 509 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 291 图像的模糊与锐化 513 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 292 光照特效实例 516 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 293 创建动画图片 519 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 294 图片的合成 520 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 295 音频播放程序 523 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 296 利用 JavaSound API 播放音频 525 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 297 视频文件的播放 528 Java 程序设计经典 300 例 XVII I 难度指数 ★★★★☆☆ 占用时间 ○○ 第 18 章 Java 数据库操作 533 实例 298 JDBC 连接 MySQL 数据库 533 难度指数 ★ ★ ☆ ☆ ☆ ☆ 占用时间 ○○ 实例 299 查询数据库中表的名称 535 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 300 动态添加数据库字段信息 538 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 301 获取数据库中表的字段信息 541 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 302 动态添加学生信息到学生表中 546 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 303 对添加数据进行数据验证 548 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 304 MySQL 数据库备份 554 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 305 MySQL 数据恢复 556 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 306 向数据库中批量插入数据 558 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 307 修改数据库表内信息 559 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 308 将数据表中的信息复制到其他表中 562 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 309 保存用户登录信息 566 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 310 将图片文件存入数据库 569 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 311 将数据库中的图片输出 571 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 312 生成有规律的编号 573 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 313 生成无规律编号 577 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 19 章 Java 小游戏合集及应用工具示例 580 实例 314 欢乐斗地主 580 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 315 打豆豆游戏 586 难度指数 ★★★ ☆ ☆ ☆ 占用时间 ○○ 实例 316 动感魔方游戏 589 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 317 俄罗斯方块游戏 593 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 318 贪吃蛇游戏 599 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 319 拼图游戏 606 前 言 XIX 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 320 寻找宝藏游戏 611 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 321 开窗游戏 615 难度指数 ★★★★☆☆ 占用时间 ○○ 实例 322 猜价格游戏 618 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 323 中国象棋游戏 621 难度指数 ★★★ ★ ★ ★ 占用时间 ○○ 实例 324 Java 身份证信息解读 625 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 实例 325 Java 万年历 628 难度指数 ★★★ ★ ★ ☆ 占用时间 ○○ 第 4 章 字 符 串 字符串是在程序开发中,随时随地都能用到的对象型数据,处理好字符串数据,对于程序 开发来说是至关重要的。在程序不同的角落都会存在字符串处理的身影。本质上,字符串就是 一个 char 型数组。字符串由 Java.lang.String 类来表示,该类具有一系列的属性和方法,提供对 字符串的各种操作。我们这一章的实例都是对于字符串的具体应用。 知 识 点 难度指数 占用时间 字符串比较 equals() 2 2 字符串格式化 format() 3 2 字符串连接 append() 3 3 字符串大小写转换 2 2 字符串的 startsWith()和 endsWith() 3 3 正则表达式 5 3 字符串比较 compareTo() 4 2 字符串的 replace()替换方法 4 2 字符串编码转换 5 3 StringBuilder 类批量操作 6 2 Java 程序设计经典 300 例 XX 实例 042 输入的用户名找回用户密码 【实例描述】 在登录一些网站时,我们需要输入用户名和密码。也许时间久了你就会忘记所设的密码, 这时我们可以请求该网站将密码发到注册时的邮箱。这就需要判断用户输入的用户名是否正 确,我们可以通过对比用户输入的用户名字符串是否与数据库中或者已经存在的集合中的字符 串相同,来决定用户输入的用户名是否正确。实例的运行效果如图 4.1 所示。 图 4.1 输入的用户名找回用户密码 【实现过程】 在 Eclipse 中新建项目 Username,并在其中创建一个 Username.java 文件。在该类的主方 法中创建标准输入流的扫描器对象,接收用户输入变量值。然后判断输入值,如果不是管理员 用户名并且输入的用户名是已经注册的则显示正确提示,否则显示错误提示。核心代码如下所 示: protected void do_button_actionPerformed(ActionEvent e) { String name = usernameField.getText(); // 获取用户输入 if (name.equals("admin")) { // 判断是否管理员账号 showMessageDialog(null, "对不起,这个用户名是管理员的,不是你的"); } else if (name.equals("Lester")) { // 判断是否注册用户 showMessageDialog(null, "该用户名对应的密码已经发送到注册时的邮箱,请查收 "); } else { // 给错误用户名的提示对话 框 showMessageDialog(null, "你输入的用户名不存在,留意 Caps Lock 键是否按下。 "); } } 【代码解析】 本实例采用了 String 类的 equals()方法来判断两个字符串的内容是否相同,这个方法是从 Object 类中继承的。在 Java 语言中,默认的所有类都是 Object 的子类,也就是说只要是对象, 都会重写或直接使用 Object 类的 equals()方法,String 类就重写了这个方法实现判断字符串内容 是否相同的目的。其声明语法如下: public boolean equals(Object anObject); 前 言 XXI 【知识扩展】 在 Java 虚拟机中有一个保存字符串的池,它会记录所有的字符串。例如: String str1=”abc”; String str2=”abc”; String str3=new String(”abc”); System.out.println(str1==str2); System.out.println(str1==str3); 这段代码中 str1==str2 的判断将返回 true,而 str1==str3 将返回 false。因为 Java 中基本数 据类型使用“==”可以判断操作数是否相等,对于对象使用这个符号判断的是两个对象的内存 地址是否相同。如果字符串已经存在,就不在创建相同的字符串,直接返回该字符串,所以这 两个变量引用的是同一个字符串,那么它们的地址也是相同的,所以 str1==str2 成立,但是使 用 new 关键字创建的字符串会开辟内存控件,所以 str1==str3 不成立。 实例 043 将数字货币金额转换为大写格式 【实例描述】 在处理财务账款时,一般需要使用大写金额。如果在银行进行储蓄或转账,也需要将数字金 额写成大写格式。也就是说,如果要转账 123456 元,则 需要写成“壹拾贰万叁仟肆佰伍拾陆元整”。对于这种情 况,如果手动填写不仅麻烦,而且容易出错,所以我们 可以设计一个程序来自动完成数字格式的转换。本实例 实现了小写金额到大写金额的转换,实例的运行效果如 图 4.2 所示。 图 4.2 将数字货币金额转换为大写格式 Java 程序设计经典 300 例 XXII 【实现过程】 (1)在 Eclipse 中新建项目 MoneyConvert,并在其中创建一个 MoneyConvert.java 文件。 在该类的主方法中创建标准输入流的扫描器对象,接收用户输入的数字金额。然后在通过 convert()方法把这个金额转换成大写金额的字符串格式,并输出到控制台。核心代码如下所示: public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 创建扫描器 System.out.println("请输入一个金额"); // 获取金额转换后的字符串 String convert = convert(scan.nextDouble()); System.out.println(convert); // 输出转换结果 } (2)编写金额转换方法 convert(),该方法在主方法中被调用,用于金额数字向大写格式的 转换。在该方法中创建 DecimalFormat 类的实例对象,通过这个格式器对象把金额数字格式化, 只保留三位小数。然后分别调用 getInteger()与 getDecimal()方法转换整数与小数部分,并返回 转换后的结果。关键代码如下: public static String convert(double d) { // 实例化 DecimalFormat 对象 DecimalFormat df = new DecimalFormat("#0.###"); // 格式化 double 数字 String strNum = df.format(d); // 判断是否包含小数点 if (strNum.indexOf(".") != -1) { String num = strNum.substring(0, strNum.indexOf(".")); // 整数部分大于 12 不能转换 if (num.length() > 12) { System.out.println("数字太大,不能完成转换!"); return ""; } } String point = ""; // 小数点 if (strNum.indexOf(".") != -1) { point = "元"; } else { point = "元整"; } // 转换结果 String result = getInteger(strNum) + point + getDecimal(strNum); if (result.startsWith("元")) { // 判断是字符串是否已"元"结尾 result = result.substring(1, result.length()); // 截取字符串 } return result; // 返回新的字符串 } (3)编写 getInteger()方法,用于转换数字整数部分的大写格式。在该方法中判断数字是否 包含小数点,然后把数字转换为字符串并反转字符顺序,为每个数字添加对应的大写单位。关 键代码如下: public static String getInteger(String num) { if (num.indexOf(".") != -1) { // 判断是否包含小数点 num = num.substring(0, num.indexOf(".")); 前 言 XXII I } num = new StringBuffer(num).reverse().toString(); // 反转字符串 StringBuffer temp = new StringBuffer(); // 创建一个 StringBuffer 对象 for (int i = 0; i < num.length(); i++) { // 加入单位 temp.append(STR_UNIT[i]); temp.append(STR_NUMBER[num.charAt(i) - 48]); } num = temp.reverse().toString(); // 反转字符串 num = numReplace(num, "零拾", "零"); // 替换字符串的字符 num = numReplace(num, "零佰", "零"); // 替换字符串的字符 num = numReplace(num, "零仟", "零"); // 替换字符串的字符 num = numReplace(num, "零万", "万"); // 替换字符串的字符 num = numReplace(num, "零亿", "亿"); // 替换字符串的字符 num = numReplace(num, "零零", "零"); // 替换字符串的字符 num = numReplace(num, "亿万", "亿"); // 替换字符串的字符 // 如果字符串以零结尾将其除去 if (num.lastIndexOf("零") == num.length() - 1) { num = num.substring(0, num.length() - 1); } return num; } public static String getDecimal(String num) { // 判断是否包含小数点 if (num.indexOf(".") == -1) { return ""; } num = num.substring(num.indexOf(".") + 1); // 反转字符串 num = new StringBuffer(num).reverse().toString(); // 创建一个 StringBuffer 对象 StringBuffer temp = new StringBuffer(); // 加入单位 for (int i = 0; i < num.length(); i++) { temp.append(STR_UNIT2[i]); temp.append(STR_NUMBER[num.charAt(i) - 48]); } num = temp.reverse().toString(); // 替换字符串的字符 num = numReplace(num, "零角", "零"); // 替换字符串的字符 num = numReplace(num, "零分", "零"); // 替换字符串的字符 num = numReplace(num, "零厘", "零"); // 替换字符串的字符 num = numReplace(num, "零零", "零"); // 替换字符串的字符 // 如果字符串以零结尾将其除去 if (num.lastIndexOf("零") == num.length() - 1) { num = num.substring(0, num.length() - 1); } return num; } public static String numReplace(String num, String oldStr, String newStr) { while (true) { // 判断字符串中是否包含指定字符 if (num.indexOf(oldStr) == -1) { break; } // 替换字符串 Java 程序设计经典 300 例 XXI V num = num.replaceAll(oldStr, newStr); } // 返回替换后的字符串 return num; } 前 言 XXV 【代码解析】 实现本实例的关键在于以下几点:  将数字格式化,如果存在小数部分,将其转换为 3 位小数,精确到厘。  分别将整数部分与小数部分转换为大写格式,并插入其单位(亿、万、仟……)。  组合转换后的整数部分与小数部分。 【知识扩展】 DecimalFormat 类可以指定格式化模板来格式化浮点数,如保留几位小数。通过调用该类 的 format()方法可以使用指定模板来格式化任意浮点数字。 实例 044 将数字格式化为货币字符串 【实例描述】 数字可以标识货币、百分比、积分、电话号码等。就货币而言,在不同的国家里会以不同 的格式来定义。本实例将通过接收用户输入的数字,将这个数字转换为不同国家的货币格式, 然后在控制台中输出这些货币的格式。运行效果如图 4.3 所示。 图 4.3 将数字格式化为货币字符串 【实现过程】 在 Eclipse 中新建项目 CurrencyFormat,并在其中创建一个 CurrencyFormat.java 文件。在 该类的主方法中创建标准输入流的扫描器对象,接收用户输入的数字,通过 NumberFormat 类 的 format()方法把接收的数字格式转换为货币字符串。核心代码如下所示: import java.text.NumberFormat; import java.util.Locale; import java.util.Scanner; public class CurrencyFormat { public static void main(String[] args) { Scanner scan = new Scanner(System.in); // 创建标注输入流扫描器 System.out.println("请输入一个数字:"); double number = scan.nextDouble(); // 获取用户输入数字 System.out.println("该数字用 Locale 类的以下常量作为格式化对象的构造参数,将获 得不同的货币格式:"); Java 程序设计经典 300 例 XXV I // 创建格式化对象 NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CHINA); // 输出格式化货币格式 System.out.println("Locale.CHINA:" + format.format(number)); format = NumberFormat.getCurrencyInstance(Locale.US); System.out.println("Locale.US:" + format.format(number)); format = NumberFormat.getCurrencyInstance(Locale.ENGLISH); System.out.println("Locale.ENGLISH:" + format.format(number)); } } 【代码解析】 数字格式化是本例的关键点,实例中应用 NumberFormat 类实现了数字格式化,这个类是 一个抽象类,但是可以通过其静态方法获取内部实现类的实例对象,本实例获取了货币的格式 对象。 获取货币格式对象,实现格式化的代码如下: NumberFormat format = NumberFormat.getCurrencyInstance(Locale.CHINA); 【知识扩展】 格式化对象可以指定语言环境,在 Java 中使用 Local 类的对象来表示,在该类中包含了三 种语言环境。通过它可以获取国际化的字符串信息,如货币、时间等。 实例 045 实现不同字符串的连接 【实例描述】 字符串连接是程序中经常进行的操作,用来将多个字符串连接在一起形成一个字符串。我 们可以使用加法(+)运算符或是 append()方法来实现此连接。实例的运行效果如图 4.4 所示。 图 4.4 实现不同字符串的连接 【实现过程】 在 Eclipse 中新建项目 StringConnection,并在其中创建一个 StringConnection.java 文件。在 该类的主方法中创建三种字符串的连接方法,实现对不同字符串的连接。核心代码如下所示: public class StringConnection { 前 言 XXV II public static void main(String[] argv){ String s1 = "Hello" + ", " + "World"; System.out.println("使用加法运算符输出:"+s1); // 构造 StringBuffer 对象,并添加一些字符串 StringBuffer sb2 = new StringBuffer(); sb2.append("Hello"); // 使用 sb2.append(','); sb2.append(' '); sb2.append("World"); // 将 StringBuffer 值转换为字符串,并输出 String s2 = sb2.toString(); System.out.println("使用 append()方法输出:"+s2); // 现在重复上面的工作,但是采用更为简明的方式 StringBuffer sb3 = new StringBuffer().append("Hello"). append(',').append(' ').append("World"); System.out.println("append()方法的另一种形式输出:"+sb3.toString()); } } 【代码解析】 append()方法用于向字符串中追加内容,这个方法有多种实现方式,它们可以接受任何类 型的数据。其功能示例图如图 4.5 所示。 str.append(STR); 字符串 append()方法 处理结果 0 1 2 3 4 OLLEH 0 1 2 3 4 5 6 7 RTSOLLEH 图 4.5 append()方法功能示例 【知识扩展】 insert()方法的作用是在 StringBuffer 对象中插入内容,然后形成新的字符串。它和 append() 方法的区别就是 insert()方法可以在任意特定的位置进行任意数据类型的值的插入。其功能示例 如图 4.6 所示。 str.Insert(2,me); 字符串 insert()方法 处理结果 0 1 2 3 4 OLLEH 0 1 2 3 4 5 6 OLLemEH 图 4.6 insert()方法功能示例 Java 程序设计经典 300 例 XXV III 实例 046 字符串大小写转换 【实例描述】 在程序设计中,经常会遇到一种情况,在验证用户登录时,如果用户名不区分大小写,那 么在代码中应当使用一种方法排除字母大小写的因素,然后再对比数据库中的用户名和用户输 入的用户名是否相等。因此可以先将数据库中的用户名全部转换为大写,再将用户输入的用户 名转换为大写,最后对比是否相等。本实例中所介绍的技术可以方便地将字符串中的字母全部 转换成大写或小写。实例的运行效果如图 4.7 所示。 前 言 XXI X 【实现过程】 在 Eclipse 中新建项目 ConvertMinMax,并在其中创建一个 ConvertMinMax.java 文件。在 该类的主方法中创建标准输入流的扫描器对象,接收用户输入的字符串值。然后通过 toUpperCase()和 toLowerCase()方法,对其进行大小写转换。核心代码如下所示: 图 4.7 字符串的大小写转换 protected void do_button_actionPerformed(ActionEvent arg0) { // 获取大小写单选项的选择 String command = buttonGroup.getSelection().getActionCommand(); boolean upper = command.equals("大写"); // 判断是否选择的大写单选项 String text = inputTextField.getText(); // 获取输入字符串 if (upper) { // 大写转换 outputTextField.setText(text.toUpperCase()); } else { // 小写转换 outputTextField.setText(text.toLowerCase()); } } 【代码解析】 String 类中提供了两个专门用于转换字符串大小写的方法:toLowerCase() 方法与 toUpperCase()方法。其功能示例图如图 4.8 所示。 str.toLowerCase(); 字符串 toLowerCase()方法 0 1 2 3 4 5 !olLEH 0 1 2 3 4 5 !olleh str.toUpperCase(); 字符串 toUpperCase()方法 0 1 2 3 4 5 !olLEH 0 1 2 3 4 5 !OLLEH Java 程序设计经典 300 例 XXX 图 4.8 toLowerCase()方法与 toUpperCase()方法功能示例 前 言 XXX I 【知识扩展】 字符串在创建后就成为不可变的对象,当调用字符串对象的方法操作字符串时,会产生新 的字符串对象,而不是更改原来的字符串对象。 实例 047 计算字符串中子串出现的次数 【实例描述】 在实际应用中,我们常常需要了解一段特定的子字符串在已知字符串中出现的次数。例如 我们可以编写程序,来测试子字符串“ab”在字符串“ackfeabiofabxeabsjabsdesab”中出现的次 数。具体的实例的运行效果如图 4.9 所示。 图 4.9 计算字符串中子串出现的次数 【实现过程】 在 Eclipse 中新建项目 appearTimes,并在其中创建一个 appearTimes.java 文件。在该类的 主方法中创建标准输入流的扫描器对象,接收用户输入的字符串和子字符串的值。然后系统对 子字符串在字符串中出现的次数进行统计。核心代码如下所示: import java.util.Scanner; public class appearTimes { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("请输入你要进行测试的字符串"); String str = scan.nextLine(); Scanner scan1 = new Scanner(System.in); System.out.println("请输入你要查找的子字符串"); String str1 = scan1.nextLine(); int count = 0; int start = 0; while (str.indexOf(str1, start) >= 0 && start < str.length()) { count++; start = str.indexOf(str1, start) + str1.length(); } System.out.println(str1 + "在" + str + "出现的次数为" + count); } Java 程序设计经典 300 例 XXX II } 【代码解析】 本例的重点是子字符串的查找。子字符串的查找方法如下所示: while (str.indexOf(str1, start) >= 0 && start < str.length()) { count++; start = str.indexOf(str1, start) + str1.length(); } 实例 048 当前日期的格式化 【实例描述】 在输出日期信息时,经常需要输出不同格式的日期格式。本实例介绍了 String 字符串中日 期格式化方法,使用不同的方式输出 String 类的日期格式参数值,组合这些值实现特殊格式的 日期字符串。实例的运行效果如图 4.10 所示。 图 4.10 当前日期的格式化 【实现过程】 在 Eclipse 中新建项目 DateString,并在其中创建一个 DateString.java 文件。在该类的主方 法中通过实例化的方法对当前日期进行实例化,然后再通过各种 format()方法格式化 today 日期 对象。核心代码如下所示: public class DateString { public static void main(String[] args) { Date today = new Date(); // 格式化后的字符串为月份的英文缩写 String a = String.format(Locale.US, "%tb", today); System.out.println("格式化后的字符串为月份的英文缩写: " + a); // 格式化后的字符串为月份的英文全写 String b = String.format(Locale.US, "%tB", today); System.out.println("格式化后的字符串为月份的英文缩写: " + b); // 格式化后的字符串为星期(如:星期一) String c = String.format("%ta", today); System.out.println("月格式化后的字符串为星期: " + c); 前 言 XXX III // 格式化后的字符串为星期(如:星期一) String d = String.format("%tA", today); System.out.println("格式化后的字符串为星期: " + d); // 格式化后的字符串为 4 位的年份值 String e = String.format("%tY", today); System.out.println("格式化后的字符串为 4 位的年份值: " + e); // 格式化后的字符串为 2 位的年份值 String f = String.format("%ty", today); System.out.println("格式化后的字符串为 2 位的年份值: " + f); // 格式化后的字符串为 2 位的月份值 String g = String.format("%tm", today); System.out.println("格式化后的字符串为 2 位的月份值: " + g); // 格式化后的字符串为 2 位的日期值 String h = String.format("%td", today); System.out.println("格式化后的字符串为 2 位的日期值: " + h); } } 【代码解析】 使用 String 类的 format()方法不但可以完成日期的格式化,也可以实现时间的格式化。时间 的格式化转换符要比日期转换符更多、更准确,它甚至可以将时间格式化为时、分、秒、毫秒。 【知识扩展】 在深入使用字符串之前,有一个概念一定要理解,那就是字符串是不可变的对象。理解了 这个概念,对后面熟练使用字符串有很大的帮助。字符串的不可变性,意味着每当对字符串进 行操作时,都将产生一个新的字符串对象,如果频繁的操作字符串对象,会在托管堆中产生大 量的无用字符串,增加垃圾回收器的压力,从而造成系统资源的浪费。 实例 049 判断字符串是否为数字 【实例描述】 软件运行过程中,经常需要用户输入数值、货币值等信息,然后进行处理。由于用户输入 只能是字符串类型,如果输入了非法的信息,如在货币值中输入了字母“a”以及其他非数字 字符,那么在运行时会抛出异常。通常我们可以通过捕获异常来判断输入信息是否合法,但这 并不是最好的处理方法。本实例将采用 NumberUtils 类中的方法处理此问题,让程序更加快捷 方便。实例的运行效果如图 4.11 所示。 Java 程序设计经典 300 例 XXX IV 图 4.11 判断字符串是否为数字 【实现过程】 在 Eclipse 中新建项目 CheckNumber,并在其中创建一个 CheckNumber.java 文件。在该类 的主方法中创建标准输入流的扫描器对象,接收用户输入的金额。程序将对其是否为数字进行 判断并输出提示结果。核心代码如下所示: protected void do_button_actionPerformed(ActionEvent e) { String text = textField.getText(); // 获取用户输入的金额字符串 boolean isnum = NumberUtils.isNumber(text); // 判断是不是数字 if (isnum) { // 输出正确提示信息 showMessageDialog(null, "输入正确,是数字格式"); } else { // 输出错误提示信息 showMessageDialog(null, "输入错误,请确认格式再输入"); } } 【代码解析】 本实例采用了 Apache 提供的 lang 包中的 NumberUtils 类来实现数字判断,该类的全路径 为“org.apache.commom.lang.math.NumberUtils”,这个类中的 isNumber()方法可以接收字符串 参数,然后对字符串进行解析,如果字符串不能转换为数字格式,则返回 false。其声明语法如 下所示: public static boolean isNumber(String str); 【知识扩展】 本实例还可以通过 Double 类的 parseDouble()方法把字符串转换为 double 类型。如果抛出 异常说明字符串不是合法数字格式。但是建议不要使用这种方式做判断,那会降低系统的运行 速度。因为它无法与简单逻辑判断相比,后者在速度上完全超越前者。 实例 050 判断网页请求和 FTP 请求 【实例描述】 大家在访问 Internet 网络时,经常涉及很多访问协议,其中最明显、最常用的就是访问网 页的 HTTP 协议和访问 FTP 服务器的 FTP 协议等。本实例将实现对用户输入信息进行判断, 根据用户输入的不同请求字符串,判断请求类型,如图 4.12 所示。 前 言 XXX V 图 4.12 判断网页请求和 FTP 请求 【实现过程】 在 Eclipse 中新建项目 HTTPFTP,并在其中创建一个 HTTPFTP.java 文件。在该类的主方法 中创建标准输入流的扫描器对象,接收用户输入的网址信息。程序通过调用 startsWith()方法判 断用户输入的是网页地址还是 FTP 地址。核心代码如下所示: protected void do_button_actionPerformed(ActionEvent e) { String request = requestField.getText(); // 获取用户输入 if (request.startsWith("http")) { // 判断输入是否以 http 开头 showMessageDialog(null, "您输入的是网页地址,希望浏览某个网站。"); } else if (request.startsWith("ftp")) { // 判断输入是否以 ftp 开头 showMessageDialog(null, "您输入的是 FTP 地址,希望访问 FTP 服务器。"); } else { // 其他字符串开头认为信息不完整 showMessageDialog(null, "您输入的请求信息不完整。"); } } 【代码解析】 使用 String 类中的 startsWith()方法和 endsWith()方法,可以判断某字符串是否以指定字符 串开始或结束。其功能示例图如图 4.13 所示。 startsWith()方法 true 0 1 2 3 4 5 !olleh eh √√ str.startsWith("he"); endsWith()方法 false 0 1 2 3 4 5 !olleh ol str.endsWith("lo");× × 图 4.13 startsWith()方法和 endsWith()方法功能示例 Java 程序设计经典 300 例 XXX VI 【知识扩展】 Java 中一句相连的字符串不能分开在两行中写。例如: System.out.println(“I love Java!”); 就是错误的,无法通过编译。如果一个字符串太长,为了便于阅读,可以将这个字符串分 在两行中书写。此时就可以使用“+”将两个字符串连接起来,之后在加号后换行。因此上面 的语句我们可以修改为: System.out.println(“I love”+ “Java!”); 实例 051 验证 IP 地址的有效性 【实例描述】 IP 地址是网络上每台计算机的标识,在浏览器中输入的网址也是要经过 DNS 服务器转换 为 IP 地址才能找到服务器的,在很多网络程序中要求输入服务器 IP 地址或者对方连接的 IP 地 址,IP 地址的错误输入将使程序无法运行。本实例将实现对 IP 地址的验证功能,实例的运行 效果如图 4.14 所示。 前 言 XXX VII 图 4.14 验证 IP 地址的有效性 【实现过程】 (1)在 Eclipse 中新建项目 CheckIP,并在其中创建一个 CheckIP.java 文件。在该类的主方 法中创建标准输入流的扫描器对象,接收用户输入的 IP 地址。核心代码如下所示: protected void do_button_actionPerformed(ActionEvent e) { String text = ipField.getText(); // 获取用户输入 String info = matches(text); // 对输入文本进行 IP 验证 showMessageDialog(null, info); // 用对话框输出验证结果 } (2)编写 IP 地址的 mathches()方法,该方法利用正则表达式对输入的字符串进行验证,并 返回验证结果,关键代码如下所示。 public String matches(String text) { if (text != null && !text.isEmpty()) { // 定义正则表达式 String regex = "^(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|[1-9])\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)\\." + "(1\\d{2}|2[0-4]\\d|25[0-5]|[1-9]\\d|\\d)$"; // 判断 IP 地址是否与正则表达式匹配 if (text.matches(regex)) { // 返回判断信息 return text + "\n 是一个合法的 IP 地址!"; } else { // 返回判断信息 return text + "\n 不是一个合法的 IP 地址!"; } } // 返回判断信息 return "请输入要验证的 IP 地址!"; } 【代码解析】 本实例的关键点在于 IP 地址格式与数字范围的验证,用户在输入 IP 地址时,程序可以获 取的只有字符串类型,所以本实例利用字符串的灵活性和正则表达式搭配进行 IP 地址格式与 范围的验证。该方法是 String 字符串类的方法,用于判断字符串与制定的正则表达式是否匹配。 其声明语法如下: public boolean mathches(String regex); Java 程序设计经典 300 例 XXX VIII 【知识扩展】 在正则表达式中,“.”代表任何一个字符,因此在正则表达式中如果想使用普通意义的点 字符“.”,必须使用转义字符“\”。 实例 052 鉴别非法的电话号码 【实例描述】 日常生活中经常需要用户录入用户信息或联系方式,其中有一些数组的格式是固定的,程 序处理逻辑也是按照这个格式来实现的,但是由于用户输入的是字符串,其灵活性较大,所以 容易输入错误格式的数据。本实例将演示如何使用正则表达式来确定输入的电话号码格式是否 匹配,实例的运行效果如图 4.15 所示。 图 4.15 验证电话号码 【实现过程】 (1)在 Eclipse 中新建项目 PhoneNumber,并在其中创建一个 PhoneNumber.java 文件。在 该类的主方法中创建标准输入流的扫描器对象,接收用户输入的用户信息。核心代码如下所示: protected void do_button_actionPerformed(ActionEvent e) { String text = phoneNumField.getText(); // 获取用户输入 String info = check(text); // 对输入文本进行 IP 验证 showMessageDialog(null, info); // 用对话框输出验证结 果 } (2)然后对电话号码的正确性进行验证,首先判断字符串是否为空,然后再通过正则表达 式对字符串进行验证。这里要注意我们设定的区号为 3 位,电话号码为 8 位。核心代码如下所示: public String check(String text){ if(text == null || text.isEmpty()){ return "请输入电话号码!"; } 前 言 XXX IX // 定义正则表达式 String regex = "^\\d{3}-?\\d{8}|\\d{4}-?\\d{8}$"; // 判断输入数据是否为电话号码 if(text.matches(regex)){ return text + "\n 是一个合法的电话号码!"; }else{ return text + "\n 不是一个合法的电话号码!"; } } Java 程序设计经典 300 例 XL 【代码解析】 本实例使用正则表达式对电话号码进行了格式匹配验证。正则表达式通常被用于判断语句 中,来检查某一字符串是否满足某一格式。它是含有一些特殊意义字符的字符串,这些特殊字 符称为正则表达式的元字符。正则表达式中的元字符及其意义如表 4-1 所示。 表 4-1 正则表达式中的元字符 . 点号 匹配任何单个字符(注:点号在字符组内不算元字符) * 星号 表示之前的元素出现任意次数或 0 次 ? 问号 前面元素出现 0 次或 1 次 + 加号 前面元素出现 1 次以上 - 连字符 注意:只有连字符在字符组内部时,并且出现在两个字符之间时,才能表示字符的范围; 如果出现在字符组的开头,则只能表示连字符本身 ^ 脱字符 表示开头。注意:^在字符组的头部,将转换成排除型字符 $ 美元符 表示结尾 \ 转义符 [ ] 字符组 范围描述符。[a-z]表示从 a 到 z 之间的任意一个 \w 英文字母和数字,即[0-9 A-Z a-z] \W 非英文字母和数字 \s 空字符,即[\t\n\r\f] \S 非空字符 \d 数字,即[0-9] \D 非数字 \b 词边界字符(在范围描述符外部时),表示为单词的分界符 \B 非词边界字符 \t 制表符 {n} 前面的元素字符出现 n 次 {m,n} 前面的元素最少出现 m 次,最多出现 n 次 | 选择符 ( ) 群组,子表达式 【知识扩展】 一个 Java 对象(字符串也是 Java 对象)必须先初始化才能使用,否则编译器会报告“使 用的变量未初始化”错误。 实例 053 ASCII 编码查看器 【实例描述】 ASCII 是 American Standard Code Information Interchange 的缩写。它是拉丁字母的一套电 前 言 XLI 脑编码系统,主要用于显示英语字符,是目前世界上最通用的单字节编码。基本的 ASCII 编码 包括了 128 个字符。本实例将编写一个 ASCII 编码查看器,可以将字符转换为数字,也可以反 向转换。实例的运行效果如图 4.16 所示。 【实现过程】 在 Eclipse 中 新 建 项 目 ASCIIView, 并 在 其 中 创 建 一 个 ASCIIView.java 文件。在该类的主方法中创建标准输入流的扫描器 对象,接收用户输入的数字和字符,并分别对其进行转换。 将用户输入的字符转换为数字的核心代码如下所示: protected void do_toNumberButton_actionPerformed(ActionEvent e) { String ascii = asciiTextField.getText(); // 获得 用户输入的字符串 int i = Character.codePointAt(ascii, 0); // 求字符串的第一个字符的代码点 label3.setText("" + i); // 更新标签 } 将用户输入的数字转换为字符的核心代码如下所示: protected void do_toASCIIButton_actionPerformed(ActionEvent e) { String number = numberTextField.getText(); // 获得用户输入的字符串 char[] a = Character.toChars(Integer.parseInt(number)); // 求数字所对应的字符数组 label6.setText(new String(a)); // 更新标签 } 【代码解析】 Character 类是 char 类型的包装类,该类除了能将 char 类型的字符串转换成引用类型外, 还包括了大量的处理字符编码的方法。本实例使用 codePointAt()方法获得字符的代码点。其声 明语法如下: public static int codePointAt(char[] a,int index); 【知识扩展】 Character 类的方法和数据是通过 UnicodeData 文件中的信息定义的,该文件是 Unicode Consortium 维护的 Unicode Charater Database 的一部分。此文件指定了各种属性,其中包括每 个已定义的 Unicode 代码点或字符范围的名称和常规类别,此文件及其描述可以从 Unicode Consortium 获得。 图 4.16 ASCII 编码查看器 Java 程序设计经典 300 例 XLII 实例 054 对用户名进行比较排序 【实例描述】 用户名也就是登录系统、网站等使用的名称,也称为登 录名称。一般情况下,用户名都要求使用英文、数字或符号 组成,如 lester_西楼听雨。这些用户名一般是根据用户注册 的先后来进行排序的,这样不利于管理员的查找,本实例将 实现对用户名字符串的排序。实例的运行效果如图 4.17 所示。 图 4.17 对用户名进行比较排序 前 言 XLIII 【实现过程】 在 Eclipse 中新建项目 UserNameSort,并在其中创建一个 UserNameSort.java 文件。在该类 的主方法中创建 compareTo()方法对用户名进行比较排序,并将结果以字符串数组的顺序进行 输出。核心代码如下所示: class userName implements Comparable { public String sName; public userName(String sName) { this.sName=sName; } public int compareTo(Object o) // 重写 compareTo 方法 { userName tempuser=(userName)o; String temp=tempuser.sName; return this.sName.compareTo(temp); // 按 字 符 串 sName 的 顺 序 排 列 userName } public String toString() { return this.sName; } } public class UserNameSort { public static void main(String args[]) { System.out.println("排序后的用户名顺序为:"); TreeSet ts=new TreeSet(); // 插入 userName 对象时,会自动调用 compareTo 方法 ts.add(new userName("Lester")); ts.add(new userName("Jimmy")); ts.add(new userName("Lily")); System.out.println(ts); } } 【代码解析】 按字典顺序比较两个字符串(compareTo), 该比较方法基于字符串中各个字符的 Unicode 值。按字典顺序将此 String 对象表示的字符序列与参数字符串所表示的字符序列进行比较。具 体比较方法如图 4.18 所示。 【知识扩展】 字符串是否相等也是使用较频繁的一组操作。字符串对象调用 String 类中的 equals()方法, 比较当前字符串对象是否与参数指定的字符串相同。equalsIgnoreCase()方法与 equals()方法的作 用与用法基本相同,只是 equalsIgnoreCase()方法在运用时会忽略大小写。 Java 程序设计经典 300 例 XLI V 实例 055 批量替换特定的字符串 【实例描述】 在字符串操作中,可以使用字符串对象的 split()方法拆分字符串,还可以使用字符串对象 的 substring()方法截取一部分字符串,字符串对象为开发者提供了很多方便实用的功能。本实 例中将会介绍使用字符串对象的 replace()方法替换某一类字符串。实例的运行效果如图 4.19 所 示。 fedcba fjihba fedcba femaba fedcba fedcba String 对象 字符串 参数字符串 String 对象 字符串 String 对象 字符串 参数字符串 参数字符串 正值 负值 0 依次比较 依次比较 依次比较 compareTo() compareTo() compareTo() h的字典顺序在c之 后,结果返回正值 a的字典顺序在c之 前,结果返回负值 两个字符串相等, 结果返回0 图 4.18 compareTo()方法比较方法 图 4.19 批量替换特定的字符串 前 言 XLV 【实现过程】 在 Eclipse 中新建项目 ReplaceString,并在其中创建一个 ReplaceString.java 文件。在该类 的主方法中创建标准输入流的扫描器对象,接收用户输入的字符串组。然后再通过同样的方法 获取用户输入的搜索字符串和替换字符串。最后通过 replace()方法完成题目的要求。核心代码 如下所示: protected void do_button_actionPerformed(ActionEvent e) { String searchStr = searchTextField.getText(); // 获取搜索字符 串 String replaceStr = replaceTextField.getText(); // 获取替换字符串 String text = txtArea.getText(); // 获取段落文本 String newText = text.replace(searchStr, replaceStr); // 执行替换 txtArea.setText(newText); // 替换结果显示在文本域控 件 } Java 程序设计经典 300 例 XLVI 【代码解析】 String 类中的一组 replace()方法返回一个新的字符串,它是通过用新的字符串,替换此字符 串中出现的所有指定子字符串而得到的,原字符串并不会发生改变。其功能示例图如图 4.20 所 示。 字符串 replace()方法 处理结果 0 1 2 3 4 5 !olleh str.replace('e','m'); 0 1 2 3 4 5 !ollmh 图 4.20 replace()方法功能示例 运用字符串对象的 replace()方法可以方便地替换字符串中指定的内容。但有一点要注意, replace()方法并不是只替换掉一个匹配的字符串,而是一次性替换掉所有匹配的字符串,由于 字符串是不可变的,replace()方法会返回一个新的字符串对象。 【知识扩展】 字符串对象通过调用 String 类的 substring()方法可以对字符串进行取子字符串的操作。其 功能示例图如图 4.21 所示。 字符串 substring()方法 lo! 处理结果 0 1 2 3 4 5 !olleh str.substring(3); 字符串 substring()方法 llo 处理结果 0 1 2 3 4 5 !olleh str.substring(2,4); 图 4.21 substring()方法的功能示例 前 言 XLVI I 实例 056 去掉字符串中的空格 【实例描述】 在字符串操作中,可以使用字符串对象的 trim()方法去除字符串对象前端和后端的所有空 格,但是,如果空格在字符串的中间位置出现,使用 trim()方法是没有效果的,那么怎样才能 有效地去除空格呢?本实例将通过字符串操作实现这个功能。示例的运行效果如图 4.22 所示。 Java 程序设计经典 300 例 XLVI II 【实现过程】 在 Eclipse 中新建项目 BlankDelete,并在其中创建一个 BlankDelete.java 文件。在该类的主 方法中创建标准输入流的扫描器对象,接收用户输入的字符串值。然后通过 replaceBlank()方法 去除字符串中的空格、回车、换行符和制表符。核心代码如下所示: 图 4.22 去掉字符串中的空格 public class BlankDelete { public static String replaceBlank(String str) { String dest = ""; if (str!=null) { Pattern p = Pattern.compile("\\s*|\t|\r|\n"); Matcher m = p.matcher(str); dest = m.replaceAll(""); } return dest; } public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("输入测试字符串:"); String str1 = scan.nextLine(); System.out.println("去除字符串中的空格、回车、换行符、制表符后:"); System.out.println(BlankDelete.replaceBlank(str1)); } } 【代码解析】 deleteCharAt()方法的作用是删除指定位置的字符,然后将剩余的内容形成新的字符串。其 功能示例如图 4.23 所示。 str.deleteCharAt(1); 字符串 deleteCharAt()方法 处理结果 0 1 2 3 4 5 !OLLEH 0 1 2 3 4 !OLLH 图 4.23 deleteCharAt()方法功能示例 前 言 XLI X 【知识扩展】 对于本章的实例,我们也可以采用 replace()方法,使用“去替换”,同样也可以达到去除 字符串中空格的效果。 Java 程序设计经典 300 例 L 实例 057 获取字符串中汉字的个数 【实例描述】 字符串中可以包含数字,字母、汉字或者其他字符。使用 Character 类的 isDigit()方法可以 判断字符中的某个字符是否为数字,使用 Character 类的 isLetter()方法可以判断字符中的某个 字符是否为字母。实例中将介绍一种方法用来判断字符串中的某个字符是否为汉字,通过此方 法可以计算字符串中汉字的数量。实例的运行效果如图 4.24 所示。 图 4.24 获取字符串中汉字的个数 【实现过程】 在 Eclipse 中新建项目 ChineseCharacter,并在其中创建一个 ChineseCharacter.java 文件。 在该类的主方法中创建标准输入流的扫描器对象,接收用户输入的字符串。我们在程序中使用 matches()方法来统计该字符串中汉字的个数。核心代码如下所示: protected void do_button_actionPerformed(ActionEvent e) { String text = chineseArea.getText(); // 获取用户输入 int amount = 0; // 创建汉字数量计数器 for (int i = 0; i < text.length(); i++) { // 遍历字符串每一个字符 // 使用正则表达式判断字符是否属于汉字编码 boolean matches = Pattern.matches("^[\u4E00-\u9FA5]{0,}$", "" + text.charAt(i)); if (matches) { // 如果是汉字 amount++; // 累加计数器 } } numField.setText(amount + ""); // 在文本框显示汉字数量 } 【代码解析】 本实例的关键点在于正则表达式的使用。Java 提供了 Pattern 用于正则表达式的编译表示 形式,该类提供的静态方法 matches()可以执行正则表达式的匹配。该方法编译给定正则表达式 并尝试给定输入与其匹配。如果要匹配的字符序列与正则表达式匹配则返回 true,否则返回 false。其声明语法如下: public static boolean matches(String regex,CharSequence input); 前 言 LI 【知识扩展】 使用正则表达式可以方便地进行字符串操作,正则表达式经常被用来验证用户输入的信 息,如可以判断用户输入的格式是否正确。本实例中使用正则表达式来判断用户输入的字符串 是否为汉字,如果为汉字则计数器加 1,最后得到字符串中所有汉字的数量。 实例 058 字符串的编码转换 【实例描述】 无论是对程序的本地化还是国际化,都会涉及字符编码的转换问题。尤其在 Web 应用中 常常需要处理中文字符,这时就需要进行字符串的编码转换,将字符串编码转换为 GBK 或者 GB2312。本实例将通过一条字符串看看各种编码方法是如何输出的,并对不能正常显示的代 码进行转换。运行效果如图 4.25 所示。 图 4.25 字符串的编码转换 【实现过程】 在 Eclipse 中新建项目 ChangeCharset,并在其中创建一个 ChangeCharset.java 文件。在该 类的主方法中创建了四种编码格式,并定义了一个字符串对这四种方法的输出进行测试。对不 能将汉字正确显示的 ISO_8859_1 和 UTF-8 编码方式进行编码转换。核心代码如下所示: public class ChangeCharset { /* ISO 拉丁字母表 No.1,也叫作 ISO-LATIN-1 */ public static final String ISO_8859_1 = "ISO-8859-1"; /*8 位 UCS 转换格式 */ public static final String UTF_8 = "UTF-8"; /* 中文超大字符集 **/ public static final String GBK = "GBK"; public static final String GB2312 = "GB2312"; /* 将字符编码转换成 ISO-8859-1 */ public String toISO_8859_1(String str) throws UnsupportedEncodingException { return this.changeCharset(str, ISO_8859_1); } /* 将字符编码转换成 UTF-8 */ public String toUTF_8(String str) throws UnsupportedEncodingException { return this.changeCharset(str, UTF_8); Java 程序设计经典 300 例 LII } /* 将字符编码转换成 GBK */ public String toGBK(String str) throws UnsupportedEncodingException { return this.changeCharset(str, GBK); } /* 将字符编码转换成 GB2312 */ public String toGB2312(String str) throws UnsupportedEncodingException{ return this.changeCharset(str,GB2312); } public String changeCharset(String str, String newCharset) throws UnsupportedEncodingException { if(str != null) { // 用默认字符编码解码字符串。与系统相关,中文 windows 默认为 GB2312 byte[] bs = str.getBytes(); return new String(bs, newCharset); // 用新的字符编码生成字符串 } return null; } public String changeCharset(String str, String oldCharset, String newCharset) throws UnsupportedEncodingException{ if(str != null) { // 用源字符编码解码字符串 byte[] bs = str.getBytes(oldCharset); return new String(bs, newCharset); } return null; } public static void main(String[] args) throws UnsupportedEncodingException { ChangeCharset test = new ChangeCharset(); String str = "This is a 中文的 String!"; System.out.println("str:" + str); String gbk = test.toGBK(str); System.out.println("转换成 GBK 码:" + gbk); String iso88591 = test.toISO_8859_1(str); System.out.println("转换成 ISO-8859-1 码:" + iso88591); gbk = test.changeCharset(iso88591, ISO_8859_1, GBK); System.out.println("再把 ISO-8859-1 码的字符串转换成 GBK 码:" + gbk); String utf8 = test.toUTF_8(str); System.out.println("转换成 UTF-8 码:" + utf8); String gb2312 = test.toGB2312(str); System.out.println("转换成 GB2312 码:" + gb2312); } } 【代码解析】 更改字符串编码的步骤为: (1)调用 String 的 getByte()方法对字符串进行解码,得到字符串的字节数组(字节数组不 携带任何有关编码格式的信息,只有字符才有编码格式)。 前 言 LIII (2)根据字节数组和新的字符编码构造一个新的 String 对象,得到的就是按照新的字符编 码生成的字符串。 实例 059 海量字符串的快速操作 【实例描述】 字符串是程序开发中使用最频繁的数据,在 Java 中字符串是 String 类的对象,它是不可 变数据,当执行字符串连接操作时将生成新的字符串,而不是修改原有的字符串,所以大量的 字符串操作非常耗时。本实例将分别演示使用 String 类与 StringBuilder 类进行 3 万个字符串追 加的操作,并输出其运行时间。我们可以对比两次方法执行的时间。运行效果如图 4.26 所示。 图 4.26 海量字符串的快速操作 【实现过程】 在 Eclipse 中新建项目 BuilderString,并在其中创建一个 BuilderString.java 文件。在该类的 主方法中创建字符串对象 appendStr,并通过循环为该字符串连接 3 万个字符,计算并输出其用 时。再创建 StringBuilder 字符串构造器,同样为其追加 3 万个字符,计算并输出其用时。核心 代码如下所示: public class BuilderString { public static void main(String[] args) { String appendStr = ""; // 创建字符串变量 long startTime = System.nanoTime(); // 开始记事 for (int i = 20000; i < 50000; i++) { // 遍历 30000 个字符 appendStr += (char) i; // 字符串与每个字符执行连接操作 } long endTime = System.nanoTime(); // 结束计时 System.out.println("String 追加字符 3 万个。"); // 输出用时 System.out.println("用时:" + (endTime - startTime) / 1000000d + "毫秒 "); StringBuilder strBuilder = new StringBuilder(); // 创建字符串构建器 startTime = System.nanoTime(); // 开始计时 for (int i = 20000; i < 50000; i++) { // 遍历 30000 个字符 strBuilder.append((char) i); // 把每个字符追加到构建器 } endTime = System.nanoTime(); // 结束计时 System.out.println("StringBuilder 字符串构建器追加字符 3 万个。"); Java 程序设计经典 300 例 LIV // 输出用时 System.out.print("用时:" + (endTime - startTime) / 1000000d + "毫秒"); } } 【代码解析】 从 JDK 5.0 开始,Java 增添了一个单个线程使用的等价类,即 StringBuilder。通常应该优 先使用 StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快。 但是,如果将 StringBuilder 的实例用于多个线程是不安全的,这时我们则建议使用 StringBuffer。 【知识扩展】 在性能强弱上:StringBuilder>StringBuffer>String。 有关这三者的性能问题我们再提示以下几点:  为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽可能指定它的容量。 当然,如果你操作的字符串长度不超过 16 个字符就不用了。  相同情况下使用 StringBuilder 与使用 StringBuffer 相比,仅能获得 10%~15%左右的性 能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的 程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此,除非能确 定你的系统瓶颈是在 StringBuffer 上,并且确定你的模块不会运行在多线程模式下,否 则还是用 StringBuffer。  用好现有的类比引入新的类更重要。很多程序员在使用 StringBuffer 时是不指定其容量 的,如果这样的习惯带入 StringBuilder 的使用中,只能获得 10%左右的性能提升;但 如果使用指定容量的 StringBuffer,将马上获得 45%左右的性能提升,甚至比不使用指 定容量的 StringBuilder 快 30%左右。
还剩53页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 7 人已下载

下载pdf

pdf贡献者

pmmf1243

贡献于2013-10-25

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf