常用API

常用API

什么是API?

  • API(Application Programming Interface) 应用程序编程接口。
  • 简单来说:就是Java帮我们已经写好的一些方法,我们直接拿过来用就好了。

1.Object

Object类的作用:

  • 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是Java的祖宗类。
  • Object类的方法是一切子类都可以直接使用的,所以我们要学习Object类的方法。

1.1 toString方法

Object类的toString方法

public String toString() 默认是返回当前对象在堆内存中的地址信息:类的全限名@内存地址

问题引出

  • 开发中直接输出对象,默认输出对象的地址其实是毫无意义的。
  • 开发中输出对象变量,更多的时候是希望看到对象的内容数据而不是对象的地址信息。

toString存在的意义

  • 父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息而不是地址信息!

1.2 equals方法

public Boolean equals(Object o) 默认是比较当前对象与另一个对象的地址是否相同,相同则返回true,不同返回false

问题思考

  • 直接比较两个对象的地址是否相同完全可以用"=="替代equals。

equals存在的意义

  • 父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则。

自己重写equals方法比较规则

   /*
    自己重写equals方法,自己定制相等规则
    两个对象的内容一样就认为是相等的
    s1.equals(s2)
    比较者s1 == this
    被比较者 s2 == o
     */
    @Override
    public boolean equals(Object o) {
        //1.判断是不是学生对象,包含判断o是否为null,为null直接返回false
        if (o instanceof Student) {
            Student s2 = (Student) o;
//            if (name.equals(s2.name) && this.sex == s2.sex && this.age == s2.age) {
//                return true;
//            } else {
//                return false;
//            }
            //基本数据类型比较对象地址用==
            return this.name.equals(s2.name) && sex == s2.sex && age == s2.age;
        } else {
            return false;
        }
    }
public class Test {
    public static void main(String[] args) {
        Student s1 = new Student("小白", '男', 18);
        Student s2 = new Student("小白", '男', 18);
        System.out.println(s1.equals(s2));
        System.out.println(s1 == s2);
    }
}
output:
true
false

官方给的equals方法

  @Override
    public boolean equals(Object o) {
        //判断是否是同一个对象比较,如果是则返回true
        if (this == o) return true;
        //判断对象地址是否为空 和判断对象类型是否相同
        if (o == null || getClass() != o.getClass()) return false;
        //到这步说明o一定是学生类型且不为null,强转一下
        Student student = (Student) o;
        return sex == student.sex &&
                age == student.age &&
                //调用Objects类中的equals方法比较引用数据类型的值
                Objects.equals(name, student.name);
    }

2. Objects

Objects概述

  • Objects类与Object类还是继承关系,Objects类是从JDK1.7开始之后才有的。

Objects的常见方法

public static boolean equals(Object a,Object b) 比较两个对象的,底层会先进行非空判断,从而可以避免控制住异常。再进行equals比较

publci static boolean isNull(Object obj) 判断变量是否为null,为null则返回true,反之false

源码分析

public class Test {
    public static void main(String[] args) {
        Student s1 = null;
        Student s2 = new Student("小白", '男', 18);
        System.out.println(s1.equals(s2));//留下了隐患,可能出现空指针异常
        System.out.println(s1 == s2);
        System.out.println(Objects.equals(s1, s2));//更安全,结果也是对的
    }
} 
public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

对象进行内容比较的时候建议使用Objects提供的equals方法,比较结果一样,但是更安全

3. StringBuilder

StringBuilder概述

  • StringBuilder是一个可变的字符串,我们可以把它看成是一个对象容器。
  • 作用:提高字符串的操作效率,如拼接、修改等。

StringBuilder构造器

public StringBuilder() 创建一个空白的可变的字符串对象,不包含任何内容。

public StringBuilder(String str) 创建一个指定字符串内容的可变字符串对象

StringBuilder常用方法

public StringBuilder append(任意类型) 添加数据并返回StringBuilder对象本身

public StringBuilder reverse() 将对象内容反转

