public class Demo {//类名
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));
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);//输出
}
}
9.1包装类
java是一种面向对象的语言,但在java中不能定义基本数据类型的对象,为了能将基本数据类型视为对象进行处理,java提供了包装类的概念,它主要是将基本数据类型封装在包装类中,如:int 型数值的包装类Integer,boolean型的包装类Boolean等,这样便可以把这些基本数据类型转换为对象处理。
9.1.1 Integer类
java.lang包中的Integer类、Byte类、Short类和Long类,分别将基本数据类型int、byte、short和long封装成一个类,由于这些类都是Number的子类,区别就是封装不同的数据类型,其包含的方法基本相同,所以本节以Integer类为例介绍整数包装类。
Integer类在对象中包装了一个基本数据类型int的值,该类的对象包含一个int类型的字段,此外,该类提供了许多方法,能在int类型和String类型之间互相转换,同时还提供了其他一些处理的方法和常量。
1.构造方法
该方法以一个int型变量作为参数来获取Integer对象。
Integer number=new Integer(7);//创建一个对象
2.Integer(String str)
该方法以一个String型变量作为参数来获取Integer对象
注意:如果要使用字符串变量创建Integer对象,字符串变量的值一定要是数值型,如"123",否则将会抛出NumberFormatException异常
2.常用方法
运行结果:
3.常量
Integer类提供了以下4个常量:
MAX_VALUE:表示int类型可取的最大值,即2^31-1。
MIN_VALUE:表示int类型可取的最小值,即-2^31。
SIZE:用来以二进制补码形式表示int值的位数。
TYPE:表示基本类型int的class实例。
public class GetCon {
public static void main(String args[]) { // 主方法
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);
}
}
运行结果:
9.1.2 Double类
Double类和Float类是对double、float基本类型的封装,它们都是Number类的子类,都是对小数进行操作,所以常用方法基本相同,
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对象。
例如,以String型变量作为参数创建Double对象,代码如下:
Double number=new Double("3.14");
2.常用方法
Double类的常用方法如表9.3所示。
public class useDouble {//创建类
public static void main(String[] args) {//主方法
Double dNum = Double.valueOf("3.14"); // 通过构造函数创建一个Integer对象
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));// 转换为十六进制
}
}
运行结果:
3.常量
Double类主要提供了以下常量:
(1)MAX、EXPONENT:返回int值,表示有限double变量可能具有的最大指数,
(2)MIN_EXPONENT:返回int值,表示标准化double变量可能具有的最小指数。
(3)NEGATIVE_INFINITY:返回double值,表示保存double类型的负无穷大值的常量
(4)POSITIVE_INFINITY:返回double值,表示保存double类型的正无穷大值的常量
9.1.3Boolean
Boolean类将基本类型为boolean的值包装在一个对象中。一个Boolean类型的对象只包含一个典型为boolan的字段。此外,此类还为boolean和String的相互转换提供了许多方法,并提供了处the boolean时非常有用的其他一些常量和方法。
1.构造方法
Boolean类提供了以下两种构造方法来获得Boolean类对象。
(1) Boolean(boolean value)
该方法创建一个表示value参数的Boolean对象。
例如,创建一个表示value参数的Boolean对象,代码如下:
Eoolean 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类的常用方法如表9.4所示。
public class GetBoolean {
public static void main(String args[]) { // 主方法
Boolean b1 = new Boolean(true); // 创建Boolean对象
Boolean b2 = new Boolean("ok"); // 创建Boolean对象
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.4Character类
Character类在对象中包装一个基本类型为char的值,该类提供了多种方法,以确定字体(小写字母、数字等),并可以很方便地将字符从大写转换成小写,反之亦然。
1.构造方法
Character类的构造方法语法如下:
Character(char value)
该类的构造方法的参数必须是一个char类型的数据。通过该构造方法将一个char类传成一个Character类对象。一旦Character类被创建,它包含的数值就不能改变了。
例如,以char型变量作为参数,创建Character对象。代码如下:
Character mychar=new Character('s');
2.常用方法
Character类提供了很多方法来完成对字符的操作,常用的方法如表9.5所示。
表9.5 Character类的常用方法
public class UpperOrLower {
public static void main(String args[]) { // 主方法
Character mychar1 = new Character('A'); // 声明Character对象
Character mychar2 = new Character('a'); // 声明Character对象
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”。
说明:
Character类提供的常量有很多,详细列表可查看Java API文档。
9.1.5Number类
前面介绍了Java中的包装类,对于数值型的包装类,它们有一个该类是一个抽象类,它是Byte、Integer、Short、Long、Float和Doubl将表示的数值转换为byte、int、short、long、float和double的方法。双精度值, floatValue ()方法返回浮点值,这些方法如表9.6所示。
Number类的方法分别被Number的各子类所实现,也就是说,在含以上这几种方法。
9.2Math类
前面的章节我们学习过+、-、*、/、%等基本的算术运算符,使用它们可以进行基本的数学运算,但是,如果我们碰到一些复杂的数学运算,该怎么办呢? Java中提供了一个执行数学基本运算的Math类,该类包括常用的数学运算方法,如三角函数方法、指数函数方法、对数函数方法、平方根函数方法等一些常用数学函数,除此之外还提供了一些常用的数学常量,如PI、E等。本节将介绍Math类以及其中的一些常用方法。
9.2.1Math类概述
Math类表示数学类,它位于java. lang包中,由系统默认调用,该类中提供了众多数学函数方法,主要包括三角函数方法,指数函数方法,取整函数方法,取最大值、最小值以及绝对值函数方法,这些方法都被定义为static形式,因此在程序中可以直接通过类名进行调用。使用形式如下:Math.数学方法
在Math类中除了函数方法之外还存在一些常用的数学常量,如PI、E等,这些数学常量作为Math类的成员变量出现,调用起来也很简单。可以使用如下形式调用:
Math.PI//表示圆周率PI的值
Math.E//表示自然对数底数e的值
例如,下面代码用来分别输出PI和E的值。代码如下:
System. out. println("圆周率π的值为:"+Math.PI);
System. out.printIn("自然对数底数e的值为:"+Math.E);
上面代码的输出结果为:
圆周率π的值为:3. 141592653589793
自然对数底数e的值为:2. 718281828459045
9.2.2常用数学运算方法
Math类中的常用数学运算方法较多,大致可以将其分为4大类别,分别为三角函数方法,指数函数方法,取整函数方法以及取最大值、最小值和绝对值函数方法,下面分别进行介绍。
1.三角函数方法
public class TrigonometricFunction {
public static void main(String[] args) {
// 取90度的正弦
System.out.println("90度的正弦值:" + Math.sin(Math.PI / 2));
System.out.println("0度的余弦值:" + Math.cos(0)); // 取0度的余弦
// 取60度的正切
System.out.println("60度的正切值:" + Math.tan(Math.PI / 3));
// 取2的平方根与2商的反正弦
System.out.println("2的平方根与2商的反弦值:"
+ Math.asin(Math.sqrt(2) / 2));
// 取2的平方根与2商的反余弦
System.out.println("2的平方根与2商的反余弦值:"
+ Math.acos(Math.sqrt(2) / 2));
System.out.println("1的反正切值:" + Math.atan(1)); // 取1的反正切
// 取120度的弧度值
System.out.println("120度的弧度值:" + Math.toRadians(120.0));
// 取π/2的角度
System.out.println("π/2的角度值:" + Math.toDegrees(Math.PI / 2));
}
}
运行结果:
2.指数函数方法
public class ExponentFunction {
public static void main(String[] args) {
System.out.println("e的平方值:" + Math.exp(2)); // 取e的2次方
// 取以e为底2的对数
System.out.println("以e为底2的对数值:" + Math.log(2));
// 取以10为底2的对数
System.out.println("以10为底2的对数值:" + Math.log10(2));
System.out.println("4的平方根值:" + Math.sqrt(4)); // 取4的平方根
System.out.println("8的立方根值:" + Math.cbrt(8)); // 取8的立方根
System.out.println("2的2次方值:" + Math.pow(2, 2)); // 取2的2次方
}
}
运行结果:
3.取整函数方法
public class IntFunction {
public static void main(String[] args) {
// 返回第一个大于等于参数的整数
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));
// 将参数加上0.5后返回最接近的整数
System.out.println("使用round()方法取整:" + Math.round(3.4f));
// 将参数加上0.5后返回最接近的整数,并将结果强制转换为长整型
System.out.println("使用round()方法取整:" + Math.round(2.5));
}
}
运行结果:
4.取最大值、最小值、绝对值函数方法
public class AnyFunction {
public static void main(String[] args) {
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随机数
在实际开发中生成随机数的使用是很普遍的,所以在程序中生成随机数的操作很重要。在Java中主要提供了两种方式生成随机数,分别为调用Math类的random(方法和Random类提供的生成各种数据类型随机数的方法,下面分别进行讲解。
9.3.1Math.random()方法
在Math类中存在一个random(方法,用于生成随机数字,该方法默认生成大于等于0.0小于10的double型随机数,即0<=Math.random0<1.0,虽然Math. random(方法只可以生成0~1之间的double型数字,但只要在Math. random(i语句上稍加处理,就可以使用这个方法生成任意范围的随机数,如图9.11所示。
(int)(Math. Random()*n)返回大于等于0小于n的随机数
m+(int)(Math. Random()*n)
返回大于等于m小于m+n(不包括m+n)的随机数
/**
* 猜数字游戏
*/
package com.mrsoft.mathrandom;
import java.util.Scanner;
public class NumGame {
public static void main(String[] args) {
System.out.println("——————猜数字游戏——————\n");
int iNum;
int 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———————游戏结束———————");
}
}
运行结果:
除了随机生成数字以外,使用Math类的random()方法还可以随机生成字符,例如,可以使用下面代码生成a~z之间的字符:
< terminated
猜数字
(char) (′a′+Math.random()*('z'-'a'+1));
通过上述表达式可以求出更多的随机字符,如A~Z之间的随机字符,进而推理出求任意两个字符之间的随机字符,可以使用以下语句表示:
(char)(cha1+Math. random()* (cha2−cha1+1));
package test;
public class MathRandomChar {
// 定义获取任意字符之间的随机字符
public static char GetRandomChar(char cha1, char cha2) {
return (char) (cha1 + Math.random() * (cha2 - cha1 + 1));
}
public static void main(String[] args) {
// 获取a~z之间的随机字符
System.out.println("任意小写字符" + GetRandomChar('a', 'z'));
// 获取A~Z之间的随机字符
System.out.println("任意大写字符" + GetRandomChar('A', 'Z'));
// 获取0~9之间的随机字符
System.out.println("0到9任意数字字符" + GetRandomChar('0', '9'));
}
}
运行结果:
注意:
Math. random向方法返回的值实际上是伪随机数,它通过复杂的运算而得到一系列的数,该方法是通过当事判断作为随机数生成器的参数,所以每次执行程序都会产生不同的随机数。
9.3.2Random类
除了Math类中的random(方法可以获取随机数之外,Java中还提供了一种可以获取随机数的方式,那就是java. util. Random类,该类表示一个随机数生成器,可以通过实例化一个Random对象创建一个随机数生成器。语法如下:
Random r=new Random();
其中,r是指Random对象。
以这种方式实例化对象时,Java编译器以系统当前时间作为随机数生成器的种子,因为每时每刻的时间不可能相同,所以生成的随机数将不同,但是如果运行速度太快,也会生成两次运行结果相同的随机数。
同时也可以在实例化Random类对象时,设置随机数生成器的种子。语法如下:
Random r=new Random(seedValue);
r:Random类对象。
seedValue:随机数生成器的种子。在Random类中提供了获取各种数据类型随机数的方法,其常用方法及说明如表9.11所示。
import java.text.DecimalFormat;
import java.util.Random;
import java.util.Scanner;
/**
* 模拟微信抢红包功能
*/
public class RedBags { //创建一个RedBags类
public static void main(String[] args) {
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(); //创建随机数对象random
DecimalFormat df = new DecimalFormat("###,###,###.##"); //创建DecimalFormat类的对象df,并设置格式
for (int i = 1; i < bagsnum; i++) { //设置“循环”
double safe = (total - (bagsnum - i) * min) / (bagsnum - i); //通过公式模拟数学中的离散模型
double money = (double) random.nextInt((int) ((safe - min) * 100)) / 100 + min; //根据离散模型得到每个红包的金额
total = total - money; //替换total的值
String temp = df.format(money); //调用format()方法,对数字money格式化
System.out.println("第" + i + "个红包:" + temp + "元"); //输出结果
}
String left = df.format(total); //调用format()方法,对数字total格式化
System.out.println("第" + bagsnum + "个红包:" + left + "元"); //输出结果
sc.close(); //关闭控制台输入
}
}
运行结果:
9.4日期时间类
9.4.1Date类
import java.util.Date;
public class DateTest {
public static void main(String[] args) {
Date date = new Date(); // 创建现在的日期
long value = date.getTime(); // 获得毫秒数
System.out.println("日期:" + date);
System.out.println("到现在所经历的毫秒数为: " + value);
}
}
运行结果:
DateFormat类是日期/时间格式化子类的抽象类,它位于java. text包中,可以按照指定的格式对而时间进行格式化。 DateFormat 提供了很多类方法,以获得基于默认或给定语言环境和多种格风格的默认日期/时间Formatter,格式化风格包括SHORT、MEDIUM、LONG和FUL等4种。如下:
SHORT:完全为数字,如12.13.52或3:30pm。
yMEDIUM:较长,如Jan 12,1952。
LONG:更长,如January 12,1952或3:30:32pm。
FULL:完全指定,如Tuesday、April 12、1952AD或3:30:42pmPST。
另外,使用 DateFormat 还可以自定义日期时间的格式。要格式化一个当前语言环境下的日期。(7)需要创建 DateFormat 类的一个对象,由于它是抽象类,因此可以使用其静态工厂方法 Bouchstance 进行创建。语法如下:
UateFormatdf = DateFormat . getDateInstance ();
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class DateFormatTest {
public static void main(String[] args) {
// 创建日期
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.2Calendar类
Calendar提供了一个类方法getInstance,以获得此类型的一个通用的对象。Calender的getInstance方法返回一个Calendar对象,其日历字段已由当前日期和时间初始化。
Calendar rightNow=Calendar.getInstance();
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
* 输出2022年冬奥会倒计时(暂定冬奥会举办时间为2022年2月2日)
*/
public class OlympicWinterGames { //创建OlympicWinterGames类
public static void main(String[] args) {
System.out.println("——————————冬奥会倒计时——————————\n");
Date date = new Date(); //实例化Date
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); //创建SimpleDateFormat对象,制定目标格式
String today = simpleDateFormat.format(date);// 调用format方法,格式化时间,转换为指定方法
System.out.println("今天是" + today); //输出当前日期
long time1 = date.getTime(); //计算“自 1970 年 1 月 1 日 00:00:00 至当前时间所经过的毫秒数
Calendar calendar = Calendar.getInstance(); //使用默认时区和语言环境获得一个日历calendar
calendar.set(2022, 2-1, 4); //设置日历calendar中的 YEAR、MONTH 和 DAY_OF_MONTH 的值
long time2 = calendar.getTimeInMillis(); //计算“自 1970 年 1 月 1 日 00:00:00 至 2022 年 2 月 2 日所经过的毫秒数
long day = (time2 - time1)/(24 * 60 * 60 * 1000); //计算2022 年 2 月 2 日距离当前时间的天数
System.out.println("距离2022年“北京-张家口”冬奥会还有 " + day + " 天!");
}
}
运行结果: