Java常用类库(一)
----------------------
认识StringBuffer
StringBuffer是使用缓冲区的,本身也是操作字符串的,但是与String类不同,String类的内容一旦声明之后则不可改变,改变的只是其内存地址的指赂,而StringBuffer中的内容是可以改变的。对StringBufffer而言,本身是一个具体的操作类,所以不能像String那样采用直接赋值的方式进行对象的实例化,必须通过构造方法完成
StringBuffer连接字符操作:
String用“+”连接 “Hello” + “ ” + “World”
StringBuffer用append “Hello” append “ ” append “World”
实例操作:字符串连接
- public class StringBufferDemo01{
- public static void main(String args[]){
- StringBuffer buf = new StringBuffer() ;
- buf.append("Hello ") ;
- buf.append("World").append("!!!") ;
- buf.append("\n") ;
- buf.append("数字 = ").append(1).append("\n") ;
- buf.append("字符 = ").append('C').append("\n");
- buf.append("布尔 = ").append(true) ;
- System.out.println(buf) ;
- }
- };
实例二:在任意位置处为StringBuffer添加内容,可直接使用inster()方法
- public class StringBufferDemo03{
- public static void main(String args[]){
- StringBuffer buf = new StringBuffer() ;
- buf.append("World!!") ;
- buf.insert(0,"Hello ") ;
- System.out.println(buf) ;
- buf.insert(buf.length(),"MLDN~") ;
- System.out.println(buf) ;
- }
实例三:字符吕反转操作,可直接使用reverse()方法就可以完成反转的功能
- public class StringBufferDemo04{
- public static void main(String args[]){
- StringBuffer buf = new StringBuffer() ;
- buf.append("World!!") ;
- buf.insert(0,"Hello ") ;
- String str = buf.reverse().toString() ;
- System.out.println(str) ;
- }
- };
实例四:替换指定范围的内容:可直接使用replace()方法
- public class StringBufferDemo05{
- public static void main(String args[]){
- StringBuffer buf = new StringBuffer() ;
- buf.append("Hello ").append("World!!") ;
- buf.replace(6,11,"LiXingHua") ;
- System.out.println("内容替换之后的结果:" + buf) ;
实例五:字符串截取,可直接使用substring()方法
- public class StringBufferDemo06{
- public static void main(String args[]){
- StringBuffer buf = new StringBuffer() ;
- buf.append("Hello ").append("World!!") ;
- buf.replace(6,11,"LiXingHua") ;
- String str = buf.substring(6,15) ;
- System.out.println("内容替换之后的结果:" + str) ;
- }
- };
实例六:字符删除,可直接使用delete()方法
- public class StringBufferDemo07{
- public static void main(String args[]){
- StringBuffer buf = new StringBuffer() ;
- buf.append("Hello ").append("World!!") ;
- buf.replace(6,11,"LiXingHua") ;
- String str = buf.delete(6,15).toString() ;
- System.out.println("删除之后的结果:" + str) ;
实例七:查找指定内容是否存在
- public class StringBufferDemo08{
- public static void main(String args[]){
- StringBuffer buf = new StringBuffer() ;
- buf.append("Hello ").append("World!!") ;
- if(buf.indexOf("Hello")==-1){
- System.out.println("没有查找到指定的内容") ;
- }else{
- System.out.println("可以查找到指定的内容") ;
- }
- }
- };
Runtime类
Runtime运行时,是一个封装了JVM进程的类,每一个JAVA程序实际上都是启动了一个JVM进程,那么每一个JVM进程都是对应这一个Runtime实例,此实例是由JVM为其实例化的。本类的定义中根本就没有构造方法,本类的构造方法被私有化了,则在此类中肯定有一个方法可以返回本类的实例化对象。public static Runtime getRuntime()
实例:利用Runtime得到JVM信息
- public class RuntimeDemo01{
- public static void main(String args[]){
- Runtime run = Runtime.getRuntime();
- System.out.println("JVM最大内存量:" + run.maxMemory()) ;
- System.out.println("JVM空闲内存量:" + run.freeMemory()) ;
- String str = "Hello " + "World" + "!!!"
- +"\t" + "Welcome " + "To " + "MLDN" + "~" ;
- System.out.println(str) ;
- for(int x=0;x<1000;x++){
- str += x ;
- }
- System.out.println("操作String之后的,JVM空闲内存量:" + run.freeMemory()) ;
- run.gc() ;
- System.out.println("垃圾回收之后的,JVM空闲内存量:" + run.freeMemory()) ;
- }
- };
Runtime与Process类
除了观察内存使用量外,也可以直接使用Runtime类运行本机的可执行程序,例如调用记事本。public Process exec(String command) throws IOException,并可以通过deestroy()方法销毁一个进程。
- public class RuntimeDemo03{
- public static void main(String args[]){
- Runtime run = Runtime.getRuntime() ;
- Process p = null ;
- try{
- p = run.exec("notepad.exe") ;
- }catch(Exception e){
- e.printStackTrace() ;
-
- }
- try{
- Thread.sleep(5000) ;
- }catch(Exception e){
- }
- p.destroy() ;
- }
- };
国际化程序
国际化程序就是指一个程序可以同时适应多门语言,即:如果现在程序使用者是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过国际化操作,让一个程序适应各个国家的语言要求。
国际化程序实现支持的类
n java.util.Locale:用于表示一个国家语言的类。
n java.util.ResourceBundle:用于访问资源文件。
n java.text.MessageFormat:格式化资源文件的占位字符串。
Locale类
Locale表示本地,实际上使用的是一个ISO编码的封装类,对于各个国家来说都存在一个唯一的编码,那么这种编码就称为ISO编码,使用Locale可以指定好一个具体的国家编码。
例:汉语:zh-CN 英语:en-US 法语:fr-FR
ResourceBundle类
此类是专门完成属性文件读取操作的,读取的时候直接指定文件名称即可,可以根据Locale所指定的区域码来自动选择所需要的资源文件。
JAVA国际化程序实现
可以根据国家不同,输出不同国家的你好:
汉语:你好!
英语:Hello!
法语:Bonjour!
分别定义在不同的资源文件中。
汉语:Message_zh_CN.properties
英语:Message_en_US.properties
法语:Message_fr_FR.properties
实例:
- import java.util.ResourceBundle ;
-
- import java.util.Locale ;
-
- public class InterDemo02{
- public static void main(String args[]){
- Locale zhLoc = new Locale("zh","CN") ;
- Locale enLoc = new Locale("en","US") ;
- Locale frLoc = new Locale("fr","FR") ;
-
- ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc) ;
-
- ResourceBundle enrb = ResourceBundle.getBundle("Message",enLoc) ;
-
- ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc) ;
-
- System.out.println("汉语" + zhrb.getString("info")) ;
- System.out.println("英语:" + enrb.getString("info")) ;
- System.out.println("法语:" + frrb.getString("info")) ;
- }
- };
-
- 处理动态文本
之前的资源文件中的所有内容实际上都是固定的,而如果现在有些内容,“你好!XXX”。那么此时就必须在资原文件中进行一些动态文本的配置,设置占位符,这些符号中的内容暂时不固定,而是在程序执行的时候由程序进行设置的,而要想实现这样的功能,则必须使用MessageForm类。此类是在java.text包中定义的。
占位符使用{数字}表示
实例:
- import java.util.ResourceBundle ;
-
- import java.util.Locale ;
-
- import java.text.* ;
-
- public class InterDemo03{
- public static void main(String args[]){
- Locale zhLoc = new Locale("zh","CN") ;
- Locale enLoc = new Locale("en","US") ;
- Locale frLoc = new Locale("fr","FR") ;
-
- ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc) ;
-
- ResourceBundle enrb = ResourceBundle.getBundle("Message",enLoc) ;
-
- ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc) ;
-
- String str1 = zhrb.getString("info") ;
- String str2 = enrb.getString("info") ;
- String str3 = frrb.getString("info") ;
- System.out.println("中文:" + MessageFormat.format(str1,"李兴华")) ;
- System.out.println("英语:" + MessageFormat.format(str2,"LiXingHua")) ;
- System.out.println("法语:" + MessageFormat.format(str3,"LiXingHua")) ;
- }
- };
JAVA新特性——可变参数
实例:
- public class InterDemo04{
- public static void main(String args[]){
- System.out.print("第一次运行:") ;
- fun("LXH","Li","李兴华") ;
- System.out.print("\n第二次运行:") ;
- fun("MLDN") ;
- }
- public static void fun(Object...args){
- for(int i=0;i
- System.out.print(args[i] + "、") ;
- }
- }
- };
System类
System.out.println()本身就是一个系统提供好的类,而且out.println()方法也是经常使用到的。
System类是一些与系统相关的属性和方法的集合在System类中所有的属性都是静态的
实例:利用System获取一个操作的运行时间
- public class SystemDemo01{
- public static void main(String args[]){
- long startTime = System.currentTimeMillis() ;
- int sum = 0 ;
- for(int i=0;i<30000000;i++){
- sum += i ;
- }
- long endTime = System.currentTimeMillis() ;
-
- System.out.println("计算所花费的时间:" + (endTime-startTime) +"毫秒") ;
- }
- };
实例:列出本机的全部系统属性
- public class SystemDemo02{
- public static void main(String args[]){
- System.getProperties().list(System.out) ;
- }
- };
如果只想要其中几个属性的话:
- public class SystemDemo03{
- public static void main(String args[]){
- System.out.println("系统版本:" + System.getProperty("os.name")
- + System.getProperty("os.version")
- + System.getProperty("os.arch")) ;
- System.out.println("系统用户:" + System.getProperty("user.name")) ;
- System.out.println("当前用户目录:" + System.getProperty("user.home")) ;
- System.out.println("当前用户工作目录:" + System.getProperty("user.dir")) ;
- }
- };
垃圾对象的回收
一个对象如果不使用,则肯定要等待进行垃圾收集,垃圾收集可以自动调用也可以手工调用,手工调用的时候就是调用System.gc()或者Runtime.getRuntime().gc()。但是如量一个地象在回收之前需要做一些收尾工作,则就必须覆写Object类中的:
protected void finalize() throws Throwable
实例:
- class Person{
- private String name ;
- private int age ;
- public Person(String name,int age){
- this.name = name ;
- this.age = age;
- }
- public String toString(){
- return "姓名:" + this.name + ",年龄:" + this.age ;
- }
- public void finalize() throws Throwable{
- System.out.println("对象被释放 --> " + this) ;
- }
- };
-
- public class SystemDemo04{
- public static void main(String args[]){
- Person per = new Person("张三",30) ;
- per = null ;
- System.gc() ;
- }
- };
日期操作类(Date、Calendar)
Date类是一个较为常用的类,但是其操作的日期格式会有一些不符合个人的要求,而如果想进一步取得一些自己需要的时间,则可以使用Calendar类。
Date类
在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可。
- import java.util.Date ;
- public class DateDemo01{
- public static void main(String args[]){
- Date date = new Date() ;
- System.out.println("当前日期为:" + date) ;
- }
- };
Calendar类
使用此类可以直接将日期精确到毫秒
Calendar类是一个抽象类,既然是一个抽象类则肯定无法直接使用,此时就要利用对象多态性的概念,通过向上转型关系实例化本类对象
实例:
- import java.util.* ;
- public class DateDemo02{
- public static void main(String args[]){
- Calendar calendar = new GregorianCalendar();
- System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
- System.out.println("MONTH: " + (calendar.get(Calendar.MONTH) + 1));
- System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
- System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));
- System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));
- System.out.println("SECOND: " + calendar.get(Calendar.SECOND));
- System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
- }
- };
日期操作类(DateFormat、SimpleDateFormat)
DateFormat类
此类是一个日期的格式化类,专门格式化日期的操作,因为java.util.Date类本身就已经包含了完整的期,所以只需要将此日期按照一些格式格式化显示即可。
实例:
- import java.text.DateFormat ;
- import java.util.Date ;
- public class DateDemo03{
- public static void main(String args[]){
- DateFormat df1 = null ;
- DateFormat df2 = null ;
- df1 = DateFormat.getDateInstance() ;
- df2 = DateFormat.getDateTimeInstance() ;
- System.out.println("DATE:" + df1.format(new Date())) ;
- System.out.println("DATETIME:" + df2.format(new Date())) ;
- }
- };
SimpleDateFormat类
此类的功能是完成日期的显示格式化。如果想要实现转换则必须先准备好一个模板,通过此模板进行日期数字的提取工作。
实例:
- import java.text.* ;
- import java.util.* ;
- public class DateDemo05{
- public static void main(String args[]){
- String strDate = "2008-10-19 10:11:30.345" ;
-
- String pat1 = "yyyy-MM-dd HH:mm:ss.SSS" ;
-
- String pat2 = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒" ;
- SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ;
- SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ;
- Date d = null ;
- try{
- d = sdf1.parse(strDate) ;
- }catch(Exception e){
- e.printStackTrace() ;
- }
- System.out.println(sdf2.format(d)) ;
- }
- };
实例操作:取得当前日期
基于Calendar类操作:
- import java.util.* ;
- class DateTime{
- private Calendar calendar = null ;
- public DateTime(){
- this.calendar = new GregorianCalendar() ;
- }
- public String getDate(){
-
- StringBuffer buf = new StringBuffer() ;
- buf.append(calendar.get(Calendar.YEAR)).append("-") ;
- buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)).append("-") ;
- buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)).append(" ") ;
- buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)).append(":") ;
- buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)).append(":") ;
- buf.append(this.addZero(calendar.get(Calendar.SECOND),2)).append(".") ;
- buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)) ;
- return buf.toString() ;
- }
- public String getDateComplete(){
-
- StringBuffer buf = new StringBuffer() ;
- buf.append(calendar.get(Calendar.YEAR)).append("年") ;
- buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)).append("月") ;
- buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)).append("日") ;
- buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)).append("时") ;
- buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)).append("分") ;
- buf.append(this.addZero(calendar.get(Calendar.SECOND),2)).append("秒") ;
- buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)).append("毫秒") ;
- return buf.toString() ;
- }
- public String getTimeStamp(){
-
- StringBuffer buf = new StringBuffer() ;
- buf.append(calendar.get(Calendar.YEAR)) ;
- buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)) ;
- buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)) ;
- buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)) ;
- buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)) ;
- buf.append(this.addZero(calendar.get(Calendar.SECOND),2));
- buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)) ;
- return buf.toString() ;
- }
-
- private String addZero(int num,int len){
- StringBuffer s = new StringBuffer() ;
- s.append(num) ;
- while(s.length()
- s.insert(0,"0") ;
- }
- return s.toString() ;
- }
- };
- public class DateDemo06{
- public static void main(String args[]){
- DateTime dt = new DateTime() ;
- System.out.println("系统日期:"+dt.getDate()) ;
- System.out.println("中文日期:"+dt.getDateComplete()) ;
- System.out.println("时间戳:"+dt.getTimeStamp()) ;
- }
- };
基于SimpleDateFormat类操作:
实例:
- import java.util.* ;
- import java.text.* ;
- class DateTime{
- private SimpleDateFormat sdf = null ;
- public String getDate(){
- this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;
- return this.sdf.format(new Date()) ;
- }
- public String getDateComplete(){
- this.sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒SSS毫秒") ;
- return this.sdf.format(new Date()) ;
- }
- public String getTimeStamp(){
- this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") ;
- return this.sdf.format(new Date()) ;
- }
- };
- public class DateDemo07{
- public static void main(String args[]){
- DateTime dt = new DateTime() ;
- System.out.println("系统日期:"+dt.getDate()) ;
- System.out.println("中文日期:"+dt.getDateComplete()) ;
- System.out.println("时间戳:"+dt.getTimeStamp()) ;
- }
- };
Java常用类库(二)
-----------------------
Math与Random类
Math类表示数学操作类,在Math类中的方未予都是静态方法,直接使用“类.方法名称()”形式调用即可。
实例:
- public class MathDemo01{
- public static void main(String args[]){
-
- System.out.println("求平方根:" + Math.sqrt(9.0)) ;
- System.out.println("求两数的最大值:" + Math.max(10,30)) ;
- System.out.println("求两数的最小值:" + Math.min(10,30)) ;
- System.out.println("2的3次方:" + Math.pow(2,3)) ;
- System.out.println("四舍五入:" + Math.round(33.6)) ;
- }
- };
Random类
Random类主要是产生随机数,可以产生一个指定范围的随机数,Random类是定义在java.util包中的类。
实例:
- import java.util.Random ;
- public class RandomDemo01{
- public static void main(String args[]){
- Random r = new Random() ;
- for(int i=0;i<10;i++){
- System.out.print(r.nextInt(100) + "\t") ;
- }
- }
- };
NumberFormat类
NuberFormat的基本使用:此类主要完成数字的格式化显示。
实例:
- import java.text.* ;
- public class NumberFormatDemo01{
- public static void main(String args[]){
- NumberFormat nf = null ;
- nf = NumberFormat.getInstance() ;
- System.out.println("格式化之后的数字:" + nf.format(10000000)) ;
- System.out.println("格式化之后的数字:" + nf.format(1000.345)) ;
- }
- };
DecimalFormat的基本使用:DecimalFormat也是Format的一个子类,主要的作用是用来格式化数字使用,当然,在格式化数字的时候要比直接使用NumberFormat更加方便,因为可以直接指按用户自定义的方式进行格式化操作,与之前SimpleDateFormat类似。
实例:
- import java.text.* ;
- class FormatDemo{
- public void format1(String pattern,double value){
- DecimalFormat df = null ;
- df = new DecimalFormat(pattern) ;
- String str = df.format(value) ;
- System.out.println("使用" + pattern
- + "格式化数字" + value + ":" + str) ;
- }
- };
- public class NumberFormatDemo02{
- public static void main(String args[]){
- FormatDemo demo = new FormatDemo() ;
- demo.format1("###,###.###",111222.34567) ;
- demo.format1("000,000.000",11222.34567) ;
- demo.format1("###,###.###¥",111222.34567) ;
- demo.format1("000,000.000¥",11222.34567) ;
- demo.format1("##.###%",0.345678) ;
- demo.format1("00.###%",0.0345678) ;
- demo.format1("###.###\u2030",0.345678) ;
- }
- };
大数操作类(BigInter、BigDecimal)
大数操作,一般是指在超出long、double类型能够存放的范围时使用。
操作整型:BigInteger
操作小数:BigDecimal
BigDecimal实例:
- import java.math.* ;
- class MyMath{
- public static double add(double d1,double d2){
- BigDecimal b1 = new BigDecimal(d1) ;
- BigDecimal b2 = new BigDecimal(d2) ;
- return b1.add(b2).doubleValue() ;
- }
- public static double sub(double d1,double d2){
- BigDecimal b1 = new BigDecimal(d1) ;
- BigDecimal b2 = new BigDecimal(d2) ;
- return b1.subtract(b2).doubleValue() ;
- }
- public static double mul(double d1,double d2){
- BigDecimal b1 = new BigDecimal(d1) ;
- BigDecimal b2 = new BigDecimal(d2) ;
- return b1.multiply(b2).doubleValue() ;
- }
- public static double div(double d1,double d2,int len){
- BigDecimal b1 = new BigDecimal(d1) ;
- BigDecimal b2 = new BigDecimal(d2) ;
- return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
- }
- public static double round(double d,int len){
- BigDecimal b1 = new BigDecimal(d) ;
- BigDecimal b2 = new BigDecimal(1) ;
- return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;
- }
- };
-
- public class BigDecimalDemo01{
- public static void main(String args[]){
- System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345,3.333),1)) ;
- System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345,3.333),3)) ;
- System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345,3.333),2)) ;
- System.out.println("除法运算:" + MyMath.div(10.345,3.333,3)) ;
- }
- };
BigInteger实例:
- import java.math.BigInteger ;
- public class BigIntegerDemo01{
- public static void main(String args[]){
- BigInteger bi1 = new BigInteger("123456789") ;
- BigInteger bi2 = new BigInteger("987654321") ;
- System.out.println("加法操作:" + bi2.add(bi1)) ;
- System.out.println("减法操作:" + bi2.subtract(bi1)) ;
- System.out.println("乘法操作:" + bi2.multiply(bi1)) ;
- System.out.println("除法操作:" + bi2.divide(bi1)) ;
- System.out.println("最大数:" + bi2.max(bi1)) ;
- System.out.println("最小数:" + bi2.min(bi1)) ;
- BigInteger result[] = bi2.divideAndRemainder(bi1) ;
- System.out.println("商是:" + result[0] +
- ";余数是:" + result[1]) ;
- }
- };
对象克隆技术
对象克隆:将对象完整的复制成另一个对象,必须依靠Object类
实例:
- class Person implements Cloneable{
- private String name ;
- public Person(String name){
- this.name = name ;
- }
- public void setName(String name){
- this.name = name ;
- }
- public String getName(){
- return this.name ;
- }
- public String toString(){
- return "姓名:" + this.name ;
- }
- public Object clone()
- throws CloneNotSupportedException
- {
- return super.clone() ;
- }
- };
- public class CloneDemo01{
- public static void main(String args[]) throws Exception{
- Person p1 = new Person("张三") ;
- Person p2 = (Person)p1.clone() ;
- p2.setName("李四") ;
- System.out.println("原始对象:" + p1) ;
- System.out.println("克隆之后的对象:" + p2) ;
- }
- };
比较器
Comparable接口的作用
之前Arrays类中存在sort()方法,此方法可以直接对对象数组进行排序
Coparable接口可以直接使用java.util.Arrays类进行数组的排序操作,但对象所在的类必须实现Comparable接口,用于指定排序接口。
实例:要求:定义一个学生类,里面有姓名、年龄、成绩三个属性,要求按成绩排序,如果成绩相等,则按照年龄由低到高排序
代码:
- class Student implements Comparable {
- private String name ;
- private int age ;
- private float score ;
- public Student(String name,int age,float score){
- this.name = name ;
- this.age = age ;
- this.score = score ;
- }
- public String toString(){
- return name + "\t\t" + this.age + "\t\t" + this.score ;
- }
- public int compareTo(Student stu){
- if(this.score>stu.score){
- return -1 ;
- }else if(this.score
- return 1 ;
- }else{
- if(this.age>stu.age){
- return 1 ;
- }else if(this.age
- return -1 ;
- }else{
- return 0 ;
- }
- }
- }
- };
- public class ComparableDemo01{
- public static void main(String args[]){
- Student stu[] = { new Student("张三",20,90.0f),
- new Student("李四",22,90.0f),new Student("王五",20,99.0f),
- new Student("赵六",20,70.0f),new Student("孙七",22,100.0f)} ;
- java.util.Arrays.sort(stu) ;
- for(int i=0;i
- System.out.println(stu[i]) ;
- }
- }
- };
实际上比较器的排序原理 就是二叉树的排序算法。
基本原里:使用第一个元素作为根节点,之后如果后面的内容比根节点要小,则放在左子树如果内容比根节点内容大,则放在右子树
手动完成二叉树算法:
- class BinaryTree{
- class Node{
- private Comparable data ;
- private Node left ;
- private Node right ;
- public Node(Comparable data){
- this.data = data ;
- }
- public void addNode(Node newNode){
-
- if(newNode.data.compareTo(this.data)<0){
- if(this.left==null){
- this.left = newNode ;
- }else{
- this.left.addNode(newNode) ;
- }
- }
- if(newNode.data.compareTo(this.data)>=0){
- if(this.right==null){
- this.right = newNode ;
- }else{
- this.right.addNode(newNode) ;
- }
- }
- }
- public void printNode(){
- if(this.left!=null){
- this.left.printNode() ;
- }
- System.out.print(this.data + "\t") ;
- if(this.right!=null){
- this.right.printNode() ;
- }
- }
- };
- private Node root ;
- public void add(Comparable data){
- Node newNode = new Node(data) ;
- if(root==null){
- root = newNode ;
- }else{
- root.addNode(newNode) ;
- }
- }
- public void print(){
- this.root.printNode() ;
- }
- };
- public class ComparableDemo03{
- public static void main(String args[]){
- BinaryTree bt = new BinaryTree() ;
- bt.add(8) ;
- bt.add(3) ;
- bt.add(3) ;
- bt.add(10) ;
- bt.add(9) ;
- bt.add(1) ;
- bt.add(5) ;
- bt.add(5) ;
- System.out.println("排序之后的结果:") ;
- bt.print() ;
- }
- };
另一种比较器:Comparator
如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的,所以为了解决这样的问题,java又定义了另一具比较器的操作接口——Comparator。
实例:
- import java.util.* ;
- class Student{
- private String name ;
- private int age ;
- public Student(String name,int age){
- this.name = name ;
- this.age = age ;
- }
- public boolean equals(Object obj){
- if(this==obj){
- return true ;
- }
- if(!(obj instanceof Student)){
- return false ;
- }
- Student stu = (Student) obj ;
- if(stu.name.equals(this.name)&&stu.age==this.age){
- return true ;
- }else{
- return false ;
- }
- }
- public void setName(String name){
- this.name = name ;
- }
- public void setAge(int age){
- this.age = age ;
- }
- public String getName(){
- return this.name ;
- }
- public int getAge(){
- return this.age ;
- }
- public String toString(){
- return name + "\t\t" + this.age ;
- }
- };
-
- class StudentComparator implements Comparator{
-
- public int compare(Student s1,Student s2){
- if(s1.equals(s2)){
- return 0 ;
- }else if(s1.getAge()
- return 1 ;
- }else{
- return -1 ;
- }
- }
- };
-
- public class ComparatorDemo{
- public static void main(String args[]){
- Student stu[] = { new Student("张三",20),
- new Student("李四",22),new Student("王五",20),
- new Student("赵六",20),new Student("孙七",22)} ;
- java.util.Arrays.sort(stu,new StudentComparator()) ;
- for(int i=0;i
- System.out.println(stu[i]) ;
- }
- }
- };
观察者设计模式
以购房者观注房价为例,结合java.util包中提供的Obeservable类和Observer接口实现。
代码:
- import java.util.* ;
- class House extends Observable{
- private float price ;
- public House(float price){
- this.price = price ;
- }
- public float getPrice(){
- return this.price ;
- }
- public void setPrice(float price){
-
- super.setChanged() ;
- super.notifyObservers(price) ;
- this.price = price ;
- }
- public String toString(){
- return "房子价格为:" + this.price ;
- }
- };
- class HousePriceObserver implements Observer{
- private String name ;
- public HousePriceObserver(String name){
- this.name = name ;
- }
- public void update(Observable o,Object arg){
- if(arg instanceof Float){
- System.out.print(this.name + "观察到价格更改为:") ;
- System.out.println(((Float)arg).floatValue()) ;
- }
- }
- };
- public class ObserDemo01{
- public static void main(String args[]){
- House h = new House(1000000) ;
- HousePriceObserver hpo1 = new HousePriceObserver("购房者A") ;
- HousePriceObserver hpo2 = new HousePriceObserver("购房者B") ;
- HousePriceObserver hpo3 = new HousePriceObserver("购房者C") ;
- h.addObserver(hpo1) ;
- h.addObserver(hpo2) ;
- h.addObserver(hpo3) ;
- System.out.println(h) ;
- h.setPrice(666666) ;
- System.out.println(h) ;
- }
- };
正则表达式
利用两段代码观察使用正则表达式的好处
不使用正则:
- public class RegexDemo01{
- public static void main(String args[]){
- String str = "1234567890" ;
- boolean flag = true ;
-
- char c[] = str.toCharArray() ;
- for(int i=0;i
- if(c[i]<'0'||c[i]>'9'){
- flag = false ;
- break ;
- }
- }
- if(flag){
- System.out.println("是由数字组成!") ;
- }else{
- System.out.println("不是由数字组成!") ;
- }
- }
- };
基本思路就是将字符串拆分,之后一个个进行比较验证,但是这样比较麻烦
使用正则表达式:
- import java.util.regex.Pattern ;
- public class RegexDemo02{
- public static void main(String args[]){
- String str = "1234567890" ;
- if(Pattern.compile("[0-9]+").matcher(str).matches()){
- System.out.println("是由数字组成!") ;
- }else{
- System.out.println("不是由数字组成!") ;
- }
- }
- };
Pattern、Matcher类
这两个类为正则的核心操作类,这两个类都定义在java.util.regex包中
Pattern为的主要作用是进行正则规范的编写。
而Matcher类主要是执行规范,验证一个字符串是否符合其规范。
实例:
- import java.util.regex.Pattern ;
- import java.util.regex.Matcher ;
- public class RegexDemo03{
- public static void main(String args[]){
- String str = "1983-07-27" ;
- String pat = "\\d{4}-\\d{2}-\\d{2}" ;
- Pattern p = Pattern.compile(pat) ;
- Matcher m = p.matcher(str) ;
- if(m.matches()){
- System.out.println("日期格式合法!") ;
- }else{
- System.out.println("日期格式不合法!") ;
- }
- }
- };
String类对正则的支持
String对正则主要有三种支持方法:字符串匹配、字符串替换、字符串拆分
实例:
- import java.util.regex.Pattern ;
- import java.util.regex.Matcher ;
- public class RegexDemo06{
- public static void main(String args[]){
- String str1 = "A1B22C333D4444E55555F".replaceAll("\\d+","_") ;
- boolean temp = "1983-07-27".matches("\\d{4}-\\d{2}-\\d{2}") ;
- String s[] = "A1B22C333D4444E55555F".split("\\d+") ;
- System.out.println("字符串替换操作:" + str1) ;
- System.out.println("字符串验证:" + temp) ;
- System.out.print("字符串的拆分:") ;
- for(int x=0;x
- System.out.print(s[x] + "\t") ;
- }
- }
- };
定时调度
每当一段时间,程序会自动执行,称为定时调度。如果要使用定时调度,则必须保证程序始终运行着才可以,也就是说相当于定时调度是在程序之外又启动了一个新的线程。
Timer和TimerTask两个类完成定时调度
具体实例:
-
- import java.util.TimerTask ;
- import java.util.Date ;
- import java.text.SimpleDateFormat ;
- class MyTask extends TimerTask{
- public void run(){
- SimpleDateFormat sdf = null ;
- sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;
- System.out.println("当前系统时间为:" + sdf.format(new Date())) ;
- }
- };
- import java.util.Timer ;
- public class TestTask{
- public static void main(String args[]){
- Timer t = new Timer() ;
- MyTask mytask = new MyTask() ;
- t.schedule(mytask,1000,2000) ;
- }
- };