第10章 API与常见算法

10.1 和数学相关的类

10.1.1 java.lang.Math

java.lang.Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。类似这样的工具类,其所有方法均为静态方法,并且不会创建对象,调用起来非常简单。

  • public static double abs(double a) :返回 double 值的绝对值。

double d1 = Math.abs(-5); //d1的值为5
double d2 = Math.abs(5); //d2的值为5
  • public static double ceil(double a) :返回大于等于参数的最小的整数。

double d1 = Math.ceil(3.3); //d1的值为 4.0
double d2 = Math.ceil(-3.3); //d2的值为 -3.0
double d3 = Math.ceil(5.1); //d3的值为 6.0
  • public static double floor(double a) :返回小于等于参数最大的整数。

double d1 = Math.floor(3.3); //d1的值为3.0
double d2 = Math.floor(-3.3); //d2的值为-4.0
double d3 = Math.floor(5.1); //d3的值为 5.0
  • public static long round(double a) :返回最接近参数的 long。(相当于四舍五入方法)

long d1 = Math.round(5.5); //d1的值为6.0
long d2 = Math.round(5.4); //d2的值为5.0
  • public static double pow(double a,double b):返回a的b幂次方法

  • public static double sqrt(double a):返回a的平方根

  • public static double random():返回[0,1)的随机值

  • public static final double PI:返回圆周率

  • public static double max(double x, double y):返回x,y中的最大值

  • public static double min(double x, double y):返回x,y中的最小值

double result = Math.pow(2,31);
double sqrt = Math.sqrt(256);
double rand = Math.random();
double pi = Math.PI;

10.1.2 java.math包

(1)BigInteger

BigInteger 用于表示任意大小的整数。由于 Java 中的基本数据类型(如 int, long)有固定的范围和大小,因此当需要处理超出这些范围的大整数时,BigInteger 就变得非常有用。

  • BigInteger(String val)

  • BigInteger add(BigInteger val)

  • BigInteger subtract(BigInteger val)

  • BigInteger multiply(BigInteger val)

  • BigInteger divide(BigInteger val)

  • BigInteger remainder(BigInteger val)

  • ....

    
    public void test01(){
//      long bigNum = 123456789123456789123456789L;
        
        BigInteger b1 = new BigInteger("123456789123456789123456789");
        BigInteger b2 = new BigInteger("78923456789123456789123456789");
        
//      System.out.println("和:" + (b1+b2));//错误的,无法直接使用+进行求和
        
        System.out.println("和:" + b1.add(b2));
        System.out.println("减:" + b1.subtract(b2));
        System.out.println("乘:" + b1.multiply(b2));
        System.out.println("除:" + b2.divide(b1));
        System.out.println("余:" + b2.remainder(b1));
    }
(2)BigDecimal

BigDecimal用于处理任意精度的十进制数。提供了任意精度的有符号十进制数字的表示,以及对这些数字进行算术运算的方法。

  • BigDecimal(String val)

  • BigDecimal add(BigDecimal val)

  • BigDecimal subtract(BigDecimal val)

  • BigDecimal multiply(BigDecimal val)

  • BigDecimal divide(BigDecimal val)

  • BigDecimal divide(BigDecimal divisor, int roundingMode)

  • BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)

  • BigDecimal remainder(BigDecimal val)

  • ....

    
    public void test02(){
        /*double big = 12.123456789123456789123456789;
        System.out.println("big = " + big);*/
        
        BigDecimal b1 = new BigDecimal("123.45678912345678912345678912345678");
        BigDecimal b2 = new BigDecimal("7.8923456789123456789123456789998898888");
        
//      System.out.println("和:" + (b1+b2));//错误的,无法直接使用+进行求和
        
        System.out.println("和:" + b1.add(b2));
        System.out.println("减:" + b1.subtract(b2));
        System.out.println("乘:" + b1.multiply(b2));
        System.out.println("除:" + b1.divide(b2,20,RoundingMode.UP));//divide(BigDecimal divisor, int scale, int roundingMode)
        System.out.println("除:" + b1.divide(b2,20,RoundingMode.DOWN));//divide(BigDecimal divisor, int scale, int roundingMode)
        System.out.println("余:" + b1.remainder(b2));
    }
(3)RoundingMode枚举类

如果项目对精度要求比较高所以使用到Bigdecimal,又涉及到范围限制,所以就涉及到如果除不尽是Bigdecimal的舍人模式的问题

CEILING :向正无限大方向舍入的舍入模式。

DOWN :向零方向舍入的舍入模式。

FLOOR:向负无限大方向舍入的舍入模式。

HALF_DOWN :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。

HALF_EVEN:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

HALF_UP:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。

UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。 UP:远离零方向舍入的舍入模式。

10.1.3 java.util.Random

