目录
Java的核心库提供了大量的现成的类供我们使用。本篇文章我们介绍几个常用的工具类。
1. Math类
Java提供用来处理和计算复杂数学运算的类,Math
Math类被final修饰,无法修改和继承。
查帮助文档:Overview (Java SE 17 & JDK 17)
扩展知识:Java如何定义常量
使用final关键字,被final修饰,无法修改和继承。
如果是常量定义,建议使用public static同时修饰。常量的命名规范是所有字母都大写,如果多个单词使用下划线_隔(例如:JAVA_HOME)
public class MathTest {
public static void main(String[] args) {
// 定义常量
final int A = 1;
// A = 20; // 错误: 无法为最终变量A分配值
}
}
Math类中常见属性和方法:
1. 两个属性:
Math.PI:圆周率,double
值比任何其他的更接近 pi ,圆周长与其直径的比率。
Math.E:自然对数的基数,double
值比其他任何一个都更接近 e
2. 常见方法:
Math类,它提供了大量的静态方法来便于我们实现数学计算
Math.abs(num):返回num(可以是double、float、int、long类型)值的绝对值
Math.cbrt(double a):对a开立方根,返回值是double类型的
Math.ceil(double a):对a向上取整,返回值是double类型的
Math.floor(double a):对a向下取整,返回值是double类型的
Math.round(float a):对a四舍五入,返回值是int类型的
Math.round(double a):对a四舍五入,返回值是long类型的
Math.pow(double a, double b):a的b次方,a^b,幂次方,返回值是double类型的
Math.sqrt(double a):对a开平方根,返回值是double类型的
Math.random():获取一个[0, 1)之间的随机数
Math.max(a, b):返回a, b中的较大值,a,b可以是double/float/int/long等类型的数据
Math.min(a, b):返回a, b中的较小值,a,b可以是double/float/int/long等类型的数据
Math.exp(double a):计算 次方,返回值是double类型的
Math.log(double a):计算以e为底的对数,返回值是double类型的
Math.log10(double a):计算以10为底的对数,返回值是double类型的
public class MathTest {
public static void main(String[] args) {
// 定义常量
final int A = 1;
System.out.println(A); // 1
// A = 20; // 错误: 无法为最终变量A分配值
// 两个常量
System.out.println(Math.E); // 2.718281828459045
System.out.println(Math.PI); // 3.141592653589793
// 求绝对值
System.out.println(Math.abs(-2)); // 2
// 开立方根
System.out.println(Math.cbrt(8)); // 2.0
// 向上取整
System.out.println(Math.ceil(12.3)); // 13.0
System.out.println(Math.ceil(-12.3)); // -12.0
// 向下取整
System.out.println(Math.floor(3.2)); // 3.0
// 四舍五入,float返回int,double返回long
System.out.println(Math.round(8.3F)); // 8
System.out.println(Math.round(8.3)); // 8
// a的b次方,a^b,幂次方,返回值是double类型的
System.out.println(Math.pow(2,3)); // 8.0
// 对a开平方根,返回值是double类型的
System.out.println(Math.sqrt(16)); // 4.0
// 获取一个[0, 1)之间的随机数
System.out.println(Math.random()); // 0.3711479414337572
// 获取一个[0, 10)之间的随机整数
System.out.println((int)(Math.random() * 10));
// 返回a, b中的较大值
System.out.println(Math.max(2, 5)); // 5
// 返回a, b中的较小值
System.out.println(Math.min(2.5, 5.2)); // 2.5
// 计算额e^x次方
System.out.println(Math.exp(10)); // 22026
// 计算以e为底的对数
System.out.println(Math.log(10)); // 2.3
// 计算以10为底的对数,返回的是double
System.out.println(Math.log10(100)); // 2.0
// 三角函数
System.out.println(Math.sin(3.14)); // 0.00159...
System.out.println(Math.cos(3.14)); // -0.9999...
System.out.println(Math.tan(3.14)); // -0.0015...
System.out.println(Math.asin(1.0)); // 1.57079...
System.out.println(Math.acos(1.0)); // 0.0
}
}
2. Random类
用来创建伪随机数。所谓伪随机数,是指只要给定一个初始的种子,产生的随机数序列是完全一样的。计算机中的随机数都是伪随机数
Random random = new Random([long 类型参数]);
2.1 常见方法
protected int next(int bits):生成下一个伪随机数。(注意protected,直接调用不了的
boolean nextBoolean():生成一个boolean随机数
void nextBytes(byte[] bytes):生成随机字节并将其放入用户提供的字节数组中
double nextDouble():生成一个double随机数,介于0.0和1.0之间的均匀分布的值。
float nextFloat():生成一个float随机数,介于0.0和1.0之间的均匀分布的值。
double nextGaussian():返回高斯(“正态”)分布双精度值,与该随机数生成器的序列的μ = 0.0, σ2=1.0的高斯(“正态”)分布双精度值。
int nextInt():生成一个int随机数
int nextInt(int bound):生成一个int随机数:[0,10)
long nextLong():生成一个long随机数
void setSeed(long seed):使用单个 long种子设置该随机数生成器的种子
import java.util.Arrays;
import java.util.Random;
public class RandomTest1 {
public static void main(String[] args) {
Random random = new Random(100);
// seed相同的对象生成的随机数相同
Random random1 = new Random();
// 生成一个int随机数
System.out.println(random1.nextInt()); // 1298071954
// 生成一个int随机数:[0,10)
System.out.println(random.nextInt(10)); // 3
// 生成一个boolean随机数
System.out.println(random.nextBoolean()); // false
// 产生随机字节,并将它们放置到提供的字节数组中。
byte[] arr = new byte[5];
random.nextBytes(arr);
System.out.println(Arrays.toString(arr)); // [69, -13, -23, 49, 105]
// 生成一个double随机数,介于0.0和1.0之间的均匀分布的值。
System.out.println(random.nextDouble()); // 0.6671595726539502
// 生成一个float随机数,介于0.0和1.0之间的均匀分布的值。
System.out.println(random.nextFloat()); // 0.77844083
// 返回高斯(“正态”)分布双精度值,与该随机数生成器的序列的μ = 0.0, σ2=1.0的高斯(“正态”)分布双精度值。
System.out.println(random.nextGaussian()); // -1.0560180403978943
// 生成一个long随机数
System.out.println(random.nextLong()); // -5496492430263629571
}
}
2.2 如何获取随机数
1. 使用Math.random()获取
获取到的是一个[0, 1)之间的随机数
获取一个随机数[a,b],公式:
[a,b] : (int)(Math.random() * (b - a +1) + a)
[a,b) : (int)(Math.random() * (b - a) + a)
2. 使用java.util.Random类获取
要生成一个随机数,可以使用nextInt()
、nextLong()
、nextFloat()
、nextDouble()
:
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
// 使用Math.random()获取
for (int i = 0; i < 5; i++) {
System.out.print(randomNum(20, 10) + "\t");
}
System.out.println();
// 使用java.util.Random类获取
Random random = new Random();
System.out.println(random.nextInt()); // 1298071954
System.out.println(random.nextInt(10)); // 3
System.out.println(random.nextBoolean()); // false
System.out.println(random.nextDouble()); // 0.6671595726539502
System.out.println(random.nextFloat()); // 0.77844083
}
public static int randomNum(int a, int b) {
if (a < b) {
return (int)(Math.random() * (a - b) + b);
}
return (int)(Math.random() * (b - a) + a);
}
}
3. Scanner类
Scanner是标准输入流,IO流
常用方法
close():关闭Scanner输入流
判断是否输入的是指定类型:hasNext()、hasNextBigDecimal()、hasNextBoolean()、hasNextInt() 等,如果是指定的类型,则返回true。
输入指定类型数据:nextInt() 、nextDouble() 、nextFloat() 、nextByte、nextBoolean() 、nextShort() 、nextLong() 等
next() 查找并返回此扫描仪的下一个完整令牌。(返回字符串)通过空格获取数据,本质即是单词
nextLine() 将此扫描仪推进到当前行并返回跳过的输入。
next() 与 nextLine() 区别
next():
- 1、一定要读取到有效字符后才可以结束输入。
- 2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 1、以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 2、可以获得空白。
// 导包
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
// 实例化Scanner类对象
Scanner scan = new Scanner(System.in);
// 返回Pattern这 Scanner目前使用匹配符
System.out.println(scan.delimiter()); // \p{javaWhitespace}+
// 调用Scanner类对象的对应的方法
System.out.println("请输入一个整数:");
int a = scan.nextInt();
System.out.println(a);
System.out.println("请输入一个小数:");
double b = scan.nextDouble();
System.out.println(b);
// hasNext()判断输入的是否是字符串
if(scan.hasNext()) {
String str1 = scan.next(); // "You are pig"
System.out.println("输入的数据为:" + str1); // "You"
}
String str2 = scan.nextLine(); // "You are pig"
System.out.println("输入的数据为:" + str2); // "You are pig"
// 关闭scan流
scan.close();
}
}
4. String类(字符串对象)
String字符串对象在java.lang.String中,所以不需要导入
字符串:字符连在一起,形成了字符串。人的肉眼可以识别分符号
在Java中,一般表现为"",引号的内部内容就是字符串
在Java中,字符串String是引用数据类型
字符串是一个常量,是一种不可变的数据类型
定义字符串:String str = "abc";
// 第一种方法
String s = "abc";
System.out.println(s);
// 第二种方法
String ss = new String(); // 相当于String ss = "";
System.out.println(ss);
// 第三种方法
String sss = new String("Hello"); // 相当于String ssa = "Hello";
// 这里可能创建了一个或者两个字符串对象,一定会创建一个sss,如果常量池中不存在"Hello",还会创建一个"Hello"对象
System.out.println(sss);
常见的字符串方法
char charAt(int index):获取下标对应的字符,返回指定索引处的 char 值。
int compareTo(Object o):把这个字符串和另一个对象比较。
int compareTo(String anotherString):按字典顺序比较两个字符串。
int compareToIgnoreCase(String str):按字典顺序比较两个字符串,不考虑大小写。
String concat(String str):将指定字符串连接到此字符串的结尾。
boolean contentEquals(StringBuffer sb):当且仅当字符串与指定的StringBuffer有相同顺序的字符时候返回真。
static String copyValueOf(char[] data):返回指定数组中表示该字符序列的 String。
static String copyValueOf(char[] data, int offset, int count):返回指定数组中表示该字符序列的 String。
boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束。
boolean equals(Object anObject):将此字符串与指定的对象比较。
boolean equalsIgnoreCase(String anotherString):将此 String 与另一个 String 比较,不考虑大小写。
byte[] getBytes():使用平台的默认字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
byte[] getBytes(String charsetName):使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):将字符从此字符串复制到目标字符数组
int hashCode():返回此字符串的哈希码。
int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
int indexOf(int ch, int fromIndex):返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。
int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。
String intern():返回字符串对象的规范化表示形式。
int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出现处的索引。
int lastIndexOf(int ch, int fromIndex):返回指定字符在此字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索。
int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。
int length():返回此字符串的长度。
boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。
boolean regionMatches(boolean ignoreCase, int toffset, String other, int ooffset, int len):测试两个字符串区域是否相等。
boolean regionMatches(int toffset, String other, int ooffset, int len):测试两个字符串区域是否相等。
String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。
String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串。
boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始。
boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始。
CharSequence subSequence(int beginIndex, int endIndex):返回一个新的字符序列,它是此序列的一个子序列。
String substring(int beginIndex):返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串的一个子字符串。
char[] toCharArray():将此字符串转换为一个新的字符数组。
String toLowerCase():使用默认语言环境的规则将此 String 中的所有字符都转换为小写。
String toLowerCase(Locale locale):使用给定 Locale 的规则将此 String 中的所有字符都转换为小写。
String toString():返回此对象本身(它已经是一个字符串!)。
String toUpperCase():使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
String toUpperCase(Locale locale):使用给定 Locale 的规则将此 String 中的所有字符都转换为大写。
String trim():返回字符串的副本,忽略前导空白和尾部空白。
static String valueOf(primitive data type x):返回给定data type类型x参数的字符串表示形式。
contains(CharSequence chars):判断是否包含指定的字符系列。
isEmpty():判断字符串是否为空。
static String join(标识符, 字符串数组):返回一个由字符串数组连接在一起的一份指定的delimiter
import java.util.Arrays;
public class StringTest {
public static void main(String[] args) {
// 第一种方法
String s = "abc";
System.out.println(s);
// 第二种方法
String ss = new String(); // 相当于String ss = "";
System.out.println(ss);
// 第三种方法
String sss = new String("Hello"); // 相当于String ssa = "Hello";
System.out.println(sss);
for (int i = 0; i < sss.length(); i++) {
System.out.println(sss.charAt(i));
}
System.out.println(s.codePointAt(0)); // 97
// System.out.println(s.codePointBefore(0)); //java.lang.StringIndexOutOfBoundsException
System.out.println(s.codePointBefore(1)); // 97
System.out.println(s.codePointCount(0, 1)); // 1
// 比较两个字符串是否相等
System.out.println(s.compareTo("cde")); // 1
System.out.println(s.compareTo("abc")); // 0
System.out.println(s.compareTo("abcd")); //-1
// 忽略大小写
System.out.println(s.compareToIgnoreCase("ABC")); // 0
System.out.println(s.concat("abc")); // abcabc
System.out.println(s.contains(s)); // true
String str = "www.baidu.com";
String[] sub = str.split("\\.");
System.out.println(Arrays.toString(sub));
}
}
注意:字符串不要使用等于符号判断是否相等
在java中 == 判断的是值是否相等,不能用来判断字符串
因为字符串的创建方式有多种,不同的创建方式,地址(指针) 可能不一致
基本数据类型都是可以使用 == 判断是否相等;字符串不能还是用 == 判断是否相等
字符串中 == 判断的字符串的地址,equals判断是字符串的值;