首页 > 技术文章 > 常用api

yellowchives 2021-08-27 17:51 原文

API概述

API (Application Programming Interface) :应用程序编程接口。Java中的API指的就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。

String类

String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象。String 类在 java.lang 包下,所以使用的时候不需要导包!

String类的特点

  • 字符串不可变,它们的值在创建后不能被更改
  • 虽然 String 的值是不可变的,但是它们可以被共享
  • 字符串效果上相当于字符数组( char[] ),但是底层原理是字节数组( byte[] )

创建String对象的两种方式

  • 通过构造方法创建

    ​ 通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同

  • 直接赋值方式创建

    ​ 以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

字符串的比较

==号的作用

  • 比较基本数据类型:比较的是具体的值
  • 比较引用数据类型:比较的是对象地址值

equals方法的作用

public boolean equals(String s) //比较两个字符串内容是否相同、区分大小写

对于String类,如果使用new关键字创建,则相当于引用数据类型,此时用比较的是对象地址值。如果直接用字符串常量赋值,相当于基本数据类型,此时用比较的是具体的值。为了避免出错,建议都用equals方法比较。

示例

public class StringDemo02 {
    public static void main(String[] args) {
        //构造方法的方式得到对象
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);

        //直接赋值的方式得到对象
        String s3 = "abc";
        String s4 = "abc";

        //比较字符串对象地址是否相同
        System.out.println(s1 == s2); //false
        System.out.println(s1 == s3); //false
        System.out.println(s3 == s4); //true
        System.out.println("--------");

        //比较字符串内容是否相同
        //下面全是true
        System.out.println(s1.equals(s2));
        System.out.println(s1.equals(s3));
        System.out.println(s3.equals(s4));
    }
}

String常用方法

方法名 说明
public boolean equals(Object anObject) 比较字符串的内容
public int compareTo(String str) 比较字符串的内容,返回0则说明内容相同,否则不同,可以用来对字符串排序
public char charAt(int index) 返回指定索引处的 char 值
public int length() 返回此字符串的长度

使用正则表达式

boolean matchers(String regExp):判断字符串是否匹配给定的正则表达式
String replaceAll(String regex, String replacement): 获取字符串中匹配正则表达式的子字符串
String[] split(String regex) :用正则表达式分割字符串,返回数组

StringBuilder类

StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的

StringBuilder类和String类的区别

  • String类:内容是不可变的
  • StringBuilder类:内容是可变的

StringBuilder类的构造方法

  • 常用的构造方法

    方法名 说明
    public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容
    public StringBuilder(String str) 根据字符串的内容,来创建可变字符串对象
public class StringBuilderDemo01 {
    public static void main(String[] args) {
        //public StringBuilder():创建一个空白可变字符串对象,不含有任何内容
        StringBuilder sb = new StringBuilder();
        System.out.println("sb:" + sb);
        System.out.println("sb.length():" + sb.length());

        //public StringBuilder(String str):根据字符串的内容,来创建可变字符串对象
        StringBuilder sb2 = new StringBuilder("hello");
        System.out.println("sb2:" + sb2);
        System.out.println("sb2.length():" + sb2.length());
    }
}

StringBuilder类添加和反转方法

  • 添加和反转方法

    方法名 说明
    public StringBuilder append(任意类型) 添加数据,并返回对象本身
    public StringBuilder reverse() 返回相反的字符序列
public class StringBuilderDemo01 {
    public static void main(String[] args) {
        //创建对象
        StringBuilder sb = new StringBuilder();

        //public StringBuilder append(任意类型):添加数据,并返回对象本身
//        StringBuilder sb2 = sb.append("hello");
//
//        System.out.println("sb:" + sb);
//        System.out.println("sb2:" + sb2);
//        System.out.println(sb == sb2);

//        sb.append("hello");
//        sb.append("world");
//        sb.append("java");
//        sb.append(100);

        //链式编程
        sb.append("hello").append("world").append("java").append(100);

        System.out.println("sb:" + sb);

        //public StringBuilder reverse():返回相反的字符序列
        sb.reverse();
        System.out.println("sb:" + sb);
    }
}

StringBuilder和String相互转换

  • StringBuilder转换为String

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

  • String转换为StringBuilder

    ​ public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder

public class StringBuilderDemo02 {
    public static void main(String[] args) {
        /*
        //StringBuilder 转换为 String
        StringBuilder sb = new StringBuilder();
        sb.append("hello");

        //String s = sb; //这个是错误的做法

        //public String toString():通过 toString() 就可以实现把 StringBuilder 转换为 String
        String s = sb.toString();
        System.out.println(s);
        */

        //String 转换为 StringBuilder
        String s = "hello";

        //StringBuilder sb = s; //这个是错误的做法

        //public StringBuilder(String s):通过构造方法就可以实现把 String 转换为 StringBuilder
        StringBuilder sb = new StringBuilder(s);

        System.out.println(sb);
    }
}

ArrayList

概述

ArrayList类概述

  • 什么是集合

    ​ 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变

  • ArrayList集合的特点

    ​ 底层是数组实现的,长度可以变化

  • 泛型的使用

    ​ 用于约束集合中存储元素的数据类型

ArrayList常用方法

方法名 说明
public boolean remove(Object o) 删除指定的元素,返回删除是否成功
public E remove(int index) 删除指定索引处的元素,返回被删除的元素
public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
public E get(int index) 返回指定索引处的元素
public int size() 返回集合中的元素的个数
public boolean add(E e) 将指定的元素追加到此集合的末尾
public void add(int index,E element) 在此集合中的指定位置插入指定的元素
public class ArrayListDemo02 {
    public static void main(String[] args) {
        //创建集合,用到了泛型
        ArrayList<String> array = new ArrayList<String>();

        //添加元素
        array.add("hello");
        array.add("world");
        array.add("java");

        //public boolean remove(Object o):删除指定的元素,返回删除是否成功
//        System.out.println(array.remove("world"));
//        System.out.println(array.remove("javaee"));

        //public E remove(int index):删除指定索引处的元素,返回被删除的元素
//        System.out.println(array.remove(1));

        //IndexOutOfBoundsException
//        System.out.println(array.remove(3));

        //public E set(int index,E element):修改指定索引处的元素,返回被修改的元素
//        System.out.println(array.set(1,"javaee"));

        //IndexOutOfBoundsException
//        System.out.println(array.set(3,"javaee"));

        //public E get(int index):返回指定索引处的元素
//        System.out.println(array.get(0));
//        System.out.println(array.get(1));
//        System.out.println(array.get(2));
        //System.out.println(array.get(3)); //?????? 自己测试

        //public int size():返回集合中的元素的个数
        System.out.println(array.size());

        //输出集合
        System.out.println("array:" + array);
    }
}

ArrayList存储学生对象并遍历

创建一个存储学生对象的集合,存储3个学生对象,使用程序实现在控制台遍历该集合,学生的姓名和年龄来自于键盘录入

/*
    思路:
        1:定义学生类,为了键盘录入数据方便,把学生类中的成员变量都定义为String类型
        2:创建集合对象
        3:键盘录入学生对象所需要的数据
        4:创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
        5:往集合中添加学生对象
        6:遍历集合,采用通用遍历格式实现
 */
public class ArrayListTest {
    public static void main(String[] args) {
        //创建集合对象
        ArrayList<Student> array = new ArrayList<Student>();

        //为了提高代码的复用性,我们用方法来改进程序
        addStudent(array);
        addStudent(array);
        addStudent(array);

        //遍历集合,采用通用遍历格式实现
        for (int i = 0; i < array.size(); i++) {
            Student s = array.get(i);
            System.out.println(s.getName() + "," + s.getAge());
        }
    }

    /*
        两个明确:
            返回值类型:void
            参数:ArrayList<Student> array
     */
    public static void addStudent(ArrayList<Student> array) {
        //键盘录入学生对象所需要的数据
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入学生姓名:");
        String name = sc.nextLine();

        System.out.println("请输入学生年龄:");
        String age = sc.nextLine();

        //创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
        Student s = new Student();
        s.setName(name);
        s.setAge(age);

        //往集合中添加学生对象
        array.add(s);
    }
}

Math

Math类用来进行数学运算,无构造方法,所有方法都是静态的,可以通过类名直接调用。
常用方法

方法名 方法名 说明
public static int abs(int a) 返回参数的绝对值
public static double ceil(double a) 返回大于或等于参数的最小double值,等于一个整数
public static double floor(double a) 返回小于或等于参数的最大double值,等于一个整数
public static int round(float a) 按照四舍五入返回最接近参数的int
public static int max(int a,int b) 返回两个int值中的较大值
public static int min(int a,int b) 返回两个int值中的较小值
public static double pow (double a,double b) 返回a的b次幂的值
public static double random() 返回值为double的正值,[0.0,1.0)

Random

可以用Math.random()生成一个随机数,介于0.0到1.0之间,但这其实是一个伪随机数。Java提供了Random类,可以传入种子,这样就能生成一个真的随机数了。而且Random类提供的方法可以生成各种类型的随机数。
image

import java.util.Random;

public class Test02 {
    public static void main(String[] args) {
        //返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。
        System.out.println("随机数:"+Math.random());
        //Random类
        //(1)利用带参数的构造器创建对象:
        Random r1 = new Random(System.currentTimeMillis());//传入当前时间作为随机数种子
        int i = r1.nextInt();
        System.out.println(i);
        //(2)利用空参构造器创建对象:
        Random r2 = new Random();//无参构造默认调用系统的时间戳作为种子
        System.out.println(r2.nextInt(10));//返回[0,10)之间均匀分布的 int 值。
        System.out.println(r2.nextDouble(5));//返回[0.0,5.0)之间均匀分布的 double 值。
    }
}

System

image

实例:在控制台输出1-10000,计算这段代码执行了多少毫秒

public class SystemDemo {
    public static void main(String[] args) {
        // 获取开始的时间节点
        long start = System.currentTimeMillis();
        for (int i = 1; i <= 10000; i++) {
            System.out.println(i);
        }
        // 获取代码运行结束后的时间节点
        long end = System.currentTimeMillis();
        System.out.println("共耗时:" + (end - start) + "毫秒");
    }
}

垃圾回收机制
除了等待Java虚拟机进行自动垃圾回收外,还可以通过调用System.gc()方法来通知Java虚拟机立即进行垃圾回收。当一个对象在内存中被释放时,它的public void finalize()方法会被自动调用,因此可以在类中通过定义finalize()方法来观察对象何时被释放。

class Person{
    public void finalize(){//此方法会在垃圾回收前被调用
        System.out.println("对象被当做垃圾回收了。。。");
    }
}
public class Demo{
    public static void main(String[] args){
        //创建了两个实例化对象
        Person p1 = new Person();
        Person p2 = new Person();
        //让对象成为垃圾
        p1=null;
        p2=null;
       //调用方法进行垃圾回收
        System.gc();
        for(int i = 0; i < 10000; i ++){}//延长程序执行时间
    }
}

Runtime

Runtime类用于表示虚拟机运行时的状态,它用于封装JVM虚拟机进程。每次使用java命令启动虚拟机都对应一个Runtime实例,并且只有一个实例,因此该类采用单例模式进行设计,对象不可以直接实例化。若想在程序中获得一个Runtime实例,只能通过以下方式。
Runtime run = Runtime.getRuntime();

Arrays

  • Arrays的常用方法

    方法名 说明
    public static String toString(int[] a) 返回指定数组的内容的字符串表示形式
    public static void sort(int[] a) 按照数字顺序排列指定的数组
    public static ArrayList asList(T…a) 将传入的多个数据包装成ArrayLIst集合并返回
  • 工具类设计思想

    1、构造方法用 private 修饰(没法创建对象了)

    2、成员用 public static 修饰

时间日期类

util.Date类

方法名 说明
public long getTime() 获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
public void setTime(long time) 设置时间,给的是毫秒值
public class DateDemo02 {
    public static void main(String[] args) {
        //创建日期对象
        Date d = new Date();

        //public long getTime():获取的是日期对象从1970年1月1日 00:00:00到现在的毫秒值
//        System.out.println(d.getTime());
//        System.out.println(d.getTime() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");

        //public void setTime(long time):设置时间,给的是毫秒值
//        long time = 1000*60*60;
        long time = System.currentTimeMillis();//此方法等同于Data类提供的getTime方法
        d.setTime(time);

        System.out.println(d);
    }
}

sql.Date

一般使用util.Date,sql.Date是专为数据库sql语句提供的,只有日期没有时间。
sql.Date没有无参构造,只有Date(long date)的构造方法。所以可以用new util.Date().getTime()获得当前日期的毫秒值作为参数传入sql.Date()中。下面的语句可以将util.Date转为数据库专用的sql.Date

java.sql.Date date = new java.sql.Date(util.Date(getTime()));

SimpleDateFormat类

  • SimpleDateFormat类概述

    ​ SimpleDateFormat是一个具体的类,用来设置接守日期的格式。设置好了格式之后,就可以用Date类生成想要的日期。

  • SimpleDateFormat类构造方法

    方法名 说明
    public SimpleDateFormat() 构造一个SimpleDateFormat,使用默认模式和日期格式
    public SimpleDateFormat(String pattern) 构造一个SimpleDateFormat使用给定的模式和默认的日期格式
  • SimpleDateFormat类的常用方法

    • 格式化(从Date到String)
      • public final String format(Date date):将日期格式化成日期/时间字符串
    • 解析(从String到Date)
      • public Date parse(String source):从给定字符串的开始解析文本以生成日期
  • 设置格式
    image

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {
    public static void main(String[] args) {
        //SimpleDateFormat extends DataFormat
        //格式化的标准参见jdk文档
        DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

        //String --> Date
        try {
            Date d = df.parse("2020/07/10 14:25:30");
            System.out.println(d);//Fri Jul 10 14:25:30 GMT+08:00 2020
        } catch (ParseException e) {
            e.printStackTrace();
        }

        //Date --> String
        String currentDate = df.format(new Date());//返回当前日期
        System.out.println(currentDate);//2021/07/10 15:02:12
    }
}

Calendar类

Date类提供的方法大部分都已经过时,现在常用Calendar类代替Date类。Calendar类是抽象类,不能用new来创建对象,它提供了一个getInstance()方法来返回一个实例化对象。

  • Calendar类常用方法

    方法名 说明
    public int get(int field) 返回给定日历字段的值
    public abstract void add(int field, int amount) 根据日历的规则,将指定的时间量添加或减去给定的日历字段
    public final void set(int year,int month,int date) 设置当前日历的年月日
  • 示例代码

    import java.util.Calendar;
    import java.util.Date;
    
    public class CalendarDemo {
        public static void main(String[] args) {
            //抽象类不能使用new关键字创建实例化对象
            Calendar cal = Calendar.getInstance();
    
            //常用方法,get()
            System.out.println(cal.get(Calendar.YEAR));//2021
            System.out.println(cal.get(Calendar.MONTH));//6
            System.out.println(cal.get(Calendar.DATE));//10 这里的DATE和DATE_OF_MONTH是一样的
            System.out.println(cal.get(Calendar.DAY_OF_WEEK));//7
            System.out.println(cal.getActualMaximum(Calendar.DAY_OF_MONTH));//获取当月最大天数
    
            //set()
            cal.set(Calendar.YEAR,1949);
            cal.set(Calendar.MONTH,10);
            cal.set(Calendar.DATE,1);
            System.out.println(cal);
    
            java.sql.Date da = new java.sql.Date.valueOf("2021-4-20");
            cal.setTime(da);
            System.out.println(cal);
        }
    }
    
    

日历项目

image

import java.util.Calendar;
import java.util.Scanner;

public class Test08 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //录入日期的String:
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入你想要查看的日期:(提示:请按照例如2012-5-6的格式书写)");
        String strDate = sc.next();
        /*System.out.println(strDate);*/
        //String--->Calendar:
        //String-->Date:
        java.sql.Date date = java.sql.Date.valueOf(strDate);
        //Date--->Calendar:
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        //后续操作:
        //星期提示:
        System.out.println("日\t一\t二\t三\t四\t五\t六\t");
        //获取本月的最大天数:
        int maxDay = cal.getActualMaximum(Calendar.DATE);
        //获取当前日期中的日:
        int nowDay = cal.get(Calendar.DATE);
        //将日期调为本月的1号:
        cal.set(Calendar.DATE,1);
        //获取这个一号是本周的第几天:
        int num = cal.get(Calendar.DAY_OF_WEEK);
        /*System.out.println(num);*/
        //前面空出来的天数为:
        int day = num - 1;
        //引入一个计数器:
        int count = 0;//计数器最开始值为0
        //在日期前将空格打印出来:
        for (int i = 1; i <= day; i++) {
            System.out.print("\t");
        }
        //空出来的日子也要放入计数器:
        count = count + day;
        //遍历:从1号开始到maxDay号进行遍历:
        for (int i = 1; i <= maxDay ; i++) {
            if(i == nowDay){//如果遍历的i和当前日子一样的话,后面多拼一个*
                System.out.print(i+"*"+"\t");
            }else{
                System.out.print(i+"\t");
            }
            count++;//每在控制台输出一个数字,计数器做加1操作
            if(count%7 == 0){//当计数器的个数是7的倍数的时候,就换行操作
                System.out.println();
            }
        }
    }
}

第三代日期类

