第六章 Java API

 

第六讲 Java API

     理解API的概念

     java辅助工具的使用

     String类和StringBuffer

     基本数据类型的对象包装类

     集合类

     HashtableProperties

     System类与Runtime

     DateCalendarDateFormat

     TimerTimerTask

     MathRandom

     学习API的方法

理解API的概念

     API的概念

(Application Programming Interface)

      

     Window API

就是Windows操作系统提供的各种函数,例如,CreatWindow

     Java API

就是JDK中提供的各种Java类,例如,System类。

Java工具软件

     Borland公司的Jbuilder

     IBM公司的Visual Age

     Sun公司的Sun ONE Studio

     塞六铁克的Visual cafe

     Jcreator

     Jcreator Pro

     下载地址:http://www.Jcreator.com

     工作区(jcw)与工程(jcp)

     使用类向导创建新类

     使用动态随笔功能和自动输入功能

     指定Jcreator所有使用的JDK

     设置第三方提供的Jar

     指定启动运行类及参数

     设置多个运行配置环境

String类和StringBuffer

     位于java.lang包中。

     String类对象中的内容一旦被初始化就不能再改变。

     StringBuffer类用于封闭内容可以改变的字符串。

toString方法转换成String类型

String x=”a”+4+”c”,编译时等效于:

String x=new StringBuffer().append(“a”).append(4).append(“c”).toString();

     字符串常量(如”hello”)实际上是一种特殊的匿名String对象。比较下面两种情况的差异:

     String s1=”hello”; String s2=”hello”;

     String s1=new String(“hello”); String s2=new String(“hello”);

编程实例:逐行读取键盘输入,直到输入内容为”bye”时,结束程序。

 

public class ReadLine

{

       public static void main(String[] args)

       {

              int pos=0;

              int ch=0;

              byte []buf=new byte [1024];

              String strInfo=null;

              System.out.println("请输入内容:");

              while(true)

              {

                     try{ch=System.in.read();}catch(Exception e){e.printStackTrace();}

                     switch(ch)

                     {

                            case '\r':

                                   break;

                            case '\n':

                                   strInfo=new String(buf,0,pos);

                                   if(strInfo.equals("bye"))

                                   //if(strInfo.equalsIgnoreCase("bye"))忽略大小写。

                                   {

                                          return;

                                   }

                                   else

                                   {

                                          System.out.println(strInfo);

                                          pos=0;

                                          break;

                                   }

                            default:

                                   buf[pos++]=(byte)ch;

                     }

              }

       }    

}

String类的常用成员方法

     构造方法:

     String(byte[] bytes, int offset, int length)
          
构造一个新的 String,方法是使用指定的字符集解码字节的指定子数组。

     charAt(int index)
          
返回指定索引处的 char

     compareTo(String anotherString)
          
按字典顺序比较两个字符串。

     indexOf(int ch)
          
返回指定字符在此字符串中第一次出现处的索引。如果不存在这样的值,则返回 -1

         例:strName.indexOf(‘a’);

     indexOf(int ch, int fromIndex)
          
从指定的索引开始搜索,返回在此字符串中第一次出现指定字符处的索引。

     indexOf(String str)
          
返回第一次出现的指定子字符串在此字符串中的索引。

     indexOf(String str, int fromIndex)
          
从指定的索引处开始,返回第一次出现的指定子字符串在此字符串中的索引。

     length()
          
返回此字符串的长度。

     substring(int beginIndex)
          
返回一个新的字符串,它是此字符串的一个子字符串。

     substring(int beginIndex, int endIndex)
          
返回一个新字符串,它是此字符串的一个子字符串。

     toLowerCase()
          
使用默认语言环境的规则将此 String 中的所有字符都转换为小写。

     toUpperCase()
          
使用默认语言环境的规则将此 String 中的所有字符都转换为大写。

     valueOf(int i)
          
返回 int 参数的字符串表示形式。

     ………………………………………………………..

StringBuffer

reverse()
          
将此字符序列用其反转形式取代。

      

基本数据类型的对象包装类

     基本数据类型包装类的作用

基本数据类型

包装类

boolean

Boolean

byte

Byte

char

Character

short

Short

Int

Integer

Long

Long

float

Float

double

Double

 

编程实例:将字符串转换成整数的编程举例

