JAVA常用类库

Java常用类库(一)

 

----------------------

认识StringBuffer

StringBuffer是使用缓冲区的,本身也是操作字符串的,但是与String类不同,String类的内容一旦声明之后则不可改变,改变的只是其内存地址的指赂,而StringBuffer中的内容是可以改变的。对StringBufffer而言,本身是一个具体的操作类,所以不能像String那样采用直接赋值的方式进行对象的实例化,必须通过构造方法完成

StringBuffer连接字符操作:

       String用“+”连接      “Hello” + “ ” + “World”

       StringBuffer用append         “Hello” append “ ” append “World”

实例操作:字符串连接

[java]  view plain copy
  1. public class StringBufferDemo01{  
  2.       public static void main(String args[]){  
  3.             StringBuffer buf = new StringBuffer() ;      // 声明StringBuffer对象   
  4.               buf.append("Hello ") ;                               // 向StringBuffer中添加内容  
  5.               buf.append("World").append("!!!") ;           // 可以连续调用append()方法  
  6.               buf.append("\n") ;                                     // 添加一个转义字符  
  7.               buf.append("数字 = ").append(1).append("\n") ; // 添加数字  
  8.               buf.append("字符 = ").append('C').append("\n");       // 添加字符  
  9.               buf.append("布尔 = ").append(true) ;  // 添加布尔值  
  10.               System.out.println(buf) ;                     // 直接输出对象,调用toString()  
  11.        }  
  12. };  


实例二:在任意位置处为StringBuffer添加内容,可直接使用inster()方法