JDK1.0中使用java.util.Date类 --》第一批日期时间API
JDK1.1引入Calendar类 --》第二批日期时间API
JDK1.8新增日期时间API --》第三批日期时间API
缺陷:
可变性 : 像日期和时间这样的类应该是不可变的。
偏移性 : Date中 的年份是从1900开始的,而月份都从0开始。
格式化 : 格式化只对Date有用,Calendar则不行。

新引入的日期类生成日期之后就不可变了,如果想要改变日期只能实例化一个新的对象,这就是不可变性。

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
/**
 * @Auther: msb-zhaoss
 */
public class Test09 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //1.完成实例化:
        //方法1:now()--获取当前的日期,时间,日期+时间
        LocalDate localDate = LocalDate.now();
        System.out.println(localDate);
        LocalTime localTime = LocalTime.now();
        System.out.println(localTime);
        LocalDateTime localDateTime = LocalDateTime.now();
        System.out.println(localDateTime);
        //方法2:of()--设置指定的日期,时间,日期+时间
        LocalDate of = LocalDate.of(2010, 5, 6);
        System.out.println(of);
        LocalTime of1 = LocalTime.of(12, 35, 56);
        System.out.println(of1);
        LocalDateTime of2 = LocalDateTime.of(1890, 12, 23, 13, 24, 15);
        System.out.println(of2);
        //LocalDate,LocalTime用的不如LocalDateTime多
        //下面讲解用LocalDateTime:
        //一些列常用的get***
        System.out.println(localDateTime.getYear());//2020
        System.out.println(localDateTime.getMonth());//JUNE
        System.out.println(localDateTime.getMonthValue());//6
        System.out.println(localDateTime.getDayOfMonth());//14
        System.out.println(localDateTime.getDayOfWeek());//SUNDAY
        System.out.println(localDateTime.getHour());//22
        System.out.println(localDateTime.getMinute());//22
        System.out.println(localDateTime.getSecond());//6
        //不是set方法,叫with
        //体会:不可变性
        LocalDateTime localDateTime2 = localDateTime.withMonth(8);
        System.out.println(localDateTime);
        System.out.println(localDateTime2);
        //提供了加减的操作:
        //加:
        LocalDateTime localDateTime1 = localDateTime.plusMonths(4);
        System.out.println(localDateTime);
        System.out.println(localDateTime1);
        //减:
        LocalDateTime localDateTime3 = localDateTime.minusMonths(5);
        System.out.println(localDateTime);
        System.out.println(localDateTime3);
    }
}

设置格式化:

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.FormatStyle;
import java.time.temporal.TemporalAccessor;
/**
 * @Auther: msb-zhaoss
 */
public class Test10 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //格式化类:DateTimeFormatter
        //方式一:预定义的标准格式。如: ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;IS0_LOCAL_TIME
        DateTimeFormatter df1 = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        //df1就可以帮我们完成LocalDateTime和String之间的相互转换:
        //LocalDateTime-->String:
        LocalDateTime now = LocalDateTime.now();
        String str = df1.format(now);
        System.out.println(str);//2020-06-15T15:02:51.29
        //String--->LocalDateTime
        TemporalAccessor parse = df1.parse("2020-06-15T15:02:51.29");
        System.out.println(parse);
        //方式二:本地化相关的格式。如: oflocalizedDateTime()
        //参数:FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT
        //FormatStyle.LONG :2020年6月15日 下午03时17分13秒
        //FormatStyle.MEDIUM: 2020-6-15 15:17:42
        //FormatStyle.SHORT:20-6-15 下午3:18
        DateTimeFormatter df2 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.SHORT);
        //LocalDateTime-->String:
        LocalDateTime now1 = LocalDateTime.now();
        String str2 = df2.format(now1);
        System.out.println(str2);
        //String--->LocalDateTime
        TemporalAccessor parse1 = df2.parse("20-6-15 下午3:18");
        System.out.println(parse1);
        //方式三: 自定义的格式。如: ofPattern( "yyyy-MM-dd hh:mm:ss") ---》重点,以后常用
        DateTimeFormatter df3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
        //LocalDateTime-->String:
        LocalDateTime now2 = LocalDateTime.now();
        String format = df3.format(now2);
        System.out.println(format);//2020-06-15 03:22:03
        //String--->LocalDateTime
        TemporalAccessor parse2 = df3.parse("2020-06-15 03:22:03");
        System.out.println(parse2);
    }
}

推荐阅读