Java常用API

Java常用API

一、Math类

以下都是静态方法,不能创建对象

1.1绝对值函数 abs

        //绝对值函数abs(int a)
//        int abs=Math.abs(-1);
//        System.out.println(abs);

1.2向上取整 ceil

        //向上取整
//        double ceil = Math.ceil(7.8);
//        System.out.println(ceil);

1.3向下取整 floor

        //向下取整
//        double floor = Math.floor(7.8);
//        System.out.println(floor);

1.4四舍五入 round

//        long round1 = Math.round(10.4);
//        long round2 = Math.round(10.5);
//        System.out.println(round1);
//        System.out.println(round2);

1.5 最大最小值 max min

        //最大最小
//        int max = Math.max(3, 6);
//        System.out.println(max);
//        int min=Math.min(4,5);
//        System.out.println(min);

1.6 幂 pow

	double pow = Math.pow(2, 3);
    System.out.println(pow);

1.7 随机数random

随机数 取值范围:【0.0~1.0)

		int cnt=10;
        while(cnt-->0){
            double random = Math.random();
            System.out.println(random);
        }

二、System

2.1 退出exit

public static void exit(int status)

终止当前运行的Java虚拟机。 该参数status作为状态代码; 按照惯例,非零状态码表示异常终止,参数为0表示正常终止。

2.2 当前时间currentTimeMillis

public static long currentTimeMillis()

返回当前时间(以毫秒为单位)

计算程序运行时间

//获取执行时间
long start = System.currentTimeMillis();
for(int i=1;i<=10000;i++)
 System.out.println(i);
long end = System.currentTimeMillis();
System.out.println(end-start);

2.3 数组拷贝arraycopy

arraycopy(数据源数组,源起始索引,目的数组,目的起始索引,拷贝个数)
//数组拷贝
int[] arr1={1,2,3,4,5};
int[] arr2=new int[10];
System.arraycopy(arr1,0,arr2,5,arr1.length);
for (int i = 0; i < arr2.length; i++) {
    System.out.println(arr2[i]);
}

三、Object类

Object类是所有类的直接或间接父类

3.1 toString方法

public String toString()
    
toString方法属于Object类,返回对象的字符串表现形式(包名+类名@对象地址),建议所有的子类重写该方法,自动生成

当子类不重写该方法,直接输出一个对象时:

public static void main(String[] args) {
        Stu stu = new Stu("zhangsan",10);
        System.out.println(stu);
    }

输出结果为:tostring.Stu@1540e19d(格式:包名+类名@对象的地址)

为什么会输出这个结果呢,于是ctrl+B查看一下println方法,一层一层调用发现println方法最终调用的是toString方法。因为Stu类中没有toString方法,所以找到其父类Object中的toString方法执行。

image-20220104180008364

这个过程体现多态,方法的形式参数是Object,也就是Object obj=new Stu(),即父类引用指向子类对象,如果子类中有toString方法就调用子类的方法,如果子类没有重写toString方法,则默认使用父类Object的toString方法、

父类引用指向子类对象:编译看前面,运行看后面

多态:

  • 一种行为具有多种表现形态
  • 在运行过程中根据对象实际类型自动调用对应方法的过程
  • 编译的多态表现为重载,运行的多态表现为重写
  • 必要条件:继承,重写,父类引用指向子类对象
  • 父类引用指向子类对象,只能调用子类与父类共有的方法(子类重写的方法),不能调用子类新增的方法
  • 我的理解,一个父类有一个方法,他的所有子类都重写了这个方法,当采用父类引用指向子类对象的方式,通过变量调用这个方法,我们不需要判断变量属于什么类型的,我们不需要关心具体要调用哪个方法,因为我们知道,Java中存在这样一种机制能够找到正确的方法

重写toString方法后

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

输出:

Stu{name='zhangsan', age=10}

3.2 equals方法

public boolean equals(另一个对象)
    
