第九章 Java常用类

9.1 包装类


Java是一种面向对象的语言,但在Java中不能定义基本数据类型的对象,为了能将基本数据类型视为对象进行处理,Java 提出了包装类的概念,它主要是将基本数据类型封装在包装类中,如int型数值的包装类Integer, boolean 型的包装类Boolean等,这样便可以把这些基本数据类型转换为对象进行处理。Java 中的包装类及其对应的基本数据类型

包装类对应基本数据类型包装类对应基本数据类型
BytebyteShortshort
IntegerintLonglong
FloatfloatDoubledouble
CharactercharBooleanboolean

 9.1.1  integer类


javalang包中的Integer类、Byte 类、Short类和Long类,分别将基本数据类型int. bye. short
和long封装成一个类, 由于这些类都是Number的子类,区别就是封装不同的数据类型,其包含的方法基本相同,所以本节以Integer类为例介绍整数包装类。

Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段,此外,该类提供了多个方法,能在int类型和String类型之间互相转换,同时还提供了其他一些处理int类型时非常有用的常量和方法。

1.构造方法
Integer类有以下两种构造方法。
(1) Integer ( int number)
该方法以一个int型变量作为参数来获取Integer对象。
例如,以int型变量作为参数创建Integer对象,代码如下:

Integer number = new Integer(7);

(2) Integer (String str)
该方法以一个String型变量作为参数来获取Ineer对象。
例如,以Sring型变量作为参数创建Iter对象,代码如下:

Integer number = new Integer("45");

2.常用方法

方法返回值功能描述
valueOf(String str)Integer返回保存指定的String值的Integer对象
parseInt(String str)int返回包含在由str指定的字符串中的数字的等价整数值
toString()String返回一个表示该integer值的String对象(可以指定进制基数)
toBinaryString(int i)String以二进制无符号整数形式返回一个整数参数的字符串表示形式
toHexString(int i)String以十六进制无符号整数形式返回一个整数参数的字符串表示形式
toOctalString(int i)String以八进制无符号整数形式返回一个整数参数的字符串表示形式
equals(Object IntegerObj)boolean比较此对象与指定的对象是否相等
intValue()int以int型返回此Integer对象
shortValue()short以short型返回此Integer对象
byteValue()byte以byte型返回此Integer对象

compareTo(Integeranother

Integer)

int在数字上比较两个Integer对象。如果这两个值相等,则返回0;如果调用对象的数值小于another Integer的数值,则返回负值;如果调用对象的数值大于another Integer的数值,则返回正值


创建一个Demo类,其中首先使用Integer类的parseInt 方法将一个字符串转换为imt数据;然后创建一个Integer对象,并调用其equals方法与转换的int数据进行比较;最后演示使用Integer类的toBinaryString方法、toHexString方法、toOctalString 方法和toString方法将int数据转换为二进制、十六进制、八进制和不常使用的十五进制表示形式。

package 第九章;  //类包
public class 例91 { //创建类
public static void main(String[] args){//主方法
int num = Integer.parseInt("456");  //将字符串转换为int类型
Integer iNum = Integer.valueOf("456"); //通过构造函数创建一个Integer对象
System.out.println("int数据与Integer对象比较:"+iNum.equals(num));  //比较int数据与integer对象比较
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);//输出十五进制的值
	}
}


3.常量
nteger类提供了以下4个常量:

MAX_VALUE:表示int类型可取的最大值,即2平方31-1.

MIN_VALUE:表示int类型可取的最小值,即-2平方31

SIZE:用来以二进制补码形式表示int值的位数。

TYPE:表示基本类型int的Class实例。

package 第九章;

public class li92 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int maxint=Integer.MAX_VALUE;
		int minint=Integer.MIN_VALUE;
		int intsize=Integer.SIZE;
		System.out.println("int类型可取的最大值是:"+maxint);
		System.out.println("int类型可取的最小值是:"+minint);
		System.out.println("int类型的二进制位数是:"+intsize);
	}

}


 9.1.2  Double类


Double类和Float类是对double、float 基本类型的封装,它们都是Number类的子类,都是对小数进行操作,所以常用方法基本相同,本节将对Double类进行介绍。对于Float类可以参考Double类的相关介绍。

Double类在对象中包装一个基本类型为double的值,每个Double类的对象都包含一个 double类型的字段。此外,该类还提供多个方法,可以将double转换为String,将String转换为double,也提供了其他一些处理 double时有用的常量和方法。

