Java部分常用类
-
思考:以下程序输出结果是多少?
public class TestBigDecimal{
public static void main(String[] args){
double d1 = 1.0;
double d2 = 0.9;
System.out.println(d1 - d2);
}
}
package com.qf.chapter;
?
import java.math.BigDecimal;
import java.math.RoundingMode;
?
public class Demo7{
public static void main(String[] args){
double d1 = 1.0;
double d2 = 0.9;
System.out.println();
//面试题
double result = (1.4 - 0.5)/0.9;
System.out.println(result);
//BigDecimal,大的浮点数精确计算。
BigDecimal bd1 = new BigDecimal("1.0"); //一定要用字符串的构造方法,最准确,后续的运算交给BigDecimal类。
BigDecimal bd2 = new BigDecimal("0.9"); //因为这个值本身就是不准确的,不传字符串传数值就会出错。
//类的减法运算,不能再用运算符了,只能调用方法。
BigDecimal r1 = bd1.subtract(bd2);
System.out.println(r1);
//加法
BigDecimal r2 = bd1.add(bd2);
System.out.println(r2);
//乘法
BigDecimal r3 = bd1.multiply(bd2);
System.out.println(r3);
//除法
BigDecimal r4 = new BigDecimal("1.4").subtract(new BigDecimal("0.5")).divide(new BigDecimal(0.9));
System.out.println(r4);
//操作除不尽的数据时
BigDecimal r5 = new BigDecimal("10").divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP); //保留两位小数,采用四舍五入的方式。
System.out.println(r5);
}
}
-
因为double和float格式存储的数据都是 近似值 ,所以结果不是预想的那样。
-
很多实际应用中需要精确运算,而double是近似值存储,不再符合要求,需要借助BigDecimal类。
-
位置:java.math包中。
-
作用:精确计算浮点数。
-
创建方式:BigDecimal bd = new BigDecimal("1.0");
-
方法:
-
BigDecimal add(BigDecimal bd)
-
BigDecimal subtract(BigDecimal bd)
-
BigDecimal multiply(BigDecimal bd)
-
BigDecimal divide(BigDecimal bd)
-
-
除法:divide(BigDecimal bd, int scal, RoundingMode mode)
-
参数scal:指定精确到小数点后几位
-
参数mode:
-
指定小数部分的取舍模式,通常采用四舍五入。
-
取值为BigDecimal.ROUND_HALF_UP。
-
-
Date
-
Date表示特定的瞬间,精确到毫秒。Date类中的大部分方法都已经被Calendar类中的方法所取代。
package com.qf.chapter;
import java.util.Date;
import javax.xml.crypto.Data;
?
public class Demo1{
public static void main(String[] args){
//1.创建Date对象
//今天的时间
Date date1 = new Date();
System.out.println(date1.toString());
System.out.println(date1.toLocaleString()); //过时的函数
//昨天的时间
Date date2 = new Date(date1.getTime() - (60*60*24*1000));
System.out.println(date2.toLocaleString());
//2.方法 after/before
boolean b1 = date1.after(date2);
System.out.println(b1);
boolean b2 = date1.before(date2);
System.out.println(b2);
//比较:compareTo()
int d = date1.compareTo(date2);
System.out.println(d);
//equals比较是否相等
boolean b3 = date1.equals(date2);
System.out.println(b3);
}
}
Calendar
-
Calendar提供了获取或设置各种日历字段的方法
-
构造方法
-
protected Calendar():由于修饰符是protected,所以无法直接创建该对象。
-
-
其他方法
方法名 | 说明 |
---|---|
static Calendar getinstance() | 使用默认的时区和区域获取日历 |
void set(int year, int month, int date, int hourofday, int minute, int second) | 设置日历的年、月、日、时、分、秒 |
int get(int field) | 返回给定日历字段的值,字段比如年、月、日 |
void setTime(Date date) | 用给定的Date设置此日历的时间。Date → Calendar |
Date getTime() | 返回一个Date表示此日历的时间。Calendar → Date |
void add(int field, int amount) | 按照日历的规则,给指定字段添加或减少 |
long getTimeInMillies() | 毫秒为单位返回该日历的时间值(从1970年起) |
package com.qf.chapter;
?
import java.util.Calendar;
import java.util.Date;
?
public class Demo2{
public static void main(String[] args){
//1.创建Calendar对象,受保护的方法不能直接new,只能用提供的其他方法。
Calendar calendar = Calendar.getInstance();
System.out.println(calendar.getTime().toLocaleString());
System.out.println(calendar.getTimeInMillis());
//2.获取时间的信息
//获取年
int year = calendar.get(Calendar.YEAR);
//获取月,老外设计顺序为0-11,所以实际月数得加一。
int month = calendar.get(Calendar.MONTH);
//获取日
int day = calendar.get(Calendar.DAY_OF_MONTH); //用Date也是一样的
//获取小时
int hour = calendar.get(Calendar.HOUR_OF_DAY); //HOUR是12小时,HOUR_OF_DAY是24小时。
//获取分钟
int minute = calendar.get(Calendar.MINUTE);
//获取秒钟
int second = calendar.get(Calendar.SECOND);
System.out.println(year + "年" + (month + 1) + "月" + day + "日" + hour + ":" + minute + ":" + second);
//修改时间
Calendar calendar2 = Calendar.getInstance();
calendar2.set(Calendar.DAY_OF_MONTH, 5); //设置具体某日
System.out.println(calendar2.getTime().toLocaleString());
//4.基于当前时间使用add方法作修改
calendar2.add(Calendar.HOUR, 1); //给原有时间加1小时,若要减少1小时就写-1。
System.out.println(calendar2.getTime().toLocaleString());
//5.补充方法,获取当前时间的最大值或最小值。
int max = calendar2.getActualMaxmum(Calendar.DAY_OF_MONTH);
int min = calendar2.getActualMinmum(Calendar.DAY_OF_MONTH);
System.out.println(max);
System.out.println(min);
}
}
SimpleDateFormat
-
SimpleDateFormat是一个以与语言环境有关的方式来格式化和解析日期的具体类
-
进行格式化(日期→文本)、解析(文本→日期)
-
常用的时间模式字母
字母 | 日期或时间 | 示例 |
---|---|---|
y | 年 | 2019 |
M | 年中月份 | 08 |
d | 月中天数 | 10 |
H | 1天中小时数(0-23) | 22 |
m | 分钟 | 16 |
s | 秒 | 59 |
S | 毫秒 | 367 |
package com.qf.chapter;
?
import java.text.SimpleDateFormat;
?
public class Demo3{
public static void main(String[] args) throws Exception{
//1.创建SimpleDateFormat对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); //只写yyyy/MM/dd也行
//2.创建一个时间
Date date = new Date();
//格式化date(把日期转成字符串)
String str = sdf.format(date);
System.out.println(str);
//解析(把字符串转成时间)
Date date2 = sdf.parse("1997/05/01"); //必须按yyyy/MM/dd类格式来给出时间字符串
System.out.println(date2);
}
}
System类
-
System系统类,主要用于获取系统的属性数据和其他操作,构造方法私有,用的时候不需要创建对象,这个类中大部分属性和方法都是静态的直接用点号访问符使用即可。
方法名 | 说明 |
---|---|
static void arraycopy(...) | 复制数组 |
static long currentTimeMillis(); | 获取当前系统时间,返回的是1970年开始到现在时刻为止的毫秒值 |
static void gc(); | 建议JVM赶快启动垃圾回收器回收垃圾 |
static void exit(int status); | 退出jvm,如果参数是0表示正常退出jvm,非0表示异常退出jvm |
package com.qf.chapter;
?
public class Demo4{
public static void main(String[] args){
//1.arraycopy数组的复制
//参数1 → src:复制的源数组
//参数2 → srcPos:从哪个位置开始复制
//参数3 → dest:目标数组
//参数4 → destPos:目标数组的位置
//参数5 → length:复制的长度
int[] arr = {20, 18, 15, 8, 35, 26, 45, 90};
int[] dest = new int[8];
System.arrcopy(arr, 0, dest, 0, arr.length);
for(int i=0; i<dest.length; i++){
System.out.println(dest[i]);
}
System.out.println(System.currentTimeMillis());
//2.计算两个for循环间隔时间
long start = System.currentTimeMillis();
for(int i=-999999999; i<999999999; i++){
for(int j=-999999999; j<999999999; j++){
int result = i + j;
}
}
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start));
//3.System.gc();告诉垃圾回收器可以回收垃圾了
Student s1 = new Student("aaa", 19);
Student s2 = new Student("bbb", 29);
new Student("ccc", 39);
System.gc();
//4.手动设置退出jvm
System.exit(0);
System.out.println("程序结束了"); //由于写在手动退出后,因此这段代码不会再执行了。
}
}
package com.qf.chapter;
?
public class Student{
private String name;
private String age;
public Student(){}
public Student(String name, int age){
super();
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(){
this.age = age;
}
-
Arrays.copyOf(original, newlength) 这个方法内部也是调用的System.arrcopy方法的,而System.arrcopy方法是由
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
这个没有方法体的函数具体实现的,类似接口中函数的写法,它的实现交由C/C++完成。