Java是一种面向对象语言,Java中的类把方法与数据连接在一起,构成了自包含式的处理单元。为了提升 Java开效率,Java类包中提供了很多常用类以方便开发人员使用。正所谓,有专攻,在常用类中主要包含可以将基本数据类型封装起来的包装类、解决常见数学问题的Math 类、生成随机数的Random类,以及处理日期时间的相关类等。
11.1包装类
Java是一种面向对象的语言,但在Java中不能定义基本数据类型的对象,为了能将基本数据类型视为对象来处理,Java提出了包装类的概念,它主要是将基本数据类型封装在包装类中,如int型的包装类Integer、boolean型的包装类Boolean等,这样便可以把这些基本数据类型转换为对象进行处理。
思维导图
11.1.1 Integer类
java .lang 包中的 Integer 类、Byte 类,Short类和Long类,分别将基本数据类型类型,int、byte、short和long封装成一个类,由于这些类都是Number 类的子类,区别就是封装不同的数据类型,其包含的方法基本相同,所以本节Integer类为例讲解整数包装类。Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段。此外该类提供了多个方法,能在int类型和 String 类型之间互相转换,同时还提供了其他一些处理int类型时非常有用的常量和方法。
例题代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
int num =Integer.parseInt("456");//将字符串转换为int类型
Integer iNum=Integer.valueOf("456");//创建一个Integer对象
System.out.println("int数据与Integer对象的比较:"+iNum.equals(num));
String str2=Integer.toBinaryString(num);//获取数字的二进制表示
String str3=Integer.toHexString(num);//获取数字的十六进制表示
String str4=Integer.toOctalString(num);//获取数字的八进制表示
String str5=Integer.toString(num,15);//获取数字的十五进制表示
System.out.println("456的二进制表示为:"+str2);
System.out.println("456的十六进制表示为:"+str3);
System.out.println("456的八进制表示为:"+str4);
System.out.println("456的十五进制表示为:"+str5);
}
}
//11.1
结果:
Integer类提供了以下4个常量:
MAX_VALUE:表示int类型可取的最大值,即2^31-1
MIN_VALUE:表示int类型可取的最小值,即-2^31。
SIZE:用来以二进制补码形式表示int值的位数。
TYPE:表示基本类型int的Class实例。
例题代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
int maxint=Integer.MAX_VALUE;//获取Integer类的常量值
int minint=Integer.MIN_VALUE;
int intsize=Integer.SIZE;
System.out.println("int类型可取的最大值是:"+maxint);//将常量值输出
System.out.println("int类型可取的最小值是:"+minint);
System.out.println("int类型的二进制位数是:"+intsize);
}
}
//11.2
结果:
11.1.2 Double类
Double 类和 Float 类是对double、float基本类型的封装,它们都是Number类的子类,都是对浮卢数进行操作,所以常用方法基本相同,本节将对Double 类进行讲解。对于Float类,可以参考Double类的相关内容。
Double 类在对象中包装一个基本类型为double的值,每个Double类的对象都包含一个 double类型的字段。此外,该类还提供多个方法,可以将double类型转换为String类型,将String类型转换为double类型,也提供了其他一些处理double 类型时有用的常量和方法。Double 类的常用方法如表
例题代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
Double dNum=Double.valueOf("3.14");//创建一个Double对象
//判断是否为非数字值
System.out.println("3.14是否为非数字值:"+Double.isNaN(dNum.doubleValue()));
System.out.println("3.14转换为int值为:"+dNum.intValue());//转换为int类型
//判断大小
System.out.println("值为3.14的Double对象与3.14的比较结果:"+dNum.equals(3.14));
//转换为十六进制
System.out.println("3.14的十六进制表示为:"+Double.toHexString(dNum));
}
}
//11.3
结果:
11.1.3 Boolean类
Boolean类将基本类型为boolean包装在一个对象中。一个Boolean类型的对象只包含一个类为boolean 的字段。此外,此类还为boolean 类型和 String类型的相互转换提供了许多方法,并提供了处理boolean类型时非常有用的其他一些常量和方法。Boolean 类的常用方法如表
例题代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
Boolean b1=Boolean.valueOf("true");//创建Boolean对象
Boolean b2=Boolean.valueOf("ok");
System.out.println("b1:"+b1.booleanValue());
System.out.println("b2:"+b2.booleanValue());
}
}
结果:
11.1.4 Character类
Character类在对象中包装一个基本类型为char的值,该类提供了多种方法,以确定字符的类别(小局字母、数字等),并可便地将字符从大写转换成小写,反之亦然。Character类提供了很多法来完成对字符的操作,常用的方法如表
例题代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
Character mychar1=Character.valueOf('A');
Character mychar2=Character.valueOf('a');
if(Character.isUpperCase(mychar1)) {//判断是否为大写字母
System.out.println(mychar1+"是大写字母");
//转换为小写并输出
System.out.println("转换为小写字母的结果:"+Character.toLowerCase(mychar1));
}
if(Character.isLowerCase(mychar2)) {//判断是否为小写字母
System.out.println(mychar2+"是小写字母");
//转换为大写字母并输出
System.out.println("转换为大写字母结果:"+Character.toUpperCase(mychar2));
}
}
}
结果:
11.1.5 Number类
前面介绍了Java中的包装类,对于数值型的包装类,它们有一个共同的父类--Number类,该类是一个抽象类,它是Byte、Integer、Short、Long、Float和Double类的父类,其子类必须提供将表示的数值转换为byte、int、short、long、float和double的方法。例如,doubleValue()方法返回双精度浮点值,floatValue()方法返回单精度浮点值,这些方法如表
11.2 数字处理
在Java语言中,提供了一个执行数学基本运算的Math类,该类包括常用的数学运算方法,如三角函数方法、指数函数方法、对数函数方法、平方根函数方法等一些常用数学函数方法。除此之外还提供了一些常用的数学常量,如PI、E等。
11.2.1 数字格式化
数字格式化在解决实际问题时应用非常普遍,如表示某超市的商品价格,需要保留两位有效数字。数字格式化操作主要针对的是浮点型数据,包括double型和float型数据。
cimalFormat 类是NumberFormat的一个子类,用于格式化十进制数字。它可以将一些数字格式为整数、浮点数、百分数等。通过使用该类可以为要输出的数字加上单位或控制数字的精度。一般况下,可以在实例化DecimalFormat对象时传递数字格式,也可以通过DecimalFormat类中的 applyPattern()方法来实现数字格式化。
格式化数字时,可在DecimalFormat类中使用一些特殊字符构成一个格式化模板,使数字按照一定的特殊字符规则进行匹配。
结果:
DecimalFormat myFormat=new DecimalFormat();
//实例化DecimalFormat类对象
myFormat.setGroupingSize(2):
//设置将数字分组的大小
myFormat.setGroupingUsed(false); //设置是否支持分组
setGroupingSize()方法设置格式化数字的分组大小,setGroupingUsed()方法设置是否可以对数字进行分组操作。
例题代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
DecimalFormat myFormat=new DecimalFormat();
myFormat.setGroupingSize(2);
String output=myFormat.format(123456.789);
System.out.println("将数字以每两个数字分组"+output);
myFormat.setGroupingUsed(false);
String output2=myFormat.format(123456.789);
System.out.println("不允许数字分组"+output2);
}
}
结果:
11.2.2 Math类
Math类提供了众多数学函数方法,主要包括三角函数方法,指数函数方法,取整函数方法,取最大值、最小值,以及平均值函数方法。这些方法都被定义为 static形式,所以在程序中应用比较简便。可以使用如下形式调用:
Math.数学方法
Math类,外存在一常用数常量,如PIE等。这些数学常量作为Math的成员变量出现,调用起来也很简单。可以使用如下形式调用:
Math.PI
Math.E
1.三角函数方法
Math类中包含的三角函数方法如下:
public static double sin(doublea):返回角的三角正弦。
public static double cos(double a):返回角的三角余弦。
public static double tan(double a):返回角的三角正切。
public static double asin(double a):返回一个值的反正弦。
public static double acos(double a):返回一个值的反余弦。
public static double atan(double a):返回一个值的反正切。
public static double toRadians(doubleangdeg):将角度转换为弧度。
public static double toDegrees(double angrad):将弧度转换为角度。
以上每个方法的参数和返回值都是double型的。将这些方法的参数的值设置为double型是有一定理的,参数以弧度代替角度来实现,其中1°等于PI/180弧度,所以180度可以使用PI弧度来表示。了可以获取角的正弦、余弦、正切、反正弦、反余弦、反正切,Math类还提供了角度和弧度相互车的方法toRadians()和toDegrees()。但需要注意的是,角度与弧度的转换通常是不精确的。
结果:
2、指数函数方法
Math类中与指数相关的函数方法如下。
M public static double exp(double a): 用于获取 e的 a 次方,即取 eª。
public static double log(doublea):用于取自然对数,即取 lna 的值
public static double log10(doublea):用于取底数为10的a的对数。
M public static double sqrt(double a):用于取a的平方根,其中a的值不能为负值。
public static double cbrt(doublea):用于取a的立方根。
public static double pow(doubleadoubleb):用于取a的b次方。
指数运算包括求方根、取对数以及求n次方的运算。
3、取整函数方法
具体的问题中,取整操作使用也很普遍,所以Java在Math数字取方法。Math类中主要包括以下几种取整方法:
public static double ceil(double a):返回大于等于参数的最小整数。向上取整
public static double floor(double a):返回小于等于参数的最大整数。向下取整
blic static double rint(doublea):返回与参数最接近的整数,如果存在两个同样接近的整数,则结果取偶数。
public static int round(floata):将参数加上0.5后返回与参数最近的整数。
public static long round(double a):将参数加上0.5后返回与参数最近的整数,然后强制转换为长整型。
注意:由于数10和数2.0距离数1.5都是0.5个单位长度,因此Mathrint(1.5)返回偶数2.0。
4.取最大值、最小值、绝对值函数方法
在程序中最常用的方法就是取最大值、最小值、绝对值等,Math类包括操法如下:
ublic static double max(double a,doubleb):取a与b之间的最大值。
public static int min(inta,intb):取a与b之间的最小值,参数为整型。
public static long min(longa,longb):取a与b之间的最小值,参数为长整型。
public static float min(floata,floatb):取a与b之间的最小值,参数为单精度浮点型。
public static double min(double a,doubleb):取a与b之间的最小值,参数为双精度浮点型。
public static int abs(int a):返回整型参数的绝对值。
public static long abs(longa):返回长整型参数的绝对值。
public static float abs(floata):返回单精度浮点型参数的绝对值。
public static double abs(doublea):返回双精度浮点型参数的绝对值。
结果:
11.2.3 Random类
Random类是JDK中的随机数生成器类,语法如下:
Random r=new Random();
以这种方式实例化对象时,Java编译器将以系统当前时间作为随机数生成器的种子。因为每时每刻的时间不可能相同,所以产生的随机数不同。但是如果运行速度太快,也会产生两个运行结果相同的随机数。
用户也可以在实例化Random类对象时,设置随机数生成器的种子。语法如下:
Random r=new Random(seedValue);
在Random类中,提供了获取各种数据类型随机数的方法,下面列举几个常用的方法:
public int nextInt():返回一个随机整数。
public int nextInt(intn):返回大于等于0且小于n的随机整数。
public long nextLongO:返回一个随机长整型值。
public boolean nextBoolean():返回一个随机布尔型值。 public float nextFloat0:返回一个随机单精度浮点型值。
public double nextDouble():返回一个随机双精度浮点型值。
public double nextGaussian():返回一个概率密度为高斯分布的双精度浮点型值。
11.2.4 BigInteger 类
BigInteger类的数字范围较 Integer 类的数字范围要大得多。前文介绍过Integer 类是 int的包装类 int的最大值为2^31-1,如果要计算更大的数字,使用Integer类就无法实现了,所以Java中提供了 nteger数字。BigInteger支持意度的整数,也就是说,在运算中BigInte类可以准确地表示任何大小的整数值而不会丢失信息。
在BigInteger类中封装了多种操作,除了基本的加、减、乘、除操作,还提供了绝对值、相反数、最大公约数以及判断是否为质数等操作。
使用BigInteger类,可以实例化一个BigInteger对象,并自动调用相应的构造函数。BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。
例如,将2转换为BigInteger类型,可以使用以下语句进行初始化操作:
Biginteger twolnstance=new BigInteger("2");
注意
参数2的双引号不能省略,因为参数是以字符串的形式存在的。
11.2.5 BigDecimal 类
BigDecimal类和BigInteger类都能实现大数字的运算,不同的是BigDecimal类加入了小数的概念。一般的float型和double型数据只可以用来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高,所以要用到BigDecimal类。BigDecimal类支持任何精度的定点数,可以用它来精确计算货币值。
BigDecimal类型的数字可以用来做超大的浮点数的运算,如加、减、乘、除等,但是在所有的运算中除法是最复杂的,因为在除不尽的情况下商小数点后的末位的处理是需要考虑的。
在上述方法中,BigDecimal类中divide()方法有多种设置,用于返回商小数点后的末位处理。
11.3 System 类
System类是JDK中提供的系统类,该类是用final修饰的,所以不允许被继承。System类提供了很多系统层面的操作方法,并且这些方法全都是静态的。
11.3.1 控制台输出字符
使用这两个输出方法时还要注意以下两点:
(1)
System.out.println("\n");会打印两个空格
(2)
System.out.println();无参数会报错
11.3.2 计时
System.currentTimemMillis()方法可以获取自1970年1月1日零点至今的毫秒数。虽然Date日期类也有类似的方法,但代码会比System类多,所以System.currentTimemMillis()方法是为获取当前毫秒数最常用的方法。因为该方法的返回值精确到毫秒, 所以可以利用该方法来记录程序的运行时间。
public static void main(String[] args) {
// TODO Auto-generated method stub
long start=System.currentTimeMillis();
String str=null;
for(int i=0; i<10000;i++) {
str+=i;
}
long end=System.currentTimeMillis();
System.out.println("循环用时:"+(end-start)+"毫秒");
}
}
结果:
11.4 Scanner 类
与c语言不同,Java从控制台中读出用户输入的值,用到的不是一行可以直接使用的代码,二十由一个叫Scanner的类来实现的,Scanner英文直译就是扫描器,他的用途就是和现实生活的扫描器一样,可以将数字化信息流转位人类可识别的文字,控制台输出内容用到了System.out表示向控制台输出,System.in就表示从控制台输入,让Scanner扫描System.in就可以获取用户输入的值了
使用Scanner类首先要引入该类,其语法如下:
import java.util.Scanner; //引入Scanner类
public static void main(String[] args) {
// TODO Auto-generated method stub
Random r=new Random();
int num=r.nextInt(100);
int input=-1;
Scanner sc=new Scanner(System.in);
while(true) {
System.out.println("猜一猜随机数是多少?");
input=sc.nextInt();
if(input>num) {
System.out.println("你输入的数字大了!");
}else if(input<num) {
System.out.println("你输入的数字小了!");
}else if(input==num) {
break;
}else {
System.out.println("你的输入有误!");
}
}
System.out.println("恭喜你答对了!");
sc.close();
}
}
结果:
11.5 日期时间类
11.5.1 Date 类
Date类用于表示日期时间,使用该类表示时间需要使用其构造方法创建对象,其构造方法及其说明
例如,使用Date类的第二种构造方法创建一个Date类的对象,代码如下:
long timeMillis=System.currentTimeMillis();//当前系统时间所经历的毫秒数
Date date =new Date(timeMillis);
上述代码中的System类的currentTimeMillis()方法主要用来获取当前系统时间距标准基准时间的毫秒数。另外,这里需要注意的是,创建Date对象时使用的是long型整数,而不是double型,这主要是因为double类型可能会损失精度。
代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
Date date=new Date();
long value=date.getTime();
System.out.println("日期:"+date);
System.out.println("到现在所经历的毫秒数为:"+value);
}
}
结果:
11.5.2 日期时间格式化
如果在程序中直接输出Date对象,显示的是“Mon Feb 2917:39:50CST2016”这种格式的日间,那么应该如何将其显示为“2016-02-29”或者“17:39:50”这样的日期时间格式呢?Java 中提 DateFormat类来实现类似的功能。
DateFormat日时间子抽类,可以按照指定的格式对日期或时间进行格式 nteFormat类提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期时间 matter,格式化风格主要包括SHORT、MEDIUM、LONG和FULL4种:
SHORT:完全为数字,如12.13.52或3:30pm。
MEDIUM:较长,如 Jan 12,1952。
LONG:更长,如January121952或3:30:32pm。
FULL:完全指定,如 Tuesday、April 12、1952AD或 3:30:42pm PST。
另外,使用DateFormat类还可以自定义日期时间的格式。要格式化一个当前语言 下的日
需要创建DateFormat类的一个对象,由于它是抽象类,因此可以使用其静态方法getDateInstance()进行创建,语法如下:
DateFormat df=DateFormat.getDatelnstance();
使用getDateInstance()方法获取的是所在国家或地区的标准日期格式。另外,DateFormat类还提供了一些其他静态方法。
由于DateFormat类是一个抽象类,不能用new创建实例对象。
代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
DateFormat df=new SimpleDateFormat("yyyy年MM月dd日EEEE HH时mm分ss秒");
System.out.print("各位观众大家好,现在是");
System.out.print(df.format(new Date()));
System.out.print(",欢迎收看新闻。");
}
}
结果:
11.5.3 Calendar 类
开JavaAPI可看javauilDate提供的大部分方法都已经过时了,因为Date设计之初没有考虑到国际化,而且很多方法也不能满足用户需求,比如需要获取指定时间的年月日时分信息,或者想要对日期时间进行加减运算等复杂的操作,Date 类已经不能胜任,因此JDK提供了新的时间处理类--Calendar日历类。
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR日历字段之间的转换提供了一些方法,并为操作日历字段(如获得下星期的日期)提供了一些方法。另外,该类还为实现包范围外的具体日历系统提供了其他字段和方法,这些字段和方法被定义为 protected。
Calendar提供了一个类方法getInstance(),以获得此类型的一个通用的对象。Calendar类的 getInstance()方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化,其使用方法如下:
Calendar rightNow=Calendar.getinstance()
说明:
由于Calendar 类是一个抽象类,不能用new创建实例对象,因此除了使用getInstance()方法创建其对象,如果需要创建其对象,必须使用其子类,如GregorianCalendar 类。
代码:
System.out.println("————————————————中华人民共和国成立100周年倒计时——————————————");
Date date = new Date();//当前时间
//创建SimpleDateFormat对象,指定目标格式
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy年MM月dd日");
//调用format方法,格式化时间,转换指定格式
String today = simpleDateFormat.format(date);
System.out.println("今天是:"+today);
//获取自1970年一月一日至当前时间所经过的毫秒数
long time1 = date.getTime();
//使用默认时区和语言环境中获得一个日历calendar
Calendar calendar = Calendar.getInstance();
//设置日历calendar中的年,月和日的值,因为月份是从0开始计算的,所以这里要减1
calendar.set(2049,10-1,1);
//计算自1970年1月1日至2049年1月1日所经过的毫秒数
long time2 = calendar.getTimeInMillis();
//计算2049年1月1日距离当前时间和相差的天数
long day = (time2-time1)/(1000*60*60*24);
System.out.println("距离2049年1月1日还有"+day+"天!");
}
}
结果:
11.6 Runtime 类
Runtime类是JDK提供的运行时类,该类为Java程序提供了与当前运行环境相连接的一个通道,Java程序可以利用该类对当前的运行环境执行一些简单的操作,Runtime 类不能使用new 关键字创建实例,只能通过 Runtime.getRuntime()方法获取实例。
11.6.1 执行本地命令:
本地命令指的是操作系统的命令。例如,在 Linux 系统下就表示 shell 命令,在Windows系统下就表示cmd命令。
Runtime 类提供 exec()方法让Java代码可以执行系统的命令,exec()方法有很多重载的形式,例如
Process exec(String command)
Process exec(Stringl cmdarray)
command:要执行的系统命令,字符串类型。
cmdarray:要执行的命令和相应的命令参数,字符串数组类型。
其实这两个重载方式很类似,如执行“javac hello.java”这行命令,使用第一种重载方式的代码如下:
Runtime.getRuntime().exec("javac hello.java");
使用第二种重载方式的代码如下:
String command[={ "javac", "hello.java" };
Runtime.getRuntime().exec(command);
exec方法会返回一个 Process 对象。Process 类是 Java 中进程类,该类是抽象类,不能使用new关键字创建实例。Process 类的常用方法如表11.22示,开可使用getInputStreamO方法获取进程返回的信息
public static void main(String[] args) {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime();//获取本地Runtime对象
try {
Process p = r.exec("help");//执行help命令,获取进程对象
InputStream is = p.getInputStream();//获取进程的字节输入流
//将字节输入流转换为字符输入流
BufferedReader br = new BufferedReader(new InputStreamReader(is));
String str = null;//创建null字符串
while((str = br.readLine())!=null) {//如果字符流中可以获取非空内容
System.out.println(str);//打印获取内容
}
}catch(IOException e) {
e.printStackTrace();
}
}
结果:
11.6.2 查看内存:
Runtime类可以通过freeMemory()方法查看当前Java虚构机可用内存的剩余量,如果程序能够实时监控内存剩余余量,就可以尽量控制程序对内存的占用,从而避免出现’内存溢出‘的情况,同样,也可以用来对测试程序性能,检验程序算法是否导致内存紧张
public static void main(String[] args) {
// TODO Auto-generated method
Runtime r = Runtime.getRuntime();//获取本地Runtime对象
Integer ints[] = new Integer[10000];//创建长度为10000的整数数组
long before = r.freeMemory();//获取当前空闲内存数
System.out.println("赋值前空闲内存字节数:"+before);
for(int i = 0,length = ints.length;i<length;i++) {//循环为整数数组赋值
ints[i]=i;//赋值
}
long after = r.freeMemory();//获取当前空闲内存数
System.out.println("赋值后空闲内存字节数:"+after);
System.out.println("数组用掉的内存字节数:"+(before-after));//输出数组用掉的内存量
}
}
结果: