常用类(四)Math类和Arrays类

news2024/9/29 18:41:19

一、Math类 

  Math类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数

我们查看math类的常用方法:

我们查看他的源码如下所示:

我们查看他的类图:

他的这些方法基本都是静态的:

 我们的代码设置如下所示:

package com.ypl.Math_;

public class MathMethod_ {
    public static void main(String[] args) {
        //Math常用的方法(静态方法)
        //1.abs  绝对值
        int abs = Math.abs(-9);
        System.out.println(abs);//9
        //2.pow 求幂
        double pow = Math.pow(2, 4); //2的4次方
        System.out.println(pow); //16
        //3.ceil  向上取整,返回>=该参数的最小整数(转成double)
        double ceil = Math.ceil(-3.0001);
        System.out.println(ceil);//-3
        //4.floor 向下取整,返回<=该参数的最大整数(转成double)
        double floor = Math.floor(-4.999);
        System.out.println(floor);//-5.0
        //5.round  四舍五入 Math.floor(该参数+0.5)
        long round = Math.round(-5.001);
        System.out.println(round);
        //6.sqrt 求开方
        double sqrt = Math.sqrt(9.0);
        System.out.println(sqrt); //3.0
        //7.random 求随机数
        //random 返回的是0<=x<1之间的一个随机小数。
        //思考:请写出获取a-b之间的一个随机整数,a,b均为整数,比如a=2,b=7.
        // 即返回一个数 x ,   2<=x<=7 .

        //Math.random()*(b-a)返回的就是0<= X <= b-a

        //(1)(int)(a)<=x<=(int)(a+ Math.random()*(b-a+1))
        //(2)使用具体的数进行解释如下:
        //a= 2  b=7
        //(int)(a+Math.random( )*(b-a  +1))=(int)(2+Math.random( )*(6)
        //Math.random( )*6 返回的是 0<=x<6  小数
        //2+Math.random( )*6 返回的就是  2<=x<8
        //(int)2+Math.random( )*6  =   2<=x<=7
        //(3)公式就是 (int)(a+ Math.random()*(b-a+1))
        //如果写成(int)(b)即为一个固定的值,而(int)(a + b-a)可以进行如上操作
        for (int i = 0; i< 3; i++) {
            System.out.println((int)(2+Math.random()*(7-2+1 )));
        }
       //获取一个a-b之间的一个随机整数
        //int num=(int)(Math.random()*(b-a +1)+a);

        //max,min返回最大值和最小值
        System.out.println("max="+Math.max(55,99));//99
        System.out.println("min="+Math.min(66,88));//66

    }
}

我们运行之后如下所示:

 我们了解到规律如下所示:
获取一个a-b之间的一个随机整数
int num=(int)(Math.random()*(b-a +1)+a);

二、Arrays类

Arrays里面包含了一系列静态方法,用于管理或操作数组(比如排序和搜索)

(1)toString 返回数组的字符串形式

我们按以前的方式如下所示:

package com.ypl.Arrays_;

public class ArrayMethod01 {
    public static void main(String[] args) {
        Integer[]  integers={1,20,90};
        //遍历数组
        for (int i=0;i<integers.length;i++){
            System.out.println(integers);
        }
    }
}

我们运行之后如下所示:

 

我们 采用toString方法如下所示:

package com.ypl.Arrays_;

import java.util.Arrays;

public class ArrayMethod01 {
    public static void main(String[] args) {
        Integer[]  integers={1,20,90};
        //遍历数组
        //直接使用Arrays.toString方法,显示数组。
        System.out.println(Arrays.toString(integers));
    }
}

我们运行之后如下所示:

 

我们查看toString的源码如下所示:

public static String toString(Object[] a) {
        if (a == null)
            return "null";

        int iMax = a.length - 1;
        if (iMax == -1)
            return "[]";

        StringBuilder b = new StringBuilder();
        b.append('[');
        for (int i = 0; ; i++) {
            b.append(String.valueOf(a[i]));
            if (i == iMax)
                return b.append(']').toString();
            b.append(", ");
        }
    }

 (2)sort 排序(自然排序和定制排序) Integer  arr[ ] ={1,-1,7,0,89};

我们可以通过这个方法Comparator这个比较器,可以指定排序的规则是什么,可以选择从大到小,也可以选择从小到大。可以根据自己的想法去设计。 

我们设计的代码如下所示:

package com.ypl.Arrays_;

import java.util.Arrays;
import java.util.Comparator;

public class ArrayMethod01 {
    public static void main(String[] args) {
        //演示sort方法的使用
        Integer arr[]={1,-1,7,0,89};
        //进行排序
        //1.可以直接使用冒泡排序,也可以直接使用Arrays提供的sort方法排序
        //2.因为数组是引用类型,所以通过sort排序后,会直接影响到实参 arr.
        //3.sort重载的,也可以通过传入一个接口 Comparator 实现定制排序
        //4.Arrays.sort(arr) 默认排序方法。
        //默认排序
        Arrays.sort(arr);
        System.out.println("=====排序后=====");
        System.out.println(Arrays.toString(arr));
        //5.调用定制排序时,传入两个参数(1)排序的数组 arr
         //(2)实现了Comparator接口的匿名内部类,要求实现 compare方法
        //6.这里体现了接口编程的方式
        //源码分析:
        //(1) Arrays.sort(arr, new Comparator() 
        //(2)最终到TimeSort的
       // private static <T> void binarySort(T[] a, int lo, int hi, int start,
        //Comparator<? super T> c)
        //(3)执行到binarySort方法的代码,会根据动态绑定机制c.compare( )执行我们传入的匿名内部类compare( )方法.
        //while (left < right) {
        //                int mid = (left + right) >>> 1;
        //                if (c.compare(pivot, a[mid]) < 0)
        //                    right = mid;
        //                else
        //                    left = mid + 1;
        //            }
        //(4) new Comparator() {
        //           @Override
        //           public int compare(Object o1, Object o2) {
        //               Integer i1 = (Integer) o1;
        //               Integer i2 = (Integer) o2;
        //
        //               return i2-i1;
        //           }
        //       });
        //(5) public int compare(Object o1, Object o2)方法返回的值>0的还是<0的会影响整个排序的结果
        //这就充分体现了接口编程+动态绑定+匿名内部类的综合使用
        //将来的底层框架和源码的使用方式,会非常常见。
        //定制排序
        Arrays.sort(arr, new Comparator() {
           @Override
           public int compare(Object o1, Object o2) {
               Integer i1 = (Integer) o1;
               Integer i2 = (Integer) o2;

               return i2-i1;
           }
       });
        System.out.println("=====排序后=====");
        System.out.println(Arrays.toString(arr));


    }
}

我们在运行的时候,我们会先调用sort方法,这个sort方法底层会调用Comparator接口。

我们运行之后如下所示:

我们通过debug来看待如何进行的自己定义的排序:

我们在如下地方打断点:

 我们追进去如下所示:

 我们传进去一个匿名类,所以不为null。

 

我们发现底层其实是二叉树排序:

我们继续进去如下所示:

 在binarySort方法底层,会通过实现的匿名内部类的compare方法来决定排序的顺序

在排序的底层,它调用了传入的接口实现的compare方法。

我们通过模拟排序来加深对排序的认识:

我们设计的代码如下所示:

package com.ypl.Arrays_;

import java.util.Arrays;
import java.util.Comparator;

public class ArraysSourtCustom {
    public static void main(String[] args) {
        int [] arr={1,-1,8,0,20};
        bubble01(arr);
        System.out.println("默认排序为:"+Arrays.toString(arr));
        bubble02(arr, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                int i1=(Integer) o1;
                int i2=(Integer)o2;
                return i2-i1;  //return  i2-i1;
            }
        });
        System.out.println("===定制排序后的情况===");
        System.out.println(Arrays.toString(arr));
    }

    //使用冒泡完成排序
    public  static void  bubble01(int [] arr){
        int temp=0;
        for (int i=0;i<arr.length-1;i++){
            for (int j=0;j< arr.length-1-i;j++){
                //从小到大
                if(arr[j]>arr[j+1]){
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
    }
    //结合冒泡+定制
    public static  void  bubble02(int [] arr, Comparator c){
        int temp=0;
        for (int i=0;i<arr.length-1;i++){
            for (int j=0;j< arr.length-1-i;j++){
                //数组排序由c.compare(arr[j],arr[j+1])返回的值决定
                if(c.compare(arr[j],arr[j+1])>0) {
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }

    }

}

我们运行之后如下所示:

 我们通过debug来进行更加清晰的认识:

我们继续进行追加进去如下所示:
 我们继续进行下一步,如下所示:

 其中c.compare就是我们传进去的匿名对象的Comparator,里面有动态绑定,我们进去step into,如下所示:会将arr[j]和arr[j+1]这两个元素传递给我们传入的匿名的类。

 

 (3)  binarySearch 通过二分搜索法进行查找,要求必须排好序       

   int  index =Arrays.binarySearch(arr,3);

我们设计代码如下所示:

package com.ypl.Arrays_;

import java.util.Arrays;

public class ArrayMethod02 {
    public static void main(String[] args) {
        // binarySearch 通过二分搜索法进行查找,要求必须排好序
        Integer[]  arr={1,2,90,123,567};
        //1.使用binarySearch 二叉查找
        //2.要求该数组是有序的,如果该数组是无序的,不能使用 binarySearch。
        int index = Arrays.binarySearch(arr, 1);
        System.out.println("index="+index);
        int i = Arrays.binarySearch(arr, 123);
        System.out.println("i="+i);
        //3.如果数组中不存在该元素,就返回-1.
        int i3 = Arrays.binarySearch(arr, -127);
        System.out.println("i3="+i3);
        int i1 = Arrays.binarySearch(arr, 556);
        System.out.println("i1="+i1);
        int i2 = Arrays.binarySearch(arr, 92);
        System.out.println("i2="+i2);


    }
}

我们运行之后如下所示:

我们发现我们搜索不存在的数组的时候,我们返回的是-5,不是-1.我们来查看源码:

我们根据源码我们了解到,low为值应该存放的地址,我们所求的556,如果存在的话应该位于第4个,即4为源码的low值,---(4+1),为-5. 
我们设计的代码如下所示:

(4)copyOf 数组元素的复制: 

package com.ypl.Arrays_;

import java.util.Arrays;

public class ArrayMethod03 {
    public static void main(String[] args) {
        //copyOf  数组元素的复制
        //1.从arr数组中,拷贝arr.length个元素到 newArr数组中
        Integer [] arr={1,2,90,123,567};
        Integer[] newArr = Arrays.copyOf(arr, arr.length);
        System.out.println("==拷贝执行哦完毕后===");
        System.out.println(Arrays.toString(newArr));
        //2.如果拷贝的长度>arr.length就在新数组的后面增加null。
        //3.如果拷贝的长度<0就抛出异常NegativeArraySizeException
        //4.该方法的底层使用的是System.arraycopy( )
        Integer[] integers1 = Arrays.copyOf(arr, arr.length + 1);
        System.out.println(Arrays.toString(integers1));
        Integer[] integers = Arrays.copyOf(arr, 3);
        System.out.println(Arrays.toString(integers));
     
    }
}

运行之后如下所示:

我们查看copy的底层源码:

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

(5) fill数组元素的填充

Integer [] num=new Integer [ ]{9,3,2};

Arrays.fill(num,99)

我们设计的代码如下所示:

package com.ypl.Arrays_;

import java.sql.Array;
import java.util.Arrays;

public class ArrayMethod04 {
    public static void main(String[] args) {
        //fill 数组元素的填充
      Integer[] num= new Integer[]{9,3,2};
      //1.使用99去填充num数组,可以理解成是替换原来的元素
        Arrays.fill(num,99);
        System.out.println("==num数组填充后==");
        System.out.println(Arrays.toString(num));
        
    }
}

我们运行之后如下所示:

 (6)equals  比较两个数组元素内容是否完全一致

boolean equals=Arrays.equals(arr,arr2);

我们设计的代码如下所示:

package com.ypl.Arrays_;

import java.util.Arrays;

public class ArrayMethod05 {
    public static void main(String[] args) {
        //equals 比较两个数组元素内容是否完全一致
        Integer [] arr ={1,2,90,123,567};
        Integer [] arr2={1,2,90,123,567};
        Integer[] num= new Integer[]{9,3,2};
        //1.如果arr 和 arr2 数组的元素一样,则返回true
        boolean equals = Arrays.equals(arr, arr2);
        //2.如果不是完全一样,就返回false.
        boolean equals1 = Arrays.equals(arr, num);
        System.out.println("equals="+equals);
        System.out.println("equals1="+equals1);
    }
}

我们运行之后如下所示:

(7)aList将一组值,转换成list

Liist<Integer> aList =Arrays.aList(2,3,4,5,6,1);

System.out.println("asList="+aList);

我们设计的代码如下所示:

package com.ypl.Arrays_;

import java.util.Arrays;
import java.util.List;

public class ArrayMethod06 {
    public static void main(String[] args) {
        //1.asList方法,会将(2,3,4,5,6,1)数据转成一个List集合
        //2.返回的asList编译类型 List(接口)
        //3.asList 运行类型  java.util.Arrays$ArrayList,是Arrays类的静态内部类
        
        List<Integer> asList = Arrays.asList(2, 3, 4, 5, 6, 1);
        System.out.println("asList="+asList);
        System.out.println("asList的运行类型"+asList.getClass());
    }
}

我们运行之后如下所示:

我们查看Arrays的类图如下所示:Arrays的内部类如下:

 我们查看他的源码如下所示:

 private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {

(八)课堂练习:

案例:自定义Book类,里面包含name和price,按price排序(从大到小)。要求使用两种方式排序,对对象的某个属性排序,有一个Book[ ] books=5本书对象。

使用前面学习过的传递实现Comparator接口匿名内部类,也称为定制排序。

可以按照价格price(1)从大到小  (2)从小到大   (3)按照书名长度从大到小

我们设计的代码如下:

package com.ypl.Arrays_;

import java.util.Arrays;
import java.util.Comparator;

public class ArrayExercise {
    public static void main(String[] args) {
        Book [] books=new Book[4];
        books[0]=new Book("红楼梦~",100);
        books[1]=new Book("金瓶梅新版",90);
        books[2]=new Book("青年文摘20年",5);
        books[3]=new Book("java从入门到放弃~",300);

        //(1)price从大到小
        Arrays.sort(books, new Comparator() {
            //这里是对Book数组排序,因此,o1和o2就是Book对象
            @Override
            public int compare(Object o1, Object o2) {
                Book book1 = (Book) o1;
                Book book2 = (Book) o1;
                return book2.getName().length() - book1.getName().length();
            }
        });
        System.out.println(Arrays.toString(books));
    }
}

class Book {
   private  String name;
   private  double price;

    public Book(String name, double price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

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

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

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




我们运行之后如下所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/353365.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重生之我是赏金猎人-SRC漏洞挖掘(十三)-攻防对抗/梦中绝杀X脖代理商

0x00 前言 前两天在国企实验室的朋友遇到了一个棘手的目标&#xff0c;听说之前没人能打点进去&#xff0c;只能靠xxxxx取证 我一听来了兴趣&#xff0c;在梦中臆造了一个靶场进行渗透&#xff0c;并且已获得相关授权 还请各位看官请勿对号入座&#xff0c;如有雷同&#xf…

百舸争流,奋楫者先 | 大势智慧2023年度销售动员大会圆满召开

春回大地&#xff0c;万物新生。满载生机与动力&#xff0c;2月10日&#xff0c;大势智慧2023年度销售动员大会圆满召开。 大势智慧CEO黄先锋、CTO张帆、副总裁周济安、运营中心副总经理段鸿、全国各分公司总经理、总监及全体销售成员线上、线下共聚一堂&#xff0c;以“百舸争…

Android Jetpack组件DataStore之Proto与Preferences存储详解与使用

一、介绍 Jetpack DataStore 是一种数据存储解决方案&#xff0c;允许您使用协议缓冲区存储键值对或类型化对象。DataStore 使用 Kotlin 协程和 Flow 以异步、一致的事务方式存储数据。 如果您当前在使用 SharedPreferences 存储数据&#xff0c;请考虑迁移到 DataStore&#…

vscode构建Vue3.0项目(vite,vue-cli)

构建Vue3.0项目构建Vue3.0项目1.使用Vite构建vue项目的方法以及步骤1. 安装vite2. 运行vite vue 项目3.说明2.使用vue-cli构建vue项目的方法以及步骤1.安装全局vue cli —— 脚手架2、VSCode3.报错4.运行构建Vue3.0项目 1.使用Vite构建vue项目的方法以及步骤 1. 安装vite n…

这才是计算机科学_计算机安全

文章目录一、前言1.1身份认证authentication1.2 权限1.3 开发安全二、黑客2.1 NAND镜像2.2 缓冲区溢出2.3 注入三、加密 cryptography3.1 列位移加密3.2 软件加密3.3 密钥交换一、前言 计算机网络中并不是没有人搞破坏的 但是网络无法区分中要执行的是好是坏 计算机安全&#…

设计模式第七讲-外观模式、适配器模式、模板方法模式详解

一. 外观模式 1. 背景 在现实生活中&#xff0c;常常存在办事较复杂的例子&#xff0c;如办房产证或注册一家公司&#xff0c;有时要同多个部门联系&#xff0c;这时要是有一个综合部门能解决一切手续问题就好了。 软件设计也是这样&#xff0c;当一个系统的功能越来越强&…

最大权闭合子图(最小割模型)

1&#xff0c;定义&#xff1a; 1&#xff0c;最大权闭合子图是最小割的一个模型。即每一个子图中的每一个点&#xff0c;其出边的点也全应该在这个子图中。而所有子图中&#xff0c;其点的权值和最大就是最大权闭合子图。 2&#xff0c;构建该图&#xff0c;我们把所有正权值…

Docker镜像创建及管理(Hub官方仓库使用及私有注册中心搭建)

写在前面 系统环境&#xff1a;centos 7 一、Docker如何创建镜像 镜像的来源有两种&#xff1a; 从镜像仓库下载镜像&#xff1b;自己创建新的镜像。创建分为两种&#xff1a;&#xff08;1&#xff09;基于已有镜像创建&#xff1b;&#xff08;2&#xff09;使用Dockerfi…

【数据治理-03】无规矩不成方圆,聊聊如何建立数据标准

无规矩&#xff0c;不成方圆&#xff01;数据标准&#xff08;Data Standards&#xff09;是保障数据的内外部使用和交换的一致性和准确性的规范性约束&#xff0c;作为数据治理的基石&#xff0c;是绕不开的一项工作&#xff0c;如此重要的活如何干&#xff0c;咱们一起聊聊。…

【数据结构】排序算法

目录 1.理解排序 1.1 排序的概念 1.2 排序的运用场景 1.3 常见的排序算法 2.插入排序算法 2.1 直接插入排序 2.2 希尔排序 3.选择排序算法 3.1 直接选择排序 3.2 堆排序 4.交换排序算法 4.1 冒泡排序 4.2 快速排序 4.2.1 hoare 法 4.2.2 挖坑法 4.2.3 前…

前期软件项目评估偏差,如何有效处理?

1、重新评估制定延期计划 需要对项目进行重新评估&#xff0c;将新的评估方案提交项目干系人会议&#xff0c;开会协商一致后按照新的讨论结果制定计划&#xff0c;并实施执行。 软件项目评估偏差 怎么办&#xff1a;重新评估制定延期计划2、申请加资源 如果项目客户要求严格&a…

用股票交易量查询接口是怎么查询a股全天总成交量的?

用股票交易量查询接口是怎么查询a股全天总成交量的&#xff1f;今天下班就以通达信给大家讲解一下&#xff0c;通常是在K线图的底部状态栏&#xff0c;可以在日线进行查看a股成交量。在市场栏底部的子图中。 有当天成交的数量。成交量是表示一定的时间内已经成交的中的成交数量…

【数据挖掘】期末复习笔记(重点知识)

Data Mining 一、概述 1.1 数据挖掘 VS 机器学习 VS 深度学习 VS 知识发现 知识发现&#xff1a; 知识发现就是在数据中发掘知识&#xff0c;将低层次的原始数据转换为高层次的信息。 数据挖掘&#xff1a; 数据挖掘是用一系列的方法或算法从数据中挖掘有用的信息&#xf…

Android中的MVC、MVP、MVVM架构你清楚不?(附实现代码)

01 架构介绍 先来看一下MVC、MVP、MVVM的架构图。 从这些架构图中&#xff0c;可以看到每种架构都有3个模块以及数据流动方向箭头。 模块 在系统架构中&#xff0c;首先要做的就是把系统整体按照一定的原则划分成模块。 数据流动 模块划分之后&#xff0c;模块之间的通信&…

工程监测多通道振弦模拟信号采集仪VTN的MODBUS 通讯协议

工程监测多通道振弦模拟信号采集仪VTN的MODBUS 通讯协议 在 MODBUS 协议下&#xff0c;所有寄存器被定义为“保持寄存器” &#xff08;详见 MODBUS 通讯协议标准说明&#xff09;&#xff0c; 设备支持基于 MODBUS 协议的多个连续寄存器读取、单个寄存器写入两种指令码&#x…

电液伺服阀控制器YY-100

供电电源&#xff1a; 24V DC(18&#xff5e;36V)&#xff1b; 控制输入&#xff1a; -10V&#xff5e;10V DC&#xff1b;最大输出&#xff1a; 70mA &#xff1b;增益 &#xff1a; 调节范围——1&#xff5e;40 mA&#xff08;出厂设置——4 mA&#xff09;&#xff1b; 偏置…

C语言从0到1算法小白训练营——day2

我们学习不仅仅是要把难的学会&#xff0c;也要注重基础&#xff0c;注重内功。 接下来我们继续先从基础知识开始&#xff1a; 1. 字符串字符常量注释 1.1 字符串 如&#xff1a;“abc” ①定义&#xff1a;由双引号引起来的一串字符称为字符串。 ②C语言规定&#xff0c;…

【计算机网络】P1 - 物理层

物理层大纲物理层基本概念数据通信基础两种入网方式传输过程源系统、传输系统与目的系统数据与信号信源、信宿与信道三种通信方式两种传输方式大纲 物理层基本概念 物理层解决如何在传输媒体上&#xff08;同轴电缆&#xff0c;光纤等&#xff09;上传输数据比特流。主要任务为…

detach,主线程终止后子线程会结束吗

此前&#xff0c;我对detach的理解是&#xff0c;当主线程退出后&#xff0c;子线程能够继续存在。实际上&#xff0c;当主线程退出后&#xff0c;子线程也随之结束了。先看一个例子&#xff1a; #include <iostream> #include <thread> #include <unistd.h>…

交叉编译 zlib

交叉编译 zlib 概述 zlib 被设计为一个免费的、通用的、不受法律约束的、即不受任何专利保护的无损数据压缩库&#xff0c;可在几乎任何计算机硬件和操作系统上使用。zlib 数据格式本身可以跨平台移植。与Unix 压缩和 GIF 图像格式中使用的 LZW 压缩方法不同&#xff0c;zlib …