用于产生随机数

  • boolean nextBoolean():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。

  • void nextBytes(byte[] bytes):生成随机字节并将其置于用户提供的 byte 数组中。

  • double nextDouble():返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 double 值。

  • float nextFloat():返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之间均匀分布的 float 值。

  • double nextGaussian():返回下一个伪随机数,它是取自此随机数生成器序列的、呈高斯(“正态”)分布的 double 值,其平均值是 0.0,标准差是 1.0。

  • int nextInt():返回下一个伪随机数,它是此随机数生成器的序列中均匀分布的 int 值。

  • int nextInt(int n):返回一个伪随机数,它是取自此随机数生成器序列的、在 0(包括)和指定值(不包括)之间均匀分布的 int 值。

  • long nextLong():返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 long 值。

    
    public void test03(){
        Random r = new Random();
        System.out.println("随机整数:" + r.nextInt());
        System.out.println("随机小数:" + r.nextDouble());
        System.out.println("随机布尔值:" + r.nextBoolean());
    }

10.2 日期时间API

10.2.1 JDK1.8之前

1、java.util.Date

new Date():当前系统时间

long getTime():返回该日期时间对象距离1970-1-1 0.0.0 0毫秒之间的毫秒值 时间戳

new Date(long 毫秒):把该毫秒值换算成日期时间对象

    
    public void test5(){
        long time = Long.MAX_VALUE;
        Date d = new Date(time);
        System.out.println(d);
    }
    
    
    public void test4(){
        long time = 1559807047979L;
        Date d = new Date(time);
        System.out.println(d);
    }
    
    public void test3(){
        Date d = new Date();
        long time = d.getTime();
        System.out.println(time);//1559807047979
    }
    
    
    public void test2(){
        long time = System.currentTimeMillis();
        System.out.println(time);//1559806982971
        //当前系统时间距离1970-1-1 0:0:0 0毫秒的时间差,毫秒为单位
    }
    
    
    public void test1(){
        Date d = new Date();
        System.out.println(d);
    }
2、java.text.SimpleDateFormat

SimpleDateFormat用于日期时间的格式化。

    
    public void test10() throws ParseException{
        String str = "2019年06月06日 16时03分14秒 545毫秒  星期四 +0800";
        SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒  E Z");
        Date d = sf.parse(str);
        System.out.println(d);
    }
    
    
    public void test9(){
        Date d = new Date();
​
        SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒 SSS毫秒  E Z");
        //把Date日期转成字符串,按照指定的格式转
        String str = sf.format(d);
        System.out.println(str);
    }
3、java.util.TimeZone

通常,使用 getDefault 获取 TimeZonegetDefault 基于程序运行所在的时区创建 TimeZone

也可以用 getTimeZone 及时区 ID 获取 TimeZone 。例如美国太平洋时区的时区 ID 是 "America/Los_Angeles"。

import org.junit.Test;
​
import java.util.TimeZone;
​
public class TestTimezone {
    
    public void test1(){
        String[] all = TimeZone.getAvailableIDs();
        for (int i = 0; i < all.length; i++) {
            System.out.println(all[i]);
        }
    }
​
    
    public void test2(){
        TimeZone t = TimeZone.getTimeZone("America/Los_Angeles");
        System.out.println(t);
    }
}

常见时区ID:

Asia/Shanghai
UTC
America/New_York
4、java.util.Locale

Locale 对象表示了特定的地理、政治和文化地区。需要 Locale 来执行其任务的操作称为语言环境敏感的 操作,它使用 Locale 为用户量身定制信息。

语言参数是一个有效的 ISO 语言代码。这些代码是由 ISO-639 定义的小写两字母代码。

国家/地区参数是一个有效的 ISO 国家/地区代码。这些代码是由 ISO-3166 定义的大写两字母代码。

Locale 类提供了一些方便的常量,可用这些常量为常用的语言环境创建 Locale 对象。

import org.junit.Test;
​
import java.util.Locale;
​
public class TestLocale {
    
    public void test01(){
        Locale[] all = Locale.getAvailableLocales();
        for (int i = 0; i < all.length; i++) {
            System.out.println(all[i]);
        }
    }
    
    
    public void test02(){
        Locale 410000 = Locale.410000;
        System.out.println("410000 = " + 410000);
    }
}
5、java.util.Calendar

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHHOUR_OF_DAYHOUR日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。

修改和获取 YEARMONTHHOUR_OF_DAYHOUR日历字段对应的时间值。

void add(int field,int amount) 根据给定的日历字段和对应的时间,来对当前的日历进行操作
int get(int field)   获取当前日历的年月日
void set(int field, int value)  设置当前日历的年月日

示例代码:

import org.junit.Test;
​
import java.util.Calendar;
import java.util.TimeZone;
​
public class TestCalendar {
    
    public void test1(){
        Calendar c = Calendar.getInstance();
        System.out.println(c);
​
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH)+1;
        int day = c.get(Calendar.DATE);
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
​
        System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute);
    }
​
    
    public void test2(){
        TimeZone t = TimeZone.getTimeZone("America/Los_Angeles");
        Calendar c = Calendar.getInstance(t);
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH)+1;
        int day = c.get(Calendar.DATE);
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
​
        System.out.println(year + "-" + month + "-" + day + " " + hour + ":" + minute);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值