在屏幕上打印出一个星号(*)组成的矩形,矩形的宽度和高度通过启动程序时传递给main方法的参数指定,并比较下面两段代码的运行效率:

String sb=new String();                      StringBuffer sb=new StringBuffer();

for(int j=0;j<w;j++)                            for(int j=0;j<w;j++)

{                                                      {

       sb=sb+*;                                           sb.append(*);

}                                                      }

 

以下黑粗体部分是“字符串转换成整数”的3种方法。

public class lesson64

{

       public static void main(String[] args)

       {

              int h=new Integer(args[0]).intValue();

              int w=Integer.parseInt(args[1]);

              /*int w=Integer.valueOf(args[1]).intValue();*/

              //StringBuffer sb=new StringBuffer();

              for(int i=0;i<h;i++)

              {

                     //sb定义在这里,可以省略下面用“//”注释的语句。

                     StringBuffer sb=new StringBuffer();

                     for(int j=0;j<w;j++)

                     {

                            sb.append('*');      

                     }

                     System.out.println(sb.toString());

                     //sb.delete(0,h+1);

              }

       }    

}

集合类

集合类用于存储一组对象,其中的每个对象称之为元素,经常会用到的有VectorEnumerationArrayListCollectionIteratorSetList等集合类和接口。

     Vector类与Enumeration接口。

         编程举例:将键盘上输入的数字序列中的每位数字存储在Vector对象中,然后在屏幕上打印出每位数字相加的结果,例如,输入32,打印出5;输入1234,打印出10。

import java.util.*;

public class TestVector

{

    public static void main(String[] args)

    {

        int sum=0;

        Vector v=new Vector();

        System.out.println("请输入数字:");

        while(true)

        {

            int b=0;

            try{b=System.in.read();}catch(Exception ex){ex.printStackTrace();}

            if(b=='\r'||b=='\n')

                break;

            else

            {

                int num=b-'0';

                v.addElement(new Integer(num));

            }  

        }

        Enumeration e=v.elements();

        while(e.hasMoreElements())

        {

            Integer intObj=(Integer)e.nextElement();

            sum+=intObj.intValue();

            //sum+=((Integer)e.nextElement()).intValue();

        }

        System.out.println(sum);

    }  

}

     Collection接口与Iterator接口

编程举例:用ArrayListIterator改写上面的例子程序。

import java.util.*;

public class TestCollection

{

public static void main(String[] args)

{

        int sum=0;

        ArrayList al=new ArrayList();

        System.out.println("请输入数字:");

        while(true)

        {

               int b=0;

               try{b=System.in.read();}catch(Exception e){e.printStackTrace();}

               if(b=='\r'||b=='\n')

               {

                      break;

               }

               else

               {

                      int num=b-'0';

                      al.add(new Integer(num));

               }

        }

        Iterator it=al.iterator();

        while(it.hasNext())

        {

               sum+=((Integer)it.next()).intValue();

        }

        System.out.println(sum);

}    

}

注意:在何种情况下使用VectorArrayList?

Vcetor类中的所有方法都是线程同步的,如果有两个线程并发的访问同一个Vector对象,这是安全的。即使有一个线程访问Vector对象时,同步监视器也是的运行的,这样程序的运行效率就会降低。ArrayList类中的所有方法都不是线程同步的,如果程序中不存在多线程安全问题,使用ArrayList会比使用Vector效率高些;如果程序中存在多线程安全问题,使用ArrayList则需要用户自己对访问ArrayList对象的程序代码进行同步处理,使用Vector则不需要这样做。

     CollectionSetList的区别如下:

CollectionSetList的父类,

         Collection各元素对象之间没有指定的顺序,允许有重复元素和多个null元素对象

         Set各元素对象之间没有指定的顺序,不允许有重复元素和最多允许有一个null元素对象

         List各元素对象之间有指定的顺序,允许有重复元素和多个null元素对象

import java.util.*;

public class TestSort

{

       public static void main(String[] args)

       {

              ArrayList al=new ArrayList();

              al.add(new Integer(2));

              al.add(new Integer(5));

              al.add(new Integer(1));

              System.out.println(al.toString());

              Collections.sort(al);

              System.out.println(al.toString());

       }    

}

 

Hashtable

