栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java

记记常用的API
  • 常用API
    • **Object**
    • Objects
    • StringBuider
    • Math
    • System
    • BigDecimal
    • Date
    • SimpleDateFormat
    • Calendar

常用API Object
  1. 一个类要么默认继承了Object类,要么间接继承了Object类,Object类是java中的祖宗类
  2. Object类的方法是一切子类都可以直接使用的,所有我们要学习Object类的方法
  3. 常用的方法:toString()equals()

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

equals()默认是比较当前对象与另一个对象的地址是否相同,返回true/false

  1. 直接比较两个对象的地址是否相同完全可以用”==”代替equals
  2. 父类equals存在的意义就是为了被子类重写,以便子类自己来定制比较规则

Object类下toString()源码

public String toString() {
        return getClass().getName() + "@" +Integer.toHexString(hashCode());
}

Object类下equals()源码

public boolean equals(Object obj) {
        return (this == obj);
        //this当前对象的地址,地址的比较
    }

举例:Person类(并没有重写toString、equals)

package test;

public class Person {
    private int age;
    private String name;
    public Person() {
    }
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

package test;

public class Test2 {
    public static void main(String[] args) {
        Person boy1 = new Person(18,"小明");
        Person boy2 = new Person(18,"小明");
        System.out.println(boy1);
        System.out.println(boy1.toString());

        System.out.println(boy1.equals(boy2));//对象.equals(对象),false,比较地址,两个对象的地址不一样
    }
}

输出结果

test.Person@1b6d3586
test.Person@1b6d3586
false

在Person类下重写两个方法

package test;

import java.util.Objects;

public class Person {
    private int age;
    private String name;
    public Person() {
    }
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {//toString+Enter即可(快捷生产),也可以自己定义
        return "Person{" +
                "age=" + age +
                ", name='" + name + ''' +
                '}';
    }

    @Override
    public boolean equals(Object o) {//equals+enter它会提示,你一路next即可
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }
    
}

输出结果

Person{age=18, name='小明'}
Person{age=18, name='小明'}
true
Objects
  1. Objects工具类(一般加s的都是工具类居多)与Object还是继承关系,Objects类是从JDK1.7开始之后才有的
  2. 官方在进行字符串比较时,没有用对象自己的equals方法,而是选择了Objects的equals方法来比较两个对象
  3. Objects的equals方法比较的结果是一样的,但是更安全
  4. 还提供了isNull(Object obj)方法,判断是否为null,是就返回true……

为什么Objects类的equals方法更加安全?
Objects下的源码

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

在比较两个对象时,用Object提供的equals方法时,需要对象来调用,但当该对象为null时,你去调用equals方法时就会报空指针异常

而Objects类的equals方法就是解决这个问题

public class Test_Objects_equals {
    public static void main(String[] args) {
        String str1 = null;
        String str2 = "in";
//        System.out.println(str1.equals(str2));//会报错,空指针异常
        System.out.println(Objects.equals(str1,str2));//更加安全
        System.out.println(Objects.isNull(str1));//true
    }
}
StringBuider
  1. 可变的字符串类,我们可以把它看成是一个对象容器
  2. 作用:提高字符串的操作效率,如拼接、修改等

为什么说效率更高?
我觉得这篇文章解释的挺好的
http://t.csdn.cn/bIVtr

 

代码自己跑一跑看一下

package api_stringbuilder;


public class StringBuilderDemo1 {
    public static void main(String[] args) {
        StringBuilder string = new StringBuilder();
        string.append("a");
        
        System.out.println(string);
        System.out.println(string.length());
        string.append("b").append("c").append("d");//支持链式编程
        System.out.println(string);

        string.reverse().append("反转完了");
        System.out.println(string);

        String str = string.toString();//转回String

        String target1 = "ab"+"cd";

        StringBuilder target2 = new StringBuilder();
        target2.append("ab").append("cd");


    }
}

Math
  1. 包含执行基本数组运算的方法,Math类没有提供公开的构造器实际上为工具类
  2. 静态成员,通过类名可以直接调用

经常用到的方法

package api_stringbuilder;

public class MathDemo {
    public static void main(String[] args) {
        System.out.println(Math.abs(-100));//取绝对值
        System.out.println(Math.ceil(4.001));//向上取整
        System.out.println(Math.floor(4.999));//向下取整
        System.out.println(Math.pow(2,3));//求指数次方,后面为指数
        System.out.println(Math.round(4.68));//四舍五入
        System.out.println(Math.random());//0.0~1.0(包前不包后)
    }
}

System
  1. 用类名调用,不能被实例化
package api_stringbuilder;

public class SystemDemo {
    public static void main(String[] args) {
//        System.out.println("程序开始.。。。");
//        System.exit(0);//非零表示异常终止,JVM停止
//        System.out.println("程序结束");//并没有运行

        //计算机认为时间有起源:返回1970/1/1 00:00:00走到此刻的毫秒值
        long time = System.currentTimeMillis();//用途:性能分析
        System.out.println(time);
    }
}

BigDecimal
  1. 大数据类型
  2. 用于解决浮点型运算精度失真的问题

浮点数直接进行加减乘除运算时会出现数据失真(精度问题)
直接使用浮点数运算时

public static void main(String[] args) {
        System.out.println(0.09+0.01);
        System.out.println(1.0-0.32);
        System.out.println(1.015*100);
        System.out.println(1.301/100);
}

运算结果是

0.09999999999999999
0.6799999999999999
101.49999999999999
0.013009999999999999

显然这不是我们想要的结果
转成BigDecimal运算

package api_stringbuilder;

import java.math.BigDecimal;

public class TestBig {
    public static void main(String[] args) {
        BigDecimal num1 = BigDecimal.valueOf(0.09);//转成BigDecimal类型
        
        System.out.println(num1.add(BigDecimal.valueOf(0.01)));//加法

        BigDecimal num2 = BigDecimal.valueOf(1.0);
        System.out.println(num2.subtract(BigDecimal.valueOf(0.32)));//减法

        BigDecimal num3 = BigDecimal.valueOf(1.015);
        System.out.println(num3.multiply(BigDecimal.valueOf(100)));//乘法

        BigDecimal num4 = BigDecimal.valueOf(1.301);
        System.out.println(num4.divide(BigDecimal.valueOf(100)));//除法

    }
}

运算结果

0.10
0.68
101.500
0.01301

注意:在做除法运算的时候,如果除不尽,编译的时候不会报错,运行时会报异常(java.lang.ArithmeticException),这个时候你要给它一个处理“除不尽”状况的标准,例如保留多少位小数四舍五入

import java.math.BigDecimal;
public class BigDecimalDemo {
        public static void main(String[] args) {
        double a = 10.0;
        double b = 3.0;

        BigDecimal a1 = BigDecimal.valueOf(a);
        BigDecimal b1 = BigDecimal.valueOf(b);
        BigDecimal c1 = a1.divide(b1,2,BigDecimal.ROUND_HALF_UP);//除,除不尽的话会报错,所有要指定参数,四舍五入
        System.out.println(c1);//输出结果:3.33
    }

}

虽然说BigDecimal类型运算可以保证精确度,但在开发中我们还是用浮点数类型较多,所以运算结果应该转回浮点数类型

//接上
double d = c1.doubleValue();//转成double
Date
  1. 对象在Java中代表当前所在系统的此刻日期时间
import java.util.Date;
public class DateDemo1 {
    public static void main(String[] args) {
        Date date1= new Date();
        System.out.println(date1);//当前时间,如Tue May 03 15:19:57 CST 2022
        long time = date1.getTime();//获取时间毫秒值,如1651562397768
        System.out.println(time);
    }
}

SimpleDateFormat
  1. 可以把Date对象或者时间毫秒值格式化成我们喜欢的时间形式,年月日+时分秒
  2. 也可以把字符串的时间形式解析成日期对象
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatDemo {
    public static void main(String[] args) {
        Date date = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//API里面有格式,自己可以去看看

        System.out.println(simpleDateFormat.format(date));//格式化日期对象

        System.out.println(simpleDateFormat.format(12000000));//格式化时间毫秒值

        String date1 = "2021-08-06 11:11:11";//注意全部是英文格式
        try {
        	//用代码去做一些时间计算问题,题目我给忘了QAQ
            Date nowDate = simpleDateFormat.parse(date1);
            long target =nowDate.getTime()+(2l*24*60*60+14*60*60+49*60+6)*1000;//2l防止溢出 long型
            System.out.println(simpleDateFormat.format(target));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        
    }
}

//输出:
2022-05-03 15:27:39//不同时间结果也会有所不同
1970-01-01 11:20:00
2021-08-09 02:00:17
Calendar
  1. 代表了系统此刻日期对应的日历对象
  2. 是一个抽象类不能直接创建对象,通过方法创建对象Calendar calendar = Calendar.getInstance();

常用方法

import java.util.Calendar;

public class CalendarDemo {
    public static void main(String[] args) {
        //拿到系统此刻日历对象,通过调用方法
        Calendar calendar = Calendar.getInstance();
        System.out.println(calendar);//会输出一长串东西,在里面可以找到年月日这些

        //获取年
        int year = calendar.get(Calendar.YEAR);
        //获取月
        int month = calendar.get(Calendar.MONTH)+1;//记得加一
        
        int weekday = calendar.get(Calendar.DAY_OF_WEEK)-1;//从周日开始,周日为1,要输出周几就-1
        System.out.println("今天是周"+weekday);
        System.out.println(year+"年"+month+"月");
        //修改字段
        calendar.set(Calendar.YEAR,2030);//换成2030年
        System.out.println(calendar.get(Calendar.YEAR)+"年"+month+"月");
    }
}

JDK8开始新增的日期类,java.time包

  1. LocalDate:不包含具体时间的日期
  2. LocalTime:不包含日期的时间
  3. LocalDateTime:包含了日期及时间
  4. Instant:代表的是时间戳
  5. DateTimeFormatter:用于做时间的格式化和解析的
  6. Duration:用于计算两个“时间”间隔
  7. Period:用于计算两个“日期”间隔

(真的超多啊,这我就不多讲了,代码放出来,自己来跑一下)

package date;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Date;

public class NewAdd {
    public static void main(String[] args) {
        LocalDate time1 = LocalDate.now();
        System.out.println(time1);
        System.out.println(time1.getDayOfWeek());
        System.out.println(time1.getDayOfWeek().getValue());

        LocalTime time2 = LocalTime.now();
        System.out.println(time2);

        LocalDateTime time3 = LocalDateTime.now();
        System.out.println(time3);
        System.out.println(time3.toLocalDate());//转化
        System.out.println(time3.toLocalTime());

        System.out.println(time2.plusHours(2));//加两小时,新对象
        System.out.println(time2);//不可变对象,还是原来的

        LocalDate myDate = LocalDate.of(2022,6,25);
        System.out.println("今天是ta的生日吗n"+(time1.equals(myDate)==true?"是的":"不是"));
        boolean flag = myDate.isAfter(time1);//顾名思义
        System.out.println(flag);

        MonthDay birthday = MonthDay.of(6,25);//设置
        MonthDay nowDate = MonthDay.from(myDate);//从里面拿月日对象

        if(birthday.equals(nowDate)){
            System.out.println("今天是她的生日");
        }else{
            System.out.println("今天不是她的生日");
        }

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

        //1、得到一个时间戳(年月日时分秒)对象
        Instant instant = Instant.now();
        System.out.println(instant);//我们在东8区,有时间差
        //2、系统此刻时间戳
        System.out.println(instant.atZone(ZoneId.systemDefault()));
        //3、如何转成Date对象,两者可以互转,类似
        Date date = Date.from(instant);
        System.out.println(date);

        System.out.println("---------------------------");
        //本地日期时间对象
        LocalDateTime ldt = LocalDateTime.now();
        System.out.println(ldt);

        //解析/格式化
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss EEE a");
        //正向格式化,与下面结果一样
        System.out.println(dtf.format(ldt));
        //逆向格式化
        System.out.println(ldt.format(dtf));
        //解析字符串时间
        DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime localDateTime = LocalDateTime.parse("2022-03-30 19:45:08",dtf1);
        System.out.println(localDateTime);
    }
}

package date;


import java.time.LocalDate;
import java.time.Period;

public class NewAdd1 {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println(today);

        LocalDate birthday = LocalDate.of(2001,5,21);
        System.out.println(birthday);

        Period period = Period.between(birthday,today);//第二个参数减第一个参数
        System.out.println(period.getYears());
        System.out.println(period.getMonths());
        System.out.println(period.getDays());

        //Duration时间间隔,天,时分秒,毫秒、纳秒
    }
}

  1. 新增的API严格区分了时刻,本地日期、本地时间,并且对时间运算更加方便
  2. 新API的类型几乎全是不变类型(和String的使用类似),可以放心使用不必担心被修改

待续~~~~

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/857983.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号