[java]  view plain copy
  1. public class StringBufferDemo03{  
  2.        public static void main(String args[]){  
  3.             StringBuffer buf = new StringBuffer() ;      // 声明StringBuffer对象   
  4.               buf.append("World!!") ;        // 添加内容  
  5.               buf.insert(0,"Hello ") ;          // 在第一个内容之前添加内容  
  6.               System.out.println(buf) ;  
[java]  view plain copy
  1.      buf.insert(buf.length(),"MLDN~") ;     // 在最后添加内容  
  2.        System.out.println(buf) ;  
  3. }  


实例三:字符吕反转操作,可直接使用reverse()方法就可以完成反转的功能

[java]  view plain copy
  1. public class StringBufferDemo04{  
  2.        public static void main(String args[]){  
  3.             StringBuffer buf = new StringBuffer() ;      // 声明StringBuffer对象   
  4.               buf.append("World!!") ;        // 添加内容  
  5.               buf.insert(0,"Hello ") ;          // 在第一个内容之前添加内容  
  6.               String str = buf.reverse().toString() ;    // 将内容反转后变为String类型  
  7.               System.out.println(str) ;        // 将内容输出  
  8.        }  
  9. };  


实例四:替换指定范围的内容:可直接使用replace()方法

[java]  view plain copy
  1. public class StringBufferDemo05{  
  2.        public static void main(String args[]){  
  3.             StringBuffer buf = new StringBuffer() ;      // 声明StringBuffer对象   
  4.               buf.append("Hello ").append("World!!") ;          // 向StringBuffer添加内容  
  5.               buf.replace(6,11,"LiXingHua") ;          // 将world的内容替换  
  6.               System.out.println("内容替换之后的结果:" + buf) ;       // 输出内容  
[java]  view plain copy
  1. }  


实例五:字符串截取,可直接使用substring()方法

[java]  view plain copy
  1. public class StringBufferDemo06{  
  2.        public static void main(String args[]){  
  3.             StringBuffer buf = new StringBuffer() ;      // 声明StringBuffer对象   
  4.               buf.append("Hello ").append("World!!") ;          // 向StringBuffer添加内容  
  5.               buf.replace(6,11,"LiXingHua") ;          // 将world的内容替换  
  6.               String str = buf.substring(6,15) ;   // 截取指定范围的内容  
  7.               System.out.println("内容替换之后的结果:" + str) ; // 输出内容  
  8.        }  
  9. };  


实例六:字符删除,可直接使用delete()方法

[java]  view plain copy
  1. public class StringBufferDemo07{  
  2.        public static void main(String args[]){  
  3.             StringBuffer buf = new StringBuffer() ;      // 声明StringBuffer对象   
  4.               buf.append("Hello ").append("World!!") ;          // 向StringBuffer添加内容  
  5.               buf.replace(6,11,"LiXingHua") ;          // 将world的内容替换  
  6.               String str = buf.delete(6,15).toString() ;      // 删除指定范围中的内容  
  7.               System.out.println("删除之后的结果:" + str) ; // 输出内容  
[java]  view plain copy
  1. }  


实例七:查找指定内容是否存在

[java]  view plain copy
  1. public class StringBufferDemo08{  
  2.        public static void main(String args[]){  
  3.               StringBuffer buf = new StringBuffer() ;      // 声明StringBuffer对象   
  4.               buf.append("Hello ").append("World!!") ;          // 向StringBuffer添加内容  
  5.               if(buf.indexOf("Hello")==-1){  
  6.                      System.out.println("没有查找到指定的内容") ;  
  7.               }else{     // 不为01表示查找到内容  
  8.                      System.out.println("可以查找到指定的内容") ;  
  9.               }  
  10.        }  
  11. };  


Runtime类

       Runtime运行时,是一个封装了JVM进程的类,每一个JAVA程序实际上都是启动了一个JVM进程,那么每一个JVM进程都是对应这一个Runtime实例,此实例是由JVM为其实例化的。本类的定义中根本就没有构造方法,本类的构造方法被私有化了,则在此类中肯定有一个方法可以返回本类的实例化对象。public static Runtime getRuntime()

实例:利用Runtime得到JVM信息

[java]  view plain copy
  1. public class RuntimeDemo01{  
  2.        public static void main(String args[]){  
  3.               Runtime run = Runtime.getRuntime();  // 通过Runtime类的静态方法进行实例化操作  
  4.               System.out.println("JVM最大内存量:" + run.maxMemory()) ;     // 观察最大的内存,根据机器的不同,环境也会有所不同  
  5.               System.out.println("JVM空闲内存量:" + run.freeMemory()) ;      // 取得程序运行的空闲内存  
  6.               String str = "Hello " + "World" + "!!!"   
  7.                             +"\t" + "Welcome " + "To " + "MLDN" + "~" ;  
  8.               System.out.println(str) ;  
  9.               for(int x=0;x<1000;x++){  
  10.                      str += x ;               // 循环修改内容,会产生多个垃圾  
  11.               }  
  12.               System.out.println("操作String之后的,JVM空闲内存量:" + run.freeMemory()) ;  
  13.               run.gc() ;        // 进行垃圾收集,释放空间  
  14.               System.out.println("垃圾回收之后的,JVM空闲内存量:" + run.freeMemory()) ;  
  15.        }  
  16. };  


Runtime与Process类

除了观察内存使用量外,也可以直接使用Runtime类运行本机的可执行程序,例如调用记事本。public Process exec(String command) throws IOException,并可以通过deestroy()方法销毁一个进程。

[java]  view plain copy
  1. public class RuntimeDemo03{  
  2.        public static void main(String args[]){  
  3.               Runtime run = Runtime.getRuntime() ; // 取得Runtime类的实例化对象  
  4.               Process p = null ;   // 定义进程变量  
  5.               try{  
  6.                      p = run.exec("notepad.exe") ;       // 调用本机程序,此方法需要异常处理  
  7.               }catch(Exception e){  
  8.                      e.printStackTrace() ;      // 打印异常信息  
  9.                      // System.out.println(e) ;  
  10.               }  
  11.               try{  
  12.                      Thread.sleep(5000) ;      // 让此线程存活5秒  
  13.               }catch(Exception e){  
  14.               }  
  15.               p.destroy() ;    // 结束此进程  
  16.        }  
  17. };  


国际化程序

国际化程序就是指一个程序可以同时适应多门语言,即:如果现在程序使用者是中国人,则会以中文为显示文字,如果现在程序的使用者是英国人,则会以英语为显示的文字,也就是说可以通过国际化操作,让一个程序适应各个国家的语言要求。

国际化程序实现支持的类

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

实例:

[java]  view plain copy
  1. import java.util.ResourceBundle ;  
  2.   
  3. import java.util.Locale ;  
  4.   
  5. public class InterDemo02{  
  6.        public static void main(String args[]){  
  7.               Locale zhLoc = new Locale("zh","CN") ;            // 表示中国地区  
  8.               Locale enLoc = new Locale("en","US") ;            // 表示美国地区  
  9.               Locale frLoc = new Locale("fr","FR") ;              // 表示法国地区  
  10.               // 找到汉语的属性文件,需要指定中文的Locale对象  
  11.               ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc) ;  
  12.               // 找到英语的属性文件,需要指定英文的Locale对象  
  13.               ResourceBundle enrb = ResourceBundle.getBundle("Message",enLoc) ;  
  14.               // 找到法语的属性文件,需要指定法文的Locale对象  
  15.               ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc) ;  
  16.               // 依次读取各个属性文件的内容,通过键值读取,此时的键值名称统一为info  
  17.               System.out.println("汉语" + zhrb.getString("info")) ;  
  18.               System.out.println("英语:" + enrb.getString("info")) ;  
  19.               System.out.println("法语:" + frrb.getString("info")) ;  
  20.        }  
  21. };  
  22.   
  23. 处理动态文本  

之前的资源文件中的所有内容实际上都是固定的,而如果现在有些内容,“你好!XXX”。那么此时就必须在资原文件中进行一些动态文本的配置,设置占位符,这些符号中的内容暂时不固定,而是在程序执行的时候由程序进行设置的,而要想实现这样的功能,则必须使用MessageForm类。此类是在java.text包中定义的。

占位符使用{数字}表示

实例:

[java]  view plain copy
  1. import java.util.ResourceBundle ;  
  2.   
  3. import java.util.Locale ;  
  4.   
  5. import java.text.* ;  
  6.   
  7. public class InterDemo03{  
  8.        public static void main(String args[]){  
  9.               Locale zhLoc = new Locale("zh","CN") ;            // 表示中国地区  
  10.               Locale enLoc = new Locale("en","US") ;            // 表示美国地区  
  11.               Locale frLoc = new Locale("fr","FR") ;              // 表示法国地区  
  12.               // 找到中文的属性文件,需要指定中文的Locale对象  
  13.               ResourceBundle zhrb = ResourceBundle.getBundle("Message",zhLoc) ;  
  14.               // 找到英文的属性文件,需要指定英文的Locale对象  
  15.               ResourceBundle enrb = ResourceBundle.getBundle("Message",enLoc) ;  
  16.               // 找到法文的属性文件,需要指定法文的Locale对象  
  17.               ResourceBundle frrb = ResourceBundle.getBundle("Message",frLoc) ;  
  18.               // 依次读取各个属性文件的内容,通过键值读取,此时的键值名称统一为info  
  19.               String str1 = zhrb.getString("info") ;  
  20.               String str2 = enrb.getString("info") ;  
  21.               String str3 = frrb.getString("info") ;  
  22.               System.out.println("中文:" + MessageFormat.format(str1,"李兴华")) ;  
  23.               System.out.println("英语:" + MessageFormat.format(str2,"LiXingHua")) ;  
  24.               System.out.println("法语:" + MessageFormat.format(str3,"LiXingHua")) ;  
  25.        }  
  26. };  


JAVA新特性——可变参数

实例:

[java]  view plain copy
  1. public class InterDemo04{  
  2.        public static void main(String args[]){  
  3.               System.out.print("第一次运行:") ;  
  4.               fun("LXH","Li","李兴华") ; // 传入三个参数  
  5.               System.out.print("\n第二次运行:") ;  
  6.               fun("MLDN") ;                           // 传入一个参数  
  7.        }  
  8.        public static void fun(Object...args){    // 固定语法,输入任意多个数据,使用数组表示  
  9.               for(int i=0;i<args.length;i++){  
  10.                      System.out.print(args[i] + "、") ;  
  11.               }  
  12.        }  
  13. };  


System类

System.out.println()本身就是一个系统提供好的类,而且out.println()方法也是经常使用到的。

System类是一些与系统相关的属性和方法的集合在System类中所有的属性都是静态的

实例:利用System获取一个操作的运行时间

[java]  view plain copy
  1. public class SystemDemo01{  
  2.        public static void main(String args[]){  
  3.             long startTime = System.currentTimeMillis() ;    // 取得开始计算之前的时间  
  4.               int sum = 0 ;                 // 声明变量  
  5.               for(int i=0;i<30000000;i++){       // 执行累加操作  
  6.                      sum += i ;  
  7.               }  
  8.               long endTime = System.currentTimeMillis() ;     // 取得计算之后的时间  
  9.               // 结束时间减去开始时间  
  10.               System.out.println("计算所花费的时间:" + (endTime-startTime) +"毫秒") ;  
  11.        }  
  12. };  


实例:列出本机的全部系统属性

[java]  view plain copy
  1. public class SystemDemo02{  
  2.        public static void main(String args[]){  
  3.               System.getProperties().list(System.out) ;     // 列出系统的全部属性  
  4.        }  
  5. };  

如果只想要其中几个属性的话:

[java]  view plain copy
  1. public class SystemDemo03{  
  2.        public static void main(String args[]){  
  3.               System.out.println("系统版本:" + System.getProperty("os.name")  
  4.                      + System.getProperty("os.version")  
  5.                      + System.getProperty("os.arch")) ;  
  6.               System.out.println("系统用户:" + System.getProperty("user.name")) ;  
  7.               System.out.println("当前用户目录:" + System.getProperty("user.home")) ;  
  8.               System.out.println("当前用户工作目录:" + System.getProperty("user.dir")) ;  
  9.        }  
  10. };  

垃圾对象的回收

一个对象如果不使用,则肯定要等待进行垃圾收集,垃圾收集可以自动调用也可以手工调用,手工调用的时候就是调用System.gc()或者Runtime.getRuntime().gc()。但是如量一个地象在回收之前需要做一些收尾工作,则就必须覆写Object类中的:

       protected void finalize() throws Throwable

实例:

[java]  view plain copy
  1. class Person{  
  2.        private String name ;  
  3.        private int age ;  
  4.        public Person(String name,int age){  
  5.               this.name = name ;  
  6.               this.age = age;  
  7.        }  
  8.        public String toString(){       // 覆写toString()方法  
  9.               return "姓名:" + this.name + ",年龄:" + this.age ;  
  10.        }  
  11.        public void finalize() throws Throwable{     // 对象释放空间时默认调用此方法  
  12.               System.out.println("对象被释放 --> " + this) ;  
  13.        }  
  14. };  
  15.   
  16. public class SystemDemo04{  
  17.        public static void main(String args[]){  
  18.               Person per = new Person("张三",30) ;  
  19.               per = null ;     // 断开引用  
  20.               System.gc() ;         // 强制性释放空间  
  21.        }  
  22. };  

日期操作类(Date、Calendar)

Date类是一个较为常用的类,但是其操作的日期格式会有一些不符合个人的要求,而如果想进一步取得一些自己需要的时间,则可以使用Calendar类。

Date类

在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可。

[java]  view plain copy
  1. import java.util.Date ;  
  2. public class DateDemo01{  
  3.        public static void main(String args[]){  
  4.               Date date = new Date() ;       // 直接实例化Date对象  
  5.               System.out.println("当前日期为:" + date) ;  
  6.        }  
  7. };  

Calendar类

使用此类可以直接将日期精确到毫秒

Calendar类是一个抽象类,既然是一个抽象类则肯定无法直接使用,此时就要利用对象多态性的概念,通过向上转型关系实例化本类对象

实例:

[java]  view plain copy
  1. import java.util.* ;  
  2. public class DateDemo02{  
  3.        public static void main(String args[]){  
  4.               Calendar calendar = new GregorianCalendar();    // 实例化Calendar类对象  
  5.               System.out.println("YEAR: " + calendar.get(Calendar.YEAR));  
  6.               System.out.println("MONTH: " + (calendar.get(Calendar.MONTH) + 1));  
  7.               System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));  
  8.               System.out.println("HOUR_OF_DAY: " + calendar.get(Calendar.HOUR_OF_DAY));  
  9.               System.out.println("MINUTE: " + calendar.get(Calendar.MINUTE));  
  10.               System.out.println("SECOND: " + calendar.get(Calendar.SECOND));  
  11.               System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));  
  12.        }  
  13. };  