1.构造方法
Double类提供了以下两种构造方法来获得Double类对象。
(1 ) Double(double value)
基于double参数创建Double类对象。
例如,以double型变量作为参数创建Double对象,代码如下:

Double number = new Double(3.14);

(2 ) Double(String str)
该方法以一个String型变量作为参数来获取Double对象。
例如,以Sing型变量作为参数创建Dolo对象,代码如下:

Doble number = new Double (“3.14”);

2.常用方法

方法返回值功能描述
valueOf(string str)Double返回保存用参数数字字符串str 表示的double值的double对象
parseDouble(string s)Double返回一个新的double值,该值被初始化为用指定string 表示的值,这与double类的
valueOf方法-样
doubleValue()Double以double形式返回此double对象
isNaN()Boolean如果此double值是非数字(NaN)值,则返回true;否则返回false
intValue()Int以int形式返回double值
Byte Value)Byte以byte形式返回此double对象值(通过强制转换)
longValue)long以long形式返回此double的值(通过强制转换为long类型)
CompareTo(double d)int对两个double对象进行数值比较。如果两个值相等,则返回0;如果调用对象的数值 小于d的数值,则返回负值,如果调用对象的数值大于d的值,则返回正值
Equals(Object obj)Boolean将此对象与指定的对象相比较
Tostring()String返回此double对象的字符串表示形式
Tohexstring(double d)String返回double参数的十六进制字符串表示形式


 下面通过一个实例演示double类的常用方法的使用

package 第九章;

public class li93 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Double dNum=Double.valueOf("3.14");
		System.out.println("3.14是否为非数字值:"+Double.isNaN(dNum.doubleValue()));
		System.out.println("3.14转换为int值为:"+dNum.intValue());
		System.out.println("值为3.14的Double对象与3.14的比较结果:"+dNum.equals(3.14));
		System.out.println("3.14的十六进制表示为:"+Double.toHexString(dNum));
	}

}

3.常量
Double类主要提供了以下常量:

 (1) MAX EXPONENT:返回int值,表示有限double变量可能具有的最大指数。
(2) MIN EXPONENT:返回int值,表示标准化double变量可能具有的最小指数。
(3) NEGATIVE INFINITY:返回double值,表示保存double 类型的负无穷大值的常量,
(4) POSITIVE INFINITY:返回double值,表示保存double类型的正无穷大值的常量.

9.1.3  Boolean类


Boolean类将基本类型为boolean的值包装在一个对象中。一个Boolean,类型的对象只包含一个类型为bolean的字段。此外,此类还为boolan和String的相互转换提供了许多多方法,并提供了处理boolean时非常有用的其他一些常量和方法。

1.构造方法
Boolean类提供了以下两种构造方法来获得Boolean类对象。
(1) Boolean(boolean value)
该方法创建一个表示 value参数的Boolean对象。
例如,创建-一个表示value参数的Boolean 对象,代码如下:

Boolean b = new Boolean (true) ;

(2) Boolean(String str)
该方法以String变量作为参数创建Boolean对象。如果String参数不为null且在忽略大小写时等于true,则分配一个表示 true值的Boolean对象,否则获得- 个false值的Boolean对象。
例如,以String变量作为参数,创建Boolean对象。代码如下:

Boolean bool = new Boolean("ok");

2.常用方法

方法返回值功能描述
Boolean value ()Boolean将boolean对象的值以对应的boolean值返回
Equals(Object obj)Boolean判断调用该方法的对象与obj是否相等,当且仅当参数不 是null,而且与调用该方法的对象一样都表示同一个 boolean值的boolean.对象时,才返回true
parseboolean(string s)Boolean将字符串参数解析为boolean值
Tostring ()String返回表示该boolean值的string 对象
ValueOf (string s)Boolean返回一个用指定的字符串表示值的boolean值


 

package 第九章;

public class li94 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Boolean b1=new Boolean(true);
		Boolean b2=new Boolean("ok");
		System.out.println("b1:"+b1.booleanValue());
		System.out.println("b2:"+b2.booleanValue());
	}

}


3.常量
Boolean提供了以下3个常量:

(1) TRUE: 对应基值true的Boolean对象。
(2) FALSE: 对应基值false的Boolean对象。
(3)TYPE:基本类型boolean的Class对象。

9.1.4  Character类


