JavaSE进阶6之常用API

API 应用程序编程接口

Object类

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

Object类常用方法

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

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

toString存在的意义:

  • 父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息
public class Student {  //extends Object
    private String name;
    private int age;
    private char sex;

    public Student() {
    }

    public Student(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }
}

public class StudentPro {
    private String name;
    private int age;
    private char sex;

    public StudentPro() {
    }

    public StudentPro(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "StudentPro{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}
public class demo {
    public static void main(String[] args) {
        Student student = new Student("张三", 20, '女');
        System.out.println(student.toString());
        System.out.println(student);   //两个输出情况一致

        StudentPro s1 = new StudentPro("李四", 21, '男');
        System.out.println(s1.toString());
    }
}

请添加图片描述
2. public Boolean equals(Object o)默认是比较当前对象与另一个对象的地址是否相同,相同返回true,不同返回false

直接比较两个对象的地址是否相同完全可以用”==“替代equals
equals存在的意义

  • 父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则
public class StudentPro {
    private String name;
    private int age;
    private char sex;

    public StudentPro() {
    }

    public StudentPro(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "StudentPro{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }

    //自己重写的比较值的方法
    @Override
    public boolean equals(Object o){
        if(o instanceof StudentPro){
            StudentPro s=(StudentPro) o;
            return name.equals(s.name)&&age==s.age&&sex==s.sex;
        }
        else{
            return false;
        }
    }
}
public class StudentMaxPro {
    private String name;
    private int age;
    private char sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public StudentMaxPro() {
    }

    public StudentMaxPro(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "StudentMaxPro{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }

    @Override   //官方生成的equals
    public boolean equals(Object o) {
        //判断是否是同一个对象,是直接返回true
        if (this == o) return true;
        //如果o为空直接返回false, 或者 本类和参数类不一致 返回false
        if (o == null || getClass() != o.getClass()) return false;
        //强制类型转换
        StudentMaxPro that = (StudentMaxPro) o;
        //对比每个参数值是否相同
        return age == that.age && sex == that.sex && Objects.equals(name, that.name);
    }

}
public class demo1 {
    public static void main(String[] args) {
        Student s1 = new Student("张三", 20, '男');
        Student s2 = new Student("张三", 20, '男');
        //默认是直接比较两个对象的地址是否一样
        System.out.println(s1.equals(s2));
        System.out.println(s1==s2);

        System.out.println("----------------------------------------");

        StudentPro s3 = new StudentPro("李四", 21, '男');
        StudentPro s4 = new StudentPro("李四", 21, '男');
        System.out.println(s3.equals(s4));

        System.out.println("----------------------------------------");
        StudentMaxPro s5 = new StudentMaxPro("王五", 22, '女');
        StudentMaxPro s6 = new StudentMaxPro("王五", 22, '女');
        System.out.println(s5.equals(s6));
    }
}

请添加图片描述

Objects类

Objects类与Object还是继承关系
Objects类的equals有非空校验,更安全,不会出现空指针异常

  1. public static boolean equals(Object a,Object b)
    比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常,再进行equals比较
  2. public static boolean isNull(Object obj)
    判断变量是否为null,为null返回true,反之false
public class demo2 {
    public static void main(String[] args) {
        String s1="zhangsan";
        String s2=new String("zhangsan");
        String s3=null;

        System.out.println(Objects.equals(s1,s2));
        System.out.println(Objects.equals(s1,s3));

        /*
        public static boolean equals(Object a, Object b) {
            return (a == b) || (a != null && a.equals(b));
        }
        */

        System.out.println(Objects.isNull(s1));
        System.out.println(Objects.isNull(s3));
        System.out.println(s3==null);  //两种写法效果一致


    }
}

请添加图片描述

StringBuilder

  • StringBuilder是一个可变的字符串类,我们可以把它看成一个对象容器
  • 作用:提高字符串的操作效率,如拼接、修改等
  1. public StringBuilder()
    创建一个空白的可变的字符串对象,不包含任何内容
  2. public StringBuilder(String str)
    创建一个指定字符串内容的可变字符串对象
  3. public StringBuilder append(任意类型)
    添加数据并返回StringBuilder对象本身
  4. public StringBuilder reverse()
    将对象的内容反转
  5. public int length()
    返回对象内容长度
  6. public String toString()
    通过toString()就可以实现把StringBuilder转换为String
    请添加图片描述
    请添加图片描述

案例:打印整型数组内容

需求

设计一个方法用于输出任意整型数组的内容,要求输出成如下格式:
“该数组内容为:[11,22,33,44,55]”

分析

  1. 定义一个方法,要求该方法能够拼接数组,并输出数组内容
  2. 定义一个静态初始化的数组,调用该方法,并传入该数组
public class Demo1 {
    public static void main(String[] args) {
        int[] a=null;
        System.out.println("该数组内容为:"+pin(a));
        
        int[] b={11,22,33,44,55};
        System.out.println("该数组内容为:"+pin(b));

        int[] c={};
        System.out.println("该数组内容为:"+pin(c));

    }

    public static String pin(int[] a){
        if(a!=null){
            StringBuilder abc=new StringBuilder();
            abc.append("[");
            for (int i = 0; i < a.length; i++) {
                abc.append(a[i]).append(i==a.length-1?"":",");
            }
            abc.append("]");
            return abc.toString();
        }else
            return null;
    }

}

请添加图片描述

Math类

  • 包含执行基本数字运算的方法,Math类没有提供公开的构造器
  • Math中的方法都是静态方法,通过类名就可以调用
  1. public static int abs(int a)
    获取参数的绝对值
  2. public static double ceil(double a)
    向上取整
  3. public static double floor(double a)
    向下取整
  4. public static int round(float a)
    四舍五入
  5. public static int max(int a,int b)
    获取两个int值中的较大值
  6. public static double pow(double a,double b)
    返回a的b次幂的值
  7. public static double random()
    返回值为double的随机值,范围[0.0,1.0)
public class demo2 {
    public static void main(String[] args) {
        System.out.println("Math.abs(10.5):"+Math.abs(10.5));
        System.out.println("Math.abs(-10.5):"+Math.abs(-10.5));

        System.out.println("-----------------------");

        System.out.println("Math.ceil(4.1):"+Math.ceil(4.1));
        System.out.println("Math.ceil(4.6):"+Math.ceil(4.6));

        System.out.println("----------------------");

        System.out.println("Math.floor(4.7):"+Math.floor(4.7));
        System.out.println("Math.floor(5.1):"+Math.floor(5.1));

        System.out.println("----------------------");

        System.out.println("Math.round(4.4999):"+Math.round(4.4999));
        System.out.println("Math.round(4.5111):"+Math.round(4.5111));

        System.out.println("Math.max(4,8):"+Math.max(4,8));
        System.out.println("Math.max(15,7):"+Math.max(15,7));

        System.out.println("Math.pow(2,3):"+Math.pow(2,3));
        System.out.println("Math.pow(2,10):"+Math.pow(2,10));

        System.out.println("------------------------");

        System.out.println("Math.random():"+Math.random());
        System.out.println("Math.random():"+Math.random());

        System.out.println("-----------------------");

        System.out.println("输出 3-9 的随机数:");

        //3-9的随机数—— (0-6的随机数)+3
        System.out.println((int)(Math.random() * 7) + 3);
        System.out.println((int)(Math.random() * 7) + 3);

        //36-69的随机数:(0-33)的随机数+36
        System.out.println("输出36-69的随机数:");
        System.out.println((int) (Math.random() * 34) + 36);
        System.out.println((int) (Math.random() * 34) + 36);
        System.out.println((int) (Math.random() * 34) + 36);
    }
}

请添加图片描述
请添加图片描述

System类

  • System的功能是通用的,都是直接用类名调用即可,所以System不能被实例化
  1. public static void exit(int status)
    终止当前运行的Java虚拟机,非零表示异常终止
  2. public static long currentTimeMillis()
    返回当前系统的时间毫秒值形式
  3. public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数)
    数组拷贝

时间毫秒值

  • 计算机认为时间是有起点的,起始时间:1970年1月1日 00:00:00
  • 时间毫秒值:指的是从1970年1月1日 00:00:00走到此刻的总毫秒数
    1s=1000ms
public class demo1 {
    public static void main(String[] args) {
        System.out.println("程序开始.....");
        System.exit(0);
        System.out.println("程序终止.....");
    }
}

请添加图片描述

public class demo2 {
    public static void main(String[] args) {
        System.out.println("程序开始。。。。。");
        long startTime=System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
        }
        long endTime=System.currentTimeMillis();
        double all=(endTime-startTime)/1000.0;
        System.out.println("执行100000次循环需要花费:"+all+"s");
        int[] a={10,20,30,40,50,60,70};
        int[] b=new int[10];
        /*
        public static native void arraycopy(Object src,  int  srcPos,
        Object dest, int destPos,
        int length);
        */
        System.arraycopy(a,2,b,3,4);
        System.out.println(Arrays.toString(b));
    }
}

请添加图片描述

BigDecimal类

  • 用于解决浮点型运算精度失真的问题
    使用步骤
  • 创建对象BigDecimal封装浮点型数据(最好的方式是调用方法)
  • public static BigDecimal valueOf(double val);
  • 包装浮点数成为BigDecimal对象
  1. public BigDecimal add(BigDecimal b)
    加法
  2. public BigDecimal subtract(BigDecimal b)
    减法
  3. public BigDecimal multiply(BigDecimal b)
    乘法
  4. public BigDecimal divide(BigDecimal b)
    除法
  5. public BigDecimal divide(另一个BigDecimal对象,精确几位,舍入模式)
    除法
public class demo3 {
    public static void main(String[] args) {
        //计算机计算时候会出现失真现象
        System.out.println("0.1+0.2:"+(0.1+0.2));
        System.out.println("0.3+0.55:"+(0.3+0.55));
        System.out.println("1.0-0.32:"+(1.0-0.32));

        System.out.println("----------------------");
        double a=0.1;
        double b=0.2;
        double c=a+b;
        System.out.println(c);
        System.out.println("----------------------");
        BigDecimal a1=BigDecimal.valueOf(0.1);
        BigDecimal b1=BigDecimal.valueOf(0.2);
        BigDecimal c1=a1.add(b1);
        BigDecimal d1=b1.subtract(a1);
        BigDecimal e1=a1.multiply(b1);
        BigDecimal f1=a1.divide(b1);
        System.out.println("a1.add(b1):"+c1);
        System.out.println("b1.subtract(a1):"+d1);
        System.out.println("a1.multiply(b1):"+e1);
        System.out.println("a1.divide(b1):"+f1);

        //转成浮点型
        double first=a1.doubleValue();
        double twice=b1.doubleValue();
        System.out.println("0.1+0.2:"+first+twice);
        System.out.println("---------------------");

        BigDecimal a11=BigDecimal.valueOf(10.0);
        BigDecimal b11=BigDecimal.valueOf(3.0);
        BigDecimal c11 = a11.divide(b11, 4, RoundingMode.UP);
        System.out.println(c11);
    }
}

请添加图片描述

Date类

  • Date类的对象在Java中代表的是当前所在系统的此刻日期时间
  1. Date的构造器
    public Date() 创建一个Date对象,代表的是系统当前此刻日期时间
  2. Date的常用方法
    public long getTime() 获取时间对象的毫秒值
  3. 时间毫秒值->日期对象
    public Date(long time) 把时间毫秒值转换成Date日期对象
    public void setTime(long time) 设置日期对象的时间为当前时间毫秒值对应的时间

案例

  • 请计算出当前时间往后走1小时121秒之后的时间是多少
public class demo1 {
    public static void main(String[] args) {
        Date d=new Date();
        long time=(60*60+121)*1000;
        Date f=new Date(System.currentTimeMillis()+time);

        //时间毫秒值换成日期对象
        System.out.println(d);
        System.out.println(f);

        System.out.println("----------------------------------");
        Date e=new Date();
        e.setTime(System.currentTimeMillis()+time);
        System.out.println(d);
        System.out.println(e);
    }
}

请添加图片描述

SimpleDateFormat类

  • 可以对Date对象或时间毫秒值格式化成我们喜欢的时间形式
  • 也可以把字符串的时间形式解析成日期对象请添加图片描述

SimpleDateFormat构造器

  1. public SimpleDateFormat()
    构造一个SimpleDateFormat,使用默认格式
  2. public SimpleDateFormat(String pattern)
    构造一个SimpleDateFormat,使用指定的格式

SimpleDateFormat的格式化方法

  1. public final String format(Date date)
    将日期格式化成日期/时间字符串
  2. public final String format(Object time)
    将时间毫秒值式化成日期/时间字符串

格式化的时间形式的常用的模式对应关系如下:

请添加图片描述

public class demo2 {
    public static void main(String[] args) {
        Date d=new Date();
        System.out.println(d);

        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sdf1=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss EEE a");
        String a=sdf.format(d);
        String b=sdf1.format(d);
        System.out.println("sdf.format(d):"+a);
        System.out.println("sdf1.format(d):"+b);

        //将121秒后时间毫秒值转换成日期对象
        long time=System.currentTimeMillis()+121*1000;
        System.out.println("sdf1.format(System.currentTimeMillis()+121*1000):"+sdf1.format(time));
        
    }
}

请添加图片描述

SimpleDateFormat解析字符串时间成为日期对象

  1. public Date parse(String source)
    从给定字符串的开始解析文本以生成日期

案例

  • 请计算出2022年08月06日11点11分11秒,往后走2天14小时49分06秒后的时间是多少
public class demo4 {
    public static void main(String[] args) throws ParseException {
        //1.把字符串时间拿到程序中来
        String date="2022年08月06日 11:11:11";
        //2.把字符串时间解析成日期对象
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date f=sdf.parse(date);
        //3.往后走2天 14小时 49分 06秒
        long time=f.getTime()+(2L*24*60*60+14*60*60+49*60+6)*1000;
        //4.格式化这个时间毫秒值就是结果
        String dateTime = sdf.format(time);
        System.out.println(dateTime);
    }
}

请添加图片描述

练习:秒杀活动

请添加图片描述

需求:
  1. 小贾下单并付款的时间为:2020年11月11日 0:03:47
  2. 小皮下单并付款的时间为:2020年11月11日 0:10:11
  3. 用代码说明这两位同学有没有参加上秒杀活动
分析
  1. 判断下单时间是否在开始到结束的范围内
  2. 把字符串形式的时间变成毫秒值
public class demo5 {
    public static void main(String[] args) throws ParseException {
        String mStart="2020年11月11日 00:00:00";
        String mEnd="2020年11月11日 00:10:00";
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date start = sdf.parse(mStart);
        Date end= sdf.parse(mEnd);
        long sTime=start.getTime();
        long eTime=end.getTime();

        String jia="2020年11月11日 00:03:47";
        Date xj= sdf.parse(jia);
        long jtime=xj.getTime();
        if(jtime>sTime && jtime<eTime){
            System.out.println("小贾参加上秒杀活动了~");
        }else{
            System.out.println("小贾没有参加上秒杀活动~");
        }

        String pi="2020年11月11日 00:10:11";
        Date xp=sdf.parse(pi);
        long ptime=xp.getTime();
        if(ptime>sTime&&ptime<eTime){
            System.out.println("小皮参加上秒杀活动了~");
        }else{
            System.out.println("小皮没有参加上秒杀活动~");
        }
    }
}

请添加图片描述
方法二

public class demo6 {
    public static void main(String[] args) throws ParseException {
        String start="2020-11-11 00:00:00";
        String end="2020-11-11 00:10:00";
        String jia="2020-11-11 00:03:47";
        String pi="2020-11-11 00:10:11";

        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date s=sdf.parse(start);
        Date e=sdf.parse(end);
        Date xj=sdf.parse(jia);
        Date xp=sdf.parse(pi);
        if(xj.after(s)&&xj.before(e)){
            System.out.println("小贾秒杀成功,可以发货了~");
        }else{
            System.out.println("小贾秒杀失败~");
        }

        if(xp.after(s)&&xp.before(e)){
            System.out.println("小皮秒杀成功,可以发货了~");
        }else{
            System.out.println("小皮秒杀失败~");
        }
    }
}

请添加图片描述

Calendar类

  • Calendar代表了系统此刻日期对应的日历对象
  • Calendar是一个抽象类,不能直接创建对象

Calendar日历创建日历对象的方法

  1. public static Calendar getInstance()
    获取当前日历对象

Calendar常用方法

  1. public int get(int field)
    取日期中的某个字段信息
  2. public void set(int field,int value)
    修改日历的某个字段信息
  3. public void add(int field,int amount)
    为某个字段增加/减少指定的值
  4. public final Date getTime()
    拿到此刻日期对象
  5. public long getTimeInMillis()
    拿到此刻时间毫秒值

注意:Calendar是可变日期对象,一旦修改后其对象本身表示的时间将产生变化

public class demo7 {
    public static void main(String[] args) {
        Calendar cal=Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month=cal.get(Calendar.MONTH)+1;  //月是从0开始计算的,所以要加1等于现在的月份
        int day=cal.get(Calendar.DAY_OF_MONTH);

        System.out.println("获取年:"+year);
        System.out.println("获取月:"+month);
        System.out.println("获取日:"+day);

        //为现在日历增加64天
        cal.add(Calendar.DAY_OF_YEAR,64);
        System.out.println(cal.get(Calendar.MONTH)+1);
        System.out.println(cal.get(Calendar.DAY_OF_YEAR));

        //获取日期
        Calendar cal1=Calendar.getInstance();
        System.out.println(cal1.getTime());

        //获取毫秒值
        System.out.println(cal1.getTimeInMillis());

    }
}

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值