Object类中的方法,比较对象是否相等,默认比较地址,重写可以比较内容,自动生成

Object类中的equals方法,底层也是用==比较地址值

“==”是比较地址是否相同

重写equals方法可以比较内容

3.3 equals面试题

程序如下:
String s1="abc";
StringBuilder sb = new StringBuilder("abc");
System.out.println(s1.equals(sb));//false
System.out.println(sb.equals(s1));//flase

分析:

  • s1.equals(sb):调用的是String中的equals方法,查看String中的源码得知,该方法equals方法中要求参数的类型也是String才能进一步比较,否则就直接返回false。

image-20220104212052813

anObject instanceof String:意思是参数是否是String
  • sb.equals(s1):调用的是StringBuilder的equals方法,而查看StringBuilder的源码发现,该类没有重写equals方法,所以调用Object类中的equals方法,而Object类中的equals方法比较的是对象地址,所以是false

ps: alt+7查看类的方法结构 ctrl+B查看源码

四、 Objects类

image-20220105171629389

4.1 方法:toString(对象)

格式:

public static String toString(Object o)

说明:

​ 返回对象的字符串表现形式,等价于直接输出对象(println底层也是调用toString方法)

//Objects中的toString(对象)方法与直接输出对象结果一样
        Stu stu = new Stu();
        String s = Objects.toString(stu);
        System.out.println(s);
        System.out.println(stu);
		//结果一样

4.2 方法:toString(对象,默认字符串)

格式:

public static String toString(Object o,
                              String nullDefault)

说明:

​ 该方法比4.1的方法多一个参数(nullDefault),不同的是,如果变量o为null,则直接返回这个该参数(空默认参数)

//Objects中的toString(对象,默认字符串),增加了空变量的判断
Stu stu = new Stu();
//        Stu stu=null;
String s = Objects.toString(stu, "nan");
System.out.println(s);

源码:Objects类中

image-20220105174843654

4.3方法 :isNull (对象), nonNull(对象)

格式:

public static boolean isNull(Object obj)
public static boolean nonNull(Object obj)

说明:

​ isNull:对象为null返回true

​ nonNull:对象非空返回true

Stu stu = new Stu();
boolean s = Objects.isNull(stu);
System.out.println(s);
boolean b = Objects.nonNull(stu);
System.out.println(b);

五、BigDecimal类

小数的二进制会出现精度问题,所以要用BigDecimal

5.1 构造方法及常用方法

image-20220105201038143

image-20220105200944657

计算机中计算方式:将十进制转换成二进制计算,得到的二进制结果再转化成十进制。但是小数转换成二进制会出现精度问题,如下图所示,所以我们要使用BigDecimal大整数类进行计算。

image-20220105200447912

如果想要精确运算,要用字符串的构造方法

//使用字符串构造方法
BigDecimal s = new BigDecimal("0.1");
BigDecimal b=new BigDecimal("0.2");
BigDecimal add = s.add(b);
System.out.println(add);//0.3

//没用字符串构造方法
BigDecimal s = new BigDecimal(0.1);
BigDecimal b=new BigDecimal(0.2);
BigDecimal add = s.add(b);       System.out.println(add);//0.3000000000000000166533453693773481063544750213623046875

四则运算:

BigDecimal s = new BigDecimal("0.1");
BigDecimal b=new BigDecimal("0.2");
BigDecimal add = s.add(b);
BigDecimal subtract = s.subtract(b);
BigDecimal multiply = s.multiply(b);
BigDecimal divide = s.divide(b);

System.out.println(add);//0.3
System.out.println(subtract);//-0.1
System.out.println(multiply);//0.02
System.out.println(divide);//0.5

