java.lang包的主要类详解
前言
在Java中,只有java.lang包是自动导入的。java.lang包包含了Java的基本类和接口,如Object、String、System、Math等,不需要显式导入。(另外,即如果多个类定义在同一个包中,它们可以直接引用而无需使用import语句。例如,在一个类文件中定义多个类,并且它们在同一包内,那么它们可以直接使用彼此的类而无需导入)
java.lang.String 类详解
java.lang.String 是 Java 中最基础、最常用的类之一,用于表示和操作字符串(字符序列)。
一、基本概述
包:java.lang(无需显式导入)修饰符:public final(不可继承)实现接口:Serializable, Comparable
不可变性(Immutable) - 创建后内容不可更改字符串常量池优化支持Unicode字符集
二、字符串创建方式
1. 直接量方式(推荐)
String str1 = "Hello"; // 使用字符串常量池
2. 构造方法方式
String str2 = new String("Hello"); // 新建对象
char[] chars = {'H','e','l','l','o'};
String str3 = new String(chars); // 通过字符数组
byte[] bytes = {72, 101, 108, 108, 111};
String str4 = new String(bytes); // 通过字节数组
三、核心方法分类
1. 字符串基本信息
length():返回字符串长度
"Hello".length(); // 5
isEmpty():判断是否为空字符串
"".isEmpty(); // true
isBlank()(Java 11+):判断是否为空白字符串(空格、制表符等)
" ".isBlank(); // true
2. 字符串比较
equals(Object anObject):内容比较
"hello".equals("hello"); // true
equalsIgnoreCase(String str):忽略大小写比较
"Hello".equalsIgnoreCase("hello"); // true
compareTo(String str):字典序比较
"apple".compareTo("banana"); // 负值
contentEquals(CharSequence cs):与任意字符序列比较
3. 字符串查找
charAt(int index):获取指定位置字符
"Hello".charAt(1); // 'e'
indexOf(String str):查找子串首次出现位置
"Hello".indexOf("l"); // 2
lastIndexOf(String str):查找子串最后出现位置
"Hello".lastIndexOf("l"); // 3
contains(CharSequence s):是否包含子串
"Hello".contains("ell"); // true
startsWith(String prefix):是否以指定前缀开头
endsWith(String suffix):是否以指定后缀结尾
4. 字符串操作
substring(int beginIndex):截取子串
"Hello".substring(1); // "ello"
substring(int begin, int end):截取指定范围子串
"Hello".substring(1, 4); // "ell"
concat(String str):字符串连接
"Hello".concat(" World"); // "Hello World"
replace(char old, char new):字符替换
"Hello".replace('l', 'L'); // "HeLLo"
replace(CharSequence target, CharSequence replacement):子串替换
"Hello".replace("ell", "ipp"); // "Hippo"
toLowerCase():转为小写
toUpperCase():转为大写
trim():去除首尾空白(Java 11+推荐使用strip())
strip()(Java 11+):去除Unicode空白字符
5. 字符串转换
toCharArray():转为字符数组
char[] arr = "Hello".toCharArray();
getBytes():转为字节数组(使用平台默认编码)
getBytes(String charsetName):按指定编码转为字节数组
valueOf()系列:将各种类型转为字符串
String.valueOf(123); // "123"
String.valueOf(3.14); // "3.14"
String.valueOf(true); // "true"
6. 字符串格式化
format(String format, Object... args):格式化字符串String.format("姓名:%s,年龄:%d", "张三", 25);
7. 正则表达式相关
matches(String regex):是否匹配正则表达式
"123".matches("\\d+"); // true
split(String regex):按正则表达式分割字符串
"a,b,c".split(","); // ["a", "b", "c"]
replaceAll(String regex, String replacement):正则替换
replaceFirst(String regex, String replacement):正则首次匹配替换
8. Java 11+新增方法
repeat(int count):重复字符串
"ab".repeat(3); // "ababab"
lines():返回行流
"line1\nline2".lines().count(); // 2
四、字符串常量池
Java使用字符串常量池优化字符串存储:
String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1 == s2); // true(引用相同)
System.out.println(s1 == s3); // false(引用不同)
System.out.println(s1.equals(s3)); // true(内容相同)
五、字符串不可变性
String对象一旦创建就不可改变,所有看似修改的操作都返回新对象:
String str = "Hello";
str.toUpperCase(); // 返回新对象"HELLO",原str仍为"Hello"
str = str.toUpperCase(); // 需要重新赋值
六、性能考虑
字符串拼接:
少量拼接:使用+运算符大量拼接:使用StringBuilder或StringBuffer
字符串比较:
总是使用equals()而非==比较内容常量字符串放前面避免NPE:"constant".equals(variable)
七、使用示例
1. 字符串处理示例
String text = " Java Programming ";
System.out.println(text.trim().toUpperCase().substring(5)); // "PROGRAMMING"
2. 字符串分割与连接
String csv = "apple,orange,banana";
String[] fruits = csv.split(",");
String joined = String.join("; ", fruits); // "apple; orange; banana"
3. 字符串格式化
String userInfo = String.format("用户名: %s, 登录次数: %d, 最后登录: %tF",
"admin", 42, new Date());
八、最佳实践
优先使用字符串直接量而非new String()敏感信息(如密码)使用char[]而非String大量字符串操作使用StringBuilder注意字符串编码问题(特别是IO操作时)使用switch语句支持字符串(Java 7+)
java.lang.System 类
java.lang.System 是 Java 提供的一个非常重要的工具类,包含与系统相关的实用方法和字段。它提供了标准输入、标准输出、错误输出流、访问系统属性、环境变量以及加载文件和库等功能。
一、基本概述
包:java.lang(无需显式导入)修饰符:public final(不可继承)构造方法:私有化(无法实例化)方法特性:所有方法都是静态方法
二、标准 I/O 流
1. 标准输入输出流
in:标准输入流(InputStream类型)
Scanner scanner = new Scanner(System.in);
out:标准输出流(PrintStream类型)
System.out.println("Hello World");
err:标准错误输出流(PrintStream类型)
System.err.println("Error message");
2. 重定向标准流
setIn(InputStream in):重定向标准输入流setOut(PrintStream out):重定向标准输出流setErr(PrintStream err):重定向标准错误流
示例:
// 将输出重定向到文件
PrintStream fileOut = new PrintStream(new File("output.txt"));
System.setOut(fileOut);
System.out.println("This will go to the file");
三、系统属性和环境变量
1. 系统属性操作
getProperties():获取所有系统属性(Properties对象)getProperty(String key):获取指定系统属性getProperty(String key, String def):获取指定系统属性,若无则返回默认值setProperty(String key, String value):设置系统属性
示例:
// 获取系统属性
String osName = System.getProperty("os.name");
String javaVersion = System.getProperty("java.version");
// 设置自定义属性
System.setProperty("my.app.name", "MyApplication");
2. 常用系统属性
属性名描述java.versionJava 运行时环境版本java.homeJava 安装目录os.name操作系统名称os.version操作系统版本user.name用户账户名称user.home用户主目录user.dir用户当前工作目录3. 环境变量访问
getenv():获取所有环境变量(Map
示例:
// 获取PATH环境变量
String path = System.getenv("PATH");
// 获取所有环境变量
Map
四、系统时间和计时
1. 时间相关方法
currentTimeMillis():返回当前时间(毫秒,自1970年1月1日UTC)
long start = System.currentTimeMillis();
// 执行一些操作
long end = System.currentTimeMillis();
System.out.println("耗时:" + (end - start) + "ms");
nanoTime():返回当前时间(纳秒,高精度计时)
long start = System.nanoTime();
// 执行需要精确计时的操作
long end = System.nanoTime();
System.out.println("耗时:" + (end - start) + "ns");
五、系统操作
1. 程序终止
exit(int status):终止当前运行的Java虚拟机
status为0表示正常终止,非0表示异常终止
if (errorCondition) {
System.err.println("发生严重错误");
System.exit(1);
}
2. 垃圾回收
gc():建议JVM运行垃圾回收器(不保证立即执行)
System.gc(); // 只是建议,不保证立即执行
runFinalization():建议JVM运行待终结对象的finalize方法
六、数组操作
arraycopy(Object src, int srcPos, Object dest, int destPos, int length):数组复制int[] src = {1, 2, 3, 4, 5};
int[] dest = new int[5];
System.arraycopy(src, 0, dest, 0, src.length);
七、安全和身份
getSecurityManager():获取系统安全管理器setSecurityManager(SecurityManager sm):设置系统安全管理器
八、使用示例
1. 性能测试示例
long startTime = System.nanoTime();
// 测试的代码块
for (int i = 0; i < 100000; i++) {
Math.sqrt(i);
}
long endTime = System.nanoTime();
System.out.println("耗时: " + (endTime - startTime) + "纳秒");
2. 系统信息展示
System.out.println("===== 系统信息 =====");
System.out.println("操作系统: " + System.getProperty("os.name"));
System.out.println("Java版本: " + System.getProperty("java.version"));
System.out.println("用户目录: " + System.getProperty("user.home"));
System.out.println("当前工作目录: " + System.getProperty("user.dir"));
3. 环境变量检查
System.out.println("===== 环境变量 =====");
System.out.println("PATH: " + System.getenv("PATH"));
System.out.println("JAVA_HOME: " + System.getenv("JAVA_HOME"));
九、注意事项
System.arraycopy() 是本地方法,执行效率很高,适合大规模数组复制nanoTime() 更适合测量时间间隔而非绝对时间currentTimeMillis() 可能会受到系统时间调整的影响修改系统属性可能会影响其他部分的程序行为System.exit() 会立即终止JVM,后续代码不会执行
System 类是Java与操作系统交互的重要桥梁,提供了许多底层操作的功能,是Java编程中常用的工具类之一。
java.lang.Math 类
java.lang.Math 类是 Java 提供的一个包含基本数学运算方法的工具类,所有方法都是静态的,可以直接通过类名调用。
一、基本概述
包:java.lang(无需显式导入)修饰符:public final(不可继承)构造方法:私有化(无法实例化)方法特性:所有方法都是静态方法
二、常用数学运算方法
1. 基本运算
abs(x):返回绝对值
Math.abs(-5); // 5
Math.abs(3.14); // 3.14
max(a, b):返回较大值
Math.max(10, 20); // 20
min(a, b):返回较小值
Math.min(10, 20); // 10
2. 指数与对数
pow(a, b):a的b次方
Math.pow(2, 3); // 8.0
sqrt(x):平方根
Math.sqrt(16); // 4.0
exp(x):e的x次方
Math.exp(1); // 约2.718
log(x):自然对数(以e为底)
Math.log(Math.E); // 1.0
log10(x):以10为底的对数
Math.log10(100); // 2.0
3. 三角函数
sin(x):正弦函数(参数为弧度)cos(x):余弦函数tan(x):正切函数asin(x):反正弦acos(x):反余弦atan(x):反正切atan2(y, x):从直角坐标 (x, y) 转换到极坐标 (r, theta)
4. 舍入运算
ceil(x):向上取整
Math.ceil(3.2); // 4.0
floor(x):向下取整
Math.floor(3.8); // 3.0
rint(x):返回最接近的整数(double类型)
Math.rint(3.5); // 4.0
round(x):四舍五入
Math.round(3.4f); // 3 (int)
Math.round(3.5); // 4 (long)
5. 随机数
random():返回 [0.0, 1.0) 之间的随机数double rand = Math.random();
6. 其他运算
hypot(x, y):返回 sqrt(x² + y²)
Math.hypot(3, 4); // 5.0
signum(x):符号函数(返回1.0, 0.0或-1.0)
Math.signum(-5); // -1.0
toDegrees(rad):弧度转角度
Math.toDegrees(Math.PI); // 180.0
toRadians(deg):角度转弧度
Math.toRadians(180); // Math.PI
三、常量字段
Math.PI:圆周率π(约3.141592653589793)Math.E:自然对数的底数e(约2.718281828459045)
四、使用示例
// 计算圆的面积
double radius = 5.0;
double area = Math.PI * Math.pow(radius, 2);
// 生成1-100的随机整数
int randomNum = (int)(Math.random() * 100) + 1;
// 解二次方程 ax² + bx + c = 0
double a = 1.0, b = -5.0, c = 6.0;
double discriminant = Math.pow(b, 2) - 4 * a * c;
double root1 = (-b + Math.sqrt(discriminant)) / (2 * a);
double root2 = (-b - Math.sqrt(discriminant)) / (2 * a);
五、注意事项
所有三角函数参数使用弧度而非角度大多数方法有对float/double/int/long的重载版本对于大数运算,考虑使用BigDecimal类以获得更高精度随机数生成更推荐使用java.util.Random类