从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)
常见API,MAth、System
- 1 Math类
- 1.1 概述
- 1.2 常见方法
- 1.3 算法小题(质数)
- 1.4 算法小题(自幂数)
- 2 System类
- 2.1 概述
- 2.2 常见方法
1 Math类
1.1 概述
tips:了解内容
查看API文档,我们可以看到API文档中关于Math类的定义如下:
Math类所在包为java.lang包,因此在使用的时候不需要进行导包。并且Math类被final修饰了,因此该类是不能被继承的。
Math类包含执行基本数字运算的方法,我们可以使用Math类完成基本的数学运算。
要想使用Math类我们就需要先创建该类的对象,那么创建对象就需要借助于构造方法。因此我们就需要首先查看一下API文档,看看API文档中针对Math类有没有提供对应的构造方法。通过API文档来查看
一下Math类的成员,如下所示:
在API文档中没有体现可用的构造方法,因此我们就不能直接通过new关键字去创建Math类的对象。同时我们发现Math类中的方法都是静态的,因此在使用的时候我们可以直接通过类名去调用。在Math类中
定义了很多数学运算的方法,但是我们并不可能将所有的方法学习一遍,我们主要学习的就是一些常见的方法。
1.2 常见方法
tips:重点讲解内容
常见方法介绍
我们要学习的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) // 按照四舍五入返回最接近参数的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() // 返回一个[0.0,1.0)的随机值
案例演示
接下来我们就来演示一些这些方法的执行效果,如下所示:
public class MathDemo01 {public static void main(String[] args) {// public static int abs(int a) 返回参数的绝对值System.out.println("-2的绝对值为:" + Math.abs(-2));System.out.println("2的绝对值为:" + Math.abs(2));// public static double ceil(double a) 返回大于或等于参数的最小整数System.out.println("大于或等于23.45的最小整数位:" + Math.ceil(23.45));System.out.println("大于或等于-23.45的最小整数位:" + Math.ceil(-23.45));// public static double floor(double a) 返回小于或等于参数的最大整数System.out.println("小于或等于23.45的最大整数位:" + Math.floor(23.45));System.out.println("小于或等于-23.45的最大整数位:" + Math.floor(-23.45));// public static int round(float a) 按照四舍五入返回最接近参数的intSystem.out.println("23.45四舍五入的结果为:" + Math.round(23.45));System.out.println("23.55四舍五入的结果为:" + Math.round(23.55));// public static int max(int a,int b) 返回两个int值中的较大值System.out.println("23和45的最大值为: " + Math.max(23, 45));// public static int min(int a,int b) 返回两个int值中的较小值System.out.println("12和34的最小值为: " + Math.min(12 , 34));// public static double pow (double a,double b)返回a的b次幂的值System.out.println("2的3次幂计算结果为: " + Math.pow(2,3));// public static double random()返回值为double的正值,[0.0,1.0)System.out.println("获取到的0-1之间的随机数为: " + Math.random());}}
运行程序进行测试,控制台输出结果如下:
-2的绝对值为:2
2的绝对值为:2
大于或等于23.45的最小整数位:24.0
大于或等于-23.45的最小整数位:-23.0
小于或等于23.45的最大整数位:23.0
小于或等于-23.45的最大整数位:-24.0
23.45四舍五入的结果为:23
23.55四舍五入的结果为:24
23和45的最大值为: 45
12和34的最小值为: 12
2的3次幂计算结果为: 8.0
获取到的0-1之间的随机数为: 0.7322484131745958
1.3 算法小题(质数)
需求:
判断一个数是否为一个质数
代码实现:
public class MathDemo2 {public static void main(String[] args) {//判断一个数是否为一个质数System.out.println(isPrime(997));//997 2~996 995次}public static boolean isPrime(int number) {int count = 0;for (int i = 2; i <= Math.sqrt(number); i++) {count++;if (number % i == 0) {return false;}}System.out.println(count);return true;}
}
1.4 算法小题(自幂数)
自幂数,一个n位自然数等于自身各个数位上数字的n次幂之和
举例1:三位数 1^3 + 5^3 + 3^3 = 153
举例2:四位数 1^4 + 6^4 + 3^4 + 4^3 = 1634
如果自幂数是:
- 一位自幂数,也叫做:独身数
- 三位自幂数:水仙花数 四位自幂数:四叶玫瑰数
- 五位自幂数:五角星数 六位自幂数:六合数
- 七位自幂数:北斗七星数 八位自幂数:八仙数
- 九位自幂数:九九重阳数 十位自幂数:十全十美数
//水仙花数:100 ~ 999
int count = 0;
//得到每一个三位数
for (int i = 100; i <= 999; i++) {//个位 十位 百位int ge = i % 10;int shi = i / 10 % 10;int bai = i / 100 % 10;//判断://每一位的三次方之和 跟本身 进行比较。double sum = Math.pow(ge, 3) + Math.pow(shi, 3) + Math.pow(bai, 3);if (sum == i) {count++;//System.out.println(i);System.out.println(count);}
}
2 System类
2.1 概述
tips:了解内容
查看API文档,我们可以看到API文档中关于System类的定义如下:
System类所在包为java.lang包,因此在使用的时候不需要进行导包。并且System类被final修饰了,因此该类是不能被继承的。
System包含了系统操作的一些常用的方法。比如获取当前时间所对应的毫秒值,再比如终止当前JVM等等。
要想使用System类我们就需要先创建该类的对象,那么创建对象就需要借助于构造方法。因此我们就需要首先查看一下API文档,看看API文档中针对System类有没有提供对应的构造方法。通过API文档来
查看一下System类的成员,如下所示:
在API文档中没有体现可用的构造方法,因此我们就不能直接通过new关键字去创建System类的对象。同时我们发现System类中的方法都是静态的,因此在使用的时候我们可以直接通过类名去调用(Nested Class Summary内部类或者内部接口的描述)。
2.2 常见方法
tips:重点内容
常见方法介绍
我们要学习的System类中的常见方法如下所示:
public static long currentTimeMillis() // 获取当前时间所对应的毫秒值(当前时间为0时区所对应的时间即就是英国格林尼治天文台旧址所在位置)
public static void exit(int status) // 终止当前正在运行的Java虚拟机,0表示正常退出,非零表示异常退出
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); // 进行数值元素copy
案例演示
接下来我们就来通过一些案例演示一下这些方法的特点。
案例1:演示currentTimeMillis方法
public class SystemDemo01 {public static void main(String[] args) {// 获取当前时间所对应的毫秒值long millis = System.currentTimeMillis();// 输出结果System.out.println("当前时间所对应的毫秒值为:" + millis);}}
运行程序进行测试,控制台的输出结果如下:
当前时间所对应的毫秒值为:1876050298313
获取到当前时间的毫秒值的意义:我们常常来需要统计某一段代码的执行时间。此时我们就可以在执行这段代码之前获取一次时间,在执行完毕以后再次获取一次系统时间,然后计算两个时间的差值,
这个差值就是这段代码执行完毕以后所需要的时间。如下代码所示:
public class SystemDemo2 {public static void main(String[] args) {//判断1~100000之间有多少个质数long start = System.currentTimeMillis();for (int i = 1; i <= 100000; i++) {boolean flag = isPrime2(i);if (flag) {System.out.println(i);}}long end = System.currentTimeMillis();//获取程序运行的总时间System.out.println(end - start); //方式一:1514 毫秒 方式二:71毫秒}//以前判断是否为质数的方式public static boolean isPrime1(int number) {for (int i = 2; i < number; i++) {if (number % i == 0) {return false;}}return true;}//改进之后判断是否为质数的方式(效率高)public static boolean isPrime2(int number) {for (int i = 2; i <= Math.sqrt(number); i++) {if (number % i == 0) {return false;}}return true;}
}
案例2:演示exit方法
public class SystemDemo01 {public static void main(String[] args) {// 输出System.out.println("程序开始执行了.....");// 终止JVMSystem.exit(0);// 输出System.out.println("程序终止了..........");}}
运行程序进行测试,控制台输出结果如下:
程序开始执行了.....
此时可以看到在控制台只输出了"程序开始了…",由于JVM终止了,因此输出"程序终止了…"这段代码没有被执行。
案例3:演示arraycopy方法
方法参数说明:
// src: 源数组
// srcPos: 源数值的开始位置
// dest: 目标数组
// destPos: 目标数组开始位置
// length: 要复制的元素个数
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
代码如下所示:
public class SystemDemo01 {public static void main(String[] args) {// 定义源数组int[] srcArray = {23 , 45 , 67 , 89 , 14 , 56 } ;// 定义目标数组int[] desArray = new int[10] ;// 进行数组元素的copy: 把srcArray数组中从0索引开始的3个元素,从desArray数组中的1索引开始复制过去System.arraycopy(srcArray , 0 , desArray , 1 , 3);// 遍历目标数组for(int x = 0 ; x < desArray.length ; x++) {if(x != desArray.length - 1) {System.out.print(desArray[x] + ", ");}else {System.out.println(desArray[x]);}}}}
运行程序进行测试,控制台输出结果如下所示:
0, 23, 45, 67, 0, 0, 0, 0, 0, 0
通过控制台输出结果我们可以看到,数组元素的确进行复制了。
使用这个方法我们也可以完成数组元素的删除操作,如下所示:
public class SystemDemo02 {public static void main(String[] args) {// 定义一个数组int[] srcArray = {23 , 45 , 67 , 89 , 14 , 56 } ;// 删除数组中第3个元素(67):要删除67这个元素,我们只需要将67后面的其他元素依次向前进行移动即可System.arraycopy(srcArray , 3 , srcArray , 2 , 3);// 遍历srcArray数组for(int x = 0 ; x < srcArray.length ; x++) {if(x != desArray.length - 1) {System.out.print(srcArray[x] + ", ");}else {System.out.println(srcArray[x]);}}}
}
运行程序进行测试,控制台的输出结果如下所示:
23, 45, 89, 14, 56, 56
通过控制台输出结果我们可以看到此时多出了一个56元素,此时我们只需要将最后一个位置设置为0即可。如下所示:
public class SystemDemo02 {public static void main(String[] args) {// 定义一个数组int[] srcArray = {23 , 45 , 67 , 89 , 14 , 56 } ;// 删除数组中第3个元素(67):要删除67这个元素,我们只需要将67后面的其他元素依次向前进行移动即可System.arraycopy(srcArray , 3 , srcArray , 2 , 3);// 将最后一个位置的元素设置为0srcArray[srcArray.length - 1] = 0 ;// 遍历srcArray数组for(int x = 0 ; x < srcArray.length ; x++) {if(x != srcArray.length - 1 ) {System.out.print(srcArray[x] + ", ");}else {System.out.println(srcArray[x]);}}}
}
运行程序进行测试,控制台输出结果如下所示:
23, 45, 89, 14, 56, 0
此时我们可以看到元素"67"已经被删除掉了。67后面的其他元素依次向前进行移动了一位。
arraycopy方法底层细节:
1.如果数据源数组和目的地数组都是基本数据类型,那么两者的类型必须保持一致,否则会报错
2.在拷贝的时候需要考虑数组的长度,如果超出范围也会报错
3.如果数据源数组和目的地数组都是引用数据类型,那么子类类型可以赋值给父类类型
代码示例:
public class SystemDemo3 {public static void main(String[] args) {//public static void arraycopy(数据源数组,起始索引,目的地数组,起始索引,拷贝个数) 数组拷贝//细节://1.如果数据源数组和目的地数组都是基本数据类型,那么两者的类型必须保持一致,否则会报错//2.在拷贝的时候需要考虑数组的长度,如果超出范围也会报错//3.如果数据源数组和目的地数组都是引用数据类型,那么子类类型可以赋值给父类类型Student s1 = new Student("zhangsan", 23);Student s2 = new Student("lisi", 24);Student s3 = new Student("wangwu", 25);Student[] arr1 = {s1, s2, s3};Person[] arr2 = new Person[3];//把arr1中对象的地址值赋值给arr2中System.arraycopy(arr1, 0, arr2, 0, 3);//遍历数组arr2for (int i = 0; i < arr2.length; i++) {Student stu = (Student) arr2[i];System.out.println(stu.getName() + "," + stu.getAge());}}
}class Person {private String name;private int age;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}/*** 获取** @return name*/public String getName() {return name;}/*** 设置** @param name*/public void setName(String name) {this.name = name;}/*** 获取** @return age*/public int getAge() {return age;}/*** 设置** @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Person{name = " + name + ", age = " + age + "}";}
}class Student extends Person {public Student() {}public Student(String name, int age) {super(name, age);}
}
后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹
相关文章:

从零开始学习 Java:简单易懂的入门指南之MAth、System(十二)
常见API,MAth、System 1 Math类1.1 概述1.2 常见方法1.3 算法小题(质数)1.4 算法小题(自幂数) 2 System类2.1 概述2.2 常见方法 1 Math类 1.1 概述 tips:了解内容 查看API文档,我们可以看到API文档中关于Math类的定义如下: Math类…...

人工智能原理概述 - ChatGPT 背后的故事
大家好,我是比特桃。如果说 2023 年最火的事情是什么,毫无疑问就是由 ChatGPT 所引领的AI浪潮。今年无论是平日的各种媒体、工作中接触到的项目还是生活中大家讨论的热点,都离不开AI。其实对于互联网行业来说,自从深度学习出来后就…...

【Linux】以太网协议——数据链路层
链路层解决的问题 IP拥有将数据跨网络从一台主机送到另一台主机的能力,但IP并不能保证每次都能够将数据可靠的送到对端主机,因此IP需要上层TCP为其提供可靠性保证,比如数据丢包后TCP可以让IP重新发送数据,最终在TCP提供的可靠性机…...
Neo4j之MATCH基础
1】基本匹配和返回:查找所有节点和关系,返回节点的标签和属性。 MATCH (n) RETURN n;2】条件筛选:查找所有名为 "Alice" 的人物节点。 MATCH (person:Person {name: Alice}) RETURN person;3】关系查询:查找所有和 &q…...

Python实验代码合集
NumPy实验(1) NumPy实验(2) NumPy实验(3) SciPy实验(1) 请结合最小二乘法的原理,利用以前学的Numpy和Python知识,实现最小乘法直线拟合的算法,并测试。 请结合梯度下降的原理,利用以前学的Numpy和Python知识,实现梯度下降法求函数最小值的…...
Less和Sass的原理和用法
一、原理 1.1 Less定义:是一种动态的样式语言,使CSS变成一种动态的语言特性,如变量、继承、运算、函数。Less既可以在客户端上面运行(支持IE6以上版本、Webkit、Firefox),也可以在服务端运行(Node.js) 1.2 SaSS定义:是一种动态样式语言&#…...
c# List<T>.Aggregate
List<T>.Aggregate 方法的定义: public TAccumulate Aggregate<TAccumulate>(TAccumulate seed, Func<TAccumulate, T, TAccumulate> func)参数解析如下: TAccumulate seed:初始累积值,也是累积的起始值(默认…...
软件测试常用工具总结(测试管理、单元测试、接口测试、自动化测试、性能测试、负载测试等)
前言 在软件测试的过程中,多多少少都是会接触到一些测试工具,作为辅助测试用的,以提高测试工作的效率,使用好了测试工具,能对测试起到一个很好的作用,同时,有些公司,也会要求掌握一…...
Hadoop组件
前言 Hadoop 是一个能够对大量数据进行分布式处理的软件框架。具有可靠、高效、可伸缩的特点。 HDFS(hadoop分布式文件系统) 是hadoop体系中数据存储管理的基础。他是一个高度容错的系统,能检测和应对硬件故障。 Mapreduce(分…...

jeecg-boot批量导入问题注意事项
现象: 由于批量导入数据速度很快, 因为数据库中的create time字段的时间可能一样,并且jeecg框架自带的是根据生成时间排序, 因此在前端翻页查询的时候,数据每次排序可能会不一样, 会出现第一页已经出现过一…...
Django图书商城系统实战开发 - 实现会员管理
Django图书商城系统实战开发 - 实现会员管理 在Django图书商城系统中,会员管理是一个重要的功能模块。该模块包括会员信息的展示、编辑和删除等功能。以下是实现会员管理功能的详细步骤和代码示例。 步骤一:设计数据库模型 首先,我们需要设…...
Kafka如何解决消息丢失的问题
在 Kafka 的整个架构中可以总结出消息有三次传递的过程: Producer 端发送消息给 Broker 端Broker 将消息进行并持久化数据Consumer 端从 Broker 将消息拉取并进行消费 在以上这三步中每一步都可能会出现丢失数据的情况, 那么 Kafka 到底在什么情况下才…...
我只记得512天在CSDN的日子
机缘 不知不觉开始写博客已经512天了,在这期间有过因为懒惰想要放弃,也有过写不出优质文章没有阅读量的气馁,也有过学习蛮久却不知道从何开始写起的迷茫,但是最终好在还是坚持了下来,无论好坏坚持总没有错。 写博客的…...

pycharm,VSCode 几个好用的插件
pycharm Tabnine AI Code 可以在编写程序的时候为你提供一些快捷方式,增加编程速度 Chinese 对英文不好的程序员来说是个不错的选择,可以将英文状态下的pycharm变为中文版的 ChatGPT 可以跟ai聊天,ai可以解决你80%的问题 ,也可以帮…...
springboot 使用zookeeper实现分布式ID
添加ZooKeeper依赖:在pom.xml文件中添加ZooKeeper客户端的依赖项。例如,可以使用Apache Curator作为ZooKeeper客户端库: <dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</arti…...
git cherry-pick
cherry-pick命令的基本用法 对于多分支的代码库,将代码从一个分支转移到另一个分支是常见需求。这时分两种情况。一种情况是,你需要另一个分支的所有代码变动,那么就采用合并( git merge )。另一种情况是,…...

转行软件测试四个月学习,第一次面试经过分享
我是去年上半年从销售行业转行到测试的,从销售公司辞职之后选择去培训班培训软件测试,经历了四个月左右的培训,在培训班结课前两周就开始投简历了,在结课的时候顺利拿到了offer。在新的公司从事软件测试工作已经将近半年有余&…...

ECS服务器安装docker
为了安装并配置 Docker ,你的系统必须满足下列最低要求: 64 位 Linux 或 Windows 系统 如果使用 Linux ,内核版本必须不低于 3.10 能够使用 sudo 权限的用户 在你系统 BIOS 上启用了 VT(虚拟化技术)支持 on your s…...

高等数学教材啃书汇总重难点(三)微分中值定理与导数的应用
本章节包含多个知识点,一些列微分中值定理是考研证明题的重头戏,而洛必达和泰勒展开则是方法论的天花板难度,虽然对于小题的考察难度较低,整体上仍需重点复习 1.费马引理 2.罗尔定理 3.拉格朗日定理 4.柯西中值定理 5.洛必达法则 …...
域名列表是什么?
域名列表指的是一个网站上所使用的所有域名地址。在互联网发展的今天,拥有一个有效的域名列表对于一个企业或组织来说是非常重要的。本文将围绕着域名列表这一主题展开,并从以下几个方面进行分析。 一、为什么需要域名列表? 首先࿰…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...