日期操作类(DateFormat、SimpleDateFormat)

DateFormat类

此类是一个日期的格式化类,专门格式化日期的操作,因为java.util.Date类本身就已经包含了完整的期,所以只需要将此日期按照一些格式格式化显示即可。

实例:

[java]  view plain copy
  1. import java.text.DateFormat ;  
  2. import java.util.Date ;  
  3. public class DateDemo03{  
  4.        public static void main(String args[]){  
  5.               DateFormat df1 = null ;        // 声明一个DateFormat  
  6.               DateFormat df2 = null ;        // 声明一个DateFormat  
  7.               df1 = DateFormat.getDateInstance() ;   // 得到日期的DateFormat对象  
  8.               df2 = DateFormat.getDateTimeInstance() ;   // 得到日期时间的DateFormat对象  
  9.               System.out.println("DATE:" + df1.format(new Date())) ; // 按照日期格式化  
  10.               System.out.println("DATETIME:" + df2.format(new Date())) ;      // 按照日期时间格式化  
  11.        }  
  12. };  

SimpleDateFormat类

此类的功能是完成日期的显示格式化。如果想要实现转换则必须先准备好一个模板,通过此模板进行日期数字的提取工作。

实例:

[java]  view plain copy
  1. import java.text.* ;  
  2. import java.util.* ;  
  3. public class DateDemo05{  
  4.        public static void main(String args[]){  
  5.               String strDate = "2008-10-19 10:11:30.345" ;  
  6.               // 准备第一个模板,从字符串中提取出日期数字  
  7.               String pat1 = "yyyy-MM-dd HH:mm:ss.SSS" ;  
  8.               // 准备第二个模板,将提取后的日期数字变为指定的格式  
  9.               String pat2 = "yyyy年MM月dd日 HH时mm分ss秒SSS毫秒" ;  
  10.               SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ;         // 实例化模板对象  
  11.               SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ;         // 实例化模板对象  
  12.               Date d = null ;  
  13.               try{  
  14.                      d = sdf1.parse(strDate) ; // 将给定的字符串中的日期提取出来  
  15.               }catch(Exception e){                   // 如果提供的字符串格式有错误,则进行异常处理  
  16.                      e.printStackTrace() ;             // 打印异常信息  
  17.               }  
  18.               System.out.println(sdf2.format(d)) ;     // 将日期变为新的格式  
  19.        }  
  20. };  


