1、Java程序设计,常用类及开源工具,学习目标,理解Object 掌握System类 掌握String与StringBuffer 了解正则表达式 掌握日期处理机制 了解定时器 掌握随机类Random 掌握数值类 了解开源代码 通过JFreeChart了解如何使用图形绘制类库,1. Object,Object类是所有Java类(系统提供的,第三方类库、用户自定义的)的根类 。,public class Objectpublic Object()public final Class getClass()public int hashCode()public boolean equals(Object
2、 obj) protected Object clone() throws CloneNotSupportedExceptionpublic String toString()public final void notify()public final void notifyAll()public final void wait() throws InterruptedExceptionprotected void finalize() throws Throwable ,对象的哈希码- hashCode() 每个对象都有自己的哈希码,利用这个哈希码可以表示一个对象。在Object 提供的 h
3、ashCode() 的缺省实施通过将对象的内存地址对映于一个整数值来生成。 如果两个对象是相等的,它们必须有相同的 hashCode()值,toString()方法 如:System.out.println(student) 输出:chap5.sample.Postgraduate1172e08 对象间的相等性比较-euqals()和”=” 对于两个对象引用变量,equals()比较的是逻辑意义,而不是判断两个引用变量是否是一个对象。但是“=”则判断的是两端的引用变量是否是引用一个对象 对于两个字符串,“=”返回true,例如“hello”=“hello”的结果是true。 数值类对象和字符串
4、对象之间的逻辑性相等判断,比较的是它们各自的状态(值),所以只要两个对象的值相同,equals()就返回true,但是只要不是引用的同一个对象,“=“返回false,2. System类,System包含了一些我们常用的方法与成员变量。System不能被实例化, 所有的方法 都可以直接引用。在 System 类提供的设施中,有标准输入、标准输出和错误输出流;对外部定义的属性和环境变量的访问;加载文件和库的方法;还有快速复制数组的一部分的实用方法,2. System类(cont.),3. String与StringBuffer,字符串常量是一个用双引号(“”)括起来的字符序列 编译器会为每一个字
5、符串常量创建对象。另外,字符串常量中可以包含一些不能从键盘上输入的字符,这涉及到字符转义。例如: “This is a u03c0“ 实际上就是 “This is a “ 另外,还需要提醒注意的是:字符串中的所有字符都是Unicode字符,所以每个字符均占两个字节。,字符串常量和字符串对象是两个不同的概念,字符串常量有在内存当中由编译器分配的固定区域,保存有字符序列。而字符串对象只是一个引用,所以不能通过字符串对象对常量进行修改,例如: String str=“This is a string literal“; str=“This is other string literal“; 另一个例
6、子: String str1=“This is a string literal“; String str2=“This is“ + “ a string literal“; 实际上str1和str2指向了同一引用,字符串运算 字符串连接、比较、分割、子串的查询等 连接(+) 值比较(equals(),compareTo() 对象比较 = 提取、检索、分割字符串 charAt()、 substring() indexOf(); split() 构造格式化字符串 public static String format(String format,Object. args),StringBuffe
7、r,因为String对象是不能修改的,Java语言提供了另外一个能够修改的类似字符串的字符串缓冲区类,就是StringBuffer。对于StringBuffer对象可以进行添加、删除、替换等操作。,创建 StringBuffer sbf = new StringBuffer(); 创建一个不带字符的缓冲区,默认容量为16个字符,随着操作容量将发生变化。 StringBuffer sbf = new StringBuffer(“初始化字符串“); 按照给定内容创建一个缓冲区,初始容量为16+字符长度。 StringBuffer sbf = new StringBuffer(256); 创建一个具
8、有初始容量的缓冲区。,追加字符串 append(.)方法是一个适应于基本类型和引用类型的方法。例如:sbf.append(10); sbf.append(“additional string “); 删除操作 StringBuffer delete(int, int) StringBuffer deleteCharAt(int) 增加操作 StringBuffer insert(int, boolean|Object|) 替换操作 StringBuffer replace(int, int, String) void setCharAt(int, char),从StringBuffer到Str
9、ing 基于一个StringBuffer对象的内容创建字符串可以: String str=new String(sbf); String str=sbf.toString();,4、正则表达式,一个例子 +|-?(d+(.d*)?)|(.d+) a+123.56,b.4,c-123 +123.56 .4 -123,java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库。它包括两个类: Pattern:是一个正则表达式经编译后的表现模式。 Matcher:是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。,public class Reg
10、xDemo public static void main(String args) /定义正则表达式,以便匹配目标字符串 String regx=“+|-?(d+(.d*)?)|(.d+)“;/定义需要匹配的字符串String input=“a+123.56,b.4,c-123“;Matcher matcher=null;/基于定义的正则表达式,创建一个模式对象 Pattern pattern = Ppile(regx);/从模式创建匹配器matcher =pattern.matcher(input); /循环获得所有的匹配子串while(matcher.find() /输出每一个匹配成功的
11、子串序列System.out.println(matcher.group(); ,正则表达式是有普通字符,包括大小写字母和数字以及一些具有特殊含义的符号组成的字符序列。简单的如“str“、“str*“,复杂的如下面的例子: “+|-?(d+(.d*)?)|(.d+)“ 这里面就包括了各种预先定义好的字符在起作用。(字符类、正则表达式内的逻辑操作符、预定义字符类、量词、边界),字符类(Character Classes),正则表达式内的逻辑操作符,&: 此操作符把定义字符集的类所表达的共同字符范围组织在一起。 |: 逻辑或,两者选一。 : 对后面的字符类取反,等价于排除定义字符类范围的其它所有字
12、符。,预定义字符类(Predefined Character Classes),量词(Quantifiers),边界,5日期处理,6 定时器,创建定时任务 import java.util.TimerTask; public class MyTask extends TimerTask int number=10; /控制任务执行次数 public void run() if(number0)System.out.println(“Hi,i has been started“);number-;elseSystem.out.println(“task completed“);System.ex
13、it(0); ,创建定时任务,import java.util.Timer; public class TimerDemo public static void main(String args) Timer timer=new Timer();timer.schedule(new MyTask(), 1000,2*1000); ,7 Random,class RandNumber public static void main(String args) for(int i=0;i10;i+)System.out.print(“ “+(int)(Math.random()*100); ,8 数
14、值和字符串,Number类 转换数值到字符串 转换字符串到数值 格式化数值,Number类及其数值的包装类,大多数情况,我们使用基本类型定义和使用变量:int a=10; 当你需要一个数值类(包装类)对象(提供一个整数列表、网络传输等)时,当你需要某种数值类的普遍方法或值时,如 Float.NEGATIVE_INFINITY,数值包装类的构造函数,Integer(int value) 构造一个新分配的 Integer 对象,它表示指定的 int 值。 Integer(String s) 构造一个新分配的 Integer 对象,它表示 String 参数所指示的 int 值。,自动包装/拆箱,I
15、nteger a5; int i=a;,转换数值到字符串,static String toBinaryString(int i) 以二进制(基数 2)无符号整数形式返回一个整数参数的字符串表示形式。 static String toHexString(int i) 以十六进制的无符号整数形式返回一个整数参数的字符串表示形式。 static String toOctalString(int i) 以八进制(基数 8)无符号整数形式返回一个整数参数的字符串表示形式。 String toString() 返回一个表示该 Integer 值的 String 对象。 static String toSt
16、ring(int i) 返回一个表示指定整数的 String 对象。 static String toString(int i, int radix) 用第二个参数指定的基数返回第一个参数的字符串表示形式,转换字符串到数值,static Integer valueOf(String s) 返回保持指定的 String 的值的 Integer 对象。 static int parseInt(String s) 将字符串参数作为有符号的十进制整数进行分析,格式化数值,NumberFormat 是所有数字格式的抽象基类。此类提供了格式化和分析数字的接口。 为了格式化当前语言环境的数字,要使用一个工厂
17、类方法: NumberFormat nf = NumberFormat.getInstance(); 要格式化不同语言环境的日期 NumberFormat nf = NumberFormat.getInstance(Locale.FRENCH);,格式化数值(cont.),parseObject(String source, ParsePosition pos)分析字符串中的文本,以生成一个Number。voidsetCurrency(Currency currency)获取格式化货币值时此数字格式使用的货币。voidsetMaximumFractionDigits(int newValue)
18、 设置数的小数部分的最大位数。 voidsetMaximumIntegerDigits(int newValue)设置数的整数部分允许的最大位数。voidsetMinimumFractionDigits(int newValue)设置数的小数部分允许的最小位数。 voidsetMinimumIntegerDigits(int newValue)设置数的整数部分允许的最小位数。 voidsetParseIntegerOnly(boolean value)设置数是否应该仅作为整数来分析。,格式化示例,下面的语句创建一个模式“000.00”的DecimalFormat实例 NumberFormat
19、nf = NumberFormat.getInstance(); DecimalFormat df(DecimalFormat)nf; 如: df.applyPattern(“000.00”); df.format(30.8989)返回030.90 再如: df.applyPattern(“00.00%“); df.format(0.308989)返回30.90%,Java程序设计,基于开源工具包开发应用程序,如何使用开源工具包,什么是开源代码,如何在程序中引用工具包,开发独立的应用程序 在CLASSPATH环境变量中,指定JAR文件的位置 如:CLASSPATHCLASSPATH;d:/ja
20、valib/jexcelapi/jxl.jar 开发运行在特定容器(Web服务器等)中的程序 将jar文件放置在特定目录下 在程序中,用import语句引用其中的类,示例,创建统计图,1、放置指定的jar文件到合适位置 2、修改classpath环境变量 3、开始编程,注意查看对应的示例代码和参考文档,示例代码,/创建饼型统计图 public class ChartDemo private DefaultPieDataset initPieDataSet() DefaultPieDataset dataset = new DefaultPieDataset();dataset.setValue
21、(“60“,5);dataset.setValue(“60-69“,10);dataset.setValue(“70-79“,15);dataset.setValue(“80-89“,10);dataset.setValue(“90-100“,5);return dataset; ,示例代码(cont.),public void createPieChart() DefaultPieDataset data = initPieDataSet(); JFreeChart chart = ChartFactory.createPieChart3D(“学生成绩统计图“, data,true, fal
22、se, false);/确定将要输出的图形文件File file=new File(“d:/pie.jpg“);try ChartUtilities.saveChartAsJPEG(file, chart, 400,300); catch (IOException e) e.printStackTrace(); ,示例代码(cont.),/需要加载的类 import org.jfree.data.general.DefaultPieDataset; import org.jfree.data.category.CategoryDataset; import org.jfree.data.cat
23、egory.DefaultCategoryDataset; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFreeChart; import org.jfree.chart.ChartFactory; import org.jfree.chart.plot.PlotOrientation;import java.io.File; import java.io.IOException;,Excel处理,加载所需的类 import java.io.File;import jxl.write.WritableCellFo
24、rmat; import jxl.write.WritableFont; import jxl.write.WritableWorkbook; import jxl.Workbook; import jxl.format.Alignment;,Excel处理(cont.),创建Sheet,并初始化 WritableWorkbook workbook =null; jxl.write.WritableSheet ws=null; workbook = Workbook.createWorkbook(new File(“d:/exceldemo.xls“); ws = workbook.creat
25、eSheet(“学生成绩表“, 0); ws.setRowView(0,400);/设置行高 ws.setColumnView(0,40);/设置列宽 ws.setColumnView(1,40); ws.setColumnView(2,40); ws.setColumnView(3,40);,Excel处理(cont.),创建表头 WritableFont wf=new WritableFont(WritableFont.TIMES,14,WritableFont.BOLD,true); WritableCellFormat cf=new WritableCellFormat(wf); cf
26、.setAlignment(Alignment.CENTRE); label = new jxl.write.Label(0, 0, “20072008学年第一学期Java成绩表“,cf); ws.addCell(label); ws.mergeCells(0,0,3,0);/ wf=null; cf=null;,Excel处理(cont.),设置ColumnHeader wf=new WritableFont(WritableFont.TIMES,10,WritableFont.NO_BOLD,true); cf=new WritableCellFormat(wf); label = new
27、 jxl.write.Label(0, 2, “学号“); ws.addCell(label);label = new jxl.write.Label(1, 2, “期中成绩“); ws.addCell(label);label = new jxl.write.Label(2, 2, “期末成绩“); ws.addCell(label);label = new jxl.write.Label(3, 2, “总评成绩“); ws.addCell(label);,Excel处理(cont.),批量增加数据到Excelfor(int line=3;line30;line+) jxl.write.La
28、bel label0 = new jxl.write.Label(0, line, “00“+Integer.toString(line); ws.addCell(label0); jxl.write.Number label2 = new jxl.write.Number(1, line, line); ws.addCell(label2); jxl.write.Number label3 = new jxl.write.Number(2, line, line); ws.addCell(label3); jxl.write.Number label4 = new jxl.write.Number(3, line,line+line); ws.addCell(label4); ,Excel处理(cont.),输出,并关闭文件 workbook.write(); workbook.close();,