Java基础类库(系统包)
Java基础类库(系统包)是Java系统为程序员提供的一系列标准类,按照用途实现的功能不同归属于不同的包中,是 Java 的API(Application Program Interface)。
Java提供了丰富的基础类库,如Java 8提供了4000多个基础类,这些类可以帮我们降低开发难度,提高开发效率。但是这些基础类并不需要我们去背,我们只需要在平常的使用中去反复的查阅API文档,就可以记住大部分功能。
Java® Platform, Standard Edition & Java Development Kit
Version 11 API Specification 所有包的层次结构
官网 https://docs.oracle.com/en/java/javase/11/docs/api/overview-tree.html
中文 https://www.runoob.com/manual/jdk11api/overview-tree.html
Java 常用包的简单介绍如下:
java.lang 包:主要含有与语言相关的类。java.lang 包由解释程序自动加载,不需要显式说明(不需要用import)。Java语言包(java.lang)定义了Java中的大多数基本类,由Java语言自动调用,不需要显示声明。该包中包含了Object类,Object类是所有 Java 类的祖先,是整个类层次结构的根结点,同时还定义了基本数据类型的包装类(Wrapper Classes),如:String、Boolean、Byter、Short等,这些类支持数字类型的转换和字符串的操作等。System类与Runtime类也在Java.lang包里。Thread类也在Java.lang包里,Thread类是非常重要的线程类。
java.io 包:主要含有与输入/输出相关的类,这些类提供了对不同的输入和输出设备读写数据的支持,这些输入和输出设备包括键盘、显示器、打印机、磁盘文件等。程序的输入和输出可以说是程序与用户之间沟通的桥梁,通过输入输出操作实现用户与程序的交互。在Java中用java.io包来管理所有与输入和输出有关的类与接口。其中有5个重要的类分别是:InputStream、OutStream、Reader、Writer和File类,几乎所有的输入输出类都是继承这5个类而来的。
java.util 包:含有的类有Scanner 类、集合类(集合框架)、日期(Date)类等。此包中早期遗留的向量(Vector)、哈希表(Hashtable)、堆栈(Stack),有人不建议继续使用。
java.swing 包和 java.awt 包:提供了创建图形用户界面元素的类。通过这些元素,编程者可以控制所写的 Applet 或 Application 的外观界面。包中包含了窗口、对话框、菜单等类。
java.net 包:含有与网络操作相关的类,如 TCP Scokets、URL 等工具。
java.sql包: 提供与数据库连接的接口。
java.security包 提供安全方面的支持。
下面选取部分介绍
java.lang包中的类
java.lang包定义了Java中的大多数基本类,由Java语言自动调用,不需要显示声明。
☆Object类
该类是所有类的子类,如果一个类没有显示继承指定父类,则会默认继承Object类。所以任何对象都可以调用Object的方法。也就是说,Java Object 类是所有类的父类, Java 的所有类都继承了 Object,子类可以使用 Object 的所有方法。
Object 类可以显示继承,也可以隐式继承,以下两种方式时一样的:
显示继承:
public class Runoob extends Object{
……
}
隐式继承:
public class Runoob {
……
}
Object类构造函数
构造函数 | 描述 |
Object() | 构造一个新对象。 |
Object类的方法
方法 | 描述 |
创建并返回一个对象的拷贝 | |
比较两个对象是否相等 | |
当 GC (垃圾回收器)确定不存在对该对象的有更多引用时,由对象的垃圾回收器调用此方法。 | |
获取对象的运行时对象的类 | |
获取对象的 hash 值 | |
唤醒在该对象上等待的某个线程 | |
唤醒在该对象上等待的所有线程 | |
返回对象的字符串表示形式 | |
让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。 | |
让当前线程处于等待(阻塞)状态,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过参数设置的timeout超时时间。 | |
与 wait(long timeout) 方法类似,多了一个 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒。。 |
☆System类
官网 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/System.html
中文 https://www.runoob.com/manual/jdk11api/java.base/java/lang/System.html
System类代表当前Java程序的运行平台,位于java.lang包下,该类被private修饰,所以不能创建System类的对象,System类提供了一些类变量和方法,允许直接通过System类来调用这些类变量和方法。
System类提供了代表标准输入、标准输出和错误输出的类变量,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。
System类中包含了in、out和err三个成员变量,分别代表标准输入流(键盘输入)、标准输出流(显示器)和标准错误输出流(显示器):
public final static InputStream in; //标准输入流
public final static PrintStream out; //标准输出流
public final static PrintStream err; //标准错误流
System.out是一个已经预先处理过的,被包装成PrintStream的对象。和System.out一样,System.err也是一个PrintStream,但是System.in不是,它是一个未经处理的InputStream。也就是说,可以直接使用System.out和System.err打印输出到控制台,使用比较简单,但是使用System.in直接读取数据不可行,必须变通(如数据转换或包装)处理。
java 里System.in 输入流的使用
System.in是一个很原始、很简陋的输入流对象,因为只能按字节读取,返回值是占一个字节的整形数据,通常不直接使用它来读取用户的输入,一般需要变通(如数据转换或包装)处理,包装成字符流的示例如下:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str;
str = br.readLine();
下面将进一步介绍。
现在给出使用System.in的几种方式:
1)构造Scanner对象:Scanner in = new Scanner(System.in);
下面给出具体例子
import java.util.Scanner; //导入 java.util.Scanner;
public class IOTestA {
public static void main(String[] args) {
System.out.println("hello world!");
// System.in的使用
Scanner in=new Scanner(System.in);
System.out.println("请输入姓名");
String name=in.nextLine();//从键盘读一行
System.out.println(name);
System.out.print("请输入");
String word=in.next();//从键盘读一个数据,空格为分隔符
System.out.println(word);
}
}
2)使用InputStream input = System.in;
下面给出具体例子:
import java.io.InputStream;
public class TestSysC {
public static void main(String[] args) throws Exception { // 所有异常 抛出
InputStream input = System.in; // System.in的使用,从键盘接收数据
byte b[] = new byte[1024]; // 开辟空间,接收数据
System.out.print("请输入内容:"); // 信息提示
int len = input.read(b); // 接收数据
System.out.println("输入的内容为:" + new String(b, 0, len));
input.close(); // 关闭输入流
}
}
3)构造BufferedReader对象:BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 关于这句的意思参见 https://blog.csdn.net/lzh_86/article/details/78107597
下面给出具体例子:
import java.io.*;
public class LineInTest
{
public static void main(String[] args)
{
String s=" ";
System.out.print("请输入一个字符串: ");
try
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
s = in.readLine();
System.out.println("你输入的字符串是: "+s);
}catch(Exception e) {}
//System.out.println("你输入的字符串是: "+s);
}
}
4)使用System.in.read()读取从控制台输入的字节
System.in.read()时,键盘上按下的任何一个键都会被当做是输入值——包括Enter键也会被当做是一个值,当我们按下Enter的时候,实际上发送两个键值:一个回车(13),一个是换行(10)——返回一个整型字节数据。并且,需要使用 throws Exception或将System.in.read()放在try块中。
下例通过变通处理,可以一次处理一个字符:
public class CharInTest{
public static void main( String args[] ) throws Exception {
char c=' ';
System.out.print("请输入一个字符: ");
c=(char)System.in.read();
System.out.println("你输入的是: "+c);
}
}
或
public class CharInTest2
{
public static void main(String[] args)
{
char c=' ';
System.out.print("请输入一个字符: ");
try
{
c = (char) System.in.read();
System.out.println("你输入的是: "+c);
}catch(Exception e) {}
//System.err.println(e.toString());
}
}
下例变通处理字符串:
public class LinInTest2
{
public static void main(String args[])
{
try
{
byte bArray[]=new byte[128];
String str;
System.out.println("请输入字符串:");
System.in.read(bArray);
str = new String(bArray);
System.out.println("你输入的是:" + str);
}
catch(Exception e)
{
//System.err.println(e.toString());
}
}
}
关于System.in.read() 的官网见: https://docs.oracle.com/javase/7/docs/api/java/io/InputStream.html
关于System.in.read()用法 参见https://blog.csdn.net/wangluqinglxq/article/details/38060299
关于System类对IO的支持 参见 java的IO操作:System类对IO的支持 https://www.cnblogs.com/alsf/p/6854540.html
关于数据的输入输出更多内容,参见“Java输入输出” https://blog.csdn.net/cnds123/article/details/112132155
System中其它常用的方法
1、System.arraycopy(a,b,c,d,e);
其中,a是被复制的数组,b是复制的起始位置,c是复制到的数组,d是复制到这个数组的起始位置,e是复制到这个数组的结束位置。
2、System.currentTimeMillis();
返回毫秒数,这个就比较简单了,和Date类中的getTime方法一样。
例子
public class TestSysA{
public static void main(String[] args){
//当前时间的毫秒值
System.out.println(System.currentTimeMillis());
//我们可以计算一段程序用了多少毫秒,例如
long start = System.currentTimeMillis();
for(int i = 0 ; i < 10000 ; i++){
System.out.println("hello"+i);
}
long end = System.currentTimeMillis();
System.out.println("这段程序共用了"+(end - start)+"毫秒"); //输出
}
}
3、getProperty获取系统属性,如:
public class TestSysB{
public static void main(String[] args){
//当前系统属性值
System.out.println("当前系统:"+System.getProperty("os.name"));
//环境变量
System.out.println("环境变量:"+System.getenv("path"));
}
}
☆Runtime类
Runtime类代表java程序的运行时环境,可以通过它访问JVM的相关信息,如处理器数量,内存信息等,它还可以通过exec()方法来启动一个进程或执行操作系统命令。每个java程序都有一个与之对应的Runtime实例,在程序中可以通过getRuntime()获得对应的Runtime对象。
例、
public class TestRuntimeA {
public static void main (String[] args) throws Exception {
Runtime rt = Runtime.getRuntime();
System.out.println("处理器数量" + rt.availableProcessors()); //CPU数量
rt.exec("notepad.exe"); //打开运行记事本程序
}
}
☆Math类
Math类提供了常用的数学运算方法以及Math.PI和Math.E两个数学常量。该类是final的,不能被继承,类中的方法和属性全部是静态,不允许在类的外部创建Math类的对象。因此,只能使用Math类的方法而不能对其作任何更改。
Math类的主要方法如下表:
方法 | 功能 |
int abs(int i) | 求整数的绝对值(另有针对long、float、double的方法) |
double ceil(double d) | 不小于d的最小整数(返回值为double型) |
double floor(double d) | 不大于d的最大整数(返回值为double型) |
int max(int i1,int i2) | 求两个整数中最大数(另有针对long、float、double的方法) |
int min(int i1,int i2) | 求两个整数中最小数(另有针对long、float、double的方法) |
double random() | 产生0~1之间的随机数 |
int round(float f) | 求最靠近f的整数 |
long round(double d) | 求最靠近d的长整数 |
double sqrt(double a) | 求平方根 |
double sin(double d) | 求d的sin值(另有求其他三角函数的方法如cos,tan,atan) |
double log(double x) | 求自然对数 |
double exp(double x) | 求e的x次幂(ex) |
double pow(double a, double b) | 求a的b次幂 |
例、产生10个10~100之间的随机整数。
☆字符串类
字符串是字符的序列。在 Java 中,字符串无论是常量还是变量都是用类的对象来实现的。java.lang 提供了两种字符串类:String 类和 StringBuffer 类。
String 类是 immutable(不可改变的) 的 Unicode(一种国际标准编码方案) 字符序列,其作用是实现一种不能改变的静态字符串。例如,把两个字符串连接起来的结果是生成一个新的字符串,而不会使原来的字符串改变。实际上,所有改变字符串的结果都是生成新的字符串,而不是改变原来字符串。
字符串与数组的实现很相似,也是通过 index 编号来指出字符在字符串中的位置的,编号从0 开始,第 2 个字符的编号为 1,以此类推。如果要访问的编号不在合法的范围内,系统会产生 StringIndexOutOfBoundsExecption 异常。如果 index 的值不是整数,则会产生编译错误。
String 创建字符串的方法
方法 | 功能 |
String s=”Hello!” | 用字符串常量自动创建 String 实例。 |
String s=new String(String s) | 通过 String 对象或字符串常量传递给构造方法。 |
public String(char value[]) | 将整个字符数组赋给 String 构造方法。 |
public String(char value[], int offset, int count) | 将字符数组的一部分赋给 String 构造方法,offset 为起始下标,count为子数组长度。 |
String 类不能改变字符串对象中的内容,只能通过建立一个新串来实现字符串的变化。如果字符串需要动态改变,就需要用 StringBuffer 类。StringBuffer 类主要用来实现字符串内容的添加、修改、删除,也就是说该类对象实体的内存空间可以自动改变大小,以便于存放一个可变的字符序列。
StringBuffer 类提供的三种构造方法
构造方法 | 说明 |
StringBuffer() | 使用该无参数的构造方法创建的 StringBuffer 对象,初始容量为 16 个字符,当对象存放的字符序列大于 16 个字符时,对象的容量自动增加。该对象可以通过 length()方法获取实体中存放的字符序列的长度,通过 capacity()方法获取当前对象的实际容量。 |
StringBuffer(int length) | 使用该构造方法创建的 StringBuffer 对象,其初始容量为参数 length 指定的字符个数,当对象存放的字符序列的长度大于 length 时,对象的容量自动增加,以便存放所增加的字符。 |
StringBuffer(Strin str) | 使用该构造方法创建的 StringBuffer 对象,其初始容量为参数字符串 str 的长度再加上 16 个字符。 |
几种 StringBuffer 类常用的方法
方法 | 说明 |
append() | 使用 append() 方法可以将其他 Java 类型数据转化为字符串后再追加到 StringBuffer 的对象中。 |
insert(int index, String str) | insert() 方法将一个字符串插入对象的字符序列中的某个位置。 |
setCharAt(int n, char ch) | 将当前 StringBuffer 对象中的字符序列 n 处的字符用参数 ch 指定的字符替换,n 的值必须是非负的,并且小于当前对象中字符串序列的长度。 |
reverse() | 使用 reverse()方法可以将对象中的字符序列翻转。 |
delete(int n, int m) | 从当前 StringBuffer 对象中的字符序列删除一个子字符序列。这里的 n 指定了需要删除的第一个字符的下标,m 指定了需要删除的最后一个字符的下一个字符的下标,因此删除的子字符串从 n~m-1。 |
replace(int n, int m, String str) | 用 str 替换对象中的字符序列,被替换的子字符序列由下标 n 和 m 指定。 |
java.util 包中的类
☆Date 类
Date 类是 Java 中的日期时间类,其构造方法比较多,下面是常用的两个:
Date():使用当前的日期和时间初始化一个对象。
Date(long millisec):从1970年01月01日00时(格林威治时间)开始以毫秒计算时间,计算 millisec 毫秒。如果运行 Java 程序的本地时区是北京时区(与格林威治时间相差 8 小时),Date dt1=new Date(1000);,那么对象 dt1 就是1970年01月01日08时00分01秒。
一些比较常用的 Date 类方法:
方法 | 功能 |
boolean after(Date date) | 若调用 Date 对象所包含的日期比 date 指定的对象所包含的日期晚,返回 true,否则返回 false。 |
boolean before(Date date) | 若调用 Date 对象所包含的日期比 date 指定的对象所包含的日期早,返回 true,否则返回 false。 |
Object clone() | 复制调用 Date 对象。 |
int compareTo(Date date) | 比较调用对象所包含的日期和指定的对象包含的日期,若相等返回 0;若前者比后者早,返回负值;否则返回正值。 |
long getTime() | 以毫秒数返回从 1970 年 01 月 01 日 00 时到目前的时间。 |
int hashCode() | 返回调用对象的散列值。 |
void setTime(long time) | 根据 time 的值,设置时间和日期。time 值从 1970 年 01 月 01 日 00 时开始计算。 |
String toString() | 把调用的 Date 对象转换成字符串并返回结果。 |
public Static String valueOf(type variable) | 把 variable 转换为字符串。 |
Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。若需要修改时间显示的格式可以使用“SimpleDateFormat(String pattern)”方法。
☆Scanner 类
官网 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Scanner.html
中文 https://www.runoob.com/manual/jdk11api/java.base/java/util/Scanner.html