实例操作:取得当前日期

基于Calendar类操作:

[java]  view plain copy
  1. import java.util.* ; // 导入需要的工具包  
  2. class DateTime{            // 以后直接通过此类就可以取得日期时间  
  3.        private Calendar calendar = null ;         // 声明一个Calendar对象,取得时间  
  4.        public DateTime(){                                          // 构造方法中直接实例化对象  
  5.               this.calendar = new GregorianCalendar() ;     
  6.        }  
  7.        public String getDate(){        // 得到的是一个日期:格式为:yyyy-MM-dd HH:mm:ss.SSS  
  8.               // 考虑到程序要频繁修改字符串,所以使用StringBuffer提升性能  
  9.               StringBuffer buf = new StringBuffer() ;  
  10.               buf.append(calendar.get(Calendar.YEAR)).append("-") ;    // 增加年  
  11.               buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)).append("-") ;   // 增加月  
  12.               buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)).append(" ") ;     // 取得日  
  13.               buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)).append(":") ; // 取得时  
  14.               buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)).append(":") ;  
  15.               buf.append(this.addZero(calendar.get(Calendar.SECOND),2)).append(".") ;  
  16.               buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)) ;  
  17.               return buf.toString() ;  
  18.        }  
  19.        public String getDateComplete(){        // 得到的是一个日期:格式为:yyyy年MM月dd日 HH时mm分ss秒SSS毫秒  
  20.               // 考虑到程序要频繁修改字符串,所以使用StringBuffer提升性能  
  21.               StringBuffer buf = new StringBuffer() ;  
  22.               buf.append(calendar.get(Calendar.YEAR)).append("年") ;  // 增加年  
  23.               buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)).append("月") ;       // 增加月  
  24.               buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)).append("日") ;   // 取得日  
  25.               buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)).append("时") ;      // 取得时  
  26.               buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)).append("分") ;          // 取得分  
  27.               buf.append(this.addZero(calendar.get(Calendar.SECOND),2)).append("秒") ;          // 取得秒  
  28.               buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)).append("毫秒") ;    // 取得毫秒  
  29.               return buf.toString() ;  
  30.        }  
  31.        public String getTimeStamp(){            // 得到的是一个时间戳  
  32.               // 考虑到程序要频繁修改字符串,所以使用StringBuffer提升性能  
  33.               StringBuffer buf = new StringBuffer() ;  
  34.               buf.append(calendar.get(Calendar.YEAR)) ; // 增加年  
  35.               buf.append(this.addZero(calendar.get(Calendar.MONTH)+1,2)) ;      // 增加月  
  36.               buf.append(this.addZero(calendar.get(Calendar.DAY_OF_MONTH),2)) ;  // 取得日  
  37.               buf.append(this.addZero(calendar.get(Calendar.HOUR_OF_DAY),2)) ;     // 取得时  
  38.               buf.append(this.addZero(calendar.get(Calendar.MINUTE),2)) ;         // 取得分  
  39.               buf.append(this.addZero(calendar.get(Calendar.SECOND),2));          // 取得秒  
  40.               buf.append(this.addZero(calendar.get(Calendar.MILLISECOND),3)) ;      // 取得毫秒  
  41.               return buf.toString() ;  
  42.        }  
  43.        // 考虑到日期中存在前导0,所以在此处加上补零的方法  
  44.        private String addZero(int num,int len){  
  45.               StringBuffer s = new StringBuffer() ;  
  46.               s.append(num) ;  
  47.               while(s.length()<len){   // 如果长度不足,则继续补0  
  48.                      s.insert(0,"0") ;      // 在第一个位置处补0  
  49.               }  
  50.               return s.toString() ;  
  51.        }  
  52. };  
  53. public class DateDemo06{  
  54.        public static void main(String args[]){  
  55.               DateTime dt = new DateTime() ;  
  56.               System.out.println("系统日期:"+dt.getDate()) ;  
  57.               System.out.println("中文日期:"+dt.getDateComplete()) ;  
  58.               System.out.println("时间戳:"+dt.getTimeStamp()) ;  
  59.        }  
  60. };  


基于SimpleDateFormat类操作:

实例:


