包装类 & 数学类 - Tung in ECNU


包装类 & 数学类

JAVA API 基础

这些都是Java开发者写好的类,我们可以用现成的轮子

JAVA JDK中常用包

  • java.lang:包含一些Java语言的核心类,如String、Math、Integer、System和Thread,提供常用功能。
  • java.awt:包含了构成抽象窗口工具集(abstract window toolkits)的多个类,这些类被用来构建和管理应用程序的图形用户界面(GUI)。
  • java.net:包含执行与网络相关的操作的类。
  • java.io:包含能提供多种输入/输出功能的类。
  • java.util:包含一些实用工具类,如定义系统特性、使用与日期日历相关的函数。
  • java.math : 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类

注:java.lang这个包会自动被导入,对于其中的类,不需要使用import语句来做导入。

java.lang 中的 langlanguage 的缩写

API 概述

使用方法:

  1. 看包路径
  2. 看使用方法
  3. 看方法摘要

1. 包装类

如果想要向集合中存储基本类型的数据,必须使用基本类型对应的包装类

  1. 八个包装类,6个数字型,都默认继承父类Number
  2. 八个包装类都实现了 Serializable 和 Comparable
  3. 除了 Character 外,其他的包装类都可以用 Srting 来构造,如 new Integer("123")

包装类数值不可变(只能替换掉),带有修饰符final,比基本类型多了一个null,在使用上可以无缝切换

基本类型包装类[属于引用类型]
byteByte
shortShort
intInteger[特殊]
floatFloat
doubleDouble
charCharacter[特殊]
booleanBoolean 注 true、false不是Java的关键字,是字面量
longLong

创建一个int类型的集合 :ArrayLish<Integer> list = new ArrayList<>();

从JDK1.5开始,支持自动装箱、自动拆箱

  • 自动装箱:基本类型—>包装类型
  • 自动拆箱:包装类型—>基本类型

面试常见问题

Integer i1 = 10;
Integer i2 = 10;
Integer i3 = new Integer(10);
Integer i4 = new Integer(10);
System.out.println(i1 == i2);  //true
System.out.println(i1 == i3);  //false
System.out.println(i3 == i4);  //false 
System.out.println(i1.equals(i2));    //true
System.out.println(i1.equals(i3));  //true
System.out.println(i3.equals(i4));  //true

Integer 类在加载的时候,自己有一个静态的空间,空间内立即加载 Integer 类型的数组,里面存储256个Integer对象,-128~127 的值可以直接存里面

Integer i1 = 1000;
Integer i2 = 1000;
System.out.println(i1 == i2);  //false

equals() 是Object 类中继承过来的方法,每一个引用类型都可以调用,默认继承的 equals() 方法和 == 一致,如果想要改变比较规则,可以重写 equals() 方法

//Integer 的 equals 方法已经被重写了. 重写后的比较条件为值一样就是一样
public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

2. 数学类

Math 的构造方法是私有的,我们不能直接调用创建对象,或者说因为 Math 中提供的属性和方法都是静态的,不需要我们创建对象。

Math 类

  1. abs 获取绝对值
  2. ceil / floor 向上取整,但是返回值是 double
  3. rint 返回最接近参数并等于某一整数的 double 值。如果两个同为整数的 double 值都同样接近,那么结果取偶数
  4. round 返回最接近参数的 int
  5. max / min 只能求二者之间的最值, int long float double 都可以
  6. double pow(double a,double b) 返回第一个参数的第二个参数次幂的值。
  7. sqrt 返回正确舍入的 double 值的正平方根。
  8. random 返回带正号的 double 值,该值 [ 0.0 , 1.0 )

但是使用 Math.random() 计算小数的时候可能会有精度损失,故推荐用 Random 类

  1. Math.PI 获取 $$\pi$$ 的常量值 ,源码如下,同理还有 Math.E
public static final double PI = 3.14159265358979323846;

double 类型的数字也可以 ++

long round(double num) 四舍五入,为什么返回值是long ?源码没看懂..是因为double 的范围太大?

public static long round(double a) {
    long longBits = Double.doubleToRawLongBits(a);
    long biasedExp = (longBits & DoubleConsts.EXP_BIT_MASK)
            >> (DoubleConsts.SIGNIFICAND_WIDTH - 1);
    long shift = (DoubleConsts.SIGNIFICAND_WIDTH - 2
            + DoubleConsts.EXP_BIAS) - biasedExp;
    if ((shift & -64) == 0) { // shift >= 0 && shift < 64
        // a is a finite number such that pow(2,-64) <= ulp(a) < 1
        long r = ((longBits & DoubleConsts.SIGNIF_BIT_MASK)
                | (DoubleConsts.SIGNIF_BIT_MASK + 1));
        if (longBits < 0) {
            r = -r;
        }
        // In the comments below each Java expression evaluates to the value
        // the corresponding mathematical expression:
        // (r) evaluates to a / ulp(a)
        // (r >> shift) evaluates to floor(a * 2)
        // ((r >> shift) + 1) evaluates to floor((a + 1/2) * 2)
        // (((r >> shift) + 1) >> 1) evaluates to floor(a + 1/2)
        return ((r >> shift) + 1) >> 1;
    } else {
        // a is either
        // - a finite number with abs(a) < exp(2,DoubleConsts.SIGNIFICAND_WIDTH-64) < 1/2
        // - a finite number with ulp(a) >= 1 and hence a is a mathematical integer
        // - an infinity or NaN
        return (long) a;
    }
}

Random 类

  1. Random 类 属于 java.util.Random 包,所以使用前需要导包
  2. 没有任何继承关系,实现了 Serializable 接口
  3. 基本构造方法 Random r = new Random(); 有多种重载方式
  4. 常用的方法

    1. 无参时 :nextInt()
    2. 有参时:nextInt(int bound) bound 必须为正数,生成一个 [0,bound)int
    3. nextBoolean 随机产生一个 Boolean

UUID 类

  1. 属于 java.util 包,使用时需要导包
  2. 没有任何继承关系,实现了 Serializable 接口
  3. 常用方法

    1. UUID.randomUUID() 直接调用静态方法,生成一个32位的密钥 (每一位都是16进制),它可以用来作为数据库表中的主键

      UUID uuid = UUID.randomUUID();
      System.out.println(uuid); //d7b5fa03-376d-4889-b910-8efd078b00f8
    2. UUID.timestamp() 返回与此 UUID 相关联的时间戳值

BigInteger 类

  1. 类中常用的方法:做四则运算

    1. add
    2. subtract
    3. multiply
    4. devide
  2. 设计一个方法,用来计算给定数字的阶乘
public BigInteger factorial(int num) {
    BigInteger result = new BigInteger("1");
    for (int i = 1; i <= num; i++) {
        result = result.multiply(new BigInteger(i + ""));
    }
    return result;
}

BigDecima 类

DecimalFormat 类

本文链接:

https://noahtung.xyz/index.php/archives/19/