(一)Java API概述
Java API(Java Application Programming Interface,Java应用程序接口),是Java语言提供的组织成包结构的许多类和接
口的集合。Java API为用户编写应用程序提供了极大的便利。Java API包含在JDK中,因此用户只要安装了JDK运行环境就可以
使用该API(在Java中的API就是JDK中提供的各种功能)
Java语言在不断发展,表现在JDK运行环境的版本在不断提高(目前为JDK10,因此读者学习时,可能Java API中又包含了
新的包或某,些包中又增加了新的子包,打开JDK的帮助文档,可以看到Java API的详细说明文档)
Java API包含的内容很多,主要讨论其中两个最基本的包中的主要类:语言包(java.lang)和实用包(java.util)
Java API按照内容分别组织和存放在不同的包中,Java API中的包及其主要功能按字母顺序说明如下:
java.accessibility 接口组件和助手技术的类和接口
java.applet Applet所需的类和接口
java.awt 图形用户界面所需的类和接口
java.beans Java bean所需的类和接口
java.io 系统输入/输出所需的类和接口
java.lang Java语言编程的基础类和接口
java.math 支持任意精度整数和任意精度小数的类和接口
java.naming 访问命名服务的类和接口
java.net 网络应用的类和接口
java.rmi 远程调用(RMI)的类和接口
java.security 用于安全框架的类和接口
java.sql 访问和处理数据源中数据的类和接口
java.text 支持按与语言无关方式处理文本、数据、数字和消息的类和接口
java.util 集合框架、事件模型、日期和时间机制、国际化等的类和接口
javax.rmi 支持RMI-IIOP的类和接口
javax.serverlet 支持serverlet编程的类和接口
javax.sound 支持音频设备数字接口(MIDI)的类和接口
javax.swing 扩充和增强基本图形用户界面功能的类和接口
javax.transaction 包含有几个关于事务上下文异常的类
org.omg.CORBA 支持OMG CORBA API到Java语言映射的类和接口
(二)语言包(java.lang)
java.lang包是Java语言的核心类库,包含了Java语言必不可少的系统类定义,如Object类、基本数据类型包装类、Math数
学类、Comparable接口、String和StringBuffered类、System和Runtime类、Class类操作类、Error错误类和Exception异常类、
Thread线程类和Runnable接口
java.lang包是Java语言编程使用最频繁的包(包含Java程序设计语言最基础的类),为了简化编程,系统固定地默认
导入了java.lang包,使用java.lang包中的时可以不用import语句导入
1、Object类
Object类是Java中所有类的根,所有其他的类都是由Object类派生出来的,因此根据继承的特点,在Object类中定义的成
员变量和方法,在其他类中都可以使用,部分方法声明如下:
public class Object{ //提供类的基本方法
public Object() //构造方法
public String toString() //返回当前对象的信息字符串( 把对象转换为字符串)
public boolean equals(Object obj) //比较当前对象与obj是否相等
public void finalize() throws Throwable //析构方法
public fina Clas> getClass() //返回当前对象所属的类的Class对象(获取对象的运行时类)
}
PS:equals(Object obj)方法与Java运算符"=="的含义相同,但用法不同。当两个值比较、对象或变量与值比较、两个变
量比较时,使用运算符"==";当比较两个对象时,使用equals()方法,该方法调用返回true时表示两个对象相等(或称相同),返
回false时表示两个对象不相等
public static void main(String[] args) {
// TODO Auto-generated method stub
char ch = 'A';
if ((ch == 'A') || (ch == 'a'))// 变量与值比较
System.out.println("true");
String str1 = "abc", str2 = null;
if (str1 != null) {// 对象与值比较
System.out.println(str1.equals(str2));// 两个对象比较
}
}
2、Math数学类
Math类包含了一组基本的数学运算的方法和常数,如求绝对值的abs()方法,计算三角函数的sin()方法和cos()方法,求两
个数中的较小值和较大值的min()方法和max()方法,求随机数的random()方法等
Math类是最终类(final),不能从Math类中派生其他的新类,不能被继承,其中方法都是静态最终方法,通过类名调
用,如Math.abs(),另外Math类还把E和PI定义为类的静态成员变量,其中E和PI代表数学上的相应常数
Math类的几个常用方法如下:
public final class Math extends Object //数学类,最终类
{
public static final double E=2.7182818; //静态常量e
public static final double PI=3.1415926; //静态常量π
public static double abs(double a); //返回a的绝对值,有重载方法
public static double random(); //返回一个0.0~1.0之间的随机数
public static doule sin(double a); //返回a的正弦值
}
(1)abs()方法有4个(重载方法),包括了4种基本的数值类型(double,float,int,long),其他方法类同
(2)random()方法是非常有用的方法,把random()的返回值乘上一个整数,可以得到任意区间的、double类型的随机
数;把random()的返回值乘上一个整数再转换成int类型,可以得到任意区间的、int类型的随机数
public static void main(String[] args) {
// TODO Auto-generated method stub
int i;
int[] a = new int[10];
for (i = 0; i < a.length; i++) {
a[i] = (int) (Math.random() * 100);// 产生随机数并赋值
}
for (i = 0; i < a.length; i++)
System.out.print(" " + a[i]);// 输出一维数组
int min = a[0];
for (i = 1; i < a.length; i++)
if (a[i] < min)
min = a[i]; // 寻找最小数
System.out.println("\n最小数为:" + min);
}
}
3、Comparable可比较接口(内比较器)
Java通过Comparable接口的compareTo方法约定两个对象比较大小的规则,Comparable接口声明如下:
public interface Comparable
public abstract int compareTo(T obj);
}
4、基本数据类型包装类(基本类型不能调用方法(通过包装类))
Java为每种数据类型声明了一个对应的类,称为基本数据类型的包装类,Java语言中的8种基本数据类型是:byte、
short、int、long、float、double、char和boolean,对应的8个数据类型包装类是:Byte、Short、Integer、Long、Float、
Double、Character 和 Boolean
(1)Integer整数类
Integer是int类型的包装类,声明如下,使用的是一个私有最终变量存储int整数值
public final class Integer extends Number implements Comparable
{
public static final int MIN_VALUE=0x8000000; //最小值常量
public static final double PI=0x7ffffffff; //最大值常量
public Integer(int value){ //构造方法
this.value=value;
}
public int intValue(); // 返回对象的int数据类型的数值,小数部分丢掉
public static int parseInt(String s) throws NumberFormatException //将串s按十进制转换为整数
public int compareTo(Integer iobj) //比较两个对象值大侠你,返回-1、0或1
}
注意:Integer类的静态方法parseInt()和实例方法intValue()都可以将一个字符串转化为int值,调用语句如下:
int i=Integer.parseInt("123");
int j=new Integer("123").intValue();
(2)Double浮点数类(和Integer相似)
public final class Double extends Number implements Comparable
{
public Double(double value) //构造方法
public Double(String s) throws NumberFormatException
public static double parseDouble(String s) throws NumberFormatException //将串s转换为浮点数
public double doubleValue(); //返回当前对象中浮点数的值
}
(3)基本类型和字符串之间的转换:
1、基本类型转换为字符串: (1)使用包装类的 toString() 方法、(2)使用String类的 valueOf() 方法、(3)用一个空
字符串加上基本类型,得到的就是基本类型数据对应的字符串
2、字符串转换为基本类型:(1)调用包装类的 parseXxx 静态方法、(2)调用包装类的 valueOf() 方法转换为基本类型
的包装类,会自动拆箱
5、String字符串类
定义字符串变量所使用的String不是一个基本数据类型,而是Java API中提供的类,String是常量字符串类,String对象存
储常量字符串,实例一旦创建,就不能再修改(代表不可变的字符串序列)
(1)字符串 str 中字符的索引从0开始,范围为 0 到 str.length()-1
(2)用 indexOf 进行字符或字符串查找时,如果匹配返回位置索引;如果没有匹配结果,返回 -1
(3)使用 substring(beginIndex , endIndex) 进行字符串截取时,包括 beginIndex 位置的字符,不包括 endIndex 位置的字符
public final class String implements java.io.Serializable,Comparable
{
public String() // 构造方法
public boolean isEmpty() // 判断是否为空串
public String toLowerCase() // 返回小写字符串
public Stirng toUpperCase() // 返回大写字符串
public int length() // 获取字符串的长度
public String substring(int beginIndex) 返回当前字符串的由beginIndex开始到结尾的子串(求字串)
public String substring(int beginIndex,int endIndex) 返回当前字符串的由beginIndex开始到endIndex结尾的子串
}
public static void main(String[] args) {
// Java文件名
String fileName = "HelloWorld.java";
// 邮箱
String email = "[email protected]";
// 判断.java文件名是否正确:合法的文件名应该以.java
// 获取文件名中最后一次出现"."号的位置
int index = fileName.indexOf(".");
System.out.println(index);
// 获取文件的后缀
String prefix = fileName.substring(index + 1);
System.out.println(prefix);
// 判断必须包含"."号,且不能出现在首位,同时后缀名为"java"
if (index != 0 && index != -1 && prefix.equals("java")) {
System.out.println("Java文件名正确");
} else {
System.out.println("Java文件名无效");
}
}
PS:
(1)length属性:用于获取数组长度。
(2)length():方法用于获取字符串长度。
(3)size()方法:用于获取泛型集合有多少个元素。
6、StringBuffere字符串缓冲区类
StringBuffere字符串缓冲区类采用缓冲区存储可变长的字符串,可以改变字符串对象中的指定字符,可以插入或删除
字串,当缓冲区容量不能满足要求时,将自动扩充容量适用于经常可变的一个字符序列,效率比String高,允许字符串追加在后
面也允许删除某个字符串(代表可变的字符串序列)
public static void main(String[] args) {
// 允许字符串追加在后面也允许删除某个字符串
StringBuffer str = new StringBuffer("hello");
str.append("hzx");
System.out.println(str);
}
}
7、StringBuilder类(线程不安全,用法和StringBuffer一样)
8、Class类操作类
Class类提供一组方法获得当前类信息,包括类名、父类及类所在包等,以及对类操作的通用方法,Class类的实例代表
一个正在运行的Java应用程序的类或接口,Java的基本数据类型(boolean,byte,char,shart,int,long,float,double)以
及数组和关键字void都是由Class对象来表达,Class类没有公共的构造方法,Class对象由Java虚拟机自动构造
Class类常用方法:
String static getName() //返回对象的类名
class static forName(String ClassName) //使用ClassName指定的、与类或接口相联系的class对象
class static forName(String name,boolean initialize,ClassLoader loader) // 使用loader指定的类装载器Class类
的forName()方法可用于安装驱动序,Class.forName("sun.jdbc.odbc.JdbcOdcDriver");
public static void main(String args[]) {
// 对象名.getClass()
Person p = new Person("zhangsan", 50);
Class> class1 = p.getClass();// 类型的实例class1(通过类的对象调用getCLass方法)
System.out.println(class1.getName());// 输出类名
System.out.println(class1.getSuperclass().getName());// 输出超类名
// 类名.class
Class> class2 = Person.class;// 创建一个 Class 类型的实例class2(通过类名.class)
System.out.println(class2.getName());
System.out.println(class2.getSuperclass().getName());
// 使用Class.forName();
try {
Class> class3 = Class.forName("classtype.Person");// //创建一个 Class
// 类型的实例class3(通过Class调用静态方法forName())
System.out.println(class3.getName());
System.out.println(class3.getSuperclass().getName());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
9、System系统类
System类提供标准输入输出常量和访问系统资源的方法,其中声明3个标准输入/输出常量:in、out、和err,方法都是静态的,System类部分声明如下:
public final class System extends Object
{
public static final int InputStream in=nullInputStream; //标准输入常量
public static final int OutputStream out=nullOutputStream; //标准输出常量
public static final int PrintStream err=nullPrintStream; //标准错误输出常量
public static void exit(int status) //结束当前程序运行(中断当前运行的Java虚拟机,status为状态码,非0的状态码表示不正常中断)
public static long currentTimeMills() //获得当前日期和时间
public static Properties getProperties() //获得当前系统全部属性
public static String getProperty(String key) //获得指定系统属性
public static String setProperty(Properties props) //设置props指定的属性
public static void load(String fileName) //加载本地文件系统中由文件名fileName指定的动态库
}
其中Properties是java语言包中定义的一个类,该类定义了系统属性集合,每个属性用字符串表示,其常用的几个属性值以及含义如下:
public static void main(String args[]) {
// java运行时环境版本
String str1 = System.getProperty("java.version");
System.out.println(str1);
// java虚拟机实现的版本
String str2 = System.getProperty("java.vm.version");
System.out.println(str2);
// java类的路径
String str3 = System.getProperty("java.class.path");
System.out.println(str3);
// 操作系统版本
String str4 = System.getProperty("os.version");
System.out.println(str4);
// 用户名
String str5 = System.getProperty("user.name");
System.out.println(str5);
// 用户路径
String str6 = System.getProperty("user.dir");
System.out.println(str6);
// 用户HOME路径
String str7 = System.getProperty("user.home");
System.out.println(str7);
10、Runtime运行类
每一个Java应用程序都有一个Runtime类的实例,从而允许应用程序与其运行的环境进行交互,利用Runtime类直接访问运行时环境资源
public class Runtime extends Objec0t
{
public static Runtime getRuntime() //返回与当前程序相联系的Runtime实例
public long totalMemory() //返回系统内存空间总量
public long freeMemory //返回系统内存剩余空间大小
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Runtime rtime = Runtime.getRuntime();
long totalMemory = rtime.totalMemory() / 1024;
long freeMemory = rtime.freeMemory() / 1024;
System.out.println("totalMemory: " + totalMemory + "k");
System.out.println("freeMemory: " + freeMemory + "k");
}
三、实用包(java.util)
java.util实用包提供了实现各种功能的类,主要包含日期类(日期和时间机制)、数组类、集合类(集合框架)、事件
模型、国际化等的类和接口
1、日期类(Date 类和Calendar类 )
1)Date 类提供了获取当前精确到毫秒时间的方法,并提供了许多方法截取当前时间的年、月、日等数值。
Date 类的构造方法有:
Date () //构造方法,获得系统当前日期和时间(显示并不友好,需通过SimpleDateFormat规范显示)
Date (long date) //以长整数创建一个可精确到毫秒的参数date指定时间的对象,date表示从GMT(格林威治)时
间1970-1-1 00:00:00开始至某时刻的毫秒数
public static void main(String[] args) {
// TODO Auto-generated method stub
Date date=new Date();
// long dL = 12345678l;
// Date date = new Date(dL);
System.out.println(date);
}
2)Calendar类定义了许多如YEAR、MONTH、DAY、HOUR、MINUTE、SECOND、DAY_OF_WEEK等成员变量,
Calendar类的get()方法可以获取这些成员变量的数值
public static void main(String[] args) {
// 创建Calendar对象
Calendar c = Calendar.getInstance();
// 将Calendar对象转换为Date对象
Date date = c.getTime();
// 创建SimpleDateFormat对象,指定目标格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 将日期转换为指定格式的字符串
String now = sdf.format(date);
System.out.println("当前时间:" + now);
}
2、Comparator比较器接口(外比较器)
java.lang.Comparable接口约定两个对象比较大小的规则, 一个类如果还需要其他比较对象大小的规则,可使用
java.util.Comparator比较器接口,Comparator接口声明如下:
public interface Comparator
public abstract boolean equals(Object obj);
public abstract int compare(T cobj1,T cobj2);
}
PS:有两种情况可以使用实现Comparator接口的方式:
(1)一个对象不支持自己和自己比较(没有实现Comparable接口),但是又想对两个对象进行比较
(2)一个对象实现了Comparable接口,但是开发者认为compareTo方法中的比较方式并不是自己想要的那种比较方式
3、Array数组类
Arrays类中包含有数组操作的一些常用方法(填充、比较、排序和查找),所有方法都是静态方法,大大简化程序设计人员的设计过程
1)排序
static void sort(byte[] a) :把byte类型的数组a中的元素按升序排序
static void sort(byte[] a,int fromIndex,int toIndex) :把byte类型的数组a中的、从fromIndex到toIndex的元素按升序排序
static void sort(int[] a) : 把int类型的数组a中的元素按升序排序
static void sort(int[] a,int fromIndex,int toIndex) :把int类型的数组a中的、从fromIndex到toIndex的元素按升序排序
static void sort(double[] a) :把double类型的数组a中的元素按升序排序
static void sort(double[] a,int fromIndex,int toIndex):把double类型的数组a中的、从fromIndex到toIndex的元素按升序排序
2)二分法查找
static int binarySearch(byte[] a,byte key) :在byte类型的数组a 中、使用折半查找算法查找指定元素key是否存在,若存在返回该元素的数组下标;若不存在返回-1
static int binarySearch(int[] a,int key) :在int类型的数组a 中、使用折半查找算法查找指定元素key是否存在,若存在返回该元素的数组下标;若不存在返回-1
static int binarySearch(double[] a,double key) :在double类型的数组a 中、使用折半查找算法查找指定元素key是否存在,若存在返回该元素的数组下标;若不存在返回-1
4、Enumeration接口
Enumeration接口主要用于集合类对象的序列化。一个集合类对象中包含有许多元素,所谓对象是序列化的,就是说可以依次取出该对象中的元素。
Enumeration接口定义如下:
public interface Enumeration
{
Object nextElement(); //返回后续元素
boolean hasMoreElements(); //判断是否还有后续元素
}
任何一个类,只要实现了Enumeration接口,其对象就是序列化的。所谓对象是序列化的,就是说若连续调用nextElement()方法,每次将返回该集合对象当前元素的后续元素。
例如,Vector类是一个集合类,Vector类就实现了Enumeration接口。因此,若要输出一个Vector类的对象v中的所有元素,就可以编写如下代码:
Enumeration e = v.elements();
while (e.hasMoreElements())
{
System.out.println(e.nextElement());
}
四、Java API总结
1、生成随机数的方法
(1)Math类
Math.random() ,返回带正号的double值,该值大于等于0.0且小于1.0(懂得灵活转换成获取其他数字的函数)
(2)java.util.Random包下
New Random.nextInt(int n),返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包
括)之间均匀分布的int值
2、String、StringBuffer和StringBuilder的比较
(1)String 字符串常量(对象不可变,线程安全) private final char value[];
(2) StringBuffer 字符串变量(线程安全)
(3)StringBuilder 字符串变量(非线程安全)char[] value;
PS:如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer,在大部分情况下 StringBuilder >
StringBuffer> String
3、Comparator 和 Comparable 的区别
相同点:都是java的一个接口,并且是用来对自定义的class比较大小的;
不同点:
(1)Comparable:Comparable 定义在 Person类的内部
public class Persion implements Comparable {..比较Person的大小..},
因为已经实现了比较器,那么我们的Person现在是一个可以比较大小的对象,它的比较功能和String完全一样,可以随时
随地的拿来比较大小,因为Person现在自身就是有大小之分的。Collections.sort(personList)可以得到正确的结果。
(2)Comparator:Comparator 是定义在Person的外部的,此时我们的Person类的结构不需要有任何变化,如
public class Person{ String name; int age }
然后我们另外定义一个比较器:
public PersonComparator implements Comparator() {..比较Person的大小..},
在PersonComparator里面实现了怎么比较两个Person的大小,所以用这种方法,当我们要对一个 personList进行
序的时候, 我们除了了要传递personList过去,还需要把PersonComparator传递过去,因为怎么比较Person的大小是在
PersonComparator里面实现的, 如Collections.sort( personList , new PersonComparator() ).