5.2除法的特殊方法

  • 特殊方法: divide(另一个对象,精确几位,舍入模式)

    声明:

    public BigDecimal divide(BigDecimal divisor,
                             int scale,
                             int roundingMode)
    

    说明:

    ​ 该方法divide的一个重载方法,有三个参数,第一个参数表示除法的另一个对象,第二个参数表示小数点后精确到几位,第三个参数为舍入模式(BigDemical中的常量)。

  • BigDemical中的常量(舍入模式的取值)

    ROUND_FLOOR:向下取整
    
    ROUND_UP:向上取整
    
    ROUND_HALF_UP:四舍五入
    
    

    声明:

    public static final int ROUND_FLOOR:向下取整
    
    public static final int ROUND_UP:向上取整
    
    public static final int ROUND_HALF_UP:四舍五入
    
  • 应用场景

    使用BigDecimal类,当除法除不尽时,会报错

    image-20220105203904230

    此时我们可以调用这个有三个参数的divide方法

    BigDecimal s = new BigDecimal("1");
    BigDecimal b = new BigDecimal("3");
    //System.out.println(s.divide(b));//报错
            System.out.println(s.divide(b,2,BigDecimal.ROUND_FLOOR));//下取整
            System.out.println(s.divide(b,2,BigDecimal.ROUND_UP));//上取整
            System.out.println(s.divide(b,2,BigDecimal.ROUND_HALF_UP));//四舍五入
    

六、基本数据类型的包装类

八大基本数据类型的包装类如下:

image-20220105205318528

八大基本数据类型:整型,长整型,短整型,单精度浮点类型,双精度浮点类型,字符类型,字节类型,布偶类型

  • 为什么

    将基本数据类型封装成对象的好处在于可以在对象中定义更多的功能方法操作该数据

    常用操作:用于基本数据类型与字符串之间的转换

6.1 Integer

image-20220105210721085

  • 重要方法valueOf()

    格式:

    public static Integer valueOf(int i)
    

    功能:

    ​ 返回一个Integer指定的int值的Integer实例

//构造方法(不用,过时了)
Integer ii = new Integer(100);
Integer ss = new Integer("100");
System.out.println(ii);
System.out.println(ss);

//静态方法
Integer i = Integer.valueOf(100);
Integer s = Integer.valueOf("100");
System.out.println(i);
System.out.println(s);

6.2 自动装箱和自动拆箱

jdk1.5有了自动装箱和自动拆箱的新特性,java底层会帮我们自动调用valueof 方法

  • 自动装箱

    装箱:把一个基本数据类型变成对应的包装类

    自动:Java底层会帮我们自动调用valueof方法

    Integer i=100;//将基本数据类型转换成对应的包装类型
    //格式: 包装类变量 = 一个基本数据类型
    System.out.println(i);
    

    总结:

    自动装箱:当一个基本数据类型赋值给一个引用数据类型(对应的包装类)时,java会自动调用valueof方法,帮我们简化代码。

  • 自动拆箱

    概念:将一个包装数据类型变成对应的基本数据类型

    Integer i=100;
    int ii=i;//将一个(包装类型)对象直接赋值给基本数据类型,居然也没有报错
    System.out.println(ii);
    
  • 综合案例

    Integer i2=100;//自动装箱
    i2+=200;
    System.out.println(i2);
    

    其中 i2+=200 等价于 i2=i2+200 。具体过程如下:
    //1.会把i2装换成基本数据类型100
    //2.计算100+200=300
    //3.将基本数据类型300自动装箱变成Integer对象赋值

  • 装箱细节

    先看下面这个代码

    Integer i4=null;
    i4+=200;
    System.out.println(i4);
    

    运行结果报空指针异常

    image-20220107171750306

    原因如下:

    ​ null可以赋值给引用数据类型,但是null不能转换成基本数据类型,所以就报错了,所以以后不管怎样都做一个非空判断就行了,请看下节。

  • 装箱建议

    在使用包装类型的时候,如果做操作,最好先判断是否为null

    只要是对象,在使用前都进行非空判断

    if(i!=null){
        i4+=200;
        System.out.println(i4);
    }
    

6.3类型转换

