热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python如何设计工具类_常用工具类

Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。Math顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态

Java的核心库提供了大量的现成的类供我们使用。本节我们介绍几个常用的工具类。

Math

顾名思义,Math类就是用来进行数学计算的,它提供了大量的静态方法来便于我们实现数学计算:

求绝对值:

Math.abs(-100); // 100

Math.abs(-7.8); // 7.8

取最大或最小值:

Math.max(100, 99); // 100

Math.min(1.2, 2.3); // 1.2

计算xy次方:

Math.pow(2, 10); // 2的10次方=1024

计算√x:

Math.sqrt(2); // 1.414...

计算ex次方:

Math.exp(2); // 7.389...

计算以e为底的对数:

Math.log(4); // 1.386...

计算以10为底的对数:

Math.log10(100); // 2

三角函数:

Math.sin(3.14); // 0.00159...

Math.cos(3.14); // -0.9999...

Math.tan(3.14); // -0.0015...

Math.asin(1.0); // 1.57079...

Math.acos(1.0); // 0.0

Math还提供了几个数学常量:

double pi = Math.PI; // 3.14159...

double e = Math.E; // 2.7182818...

Math.sin(Math.PI / 6); // sin(π/6) = 0.5

生成一个随机数x&#xff0c;x的范围是0 <&#61; x <1&#xff1a;

Math.random(); // 0.53907... 每次都不一样

如果我们要生成一个区间在[MIN, MAX)的随机数&#xff0c;可以借助Math.random()实现&#xff0c;计算如下&#xff1a;

// 区间在[MIN, MAX)的随机数

public class Main {

public static void main(String[] args) {

double x &#61; Math.random(); // x的范围是[0,1)

double min &#61; 10;

double max &#61; 50;

double y &#61; x * (max - min) &#43; min; // y的范围是[10,50)

long n &#61; (long) y; // n的范围是[10,50)的整数

System.out.println(y);

System.out.println(n);

}

}

有些童鞋可能注意到Java标准库还提供了一个StrictMath&#xff0c;它提供了和Math几乎一模一样的方法。这两个类的区别在于&#xff0c;由于浮点数计算存在误差&#xff0c;不同的平台&#xff08;例如x86和ARM&#xff09;计算的结果可能不一致&#xff08;指误差不同&#xff09;&#xff0c;因此&#xff0c;StrictMath保证所有平台计算结果都是完全相同的&#xff0c;而Math会尽量针对平台优化计算速度&#xff0c;所以&#xff0c;绝大多数情况下&#xff0c;使用Math就足够了。

Random

Random用来创建伪随机数。所谓伪随机数&#xff0c;是指只要给定一个初始的种子&#xff0c;产生的随机数序列是完全一样的。

要生成一个随机数&#xff0c;可以使用nextInt()、nextLong()、nextFloat()、nextDouble()&#xff1a;

Random r &#61; new Random();

r.nextInt(); // 2071575453,每次都不一样

r.nextInt(10); // 5,生成一个[0,10)之间的int

r.nextLong(); // 8811649292570369305,每次都不一样

r.nextFloat(); // 0.54335...生成一个[0,1)之间的float

r.nextDouble(); // 0.3716...生成一个[0,1)之间的double

有童鞋问&#xff0c;每次运行程序&#xff0c;生成的随机数都是不同的&#xff0c;没看出伪随机数的特性来。

这是因为我们创建Random实例时&#xff0c;如果不给定种子&#xff0c;就使用系统当前时间戳作为种子&#xff0c;因此每次运行时&#xff0c;种子不同&#xff0c;得到的伪随机数序列就不同。

如果我们在创建Random实例时指定一个种子&#xff0c;就会得到完全确定的随机数序列&#xff1a;

import java.util.Random;

----

public class Main {

public static void main(String[] args) {

Random r &#61; new Random(12345);

for (int i &#61; 0; i <10; i&#43;&#43;) {

System.out.println(r.nextInt(100));

}

// 51, 80, 41, 28, 55...

}

}

前面我们使用的Math.random()实际上内部调用了Random类&#xff0c;所以它也是伪随机数&#xff0c;只是我们无法指定种子。

SecureRandom

有伪随机数&#xff0c;就有真随机数。实际上真正的真随机数只能通过量子力学原理来获取&#xff0c;而我们想要的是一个不可预测的安全的随机数&#xff0c;SecureRandom就是用来创建安全的随机数的&#xff1a;

SecureRandom sr &#61; new SecureRandom();

System.out.println(sr.nextInt(100));

SecureRandom无法指定种子&#xff0c;它使用RNG&#xff08;random number generator&#xff09;算法。JDK的SecureRandom实际上有多种不同的底层实现&#xff0c;有的使用安全随机种子加上伪随机数算法来产生安全的随机数&#xff0c;有的使用真正的随机数生成器。实际使用的时候&#xff0c;可以优先获取高强度的安全随机数生成器&#xff0c;如果没有提供&#xff0c;再使用普通等级的安全随机数生成器&#xff1a;

import java.util.Arrays;

import java.security.SecureRandom;

import java.security.NoSuchAlgorithmException;

----

public class Main {

public static void main(String[] args) {

SecureRandom sr &#61; null;

try {

sr &#61; SecureRandom.getInstanceStrong(); // 获取高强度安全随机数生成器

} catch (NoSuchAlgorithmException e) {

sr &#61; new SecureRandom(); // 获取普通的安全随机数生成器

}

byte[] buffer &#61; new byte[16];

sr.nextBytes(buffer); // 用安全随机数填充buffer

System.out.println(Arrays.toString(buffer));

}

}

SecureRandom的安全性是通过操作系统提供的安全的随机种子来生成随机数。这个种子是通过CPU的热噪声、读写磁盘的字节、网络流量等各种随机事件产生的“熵”。

在密码学中&#xff0c;安全的随机数非常重要。如果使用不安全的伪随机数&#xff0c;所有加密体系都将被攻破。因此&#xff0c;时刻牢记必须使用SecureRandom来产生安全的随机数。

需要使用安全随机数的时候&#xff0c;必须使用SecureRandom&#xff0c;绝不能使用Random&#xff01;

小结

Java提供的常用工具类有&#xff1a;

Math&#xff1a;数学计算

Random&#xff1a;生成伪随机数

SecureRandom&#xff1a;生成安全的随机数



推荐阅读
  • 1.背景java.util.concurrent.atomic这个包是非常实用,解决了我们以前自己写一个同步方法来实现类似于自增长字段的问题。在Java语言中,增量操作符(++)不是原子的, ... [详细]
  • importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.io. ... [详细]
  • Java中的FileStoregetUsableSpace()方法,带示例 ... [详细]
  • 找出字符串中重复字符
    2019独角兽企业重金招聘Python工程师标准packagejavaBasic;importjava.util.HashMap;importjava.util.Map; ... [详细]
  • 我正在使用数组列表通过构建一个交互式菜单供用户选择来存储来自用户输入的值。到目前为止,我的两个选择是为用户提供向列表输入数据和读取列表的全部内容。到目前为止,我创建的代码由两个类组成。 ... [详细]
  • IDEA实用插件Lombok
    LombokLombok是一个可以通过简单的注解形式来帮助我们简化消除一些必须有但显得很臃肿的Java代码的工具,通过使用对应的注解,可以在编译源码的时候生成对应的方法。通常,我们所定义的对象和b ... [详细]
  • Java发布webservice应用并发送SOAP请求调用
    webservice框架有很多,比如axis、axis2、cxf、xFire等等,做服务端和做客户端都可行,个人感觉使用这些框架的好处是减少了对于接口信息的解析,最主要的是减少了对于传递于网络中XML ... [详细]
  • 1.什么是hashcode方法?hashcode方法返回对象的哈希码值在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有改变& ... [详细]
  • 接口自动化相关面试题
    你好,我是懂Java的测试最近辅导简历,有同学向我反馈,自学过接口自动化、没有落地接口自动化项目办?还有很多同学落地实践过自 ... [详细]
  • JNI技术实践小结转自http:sett ... [详细]
  • C#的Type对象的简单应用
    通过Type对象可以获取类中所有的公有成员直接贴代码:classMyClass{privatestringname;privateintid;publicstringcity;pu ... [详细]
  • java接口中静态方法的继承
    java接口中静态方法的继承:1、由于类可以实现多个接口,如果接口中静态方法的方法在前面相同,就会发生继承冲突。2、从继承层面上干扰冲突的发生。另一方面,由于接口中的字段可以继承, ... [详细]
  • 字符串匹配: BF与KMP算法
    文章目录一.BF算法1.算法思想2.代码实现二.KMP算法1.算法思想概述2.理解基于最长相等前后缀进行匹配3.代码中如何实现next数组5.代码实现6.next数组的优化一.BF ... [详细]
  • Shiro 简单了解
    Shiro简单了解简单用过SpringSecurity安全框架后,再试试另一个安全框架——Shiro。1.Shiro简介ApacheShiro是一个强大且易用的Java安全框架:S ... [详细]
  • 技术点:1、通过已知的网页路径获得流2、把流转换成字节数组3、把字节数组转换成String字符串显示在TextView控件中一、获得流publicstaticSt ... [详细]
author-avatar
叶韵
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有