Hashtable不仅可以像Vector一样动态存储一系列的对象,而且对存储的每一个对象(称为值)都要安排另一个对象(称为关键字)与之相关联。

例:

       创建了一个数字的哈希表

       Hashtable numbers=new Hashtable();

       numbers.put(“one”,new Integer(1));

       numbers.put(“two”,new Integer(2));

       numbers.put(“three”,new Integer(3));

如存在相同关键字,则修改原来的关键字所对应的值。

       要检索一个数字

       Integer n=(Integer)numbers.get(“two”);

       If(n!=null)

              {

                     System.out.println(“tow=’+n);

              }

用作关键字的类必须覆盖Object.hashCode方法和Object.equals方法。

编程举例:使用自定义类作为Hashtable的关键字类

HashTableTest

import java.util.*;

public class HashTableTest

{

       public static void main(String[] args)

       {

              Hashtable numbers=new Hashtable();

              numbers.put(new MyKey("zhangsan",18),new Integer(1));

              numbers.put(new MyKey("lisi",15),new Integer(2));

              numbers.put(new MyKey("wangwu",20),new Integer(3));

             

              Enumeration e=numbers.keys();

              while(e.hasMoreElements())

              {

                     MyKey key=(MyKey)e.nextElement();

                     System.out.print(key.toString()+"=");

                     System.out.println(numbers.get(key));

              }

              System.out.println(numbers.get(new MyKey("zhangsan",18)));        

       }    

}

MyKey

public class MyKey

{

       private String name = null;

       private int age = 0; 

       public MyKey(String name,int age)

       {

              this.name=name;

              this.age=age;

       }

 

       public boolean equals(Object obj)

       {

              if(obj instanceof MyKey)

              {

                     MyKey key=(MyKey)obj;

                     if(name.equals(key.name)&&age==key.age)

                     {

                            return true;

                     }

                     else

                     {

                            return false;

                     }

              }

              else

              {

                     return false;

              }

       }

      

       public int hashCode()

       {

              return name.hashCode()+age;

       }

 

       public String toString()

       {

              return name+","+age;

       }    

}

Properties

     Properties类是Hashtable的子类

     增加了将Hashtable对象中的关键字和值保存到文件和从文件中读取关键字和值到Hashtable对象中的方法。

     如果要用Properties.store方法存储Properties对象中的内容,每个属性的关键字和值都必须是String类型

编程举例:使用Prperties把程序的启动运行记录在某个文件中,每次运行时打印出它的运行次数。

import java.util.Properties;

import java.io.*;

public class PropertiesFile

{

 

       public static void main(String[] args)

       {

              // TODO: Add your code here

              Properties setting=new Properties();

              try

              {

                     setting.load(new FileInputStream("count.txt"));

              }

              catch(Exception e)

              {

                     setting.setProperty("count",String.valueOf(0));

              }

              int n=Integer.parseInt(setting.getProperty("count"))+1;

              System.out.println("Times:"+n);

              setting.setProperty("count",String.valueOf(n));

              try

              {

                     setting.store(new FileOutputStream("count.txt"),"Program used:");

              }

              catch(Exception e)

              {

                     e.printStackTrace();

              }

             

       }    

}

SystemRuntime

     System

n         Exit方法

       public static void exit(int status)

终止当前正在运行的 Java 虚拟机。参数用作状态码;根据惯例,非零的状态码表示异常终止,零为正常终止

该方法调用 Runtime 类中的 exit 方法。该方法永远不会正常返回。

调用 System.exit(n) 实际上等效于调用:

 Runtime.getRuntime().exit(n)
  •     CurrentTimeMillis方法
       public static long currentTimeMillis()

返回以毫秒为单位的当前时间。注意,当返回值的时间单位是毫秒时,值的粒度取决于基础操作系统,并且粒度可能更大。例如,许多操作系统以几十毫秒为单位测量时间。

返回:

当前时间与协调世界时 1970 1 1 日午夜之间的时间差(以毫秒为单位测量)。

  •          Java虚拟机的系统属性
  •        GetPropertiessetProperties方法

getProperties

       public static Properties getProperties()

确定当前的系统属性。

setProperties

       public static void setProperties(Properties props)

将系统属性设置为 Properties 参数。

getProperty

       public static String getProperty(String key)

获得指定键指示的系统属性