基本数据类型包装类的最常见操作是将基本数据类型字符串的相互转化

  • int 转换成String

    方法一:加双引号(字符串+任意数据类型=字符串)

    方法二:调用String中的valueOf方法

    public static String valueOf(int i)
    功能:返回int参数的字符串
    

    例:

    方法一:
            int a=100;
            String aa=a+"";
            System.out.println(aa);
    方法二:
        	int b=100;
            String bb = String.valueOf(b);
            System.out.println(bb);
    
  • String 转换成 int

    调用Integer中的parseInt方法

    public static int parseInt(String s)
    功能:将字符串参数解析为带符号的十进制整数
    

    例:

    String s="100";
    int i = Integer.parseInt(s);
    System.out.println(i);
    
  • 基本数据类型 转换成 String类型

    调用String中的valueOf方法

    image-20220107175235160

  • String类型 转换成 基本数据类型

    调用对应基本数据类型包装类中的《parse基本数据类型》方法

    例如:将字符串转换bool类型,bool的包装类是Boolean,调用Boolean中的parseBoolean方法。

    String ss="true";
    boolean sss = Boolean.parseBoolean(ss);
    System.out.println(ss);
    

具体方法查看API

6.4 案例:字符串中的数据排序

需求:将一个字符串“91 27 46 38 50”,将其中的每一个数存到int类型的数组中

  • 方法一(split分隔数组)
String str="91 27 46";

//1.调用split函数将字符串分割成一个字符串数组
String[] s = str.split(" ");
//2.定义一个存放结果的数组(int)
int[] arr=new int[s.length];
//3.遍历字符串数组,将数组元素字符串转换成int类型
for (int i = 0; i < s.length; i++) {
    int num = Integer.parseInt(s[i]);
    arr[i]=num;//4.放到目标数组中
}
for (int i : arr) {
    System.out.println(i);
}
  • 方法二(字符串遍历)

    int[] ans= new int[10];
    int k=0;
    int idx=0;
    for (int i = 0; i < str.length(); i++) {
    char c = str.charAt(i);
    if(c==' ' ){
    String substring = str.substring(idx, i);
    idx=i+1;
    int num = Integer.parseInt(substring);
    ans[k++]=num;
    }
    if(i==str.length()-1){//最后一个数字特判
    String substring = str.substring(idx, str.length());
    int num = Integer.parseInt(substring);
    ans[k++]=num;
    }
    }
    for (int i : ans) {
    System.out.println(i);
    }
    

七、Arrays类(数组)

Arrays类包含用于操作数组的各种方法

image-20220109211154135

7.1 toString方法

声明:

public static String toString(int[] a)
	功能:返回指定数组的的字符串表示形式。

数组的字符串表现形式就是输出数组全部内容

例:

int[] a={3,4,1,2,8};
System.out.println(Arrays.toString(a));
//输出:[3, 4, 1, 2, 8]

7.2 sort方法

public static void sort(int[] a)
	功能:按照数字顺序排列指定的数组(默认从小到大)

例:

int[] a={3,4,1,2,8};
Arrays.sort(a);
System.out.println(Arrays.toString(a));
//输出:[1, 2, 3, 4, 8]

7.3 binarySearch方法

声明:

public static int binarySearch(int[] a,
                               int key)
功能: 使用二分查找算法搜索指定的int数组的指定值。 
在进行此调用之前,必须对数组进行排序(如sort(int[])方法)。 如果没有排序,结果是未定义的。 如果数组包含具有指定值的多个元素,则不能保证将找到哪个元素。               

注意:

  1. 数组必须有序

  2. 如果查找元素存在,那么返回这个元素的索引

  3. 如果查找元素不存在,那么返回(-插入点-1)

    插入点:如果这个查找元素在数组上,那么在哪个索引。

    例如数组:[1, 2, 3, 4, 8],那么元素0的插入点为0(如果0在数组中,那么0在1左边,也就是第一个位置,索引为0)。

例1:

int[] a={1,2,3,4,5};
int idx1 = Arrays.binarySearch(a, 2);
System.out.println(idx1);
//输出:1