[java]  view plain copy
  1. import java.util.* ; // 导入需要的工具包  
  2. import java.text.* ; // 导入SimpleDateFormat所在的包  
  3. class DateTime{            // 以后直接通过此类就可以取得日期时间  
  4.        private SimpleDateFormat sdf = null ;  // 声明SimpleDateFormat对象  
  5.        public String getDate(){        // 得到的是一个日期:格式为:yyyy-MM-dd HH:mm:ss.SSS  
  6.               this.sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;  
  7.               return this.sdf.format(new Date()) ;// 将当前日期进行格式化操作  
  8.        }  
  9.        public String getDateComplete(){        // 得到的是一个日期:格式为:yyyy年MM月dd日 HH时mm分ss秒SSS毫秒  
  10.               this.sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分ss秒SSS毫秒") ;  
  11.               return this.sdf.format(new Date()) ;// 将当前日期进行格式化操作  
  12.        }  
  13.        public String getTimeStamp(){            // 得到的是一个时间戳  
  14.               this.sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS") ;  
  15.               return this.sdf.format(new Date()) ;// 将当前日期进行格式化操作  
  16.        }  
  17. };  
  18. public class DateDemo07{  
  19.        public static void main(String args[]){  
  20.               DateTime dt = new DateTime() ;  
  21.               System.out.println("系统日期:"+dt.getDate()) ;  
  22.               System.out.println("中文日期:"+dt.getDateComplete()) ;  
  23.               System.out.println("时间戳:"+dt.getTimeStamp()) ;  
  24.        }  

  1. };  



Java常用类库(二)

-----------------------

Math与Random类

Math类表示数学操作类,在Math类中的方未予都是静态方法,直接使用“类.方法名称()”形式调用即可。

实例:

[java]  view plain copy
  1. public class MathDemo01{  
  2.     public static void main(String args[]){  
  3.         // Math类中的方法都是静态方法,直接使用“类.方法名称()”的形式调用即可  
  4.         System.out.println("求平方根:" + Math.sqrt(9.0)) ;  
  5.         System.out.println("求两数的最大值:" + Math.max(10,30)) ;  
  6.         System.out.println("求两数的最小值:" + Math.min(10,30)) ;  
  7.         System.out.println("2的3次方:" + Math.pow(2,3)) ;  
  8.         System.out.println("四舍五入:" + Math.round(33.6)) ;  
  9.     }  
  10. };  


Random类

Random类主要是产生随机数,可以产生一个指定范围的随机数,Random类是定义在java.util包中的类。

实例:

[java]  view plain copy
  1. import java.util.Random ;  
  2. public class RandomDemo01{  
  3.     public static void main(String args[]){  
  4.         Random r = new Random() ;       // 实例化Random对象  
  5.         for(int i=0;i<10;i++){  
  6.             System.out.print(r.nextInt(100) + "\t") ;  
  7.         }  
  8.     }  
  9. };  


NumberFormat类

NuberFormat的基本使用:此类主要完成数字的格式化显示。

实例:

[java]  view plain copy
  1. import java.text.* ;  
  2. public class NumberFormatDemo01{  
  3.     public static void main(String args[]){  
  4.         NumberFormat nf = null ;        // 声明一个NumberFormat对象  
  5.         nf = NumberFormat.getInstance() ;   // 得到默认的数字格式化显示  
  6.         System.out.println("格式化之后的数字:" + nf.format(10000000)) ;  
  7.         System.out.println("格式化之后的数字:" + nf.format(1000.345)) ;  
  8.     }  
  9. };  


DecimalFormat的基本使用:DecimalFormat也是Format的一个子类,主要的作用是用来格式化数字使用,当然,在格式化数字的时候要比直接使用NumberFormat更加方便,因为可以直接指按用户自定义的方式进行格式化操作,与之前SimpleDateFormat类似。

实例:

[java]  view plain copy
  1. import java.text.* ;  
  2. class FormatDemo{  
  3.     public void format1(String pattern,double value){   // 此方法专门用于完成数字的格式化显示  
  4.         DecimalFormat df = null ;           // 声明一个DecimalFormat类的对象  
  5.         df = new DecimalFormat(pattern) ;   // 实例化对象,传入模板  
  6.         String str = df.format(value) ;     // 格式化数字  
  7.         System.out.println("使用" + pattern  
  8.             + "格式化数字" + value + ":" + str) ;  
  9.     }  
  10. };  
  11. public class NumberFormatDemo02{  
  12.     public static void main(String args[]){  
  13.         FormatDemo demo = new FormatDemo() ;    // 格式化对象的类  
  14.         demo.format1("###,###.###",111222.34567) ;  
  15.         demo.format1("000,000.000",11222.34567) ;  
  16.         demo.format1("###,###.###¥",111222.34567) ;  
  17.         demo.format1("000,000.000¥",11222.34567) ;  
  18.         demo.format1("##.###%",0.345678) ;  
  19.         demo.format1("00.###%",0.0345678) ;  
  20.         demo.format1("###.###\u2030",0.345678) ;  
  21.     }  
  22. };  


大数操作类(BigInter、BigDecimal)

大数操作,一般是指在超出long、double类型能够存放的范围时使用。

                    操作整型:BigInteger

                    操作小数:BigDecimal

BigDecimal实例:

 

[java]  view plain copy
  1. import java.math.* ;  
  2. class MyMath{  
  3.     public static double add(double d1,double d2){      // 进行加法计算  
  4.         BigDecimal b1 = new BigDecimal(d1) ;  
  5.         BigDecimal b2 = new BigDecimal(d2) ;  
  6.         return b1.add(b2).doubleValue() ;  
  7.     }  
  8.     public static double sub(double d1,double d2){      // 进行减法计算  
  9.         BigDecimal b1 = new BigDecimal(d1) ;  
  10.         BigDecimal b2 = new BigDecimal(d2) ;  
  11.         return b1.subtract(b2).doubleValue() ;  
  12.     }  
  13.     public static double mul(double d1,double d2){      // 进行乘法计算  
  14.         BigDecimal b1 = new BigDecimal(d1) ;  
  15.         BigDecimal b2 = new BigDecimal(d2) ;  
  16.         return b1.multiply(b2).doubleValue() ;  
  17.     }  
  18.     public static double div(double d1,double d2,int len){      // 进行乘法计算  
  19.         BigDecimal b1 = new BigDecimal(d1) ;  
  20.         BigDecimal b2 = new BigDecimal(d2) ;  
  21.         return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;  
  22.     }  
  23.     public static double round(double d,int len){   // 进行四舍五入  
  24.         BigDecimal b1 = new BigDecimal(d) ;  
  25.         BigDecimal b2 = new BigDecimal(1) ;  
  26.         return b1.divide(b2,len,BigDecimal.ROUND_HALF_UP).doubleValue() ;  
  27.     }  
  28. };  
  29.   
  30. public class BigDecimalDemo01{  
  31.     public static void main(String args[]){  
  32.         System.out.println("加法运算:" + MyMath.round(MyMath.add(10.345,3.333),1)) ;  
  33.         System.out.println("减法运算:" + MyMath.round(MyMath.sub(10.345,3.333),3)) ;  
  34.         System.out.println("乘法运算:" + MyMath.round(MyMath.mul(10.345,3.333),2)) ;  
  35.         System.out.println("除法运算:" + MyMath.div(10.345,3.333,3)) ;  
  36.     }  
  37. };  