public int length() 返回对象内容的长度

public String toString() 通过toString()就可以实现把StringBuilder转换成String

public class StringBuilderDemo1 {
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        sb.append("a");
        sb.append("A");
        sb.append(123);
        sb.append(true);
        sb.append('中');
        sb.append("]");
        System.out.println(sb);

        StringBuilder sb1 = new StringBuilder();
        //支持链式编程
        sb1.append("a").append("b").append("中国我爱你");
        System.out.println(sb1);
        //反转
        sb1.reverse().append(1234);
        System.out.println(sb1);

        //注意:StringBuilder只是拼接字符串的手段,效率好
        //最终的结果还是要恢复成String类型
        StringBuilder sb2 = new StringBuilder();
        sb2.append("hello").append(123);
        System.out.println(sb2.length());
        //恢复成String类型
        String str = sb2.toString();
        check(str);
    }
    public static void check(String s){
        return;
    }
}
output:
[aA123true中]
ab中国我爱你
你爱我国中ba1234
8

为什么拼接字符串、反转字符串建议使用StringBuilder?

  • String:内容是不可变的、拼接字符串性能差,String拼接字符串用+每拼接一次要在堆内存中产生两个对象(先new个StringBuilder把内容拼好,再toString成字符串)

  • StringBuilder:内容是可变的,拼接字符串性能好、代码有优雅。

  • 定义字符串使用String

  • 拼接、修改等操作字符串使用StringBuilder

案例:打印整形数组内容

需求:

设计一个方法用于输出任意整形数组的内容,要求输出成如下格式:

该数组的内容为:[11,22,33,44,55]

分析

1.定义一个方法,要求该方法能够接收数组,并输出数组内容。----->需要参数吗?需要返回值类型声明吗?

2.定义一个静态初始化数组,调用该方法,并传入数组

public class StringBuilderDemo2 {
    public static void main(String[] args) {
        int[] arr = null;
        System.out.println(toString(arr));

        int[] arr1 = {12,33,55,2};
        System.out.println(toString(arr1));
    }

    /**
     * 1.定义方法接收任意整形数组,返回数组内容格式
     */
    public static String toString(int[] arr) {
        if (arr != null) {
            //2.开始拼接内容
            StringBuilder sb = new StringBuilder("[");
            for (int i = 0; i < arr.length; i++) {
                sb.append(arr[i]).append(i == arr.length - 1 ? "" : ", ");
            }
            sb.append("]");
            return sb.toString();
        } else {
            return null;
        }
    }
}
output:
null
[12, 33, 55, 2]

4.Math

Math类

  • ​ 包含执行基本数字运算的方法,Math类没有提供公开的构造器。
  • 如何使用类中的成员呢?看类的成员是否都是静态的,如果是,通过类名就可以直接调用。

Math类中常用方法

pubic static int abs(int a) 获取参数绝对值

public static double ceil(double a) 向上取整

public static double floor(double a) 向下取整

public static int round(float a) 四舍五入

public static int max(int a,int b) 获取两个int值中的较大值

public static double pow(double a ,double b) 返回a 的b次幂的值

public static double random() 返回值为double的随机值,范围[0.0,1.0)

public class MathDemo {
    public static void main(String[] args) {
        //1.取绝对值
        System.out.println(Math.abs(10));
        System.out.println(Math.abs(-10));

        //2.向上取整:5
        System.out.println(Math.ceil(4.00001));
        System.out.println(Math.ceil(4.0));

        //3.向下取整:4
        System.out.println(Math.floor(4.000001));
        System.out.println(Math.floor(4.99999999));

        //4.求次方幂
        System.out.println(Math.pow(2, 3));

        //5.四舍五入:10
        System.out.println(Math.round(4.49999));
        System.out.println(Math.round(4.500001));

        System.out.println(Math.random());//[0.0 - 1.0),取值范围不包含1

        //拓展: 3 - 9之间的随机数,  (0 - 6) + 3
        int data = (int) (Math.random() * 7) + 3;
        System.out.println(data);
    }
}
output:
10
10
5.0
4.0
4.0
4.0
8.0
4
5
0.26371044972810354
9