Cancer类在对象中包装一个基本类型为 chara的值,该类提供了多种方法,以确定字符的类期(小写字母、数字等),并可以很方便地将字符从大写转换成小写,反之亦然。

1.构造方法
Character类的构造方法语法如下:

Character (char value)

该类的构造方法的参数必须是一个char类型的数据。通过该构造方法将一个char类型数据包成一个Charcter类对象。一旦Character类被创建,它包含的数值就不能改变了。
例如,以char型变量作为参数,创建Character对象。代码如下:

Character mychar = new Character('s');

2.常用方法
Characer类提供了很多方法来完成对字符的操作,常用的方法

方法返回值功能描述
compareTo(CharacteranotherCharacter)int根据数字比较两个Character 对象,若这两 个对象相等则返回0
equals(Objectobj)Boolean将调用该方法的对象与指定的对象相比较
toUpperCase(charch)char将字符参数转换为大写
tolowerCase(charch)char将字符参数转换为小写
toString()String返回一个表示指定char值的String对象
charValue()char返回此Character对象的值
isUpperCase(charch)boolean判断指定字符是否是大写字符
isLowerCase(charch)boolean判断指定字符是否是小写宇符
isLetter(charch)boolean判断指定字符是否为字母
isDigit(charch)boolean判断指定字符是否为数字

下面通过实例开介绍Character类的大小写转换方法的使用

package 第九章;

public class li95 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Character mychar1=new Character('A');
		Character mychar2=new Character('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));
		}
	}

}

3.常量
 Character类提供了大量表示特定字符的常量,例如:

( 1 ) CONNECTOR PUNCTUATION: 返回byte型值,表示Unicode规范中的常规类别“Pc”。
(2) UNASSIGNED:返回byte型值,表示Unicode规范中的常规类别“Cn”。
(3) TITLECASE LETTER:返回byte型值,表示Unicode规范中的常规类别“Lt”。

9.1.5  Number类


前面介绍了Java中的包装类,对于数值型的包装类,它们有一个共同的父类ANum ber类,其该类是一个抽象类, 它是Byte、Integer、 Short、 Long、 Float 和Double类的父类,其子类必须提供将表示的数值转换为byte、int、 short、 long、 float 和double的方法。例如,doubleValue(方法返回双精度值,floatValue()方法返回浮点值。
Number类的方法分别被Number的各子类所实现,也就是说,在Number类的所有子类中都包含以上这几种方法。

方法返回值功能描述
Byte value ()Byte 以byte形式返回指定的数值
Int value ()Int以int形式返回指定的数值
Float value ()Float .以float形式返回指定的数值
Short value ()Short以short形式返回指定的数值
Long value ()Long以long形式返回指定的数值
Double value ()Double以double形式返回指定的数值

 

9.2  Math类


前面的章节我们学习过+、一、*、/、%等基本的算术运算符,使用它们可以进行基本的数学运算,但是,如果我们碰到一些复杂的数学运算,该怎么办呢? Java中提供了一个执行数学基本运算的Math类,该类包括常用的数学运算方法,如三角函数方法、指数函数方法、对数函数方法、平方根函数方法等一些常用数学函数, 除此之外还提供了一些常用的数学常量, 如PI、 E等。本节将介绍Math类以及其中的一些常用方法。

9.2.1  Math类概述


Math类表示数学类,它位于java. ang包中,由系统默认调用,该类中提供了众多数学函数方法,主要包括三角函数方法,指数函数方法,取整函数方法,取最大值、最小值以及绝对值函数方法,这些方法都被定义为static 形式,因此在程序中可以直接通过类名进行调用。使用形式如下:

Math.数学方法

在Math类中除了函数方法之外还存在一些常用的数学常量, 如PI、 E等,这些数学常量作为Math类的成员变量出现,调用起来也很简单。可以使用如下形式调用:

Math. PI        //表示圆周率PI的值

Math.E         //表示自然对数底数e的值

例如,下面代码用来分别输出PI和E的值。代码如下:

System. out.println("圆周率π的值为:" + Math.PI);

System. out .println("自然对数底数e的值为:”+ Math.E);

上面代码的输出结果为:

圆周率π的值为: 3.141592653589793

自然对数底数e的值为: 2.718281828459045

9.2.2  常用属性运算方法


Math类中的常用数学运算方法较多,大致可以将其分为4大类别,分别为三角函数方法,指数函数方法,取整函数方法以及取最大值、最小值和绝对值函数方法,下面分别进行介绍。

1.三角函数方法
Math类中包含的三角函数方法

方法返回值功能描述
Sin (double a)Double返回角的三角正弦
Cos (double a)Double返回角的三角余弦
Tan (double a)Double返回角的三角正切
Asin (double a)Double返回一个值的反正弦
Acos (double a)Double返回一个值的反余弦.
Atan (double a)Double返回一个值的反正切
Toradians (double angdeg)Double将角度转换为弧度
Todegrees (double angrad)Double将弧度转换为角度

以上每个方法的参数和返回值都是double 型的,将这些方法的参数的值设置为double型是有一定道理的, 参数以弧度代替角度来实现,其中1°等于π/180弧度,所以180°可以使用π弧度来表示。除了可以获取角的正弦、余弦、正切、反正弦、反余弦、反正切之外,Math类还提供了角度和弧度相互转换的方法toRadians()和toDegrees()。但需要注意的是,角度与弧度的转换通常是不精确的。

package 第九章;

public class li96 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("90度的正弦值:"+Math.sin(Math.PI/2));
		System.out.println("0度的余弦值:"+Math.cos(0));
		System.out.println("60度的正切值:"+Math.tan(Math.PI/3));
		System.out.println("2的平方根与2商的反弦值:"+ Math.asin(Math.sqrt(2) / 2));
		System.out.println("2的平方根与2商的反余弦值:"+ Math.acos(Math.sqrt(2) / 2));
		System.out.println("1的反正值:"+Math.atan(1));
		System.out.println("120度的弧度值:"+Math.toRadians(120.0));
		System.out.println("Π/2的角度值:"+Math.toDegrees(Math.PI/2));
	}

}


 通过运行结果可以看出,90°的正弦值为1, 0°的余弦值为1, 60°的正切与Math.sqrt(3)的值应该是一致的,也就是取3的平方根。在结果中可以看到第4~6行的值是基本相同的,这个值换算后正是45°,也就是获取的Math.sqrt(2)/2 反正弦、反余弦值与1的反正切值都是45°。最后两行打印语句实现的是角度和弧度的转换,其中Math.toRadians(120.0)语句是获取 120° 的弧度值,而Math. toDegrees(Math.PI2)语句是获取πu/2 的角度。读者可以将这些具体的值使用π的形式表示出来,与上述结果应该是基本致的, 这些结果不能做到十分精确,因为π本身也是一 个近似值。

2.指数函数方法

方法返回值功能描述
Exp (double a)Double用于获取e的a次方,即取ea
Double log (double a)Double用于取自然对数,即取Ina的值
Double log10 (double a)Double用于取底数为10的对数
Sqrt (double a)Double用于取a的平方根,其中a的值不能为负值
Cbrt (double a)Double用于取a的立方根
Pow (double a, double b)Double用于取a的b次方


指数运算包括求方根、取对数以及求n次方的运算。为了使读者更好地理解这些指数函数方法的用法,下面举例说明。

在项 目中创建ExponentFunction类,在类的主方法中调用Math类中的方法实现指数函数的运算,并输出运算结果。

package 第九章;

public class li97 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("e的平方值:"+Math.exp(2));
		System.out.println("以e为底2的对数值:"+Math.log(2));
		System.out.println("以10为底2的对数值:"+Math.log10(2));
		System.out.println("4的平方根值:"+Math.sqrt(4));
		System.out.println("8的立方根值:"+Math.cbrt(8));
		System.out.println("2的2次方值:"+Math.pow(2,2));
	}

}

 

 3.取整函数方法
在具体的问题中,取整操作使用也很普遍,所以Java在Math类中添加了数字取整方法。Math类中常用的取整方法。

方法返回值功能描述
Ceil (double a)Double返回大于等于参数的最小整数
Floor (double a)Double返回小于等于参数的最大整数
Rmit (double a)Double返回与参数最接近的整数,如果两个同为整数且同样接近,则结果取偶数
Round (float a)Double将参数加_上0.5后返回与参数最近的整数
Round (double a)Double将参数加上0.5后返回与参数最近的整数,然后强制转换为长整型

演示使用取整方法后的返回值,在坐标轴上表示

 

下面举例说明Math类中取整方法的使用

package 第九章;