例2:

int[] a={1,2,3,4,5};
int idx2 = Arrays.binarySearch(a, 0);
System.out.println(idx2);
//输出:-1(-0-1)

思考:如果查找失败,返回(-插入点-1),为什么要-1

答:减1刚好能避免与查找成功返回的索引冲突。假设不减1,此时如果查找失败,返回(-插入点),此时考查返回值的最大值,插入点的最小值为0,此时返回值取到最大,为-0,即查找失败返回值(-插入点)的最大值0。但是我们知道,查找成功也能返回0,造成冲突,所以减1,使得查找失败的返回值最大值为-1,这样就不会冲突。

八、字符串

8.1 String

8.1.1 isEmpty方法

8.1.2 substring方法

public String substring(int beginIndex,
                        int endIndex)
功能:返回一个子串,子串开始于指定beginIndex并延伸到字符索引endIndex - 1

8.1.3 split方法

public String[] split(String regex)
功能:根据给定正则表达式的匹配拆分此字符串。

例:

 String str = "回车课堂,打工人,小四老师!";
 //spilt:根据一定的正则分割数据,分割成一个String集合
 String[] strs = str.split(",");
 System.out.println("按照,分割后的字符串集合长度为:" + strs.length);
 for (int i = 0; i < strs.length; i++) {
 System.out.println("第" + (i + 1) + "个数据是:" + strs[i]);
 }

8.1.4 length方法

str.length()

8.1.5 equals方法

比较字符串内容是否相等,重写了Object类中的方法

8.1.6 indexOf方法

public int indexOf(int ch)
返回指定字符第一次出现的字符串内的索引。
String str = "回车课堂,打工人小四老师!";
System.out.println(str.indexOf("小四"));

8.2 StringBuilder和StringBuffer

两者都是用与可变字符序列,用于构造字符串对象。内部使用自动扩容的数组操作字符串数据。StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。

  • 区别

    StringBuffer的方法是线程安全的

    StringBuilder的方法不是线程安全的

    StringBuffer与StringBuilder只是在多线程的使用情况下,使用场景有所不同。

  • 相同点

    都是可变长度的字符串

    API相同:append(),reverse(),delete(),insert(),replace()等

对于StringBuilder和StringBuffer的API学习,我们了解了其中一个的API,就相当于掌握了StringBuffer和StringBuilder的API。

8.2.1 append方法

将指定的字符串追加到此字符序列。

  String str = "打工人,小四老师!";
  StringBuilder stringBuilder = new StringBuilder("回车课堂,");
  //append:将指定的字符串追加到此字符序列。
  stringBuilder.append(str);
  System.out.println(stringBuilder);

8.2.2 reverse方法

将此字符序列用其反转形式取代。

StringBuilder stringBuilder = new StringBuilder("回车课堂");
//reverse:字符序列反转
System.out.println(stringBuilder.reverse());

8.2.3 delete方法

移除此序列的子字符串中的字符。

StringBuilder stringBuilder = new StringBuilder("回车课堂,打工人小四老师!");
//delete:移除此序列的子字符串中的字符。      System.out.println(stringBuilder.delete(4,stringBuilder.length()-1));

8.2.4 insert

将 int参数的字符串表示形式插入此序列中。

StringBuilder stringBuilder = new StringBuilder("回车课堂");
//insert:将 `int` 参数的字符串表示形式插入此序列中。
System.out.println(stringBuilder.insert(4,",打工人,小四老师!"));

8.2.4 replace

使用给定 String 中的字符替换此序列的子字符串中的字符。

public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("回车课堂,打工人,小四老师!");
//replace:使用给定 `String` 中的字符替换此序列的子字符串中的字符。     System.out.println(stringBuilder.replace(4,stringBuilder.length()-1,",打工魂,奥利给!"));
posted @ 2022-02-08 11:57  weiambt  阅读(510)  评论(0)    收藏  举报