5.System

System类概述

  • System的功能是通用的,都是直接类名调用即可,所以System不能被实例化。

System类的常用方法

public static void exit(int status) 终止当前运行的Java虚拟机,非零表示异常终止

public static long currentTimeMillis() 返回当前系统的时间毫秒值形式

public static void arraycopy(数组源数组,起始索引,目的地数组,起始索引,拷贝个数) 数组拷贝

import java.util.Arrays;

public class SystemDemo {
    public static void main(String[] args) {
        System.out.println("程序开始。。。");
        //System.exit(0);//JVM终止!慎用

        //2。计算机认为时间有起源:返回1970-1-1 00:00:00 走到此前时刻的总的毫秒值:时间毫秒值
 /*       long time = System.currentTimeMillis();
        System.out.println(time);
        long startTime = System.currentTimeMillis();
        //运行时间的计算:性能分析
        for (int i = 0; i < 100000; i++) {
            System.out.println("输出" + i);
        }
        long endTime = System.currentTimeMillis();
        System.out.println((endTime-startTime)/10+"s");

        */

        //3.数组拷贝
        /**
         arraycopy(Object src,  int  srcPos,
         Object dest, int destPos,
         int length);
         src :被拷贝的数组
         src Pos:要被拷贝的开始索引
         dest:拷贝到的数组
         destPos:拷贝到数组的起始索引
         length :要拷贝的长度
         */
        int[] arr = {1,3,5,4,66,33};
        int[] arr1 = new int[6];//[0,0,0,0,0,0]-->[0,0,5,4,66,0]
        System.arraycopy(arr,2,arr1,2,3);
        System.out.println(Arrays.toString(arr1));
    }
}
output:
程序开始。。。
[0, 0, 5, 4, 66, 0]

6. BigDecimal

BigDecimal作用

  • 用于解决浮点型运算精度失真的问题

使用步骤:

  • 创建对象BigDecimal封装浮点型数据(最好的方式是调用方法)
public static BigDecimal valueOf(double val):	包装浮点数称为BigDecimal对象。
import java.math.BigDecimal;
import java.math.RoundingMode;

public class BigDecimalDemo {
    public static void main(String[] args) {
        //浮点型运算的时候直接 + - * /  可能会出现数据失真(精度问题)
        System.out.println(0.09 + 0.01);
        System.out.println(1.0 - 0.32);
        System.out.println(1.105 * 100);
        System.out.println(1.301 / 100);

        System.out.println("------------");
        double a = 0.1;
        double b = 0.2;
        double c = a + b;
        System.out.println(c);
        System.out.println("------------");

        //包装浮点型数据成为大数据对象,BigDecimal
        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);
        //BigDecimal c1 = a1.add(b1);
        //BigDecimal c1 = a1.subtract(b1);
        //BigDecimal c1 = a1.multiply(b1);
        BigDecimal c1 = a1.divide(b1);
        System.out.println(c1);

        //目的:double
        double rs = c1.doubleValue();
        System.out.println(rs);
        //注意事项:BigDecimal是一定要精度运算的
        BigDecimal a11 = BigDecimal.valueOf(10.0);
        BigDecimal b11 = BigDecimal.valueOf(3.0);
        //BigDecimal c11 = a11.divide(b11);//ArithmeticException
        /**
            参数一:除数,参数二:保留小数位数,参数三:舍入模式
         */
        BigDecimal c11 = a11.divide(b11,2, RoundingMode.HALF_UP);
        System.out.println(c11);
        System.out.println("----------");
    }
}
output:
0.09999999999999999
0.6799999999999999
110.5
0.013009999999999999
------------
0.30000000000000004
------------
0.5
0.5
3.33
----------
posted @ 2022-01-11 21:58  tryAgainCs  阅读(120)  评论(0编辑  收藏  举报