setProperty

       public static String setProperty(String key,String value)

设置指定键指示的系统属性。

参数:

key - 系统属性的名称。

value - 系统属性的值。

返回:

系统属性以前的值,如果没有以前的值,则返回 null

编程实例:列出Java虚拟机的系统属性

import java.util.*;

public class TestProperties

{

       public static void main(String[] args)

       {

              long startTime=System.currentTimeMillis();

              Properties pp=System.getProperties();

              pp.setProperty("name","jianke");

              System.setProperties(pp);

              Enumeration e=pp.propertyNames();

              while(e.hasMoreElements())

              {

                     String key=(String)e.nextElement();

                     System.out.println(key+System.getProperty(key));

              }

              long endTime=System.currentTimeMillis();

              System.out.println("此程序启动运行时间:"+(endTime-startTime)+"ms");

       }    

}

     Runtime

在单独的进程中执行指定的字符串命令。

  •          public void exit(int status)

通过启动虚拟机的关闭序列,终止当前正在运行的 Java 虚拟机。此方法从不正常返回。可以将变量作为一个状态码;根据惯例,非零的状态码表示非正常终止。

  •         public static Runtime getRuntime()

返回与当前 Java 应用程序相关的运行时对象。Runtime 类的大多数方法是实例方法,并且必须根据当前的运行时对象对其进行调用。

编程实例:在Java程序中启动一个Windows记事本程序运行实例,并在该运行实例中打开这个Java程序的源文件,启动的记事本程序5秒钟后被关闭。

 

public class TestRunTime

{

       public static void main(String[] args)

       {

              Process p=null;

              try

              {

                     p=Runtime.getRuntime().exec("notepad.exe TestRunTime.java");

                     Thread.sleep(5000);

                     p.destroy();

              }

              catch(Exception e)

              {

                     e.printStackTrace();

              }

       }    

}

Destroy(Process方法)

public abstract void destroy()

杀掉子进程。强制终止此 Process 对象表示的子进程。

与日期和时间有关的类

     最常用几个类:Date、DateFormat和Calendar

     Calendar类

Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。CalendargetInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:

     Calendar rightNow = Calendar.getInstance();
     public abstract void add(int field, int amount)

根据日历的规则,为给定的日历字段添加或减去指定的时间量。例如,要从当前日历时间减去 5 天,可以通过调用以下方法做到这一点:

add(Calendar.DAY_OF_MONTH, -5)

参数:

field - 日历字段。

amount - 为字段添加的日期或时间量

public int get(int field)

返回给定日历字段的值。

     ◆ public void set(int field,int value)

将给定的日历字段设置为给定值

参数:

field - 给定的日历字段。

value - 给定日历字段所要设置的值。

     GrlendarCalendar子类

编程实例:计算出距当前日期时间315天后的日期,并用“XXXXXXXXXX小时:XX分:XX秒”的格式输出。

import java.util.Calendar;

public class TestCalendar

{

       public static void main(String[] args)

       {

              Calendar c=Calendar.getInstance();

System.out.println(c.get(c.YEAR)+""+

c.get(c.MONTH) +""+c.get(c.DAY_OF_MONTH)+""+

c.get(c.HOUR_OF_DAY)+":"+c.get(c.MINUTE)+":"+c.get(c.SECOND));

              c.add(c.DAY_OF_YEAR,315);

              System.out.println(c.get(c.YEAR)+""+

c.get(c.MONTH) +""+c.get(c.DAY_OF_MONTH)+""+                           c.get(c.HOUR_OF_DAY)+":"+c.get(c.MINUTE)+":"+c.get(c.SECOND));

       }    

}

     Date

     Java.text.DateFormatgjava.text.SimpleDateFormat子类

SimpleDateFormat()
          
用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

SimpleDateFormat(String pattern)
          
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

 
 public abstract class DateFormat extends Format

DateFormat 是日期/时间格式化子类的抽象类,它以与语言无关的方式格式化并分析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、分析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年,1 月 1 日 00:00:00 这一刻开始的毫秒数。

public class SimpleDateFormat extends DateFormat

SimpleDateFormat 是一个以与语言环境相关的方式来格式化和分析日期的具体类。它允许进行格式化(日期 -> 文本)、分析(文本 -> 日期)和规范化。

