Java进阶04 API

Java进阶04 API

一、常用API(续)

1、Math类

包含执行基本数字运算的方法

  • Math类的常用方法

    方法名说明
    public 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) {
        // 获取绝对值
        System.out.println(Math.abs(10));        //10
        System.out.println(Math.abs(-10));       //10
        // 向上取整
        System.out.println(Math.ceil(12.3));     //13
        System.out.println(Math.ceil(12.9));     //13
        System.out.println(Math.ceil(12.0));     //12
        // 向下取整
        System.out.println(Math.floor(12.3));    //12
        System.out.println(Math.floor(12.9));    //12
        System.out.println(Math.floor(12.0));    //12
        // 四舍五入
        System.out.println(Math.round(12.3));    //12
        System.out.println(Math.round(12.9));    //13
        // 求最值
        System.out.println(Math.max(10, 20));    //20
        System.out.println(Math.min(10, 20));    //10
        // 求次幂
        System.out.println(Math.pow(2, 3));      //8
        // 随机数
        System.out.println(Math.random());
    }
}

2、System类

System的功能是静态的,都是直接用类名调用即可

方法名说明
public static void exit(int status)终止当前运行的 Java 虚拟机,非零表示异常终止
public static long currentTimeMillis()返回当前系统的时间毫秒值形式
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)数组拷贝
  • currentTimeMills方法可以用来计算某段程序执行的时间

private static void method() {
        // 获取时间原点 (1970-01-01 00:00:00) 到现在所经历过的毫秒值
        long start = System.currentTimeMillis();
​
        StringBuilder sb = new StringBuilder();
        //循环拼接1-100000
        for (int i = 1; i <= 100000; i++) {
            sb.append(i);
        }
        System.out.println(sb);
​
        long end = System.currentTimeMillis();
        
        //结束时间-开始时间即上述代码运行时间
        System.out.println(end - start);
    }
  • arraycopy方法

/*public static void arraycopy(数据源数组, 起始索引, 目的地数组, 起始索引, 拷贝个数)
*/
​
//需求:拷贝src数组中的22,33,44到dest数组
public static void main(String[] args) {
        int[] src = {11, 22, 33, 44, 55};
        int[] dest = new int[3];
​
        System.arraycopy(src, 1, dest, 0, 3);
​
        for (int i = 0; i < dest.length; i++) {
            System.out.println(dest[i]);
        }
    }

3、BigDecimal类

用于解决小数运算中,出现的不精确问题

3.1 创建对象

将需要运算的对象,封装为对应的包装类对象

//方式一  不推荐使用
public BigDecimal(double val)
    
//方式二    推荐使用
public BigDecimal(String val)
    
//方式三    极其推荐
public static BigDecimal valueOf(double val)
3.2 常用方法:四则运算
方法名说明
public BigDecimal add(BigDecimal b)加法
public BigDecimal subtract(BigDecimal b)减法
public BigDecimal multiply(BigDecimal b)乘法
public BigDecimal divide(BigDecimal b)除法
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)除法(保留小数)

注意divide使用细节:

/*
     public BigDecimal divide (另一个BigDecimal对象,精确几位,舍入模式)
                             参数1: 除数
                             参数2: 保留小数点多少位
                             参数3: 舍入模式
舍入模式:                                                                                     RoundingMode.HALF_UP : 四舍五入
    RoundingMode.UP : 进一法
    RoundingMode.DOWN : 去尾法
*/
 public static void main(String[] args) {
        BigDecimal num1 = BigDecimal.valueOf(10.0);
        BigDecimal num2 = BigDecimal.valueOf(3.0);
        
        //计算10.0/3.0的商,结果采用四舍五入保留2位小数
        double result = num1.divide(num2,2, RoundingMode.HALF_UP).doubleValue();
        System.out.println(result);
​
    }

4、包装类

将基本数据类型,包装成类(变成引用数据类型)

基本数据类型引用数据类型
byteByte
shortShort
intInteger
longLong
charCharacter
floatFloat
doubleDouble
booleanBoolean
4.1 为什么会有包装类?

变成类,就可以创建对象了,对象就可以调用方法更方便得解决问题

//如何将基本类型,包装为引用类型
public static Integer valueOf(int i)
4.2 拆装箱(Integer类举例)
  • 装箱

    基本类型的数据和变量可以直接赋值给包装类型的变量

    • 手动(手动调用方法valueof()方法, 将基本数据类型, 封装为引用类型)

      Integer i1 = Integer.valueOf(10);
    • 自动(将基本数据类型数据, 直接赋值给包装类的变量)

      Integer i1 = 10;
  • 拆箱

    包装类型的变量可以直接赋值给基本数据类型的变量

    • 手动(手动调用方法intValue()方法, 将包装类的对象, 转换为基本数据类型)

      int num = i1.intValue();
    • 自动(包装类的对象, 可以和基本数据类型直接在一起运算, 内部会自动的调用intValue() 方法)

       int result = i1 + i2;   //i1会自动调用intValue()方法

结论:有了自动拆装箱, 基本数据类型和对应的包装类, 可以直接一起运算, 操作便捷

4.3 ★包装类面试题★
Integer i1 = 127;
Integer i2 = 127;
System.out.printLn(i1 ==i2);       //true
​
Integer i3 = 129;
Integer i4 = 129;
System.out.printLn(i3 ==i4);       //false
​

分析:首先自动装箱的实现原理其实是底层调用valueOf()方法,而valueOf()方法的源码实现逻辑其实是判断传入的数据范围是否在-128~127之间,如果在这个范围内,就会直接从底层数据中获取地址;如果没在这个范围内,就会重新在堆内存中new出一个Integer类对象,进堆便会开辟空间,分配地址。结合上述代码分析,i1、i2、i3、i4都是自动装箱,i1、i2给出127,在范围内,会直接指向底层数组的同一个地址,所以做==判断的结果为true。而i3、i4给出129,已超出范围,会各自在堆内存中开辟新的空间,分配不同的地址,所以做==判断的结果为flase。

//valueOf底层源码
public static Integer valueOf(int i) {
    if (i >= -128 && i <= 127) {
        return IntegerCache.cache[i + 128];   //底层是一个长度为255的数组InterCache.cache[],正好存放-128~127这些数
    }
    return new Integer(i);
}
4.4 Integer类的常用方法
方法名说明
public static String toBinaryString(int i)得到二进制
public static String toOctalString(int i)得到八进制
public static String toHexString(int i)得到十六进制
public static int parseInt(String s)将字符串类型的整数转成int类型的整数
public static void main(String[] args) {
    Integer i1 = 10;
    int i2 = 20;
    System.out.println(i1 + i2);
​
    System.out.println("-----------------------------");
​
    int num = 12;
    System.out.println(Integer.toBinaryString(num));
    System.out.println(Integer.toOctalString(num));
    System.out.println(Integer.toHexString(num));
​
    System.out.println("-----------------------------");
​
    String s = "123";
    System.out.println(Integer.parseInt(s) + 100);                // 223
}
  • Demo(运用练习parseInt方法)

    需求:已知字符串为String s = “10,30,40,50,20”;找出其中的最大值并打印

    public class IntegerTest2 {
        /*
             思路:请将该字符串转换为整数并存入数组
         */
    ​
        public static void main(String[] args) {
    ​
            //切割字符串
            String s = "10,50,30,20,40";
            String[] contents = s.split(",");
    ​
          /*  输出打印查看是否切割成功
            for (int i = 0; i < contents.length; i++) {
                System.out.println(contents[i]);
            }*/
    ​
            //创建一个整数数组,用于存放转换类型后的数字
            int[] nums = new int[contents.length];
           
            //遍历原数组,逐个转换并存入新数组
            for (int i = 0; i < contents.length; i++) {
                nums[i] = Integer.parseInt(contents[i]);
            }
    ​
            //遍历新数组,找最大值并打印
            int max = nums[0];
            for (int i = 0; i < nums.length; i++) {
                if(nums[i]>max){
                    max=nums[i];
                }
            }
            //for循环结束,展示最大值
            System.out.println("该字符串中的最大值为:"+max);
        }
    }
4.5 其他基本数据类型的包装类

5、Arrays工具类

数组操作工具类,专门用于操作数组元素

5.1 常用方法
方法名说明
public static String toString(类型[] a)将数组元素拼接为带有格式的字符串
public static boolean equals(类型[] a, 类型[] b)比较两个数组内容是否相同(长度、内容、顺序)
public static int binarySearch(int[] a, int key)查找元素在数组中的索引 (二分查找法)
public static void sort(类型[] a)对数组进行默认升序排序

二、数组基本算法

1、冒泡排序

思想:相邻的两个数两两比较,若逆序,则定义中间变量交换位置

1.1 分析比较次数

以int[] arr = {22,11,55,44,33};为例分析

1.2 代码
 public static void bubbleSort(int[] arr){
        //外循环控制比较的轮数
        for (int i = 0; i < arr.length-1; i++) {
            //内循环:控制比较的次数
            //-1 避免索引越界
            //-i 提升效率
            for (int j = 0; j < arr.length-1-i; j++) {
                //交换
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

2、选择排序

从索引为0的元素开始,拿着每个索引上的元素跟后面的元素依次比较,若逆序则交换

2.1 循环次数分析

以int[] arr = {22,11,55,44,33};为例分析

如图所示,蓝色外外循环分析,红色为内循环分析。外循环取值范围从0-3,初始从0开始,结束时为数组长度减1;内循环总是从外循环控制下标的后一位开始,因此初始值为外循环控制变量加1,循环结束条件为数组长度

2.2 代码
private static void selectSort(int[] arr) {
        //外循环,控制比较轮数,
        for (int i = 0; i < arr.length-1; i++) {
            //内循环 总是和外循环控制的下标的后一个开始比较,因此初始值为i+1
            for (int j = i+1; j < arr.length; j++) {
                if(arr[i]>arr[j]){
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

3、二分查找(折半查找)

思想:从一组有序数组(前提)的正中间开始查找,与目标元素进行比较,将查找范围缩小至左半边或右半边,再找到半表的正中间,重复上述操作,直至查找到或未找到结束

public class ArrayDemo3 {
    public static void main(String[] args) {
        int[] arr ={11,22,33,44,55};    //折半查找必须传入有序数组
​
        int index= binarySearch(arr,33);
​
        System.out.println(index);
    }
​
    private static int binarySearch(int[] arr, int num) {
        //定义两个变量,记录最大,最小索引
        int min = 0;
        int max = arr.length-1;
​
        //不明确循环次数,使用while循环,循环执行条件为min<=max
        while(min<=max){
             //计算中间索引mid,每次折半都需要重新计算mid
            int mid = (min+max)/2;
            //目标元素大于中间索引位置的元素,向右半查找,改变min的指向
            if(num>arr[mid]){
                min = mid+1;
                //目标元素小于中间索引位置的元素,向左半查找,改变max的指向  
            }else if(num<arr[mid]){
                max=mid-1;
            }else{
                //找到了,返回mid所指向的索引
                return mid;
            }
        }
         //min>max结束循环,未找到
        return -1;
    }
}

三、正则表达式

本质来说就是一个字符串, 可以指定一些规则, 来校验其他字符串

1、编写规则

2、正则练习

public class RegexTest {
    public static void main(String[] args) {
        
        //qq号正则:要求不能以0开头、5-12位纯数字
        String qqRegex = "[1-9]\\d{4,11}";
        //matches方法将字符串和正则表达式做匹配,完全匹配才会返回true 
        System.out.println("123456".matches(qqRegex));
​
        
        //手机号正则:必须1开头、第二位可以是3-9任意一位、11位纯数字
        String telRegex = "[1][3-9]\\d{9}";
        System.out.println("18298309323".matches(telRegex));
​
        System.out.println("---------------------------------------");
​
        //邮箱正则
        String emailRegex = "\\w+@[a-z0-9]{2,10}(\\.[a-z]{2,3})+";
        System.out.println("zhangSan@itcast.cn".matches(emailRegex));
        System.out.println("zhangsan@163.com".matches(emailRegex));
        System.out.println("123456@qq.com".matches(emailRegex));
        System.out.println("zhangsan@sina.com".matches(emailRegex));
        System.out.println("zhangsan@itcast.qq.com".matches(emailRegex));
        System.out.println("zhangsan@xxx.edu".matches(emailRegex));
        System.out.println("zhangsan@xxx.org".matches(emailRegex));
    }
}

3、String类中与正则有关的常用方法

方法名说明
public String replaceAll(String regex,String newStr)按照正则表达式匹配的内容进行替换
public String[] split(String regex)按照正则表达式匹配的内容进行分割字符串,反回一个字符串数组

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值