Java部分常用类


BigDecimal

  • 思考:以下程序输出结果是多少?


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;
  }
   @Override
   public String toString(){
       return "Student [name=" + name + ", age=" + age + "]";
  }
   
   @Override //重写垃圾回收时需要执行的方法
   protected void finalize() throws Throwable{
       System.out.println("回收了" + name + " " + 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++完成。

相关