SimpleDateFormat 使得可以选择任何用户定义的日期-时间格式的模式。但是,仍然建议通过 DateFormat 中的 getTimeInstancegetDateInstancegetDateTimeInstance 来新的创建日期-时间格式化程序

编程实例:将“2002-03-15”格式的日期字符串转换成“20020315日”的格式。

import java.util.*;

import java.text.*;

public class TestCalendar

{

public static void main(String[] args)

{

        SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");

        SimpleDateFormat sdf2=new SimpleDateFormat("yyyyMMdd");

        try

        {

               Date d=sdf1.parse("2002-03-15");

               System.out.println(sdf2.format(d));     

        }

        catch(Exception e)

        {

               e.printStackTrace();

        }

        System.out.println(new Date());

}    

}

TimerTimerTask

构造方法摘要

Timer()
          
创建一个新计时器。

 

Timer(boolean isDaemon)
          
创建一个新计时器,可以指定其相关的线程作为守护程序运行。

 

Timer(String name)
          
创建一个新计时器,其相关的线程具有指定的名称。

 

Timer(String name, boolean isDaemon)
          
创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护程序运行。

 

 

     Schedule方法主要有如下几种重载形式:

方法摘要

void

schedule(TimerTask task, Date time)
          
安排在指定的时间执行指定的任务。

task - 所要安排的任务。

time - 执行任务的时间。

 void

schedule(TimerTask task, Date firstTime, long period)
          
安排指定的任务在指定的时间开始进行重复的固定延迟执行

task - 所要安排的任务。

firstTime - 首次执行任务的时间。

period - 执行各后续任务之间的时间间隔,单位是毫秒。

 void

schedule(TimerTask task, long delay)

          安排在指定延迟后执行指定的任务。

task - 所要安排的任务。

delay - 执行任务前的延迟时间,单位是毫秒。

 void

schedule(TimerTask task, long delay, long period)
          
安排指定的任务从指定的延迟后开始进行重复的固定延迟执行

task - 所要安排的任务。

delay - 执行任务前的延迟时间,单位是毫秒。

period - 执行各后续任务之间的时间间隔,单位是毫秒。

     TimerTask类实例了Runnable接口,要执行的任务由它里面实现的run方法来完成。

编程实例:程序启动运行30秒启动Windows自带的计算器程序。

import java.util.*;

public class TestTimer

{

public static void main(String[] args)

{

        Timer tm=new Timer();

        tm.schedule(new MyTimerTask(tm),30000);

}    

}

 

class MyTimerTask extends TimerTask

{

private Timer tm=null;

public MyTimerTask(Timer tm)

{

        this.tm=tm;    

}

public void run()

{

        try

        {

               Runtime.getRuntime().exec("calc.exe");

        }

        catch(Exception e)

        {

               e.printStackTrace();

        }

        //结束任务的线程代码

        tm.cancel();

}

}

MathRandom

     Math类包含了所有用于几何和三角运算的方法

     Random类是一个伪随机数产生器

int

nextInt()
          
返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。

 int

nextInt(int n)
          
返回一个伪随机数,它是从此随机数生成器的序列中取出的、在 0(包括)和指定值(不包括)之间均匀分布的 int值。

例:      

public static void main(String[] args)

       {

              Random rd=new Random();

              System.out.println(rd.nextInt(100));    

       }

 

posted on 2007-07-02 12:04 大头剑客 阅读(999) 评论(0)  编辑  收藏 所属分类: 学习笔记


只有注册用户登录后才能发表评论。


网站导航:
 
<2025年2月>
2627282930311
2345678
9101112131415
16171819202122
2324252627281
2345678

导航

统计

公告

写字楼里写字间,写字间里程序员;
程序人员写程序,又拿程序换酒钱;
酒醒只在网上坐,酒醉还来网下眠;
酒醉酒醒日复日,网上网下年复年;
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员;
别人笑我忒疯癫,我笑自己命太贱;
不见满街漂亮妹,哪个归得程序员.
不管前面是地雷阵还是万丈深渊,
我都将勇往直前,义无反顾,
鞠躬尽瘁,死而后已。
—— 朱镕基总理

常用链接

留言簿(1)

随笔档案

文章分类

文章档案

学习园地

最新随笔

搜索

积分与排名

最新评论