public class li98 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("使用ceil()方法取整:"+Math.ceil(5.2));
		System.out.println("使用floor()方法取整:"+Math.floor(2.5));
		System.out.println("使用rint()方法取整:"+Math.rint(2.7));
		System.out.println("使用rint()方法取整:"+Math.rint(2.5));
		System.out.println("使用round()方法取整:"+Math.round(3.4f));
		System.out.println("使用round()方法取整:"+Math.round(2.5));
	}

}


 4.取最大值、最小值、绝对值函数方法
Math类还有一些常用的数据操作方法,比如取最大值、最小值、绝对值等,它们的说明如表

 

方法返回值功能描述
Max(double a,double b)double取a与b之间的最大值
Min(int a,int b)int取a与b之间的最小值,参数为整型
Min(long a.long b)long取a与b之间的最小值,参数为长整型
Min(float a,float b)float取a与b之间的最小值,参数为浮点型
Min(double a,double b)double取a与b之间的最小值,参数为双精度型
Abs(int a)int返回整数参数的绝对值
Abs(long a)long返回长整数参数的绝对值
Abs(float a)float返回浮点型参数的绝对值
Abs(double a)double返回双精度型参数的绝对值

下面举例说明上述方法的使用

package 第九章;

public class li99 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("4和8较大者:"+Math.max(4, 8));
		System.out.println("4.4和4较小者:"+Math.min(4.4, 4));
		System.out.println("-7的绝对值:"+Math.abs(-7));
	}

}

9.3  随机数 


在实际开开发中生成随机数的使用是很普遍的,所以在程序中生成随机数的操作很重要。在Iluna中更提供了两种方式生成随机数,分别为调用Math类的random0方法和Random类提供的生成文种数据类型随机数的方法,下面分 别进行讲解。

 

9.3.1 Math.random()方法


在Math类中存在一个random()方法,用于生成随机数字,该方法默认生成大于等于0.0小于1.0的double型随机数,即0<=Math.random()<1.0,虽然Math.random()方法只可以生成0~1之间的double
型数字,但只要在Math.random0语句上稍加处理,就可以使用这个方法生成任意范围的随机数

 

为了更好地解释这种生成随机数的方式,下面举例说明。

package 第九章; //类包
import java.util.Scanner;//导入要用到的包
public class li910 { //创建类
public static void main(String[] args) {//主方法
System.out.println("——————猜数字游戏——————\n");//输出猜数字游戏
int iNum;//定义iNum
int iGuess;//定义iGuess
Scanner in = new Scanner(System.in);// 创建扫描器对象,用于输入
iNum = (int) (Math.random() * 100);// 生成1到100之间的随机数
System.out.print("请输入你猜的数字:");//输入猜的数字
iGuess = in.nextInt(); // 输入首次猜测的数字
while ((iGuess != -1) && (iGuess != iNum))// 判断输入的数字不是-1或者基准数
{
 if (iGuess < iNum)// 若猜测的数字小于基准数,则提示用户输入的数太小,并让用户重新输入
{
System.out.print("太小,请重新输入:");  //请重新输入
iGuess = in.nextInt();  //输出
} else// 若猜测的数字大于基准数,则提示用户输入的数太大,并让用户重新输入
{
System.out.print("太大,请重新输入:"); //请重新输入
iGuess = in.nextInt(); //输出
}
}
if (iGuess == -1)// 若最后一次输入的数字是-1,循环结束的原因是用户选择退出游戏
{
 System.out.println("退出游戏!"); //退出游戏
} else// 若最后一次输入的数字不是-1,用户猜对数字,获得成功,游戏结束
{
 System.out.println("恭喜你,你赢了,猜中的数字是:" + iNum);  //输出猜中的数字
}
System.out.println("\n———————游戏结束———————");//输出游戏结束
}
}


 在Eclipse中运行本实例,结果如图9.12所示。


除了随机生成数字以外,使用Math类的random0方法还可以随机生成字符,例如,可以使用下面代码生成a~z之间的字符:

 

(char) ('a'+Math. random()*('z'-'a'+1)) ;

通过上述表达式可以求出更多的随机字符,如A~Z之间的随机字符,进而推理出求任意两个字符之间的随机字符,可以使用以下语句
表示:

(char) (chal +Math. random() * (cha2-cha1+1)) ;

在这里可以将这个表达式设计为一个方法,参数设置为随机生成字符的上限与下限。下面举例说明。

package 第九章; //类包
public class li911 { //创建类
public static char GetRandomChar(char cha1, char cha2) {//定义获取任意字符之间的随机字符
return (char) (cha1 + Math.random() * (cha2 - cha1 + 1));//参数设置
}
public static void main(String[] args) {//主方法
System.out.println("任意小写字符" + GetRandomChar('a', 'z'));// 获取a~z之间的随机字符
System.out.println("任意大写字符" + GetRandomChar('A', 'Z'));// 获取A~Z之间的随机字符
System.out.println("0到9任意数字字符" + GetRandomChar('0', '9'));// 获取0~9之间的随机字符
	}
}


 9.3.2  Randon类


除了Mah类中的rndom万方法可以获取随机数之外,lava 中还提供了一种可以获取随机数的方式,那就是java util Random类,该类表示一个随机数生成器, 可以通过实例化一个Rndm对象创建一个随机数生成器。语法如下:

Random r=new Random() ;

其中,r是指Random对象。
以这种方式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以生成的随机数将不同,但是如果运行速度太快,也会生成两次运行结果相同的随机数。
同时也可以在实例化Random类对象时,设置随机数生成器的种子。

语法如下:

Random r=newRandom (seedValue);

r: Random类对象。

seedValue:: 随机数生成器的种子。

在Random类中提供了获取各科数据类型随机数的方法,其常用方法及说明

方法返回值功能描述
nextlnt()int返回一个随机整数
nextlnt(int n)int返回大于等于0小于n的随机整数
nextLong()long返回一个随机长整型值
nextBoolean()boolean返回一个随机布尔型值
nextFloatfloat返回一个随机淫点型值
nextDouble,double返回一个随机双精度型值
nextGaussiandouble返回一个概率密度为高斯分布的双精度值
package 第九章;

import java.util.Random;
import java.util.Scanner;

public class 例912 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("——————————模拟微信抢红包——————————\n");
		Scanner sc=new Scanner(System.in);
		System.out.print("请输入要装入红包的总金额(元):");
		double total=sc.nextDouble();
		System.out.print("请输入红包的个数(个):");
		int bagsnum=sc.nextInt();
		double min=0.01;
		Random random=new Random();
		for(int i=1;i<bagsnum;i++) {
			double max=total-(bagsnum-i)*min;
			double bound=max-min;
			double safe=(double)random.nextInt((int) (bound*100))/100;
			double money=safe+min;
			total=total-money;
			System.out.println("第"+i+"个红包:"+String.format("%.2f", money)+"元");
		}
		System.out.println("第"+bagsnum+"个红包:"+String.format("%.2f", total)+"元");
		sc.close();
	}

}

9.4  日期时间类 

在程序开发中,经常需要处理日期时间,Java 中提供了专门的日期时间类来处理相应的操作,本节将对Java中的日期时间类进行详细讲解。

9.4.1  Date类


Date类用于表示日期时间,它位于java.util包中,程序中使用该类表示时间时,需要使用其构造方法创建Date类的对象,其构造方法及说明

构造方法功能描述
Date()分配Date对象并初始化此对象,以表示分配它的时间(精确到毫
秒)
Date(long date)分配Date对象并初始化此对象,以表示自从标准基准时间(即1970
年1月1日00:00:00GMT)以来的指定毫秒数
Date(int year, int month, int date)已过时
Date(int year, int month, int date,hrs, int min)已过时
Date(int year, int month, int date, int hrs, int min, int sec)已过时
Date(String s)


例如,使用Date类的第2种方法创建一个Date类的对象,代码如下:

long timeMillis = System. currentTimeMillis() ;

Date date=new Date (timeMillis) ;

上面代码中的System类的currentTimeMillis()方法主要用来获取系统当前时间距标准基准时间的亳秒数,另外,这里需要注意的是,创建Date对象时使用的是long型整数,而不是double型,这主要是因为double类型可能会损失精度。
使用Date类创建的对象表示日期和时间,它涉及最多的操作就是比较,例如两个人的生日,明个较早,哪个又晚一些,或者两人的生日完全相等,其常用的方法

方法返回值功能描述
after(Date when)boolean测试当前日期是否在指定的日期之后
before(Date when)boolean测试当前日期是否在指定的日期之前
getTime0)long获得自1970年1月1日00:00:00GMT开始到现在所表示的毫秒数
setTime(long time)void设置当前Date对象所表示的日期时间值,该值用以表示1970年1月1日 00:00:00GMT以后time毫秒的时间点
package 第九章;

import java.util.Date;

public class li913 {

	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);
	}

}


从例9.13可以看到,如果在程序中直接输出Date对象,显示的是“Mon Feb 29 17:39:50 CST2016”这种形势的日期时间,那么如何将其显示为“2016-02-29” 或者“17:39:50”这样的日期时间形势呢? Java中提供了DteFormat 类来实现类似的功能。
DateFomat类是日期/时间格式化子类的抽象类,它位于java.tet 包中,可以按照指定的格式对日期或时间进行格式化。DateFomat 提供了很多类方法,以获得基于默认或给定语言环境和多种格式化风格的默认日期时间Fomaterer格式化风格包括SHORT、MEDIUM、LONG和FULlL等4种,分别如下:

SHORT: 完全为数字,如12.13.52或3:30pm。

MEDIUM: 较长,如Jan 12, 1952。

LONG: 更长,如January 12, 1952或3:30:32pm。

FULL: 完全指定,如Tuesday、 April 12、 1952 AD或3:30:42pm PST.

另外,使用DateFormat还可以自定义日期时间的格式。要格式化一个当前语言环境下的日期,首先需要创建DateFormat 类的一个对象,由于它是抽象类,因此可以使用其静态工厂方法getDateInstance进行创建。语法如下:

DateFormat df = DateFormat .getDateInstance() ;

使用getDateInstance获取的是该国家/地区的标准日期格式,另外,DateFormat类还提供了一些其他静态工厂方法,例如,使用getTimeInstance 可获取该国家/地区的时间格式,使用getDateTimeInstance可获取日期和时间格式。

DateFormat类的常用方法及说明

方法返回值功能描述
format(Date date)String将一个Date格式化为日期/时间字符串
getCalendar()Calendar获取与此日期/时间格式器关联的日历
getDatelnstance()static DateFormat

获取日期格式器,该格式器具有默认语言环境的默认格式化

风格

getDateTimelnstance()static DateFormat

获取日期/时间格式器,该格式器具有默认语言环境的默认

格式化风格

getInstance()static DateFormat

获取为日期和时间使用SHORT 风将字符串解析 成一个日期

并返回这个日期的Date对象格的默 认日期/时间格式器

getTimelInstance()static DateFormat

获取时间格式器,该格式器具有默认语言环境的 默认格式化风

parse(String source)Date将字符串解析成一个日期,并返回这个日期的
Date对象

由于DateFormat类是一个抽象类, 不能用new创建实例对象,因此,除了使用getXXXInstance方法创建其对象外,还可以使用其子类,例如SimpleDateFormat类,该类是一个以与语言环境相关的方式来格式化和分析日期的具体类,它允许进行格式化(日期->文本)、分析(文本->日期)和规范化。
创建一 个Java类,在其中首先创建Date类的对象;然后使用DateFormat类的getInstance方法和SimpleDateFormat类的构造方法创建不同的DateFormat 对象,并指定不同的日期时间格式,并对当前日期时间进行格式化。

package 第九章;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class li914 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Date date=new Date();
		DateFormat df1=DateFormat.getInstance();
		DateFormat df2=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");
		DateFormat df3=new SimpleDateFormat("yyyy年MM月dd日hh时mm分ss秒EE",Locale.CHINA);
		DateFormat df4=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE",Locale.US);
		DateFormat df5=new SimpleDateFormat("yyyy-MM-dd");
		DateFormat df6=new SimpleDateFormat("yyyy年MM月dd日");
		System.out.println("------将日期时间按照不同格式进行输出------");
		System.out.println("按照Java默认的日期格式:"+df1.format(date));
		System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss,系统默认区域:"+df2.format(date));
		System.out.println("按照指定格式 yyyy年MM月dd日hh时mm分ss秒,区域为中文:"+df3.format(date));
		System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss,区域为美国:"+df4.format(date));
		System.out.println("按照指定格式 yyyy-MM-dd:"+df5.format(date));
		System.out.println("按照指定格式 yyyy年MM月dd日:"+df6.format(date));
	}

}

 

 

9.4.2  Calendar类


在9.4.1节中讲解Date中的构造方法时,我们发现有好几种方法都是过时的,这些过时的构造方法其实是被Calendar类的方法代替了,这里提到了Calendar 类,为什么要使用该类呢?因为Date类在设计之初没有考虑到国际化,它的很多方法都被标记为过时状态,而且其方法不能满足用户需求,比如需要获取指定时间的年月日时分秒信息,或者想要对日期时间进行加减运算等复杂的操作,Date类已经不能胜任。下 面对Calendar类进行详细讲解。

Calendar类是一个抽象类, 它为特 定瞬间与一组诸如YEAR、MONTH、DAY _OF MONTH、HOUR等日历字段之间的转换提供了一.些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。另外,该类还为实现包范围外的具体日历系统提供了其他字段和方法,这些字段和方法被定义为protected。

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

Calendar rightNow = Calendar. getInstance() ;

Calendar类提供的常用字段及说明

字段名说明
DATEget和set的字段数字,指示一个月中的某天
DAY_ OF_ MONTHget和set的字段数字,指示一个月中的某天
DAY_ _OF_ WEEKget和set 的字段数字,指示一个星期中的某天
DAY_ OFWEEK_ _IN_ MONTHget和set字段数字,指示月中第几个星期
DAY_ OF_ _YEARget和set 的字段数字,指示当前年中的天数
HOURget和set的字段数字,指示.上午或下午的小时
HOUR OF DAYget和set 的字段数字,指示一天中的小时
MILLISECONDget和set的字段数字,指示一秒中的毫秒
MINUTEget和 set 的字段数字,指示一小时中的分钟
MONTH指示月份的get 和set 的字段数字
SECONDget和set 的字段数字,指示一分钟中的秒
time日历的当前设置时间,以毫秒为单位,表示自格林威 治标准时间1970年1月1日0:00:00后经过的时间
WEEK_ OF_ MONTHget和set的字段数字,指示当前月中的星期数
WEEK_ OF_ _YEARget和set的字段数字,指示当前年中的星期数
YEAR指示年的get和set的字段数字

Calendar类提供的常用方法及说明 

方法返回值功能描述
add(int field, int amount)void根据曰历的规则,为给定的日历字段添加或减去指定的 时间量
after(Object when)boolean判断此Callendar表示的时间是否在指定Object表示的 时间之后,返回判断结果
before(Object when)boolean判断此Calendar表示的时间是否在指定bject表示的时间 之前, 返回判断结果
get(int field)int返回给定日历字段的值
getInstance ()static Calendar使用默认时区和语言环境获得- -个日历
getTime() DateDate返回一个表示此Calendar时间值(从历元至现在的毫秒 偏移Date对象
getTimelnMillis ( )long返回此Calendar 的时间值,以毫秒为单位
rol(int field, boolean up)abstract void在给定的时间字段上添加或减去(.上/下)单个时间单元,不 更改更大的字段
set(int field, int value)Void将给定的日历字段设置为给定值将给定的日历字段设置 为给定值
set(int year, int month, int date)Void设置日历字段YEAR、MONTH和DAY_ _OF_ _MONTH的值
set(int year, int month, int date, int hourOfDay, int minute)Void设置日历字段YEAR、 MONTH、DAY_ OF_ _MONTH、 HOUR_ _OF_ _DAY和MINUTE的值
set(int year, int month, int date.int hourQfDay, int minuteint second)Void设置字段YEAR、MONTH、DAY_ OF_ _MONTH 、 HOUR.MINUTE和SECOND的值
setTime(Date date)Void使用给定的Date设置此Calendar的时间
setTimelnMillis(long millis)Void用给定的long值设置此Calendar的当前时间值
package 第九章;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class li915 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		System.out.println("————————东奥会倒计时————————");
		Date date=new Date();
		SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
		String today=simpleDateFormat.format(date);
		System.out.println("今天是"+today);
		long time1=date.getTime();
		Calendar calendar=Calendar.getInstance();
		calendar.set(2022,2-1,4);
		long time2=calendar.getTimeInMillis();
		long day=(time2-time1)/(1000*60*60*24);
		System.out.println("距离2022年“北京——张家口”冬奥会还有"+day+"天!");
	}

}

9.5  小结


本章主要讲解了Java 中常用类的使用方法,包括封装基本数据类型的包装类、Math 数学运算类、Random随机数类、Date 类以及Calendar 类,在实际开发中,这些类经常会用到,希望通过本章的学习,读者能够熟练掌握Java中常用类的使用方法,并能够在实际开发中灵活应用。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值