思考: 以下程序输出结果是多少?
public class Test {
public static void main(String[] args) {
double d1 = 1.0;
double d2 = 0.9;// 近似存储
System.out.println(d1-d2);//0.09999999999999998
}
}
res:
0.09999999999999998
位置:java.math包中。
作用:精确计算浮点数。
创建方式:BigDecimal bd=new BigDecimal(“1.0”);
eg:
public class Test {
public static void main(String[] args) {
double d1 = 1.0;
double d2 = 0.9;// 近似存储
System.out.println(d1-d2);//0.09999999999999998
BigDecimal bd1 = new BigDecimal("1.0");
BigDecimal bd2 = new BigDecimal("0.9");
//减法
BigDecimal r1 = bd1.subtract(bd2);
System.out.println(r1.doubleValue());
//加法
BigDecimal r2 = bd1.add(bd2);
System.out.println(r2.doubleValue());
//乘法
BigDecimal r3 = bd1.multiply(bd2);
System.out.println(r3.doubleValue());
//除法
BigDecimal bd3 = new BigDecimal("10");
BigDecimal bd4 = new BigDecimal("3");
//RoundingMode.HALF_UP 四舍五入 大于等于5
//RoundingMode.HALF_DOWN 四舍五入 大于5
/*
RoundingMode.HALF_EVEN 银行舍入法 四舍六入 五取偶
5后面有非0数字进一
5后面为0看前面数字, 为奇数进一, 偶数不变
3.4550 保留两位小数 3.46
3.2854 保留两位小数 3.29
3.1450 保留两位小数 3.14
*/
BigDecimal r4 = bd4.divide(bd4,2, RoundingMode.HALF_UP);
System.out.println(r4.doubleValue());
//模
BigDecimal r5 = bd3.remainder(bd4);
System.out.println(r5.doubleValue());
}
}
Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。
方法名 | 说明 |
---|---|
static int abs(int a) | 获取绝对值 |
static double pow(double a,double b) | 返回第一个参数的第二个参数次幂的值 |
static double random() | 返回带正号的 double 值,该值大于等于 0.0 且小于 1.0 |
static long round(double a) | 返回最接近参数的long |
static double sqrt(double a) | 返回正确舍入的 double 值的正平方根 |
static double cbrt(double a) | 返回double值的立方根。 |
static double ceil(double a) | 返回大于或等于参数的最小整数 |
static double floor(double a) | 返回小于或等于参数的最大整数 |
public class Test {
public static void main(String[] args) {
System.out.println(Math.PI);
System.out.println(Math.E);
//方法
//abs绝对值
System.out.println(Math.abs(-10));
//pow(a,b) a的b次幂
System.out.println(Math.pow(2, 10));
//ceil()
System.out.println(Math.ceil(3.5));
//floor()
System.out.println(Math.floor(2.5));
//求平方根
System.out.println(Math.sqrt(100));
//求立方根
System.out.println(Math.cbrt(27));
//random() 随机返回0-1之间的小数,含0不含1
System.out.println(Math.random());
//随机获取0-9之间的整数
System.out.println((int) (Math.random() * 10));
//随机获取0-99之间的整数
System.out.println((int) (Math.random() * 100));
//随机获取50-99之间的整数
System.out.println((int) (Math.random() * 50) + 50);
//规律: 随机获取a-b之间的整数 (int)(Math.random()*(b-a+1))+a
//随机获取100-999之间的整数
System.out.println((int) (Math.random() * 900) + 100);
}
}
此类的实例用于生成伪随机数流。
此类使用 48 位的种子,使用线性同余公式 (linear congruential form) 对其进行了修改所得。
eg:
public class Test {
public static void main(String[] args) {
//Random 伪随机数类
Random random = new Random();
//方法
//nextInt(); 随机返回一个整数
System.out.println(random.nextInt());
//nextInt(bound); 随机返回0-bound(不包含)之间的一个整数
System.out.println(random.nextInt(100));
//nextDouble(); 随机返回一个0-1之间的小数, 含0不含1
System.out.println(random.nextDouble());
System.out.println("---------------------------");
//指定种子的随机对象
Random random1 = new Random(1000);
Random random2 = new Random(1000);
for (int i = 0; i < 10; i++) {
System.out.println(random1.nextInt());
System.out.println(random2.nextInt());
}
}
}
Date表示特定的瞬间,精确到毫秒。
Date类中的大部分方法都已经被Calendar类中的方法所取代。
时间单位: 1秒=1000毫秒; 1毫秒=1000微秒; 1微秒=1000纳秒
eg:
public class Test {
public static void main(String[] args) {
//创建今天
Date now = new Date();
System.out.println(now);
//创建昨天
Date yesterday = new Date(now.getTime()-60*60*24*1000);
System.out.println(yesterday);
//创建明天
Date tomorrow = new Date(now.getTime()+60*60*24*1000);
System.out.println(tomorrow);
}
}
SimpleDateFormat是以与语言环境有关的方式来格式化和解析日期的类。
进行格式化(日期 -> 文本)、解析(文本 -> 日期)
常用的时间模式字母
字母 | 日期或时间 | 示例 |
---|---|---|
y | 年 | 2019(yyyy) |
M | 年中月份 | 08(MM) |
d | 月中天数 | 10(dd) |
H | 1天中小时数(0-23) | 22(HH) |
m | 分钟 | 16(mm) |
s | 秒 | 59(ss) |
S | 毫秒 | 367(SSSS) |
eg:
public class Test {
public static void main(String[] args) throws ParseException {
//创建任意时间
//2001-10-8 10:08:10
//创建格式化对象
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String s = "2001-10-8 10:08:10";
//把字符串转换成日期
Date date = simpleDateFormat.parse(s);
System.out.println(date);
//把日期对象转换成字符串
System.out.println("--------------");
System.out.println(simpleDateFormat.format(now));
System.out.println(simpleDateFormat.format(yesterday));
System.out.println(simpleDateFormat.format(tomorrow));
System.out.println(simpleDateFormat.format(date));
}
}
eg:
将日期字符串"Jan 9,2023"转成"2023-01-09"
public class Test2 {
public static void main(String[] args) throws ParseException {
//日期字符串"Jan 9,2023"转成"2023-01-09"
//Date 和 SimpleDateFormat
String s1 = "Jan 9,2023";
//默认语言环境简体中文
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd,yyyy", Locale.ENGLISH);
Date d = sdf.parse(s1);
System.out.println(d);
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
System.out.println(sdf2.format(d));
}
}
Calendar提供了获取或设置各种日历字段的方法。
protected Calendar() 构造方法为protected修饰,无法直接创建该对象。
eg:
public class calendar {
public static void main(String[] args) {
//创建日历对象
Calendar now = Calendar.getInstance();
//获取年份
System.out.println(now.get(Calendar.YEAR));
//获取月份
System.out.println(now.get(Calendar.MONTH)+1);
//获取天数
System.out.println(now.get(Calendar.DAY_OF_MONTH));
//获取小时
System.out.println(now.get(Calendar.HOUR_OF_DAY));
//获取分钟
System.out.println(now.get(Calendar.MINUTE));
//获取秒
System.out.println(now.get(Calendar.SECOND));
//设置日历
Calendar calendar = Calendar.getInstance();
calendar.set(2024, Calendar.JANUARY,9,11,19,20);
System.out.println(calendar.getTime());
}
}
System系统类,主要用于获取系统的属性数据和其他操作
public class Test {
public static void main(String[] args) {
//System 系统类
//1 arraycopy() 复制数组
//src: 源数组
//srcPos: 源数组位置
//dest: 目标数组
//dest: 目标数组位置
//length: 长度
int[] arr1 = {10,8,5,20,23};
int[] arr2 = new int[arr1.length*2];
System.arraycopy(arr1,0,arr2,0,arr1.length);
System.out.println(Arrays.toString(arr2));
//2 currentTimeMillis(); 从1970-1-1 0:0:0(Unix系统元年) 开始到现在的毫秒值
System.out.println(System.currentTimeMillis());
//3 gc(); 通知垃圾回收器回收垃圾
System.gc();
//4 exit(); 退出jvm
//0 表示正常退出, 非0: 异常退出
System.exit(0);
System.out.println("程序结束了...");
}
}
每个 Java 应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接。
可以通过getRuntime方法获取当前运行时。
方法名 | 说明 |
---|---|
Process exec(String command) | 在单独的进程中执行指定的字符串命令。 |
void exit(int status) | 终止当前正在运行的 Java 虚拟机。 |
void gc() | 建议JVM赶快启动垃圾回收器回收垃圾 |
long totalMemory() | 返回 Java 虚拟机中的内存总量。 |
long freeMemory() | 返回 Java 虚拟机中的空闲内存量 |
long maxMemory() | 返回 Java 虚拟机试图使用的最大内存量。 |
eg:
public class Test {
public static void main(String[] args) throws IOException {
//Runtime类: 每一个应用程序启动都对应Runtime对象
//1 获取运行时对象
Runtime runtime = Runtime.getRuntime();
//2 exec(); 执行程序(单独程序中执行)
//runtime.exec("notepad");
//3 exit(); 退出jvm
//runtime.exit(0);
//4 gc(); 告诉垃圾回收器回收垃圾
//runtime.gc();
//5 内存相关的方法(堆)
//totalMemory(); 总内存 -Xms 堆的初始大小
//freeMemory(); 空闲内存
//maxMemory(); 最大内存 -Xmx 堆的最大大小
System.out.println(runtime.totalMemory() / 1024 / 1024);//MB 默认电脑内存的1/64
System.out.println(runtime.freeMemory() / 1024 / 1024);
System.out.println(runtime.maxMemory() / 1024 / 1024);//MB 默认电脑内存的1/4
System.out.println(args.length);
for (String arg : args) {
System.out.println(arg);
}
}
}