BigInteger实例:

[java]  view plain copy
  1. import java.math.BigInteger ;  
  2. public class BigIntegerDemo01{  
  3.     public static void main(String args[]){  
  4.         BigInteger bi1 = new BigInteger("123456789") ;  // 声明BigInteger对象  
  5.         BigInteger bi2 = new BigInteger("987654321") ;  // 声明BigInteger对象  
  6.         System.out.println("加法操作:" + bi2.add(bi1)) ;    // 加法操作  
  7.         System.out.println("减法操作:" + bi2.subtract(bi1)) ;   // 减法操作  
  8.         System.out.println("乘法操作:" + bi2.multiply(bi1)) ;   // 乘法操作  
  9.         System.out.println("除法操作:" + bi2.divide(bi1)) ; // 除法操作  
  10.         System.out.println("最大数:" + bi2.max(bi1)) ;  // 求出最大数  
  11.         System.out.println("最小数:" + bi2.min(bi1)) ;  // 求出最小数  
  12.         BigInteger result[] = bi2.divideAndRemainder(bi1) ; // 求出余数的除法操作  
  13.         System.out.println("商是:" + result[0] +   
  14.             ";余数是:" + result[1]) ;  
  15.     }  
  16. };  


对象克隆技术
对象克隆:将对象完整的复制成另一个对象,必须依靠Object类

实例:

[java]  view plain copy
  1. class Person implements Cloneable{  // 实现Cloneable接口表示可以被克隆   
  2.     private String name ;  
  3.     public Person(String name){  
  4.         this.name = name ;  
  5.     }  
  6.     public void setName(String name){  
  7.         this.name = name ;  
  8.     }  
  9.     public String getName(){  
  10.         return this.name ;  
  11.     }  
  12.     public String toString(){  
  13.         return "姓名:" + this.name ;  
  14.     }  
  15.     public Object clone()  
  16.                 throws CloneNotSupportedException  
  17.     {  
  18.         return super.clone() ;  // 具体的克隆操作由父类完成  
  19.     }  
  20. };  
  21. public class CloneDemo01{  
  22.     public static void main(String args[]) throws Exception{  
  23.         Person p1 = new Person("张三") ;  
  24.         Person p2 = (Person)p1.clone() ;  
  25.         p2.setName("李四") ;  
  26.         System.out.println("原始对象:" + p1) ;  
  27.         System.out.println("克隆之后的对象:" + p2) ;  
  28.     }  
  29. };  


比较器

Comparable接口的作用

之前Arrays类中存在sort()方法,此方法可以直接对对象数组进行排序

Coparable接口可以直接使用java.util.Arrays类进行数组的排序操作,但对象所在的类必须实现Comparable接口,用于指定排序接口。

实例:要求:定义一个学生类,里面有姓名、年龄、成绩三个属性,要求按成绩排序,如果成绩相等,则按照年龄由低到高排序

代码:

[java]  view plain copy
  1. class Student implements Comparable<Student> {    // 指定类型为Student  
  2.     private String name ;  
  3.     private int age ;  
  4.     private float score ;  
  5.     public Student(String name,int age,float score){  
  6.         this.name = name ;  
  7.         this.age = age ;  
  8.         this.score = score ;  
  9.     }  
  10.     public String toString(){  
  11.         return name + "\t\t" + this.age + "\t\t" + this.score ;  
  12.     }  
  13.     public int compareTo(Student stu){  // 覆写compareTo()方法,实现排序规则的应用  
  14.         if(this.score>stu.score){  
  15.             return -1 ;  
  16.         }else if(this.score<stu.score){  
  17.             return 1 ;  
  18.         }else{  
  19.             if(this.age>stu.age){  
  20.                 return 1 ;  
  21.             }else if(this.age<stu.age){  
  22.                 return -1 ;  
  23.             }else{  
  24.                 return 0 ;  
  25.             }  
  26.         }     
  27.     }  
  28. };  
  29. public class ComparableDemo01{  
  30.     public static void main(String args[]){  
  31.         Student stu[] = {new Student("张三",20,90.0f),  
  32.             new Student("李四",22,90.0f),new Student("王五",20,99.0f),  
  33.             new Student("赵六",20,70.0f),new Student("孙七",22,100.0f)} ;  
  34.         java.util.Arrays.sort(stu) ;    // 进行排序操作  
  35.         for(int i=0;i<stu.length;i++){   // 循环输出数组中的内容  
  36.             System.out.println(stu[i]) ;  
  37.         }  
  38.     }  
  39. };  


实际上比较器的排序原理 就是二叉树的排序算法。

基本原里:使用第一个元素作为根节点,之后如果后面的内容比根节点要小,则放在左子树如果内容比根节点内容大,则放在右子树

手动完成二叉树算法:

[java]  view plain copy
  1. class BinaryTree{  
  2.     class Node{         // 声明一个节点类  
  3.         private Comparable data ;   // 保存具体的内容  
  4.         private Node left ;         // 保存左子树  
  5.         private Node right ;        // 保存右子树  
  6.         public Node(Comparable data){  
  7.             this.data = data ;  
  8.         }  
  9.         public void addNode(Node newNode){  
  10.             // 确定是放在左子树还是右子树  
  11.             if(newNode.data.compareTo(this.data)<0){ // 内容小,放在左子树  
  12.                 if(this.left==null){  
  13.                     this.left = newNode ;   // 直接将新的节点设置成左子树  
  14.                 }else{  
  15.                     this.left.addNode(newNode) ;    // 继续向下判断  
  16.                 }  
  17.             }  
  18.             if(newNode.data.compareTo(this.data)>=0){    // 放在右子树  
  19.                 if(this.right==null){  
  20.                     this.right = newNode ;  // 没有右子树则将此节点设置成右子树  
  21.                 }else{  
  22.                     this.right.addNode(newNode) ;   // 继续向下判断  
  23.                 }  
  24.             }  
  25.         }  
  26.         public void printNode(){    // 输出的时候采用中序遍历  
  27.             if(this.left!=null){  
  28.                 this.left.printNode() ; // 输出左子树  
  29.             }  
  30.             System.out.print(this.data + "\t") ;  
  31.             if(this.right!=null){  
  32.                 this.right.printNode() ;  
  33.             }  
  34.         }  
  35.     };  
  36.     private Node root ;     // 根元素  
  37.     public void add(Comparable data){   // 加入元素  
  38.         Node newNode = new Node(data) ; // 定义新的节点  
  39.         if(root==null){ // 没有根节点  
  40.             root = newNode ;    // 第一个元素作为根节点  
  41.         }else{  
  42.             root.addNode(newNode) ; // 确定是放在左子树还是放在右子树  
  43.         }  
  44.     }  
  45.     public void print(){  
  46.         this.root.printNode() ; // 通过根节点输出  
  47.     }  
  48. };  
  49. public class ComparableDemo03{  
  50.     public static void main(String args[]){  
  51.         BinaryTree bt = new BinaryTree() ;  
  52.         bt.add(8) ;  
  53.         bt.add(3) ;  
  54.         bt.add(3) ;  
  55.         bt.add(10) ;  
  56.         bt.add(9) ;  
  57.         bt.add(1) ;  
  58.         bt.add(5) ;  
  59.         bt.add(5) ;  
  60.         System.out.println("排序之后的结果:") ;  
  61.         bt.print() ;  
  62.     }  
  63. };  


另一种比较器:Comparator

如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的,所以为了解决这样的问题,java又定义了另一具比较器的操作接口——Comparator。

实例:

[java]  view plain copy
  1. import java.util.* ;  
  2. class Student{  // 指定类型为Student  
  3.     private String name ;  
  4.     private int age ;  
  5.     public Student(String name,int age){  
  6.         this.name = name ;  
  7.         this.age = age ;  
  8.     }  
  9.     public boolean equals(Object obj){  // 覆写equals方法  
  10.         if(this==obj){  
  11.             return true ;  
  12.         }  
  13.         if(!(obj instanceof Student)){  
  14.             return false ;  
  15.         }  
  16.         Student stu = (Student) obj ;  
  17.         if(stu.name.equals(this.name)&&stu.age==this.age){  
  18.             return true ;  
  19.         }else{  
  20.             return false ;  
  21.         }  
  22.     }  
  23.     public void setName(String name){  
  24.         this.name = name ;  
  25.     }  
  26.     public void setAge(int age){  
  27.         this.age = age ;  
  28.     }  
  29.     public String getName(){  
  30.         return this.name ;  
  31.     }  
  32.     public int getAge(){  
  33.         return this.age ;  
  34.     }  
  35.     public String toString(){  
  36.         return name + "\t\t" + this.age  ;  
  37.     }  
  38. };  
  39.   
  40. class StudentComparator implements Comparator<Student>{   // 实现比较器  
  41.     // 因为Object类中本身已经有了equals()方法  
  42.     public int compare(Student s1,Student s2){  
  43.         if(s1.equals(s2)){  
  44.             return 0 ;  
  45.         }else if(s1.getAge()<s2.getAge()){   // 按年龄比较  
  46.             return 1 ;  
  47.         }else{  
  48.             return -1 ;  
  49.         }  
  50.     }  
  51. };  
  52.   
  53. public class ComparatorDemo{  
  54.     public static void main(String args[]){  
  55.         Student stu[] = {new Student("张三",20),  
  56.             new Student("李四",22),new Student("王五",20),  
  57.             new Student("赵六",20),new Student("孙七",22)} ;  
  58.         java.util.Arrays.sort(stu,new StudentComparator()) ;    // 进行排序操作  
  59.         for(int i=0;i<stu.length;i++){   // 循环输出数组中的内容  
  60.             System.out.println(stu[i]) ;  
  61.         }  
  62.     }  
  63. };  


观察者设计模式

以购房者观注房价为例,结合java.util包中提供的Obeservable类和Observer接口实现。

代码:

[java]  view plain copy
  1. import java.util.* ;  
  2. class House extends Observable{ // 表示房子可以被观察  
  3.     private float price ;// 价钱  
  4.     public House(float price){  
  5.         this.price = price ;  
  6.     }  
  7.     public float getPrice(){  
  8.         return this.price ;  
  9.     }  
  10.     public void setPrice(float price){  
  11.         // 每一次修改的时候都应该引起观察者的注意  
  12.         super.setChanged() ;    // 设置变化点  
  13.         super.notifyObservers(price) ;// 价格被改变  
  14.         this.price = price ;  
  15.     }  
  16.     public String toString(){  
  17.         return "房子价格为:" + this.price ;  
  18.     }  
  19. };   
  20. class HousePriceObserver implements Observer{  
  21.     private String name ;  
  22.     public HousePriceObserver(String name){ // 设置每一个购房者的名字  
  23.         this.name = name ;  
  24.     }  
  25.     public void update(Observable o,Object arg){  
  26.         if(arg instanceof Float){  
  27.             System.out.print(this.name + "观察到价格更改为:") ;  
  28.             System.out.println(((Float)arg).floatValue()) ;  
  29.         }  
  30.     }  
  31. };  
  32. public class ObserDemo01{  
  33.     public static void main(String args[]){  
  34.         House h = new House(1000000) ;  
  35.         HousePriceObserver hpo1 = new HousePriceObserver("购房者A") ;  
  36.         HousePriceObserver hpo2 = new HousePriceObserver("购房者B") ;  
  37.         HousePriceObserver hpo3 = new HousePriceObserver("购房者C") ;  
  38.         h.addObserver(hpo1) ;  
  39.         h.addObserver(hpo2) ;  
  40.         h.addObserver(hpo3) ;  
  41.         System.out.println(h) ; // 输出房子价格  
  42.         h.setPrice(666666) ;    // 修改房子价格  
  43.         System.out.println(h) ; // 输出房子价格  
  44.     }  
  45. };  


正则表达式

利用两段代码观察使用正则表达式的好处

不使用正则:

[java]  view plain copy
  1. public class RegexDemo01{  
  2.     public static void main(String args[]){  
  3.         String str = "1234567890" ;     // 此字符串由数字组成  
  4.         boolean flag = true ;           // 定义一个标记变量  
  5.         // 要先将字符串拆分成字符数组,之后依次判断  
  6.         char c[] = str.toCharArray() ;  // 将字符串变为字符数组  
  7.         for(int i=0;i<c.length;i++){ // 循环依次判断  
  8.             if(c[i]<'0'||c[i]>'9'){       // 如果满足条件,则表示不是数字  
  9.                 flag = false ;          // 做个标记  
  10.                 break ;                 // 程序不再向下继续执行  
  11.             }  
  12.         }  
  13.         if(flag){  
  14.             System.out.println("是由数字组成!") ;  
  15.         }else{  
  16.             System.out.println("不是由数字组成!") ;  
  17.         }  
  18.     }  
  19. };  


基本思路就是将字符串拆分,之后一个个进行比较验证,但是这样比较麻烦

使用正则表达式:

[java]  view plain copy
  1. import java.util.regex.Pattern ;  
  2. public class RegexDemo02{  
  3.     public static void main(String args[]){  
  4.         String str = "1234567890" ;     // 此字符串由数字组成  
  5.         if(Pattern.compile("[0-9]+").matcher(str).matches()){   // 使用正则  
  6.             System.out.println("是由数字组成!") ;  
  7.         }else{  
  8.             System.out.println("不是由数字组成!") ;  
  9.         }  
  10.     }  
  11. };  


Pattern、Matcher类

这两个类为正则的核心操作类,这两个类都定义在java.util.regex包中

Pattern为的主要作用是进行正则规范的编写。

而Matcher类主要是执行规范,验证一个字符串是否符合其规范。

实例:

[java]  view plain copy
  1. import java.util.regex.Pattern ;  
  2. import java.util.regex.Matcher ;  
  3. public class RegexDemo03{  
  4.     public static void main(String args[]){  
  5.         String str = "1983-07-27" ;     // 指定好一个日期格式的字符串  
  6.         String pat = "\\d{4}-\\d{2}-\\d{2}" ;   // 指定好正则表达式  
  7.         Pattern p = Pattern.compile(pat) ;  // 实例化Pattern类  
  8.         Matcher m = p.matcher(str) ;    // 实例化Matcher类  
  9.         if(m.matches()){        // 进行验证的匹配,使用正则  
  10.             System.out.println("日期格式合法!") ;  
  11.         }else{  
  12.             System.out.println("日期格式不合法!") ;  
  13.         }  
  14.     }  
  15. };  


String类对正则的支持

String对正则主要有三种支持方法:字符串匹配、字符串替换、字符串拆分

实例:

[java]  view plain copy
  1. import java.util.regex.Pattern ;  
  2. import java.util.regex.Matcher ;  
  3. public class RegexDemo06{  
  4.     public static void main(String args[]){  
  5.         String str1 = "A1B22C333D4444E55555F".replaceAll("\\d+","_") ;  
  6.         boolean temp = "1983-07-27".matches("\\d{4}-\\d{2}-\\d{2}") ;  
  7.         String s[] = "A1B22C333D4444E55555F".split("\\d+") ;  
  8.         System.out.println("字符串替换操作:" + str1) ;  
  9.         System.out.println("字符串验证:" + temp) ;  
  10.         System.out.print("字符串的拆分:") ;  
  11.         for(int x=0;x<s.length;x++){  
  12.             System.out.print(s[x] + "\t") ;  
  13.         }  
  14.     }  
  15. };  


定时调度

每当一段时间,程序会自动执行,称为定时调度。如果要使用定时调度,则必须保证程序始终运行着才可以,也就是说相当于定时调度是在程序之外又启动了一个新的线程。

Timer和TimerTask两个类完成定时调度

具体实例:

[java]  view plain copy
  1. // 完成具体的任务操作   
  2. import java.util.TimerTask ;  
  3. import java.util.Date ;  
  4. import java.text.SimpleDateFormat ;  
  5. class MyTask extends TimerTask{ // 任务调度类都要继承TimerTask  
  6.     public void run(){  
  7.         SimpleDateFormat sdf = null ;  
  8.         sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS") ;  
  9.         System.out.println("当前系统时间为:" + sdf.format(new Date())) ;  
  10.     }  
  11. };  


 

[java]  view plain copy
  1. import java.util.Timer ;  
  2. public class TestTask{  
  3.     public static void main(String args[]){  
  4.         Timer t = new Timer() ; // 建立Timer类对象  
  5.         MyTask mytask = new MyTask() ;  // 定义任务  
  6.         t.schedule(mytask,1000,2000) ;  // 设置任务的执行,1秒后开始,每2秒重复  
  7.     }  
  8. };  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值