常见的 API 及相关知识总结
常见的 API 及相关知识总结
一、Math 类
Math 类提供了许多用于数学计算的静态方法和常量。
常见方法总结
方法 | 描述 |
---|---|
Math.abs() | 返回一个数的绝对值 |
Math.ceil() | 返回大于或等于给定数字的最小整数 |
Math.floor() | 返回小于或等于给定数字的最大整数 |
Math.round() | 对一个数进行四舍五入 |
Math.max() | 返回两个数中的最大值 |
Math.min() | 返回两个数中的最小值 |
Math.random() | 返回一个介于 0(包括)和 1(不包括)之间的随机小数 |
示例代码
public class MathExample {public static void main(String[] args) {int num = -10;System.out.println("绝对值: " + Math.abs(num)); System.out.println("向上取整: " + Math.ceil(3.2)); System.out.println("向下取整: " + Math.floor(3.8)); System.out.println("四舍五入: " + Math.round(3.5)); System.out.println("最大值: " + Math.max(10, 20)); System.out.println("最小值: " + Math.min(10, 20)); System.out.println("随机数: " + Math.random()); }
}
二、算法水题
1. 减少循环次数提高效率
在编写循环代码时,通过合理的条件判断和算法优化,可以减少不必要的循环次数,从而提高程序的执行效率。例如,在查找某个元素时,可以提前终止循环。
2. 自幂数
自幂数是指一个 n 位数,它的每个位上的数字的 n 次幂之和等于它本身。例如,153 是一个自幂数,因为 (1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153)。
示例代码
public class NarcissisticNumber {public static void main(String[] args) {for (int i = 100; i < 1000; i++) {int num = i;int sum = 0;while (num > 0) {int digit = num % 10;sum += Math.pow(digit, 3);num /= 10;}if (sum == i) {System.out.println(i + " 是自幂数");}}}
}
三、System 类
1. 时间相关
System.currentTimeMillis()
方法可以返回当前时间与协调世界时 1970 年 1 月 1 日午夜之间的时间差(以毫秒为单位),常用于计算程序的执行时间。
2. 常见方法
退出程序
System.exit(int status)
方法用于终止当前正在运行的 Java 虚拟机。参数 status
为 0 表示正常退出,非 0 表示异常退出。
获取运行时间
通过记录程序开始和结束时的时间戳,然后计算差值,可以得到程序的运行时间。
拷贝数组
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
方法用于将一个数组的指定部分复制到另一个数组中。
示例代码
public class SystemExample {public static void main(String[] args) {// 获取当前时间戳long startTime = System.currentTimeMillis();// 数组拷贝示例int[] srcArray = {1, 2, 3, 4, 5};int[] destArray = new int[5];System.arraycopy(srcArray, 0, destArray, 0, 5);// 打印拷贝后的数组for (int num : destArray) {System.out.print(num + " ");}System.out.println();// 获取结束时间戳long endTime = System.currentTimeMillis();System.out.println("程序运行时间: " + (endTime - startTime) + " 毫秒");// 退出程序System.exit(0);}
}
四、Runtime 类
Runtime
类表示 Java 虚拟机的运行时环境,每个 Java 应用程序都有一个 Runtime
类实例,应用程序可以通过 Runtime.getRuntime()
方法获取该实例。常见的方法有 exec()
用于执行外部命令,freeMemory()
用于返回 Java 虚拟机中的空闲内存量等。
示例代码
import java.io.IOException;public class RuntimeExample {public static void main(String[] args) {Runtime runtime = Runtime.getRuntime();try {// 执行外部命令Process process = runtime.exec("notepad.exe");} catch (IOException e) {e.printStackTrace();}// 获取空闲内存量long freeMemory = runtime.freeMemory();System.out.println("空闲内存量: " + freeMemory + " 字节");}
}
五、Object 类
1. 构造方法
Object()
是 Object
类的默认构造方法,所有类都直接或间接继承自 Object
类,因此所有类都可以使用这个构造方法。
2. 常见成员方法
toString()
toString()
方法返回该对象的字符串表示形式,默认情况下返回的是对象的类名和哈希码的十六进制表示。通常建议重写该方法,以便返回更有意义的信息。
equals()
equals()
方法用于比较两个对象是否相等,默认情况下比较的是两个对象的引用是否相等。通常需要重写该方法,以便根据对象的属性进行比较。
clone()
clone()
方法用于创建并返回该对象的一个副本。要使用该方法,类必须实现 Cloneable
接口,否则会抛出 CloneNotSupportedException
异常。克隆分为浅克隆和深克隆:
- 浅克隆:只复制对象的基本数据类型和引用类型的引用,而不复制引用类型所指向的对象。
- 深克隆:不仅复制对象的基本数据类型,还复制引用类型所指向的对象。
示例代码
class Person implements Cloneable {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{name='" + name + "', age=" + age + "}";}@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;Person person = (Person) obj;return age == person.age && name.equals(person.name);}@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}public class ObjectExample {public static void main(String[] args) throws CloneNotSupportedException {Person person1 = new Person("Alice", 20);Person person2 = (Person) person1.clone();System.out.println(person1.toString());System.out.println(person1.equals(person2));}
}
六、Objects 类
Objects
类提供了一些静态实用方法,用于操作对象或在操作前检查某些条件。常见的方法有 isNull()
用于判断对象是否为 null
,nonNull()
用于判断对象是否不为 null
,equals()
用于比较两个对象是否相等(可以处理 null
情况)等。
示例代码
import java.util.Objects;public class ObjectsExample {public static void main(String[] args) {String str1 = "hello";String str2 = null;System.out.println(Objects.isNull(str1)); System.out.println(Objects.isNull(str2)); System.out.println(Objects.nonNull(str1)); System.out.println(Objects.nonNull(str2)); System.out.println(Objects.equals(str1, str2)); }
}
七、BigInteger 类
BigInteger
类用于处理任意大的整数,它可以表示的整数范围没有上限。
1. 构造方法
可以通过字符串、整数等方式创建 BigInteger
对象。
2. 常见方法
add()
用于加法运算,subtract()
用于减法运算,multiply()
用于乘法运算,divide()
用于除法运算等。
示例代码
import java.math.BigInteger;public class BigIntegerExample {public static void main(String[] args) {BigInteger num1 = new BigInteger("12345678901234567890");BigInteger num2 = new BigInteger("98765432109876543210");BigInteger sum = num1.add(num2);BigInteger difference = num1.subtract(num2);BigInteger product = num1.multiply(num2);BigInteger quotient = num1.divide(num2);System.out.println("和: " + sum);System.out.println("差: " + difference);System.out.println("积: " + product);System.out.println("商: " + quotient);}
}
八、BigDecimal 类
BigDecimal
类用于处理任意精度的十进制数,常用于金融计算等对精度要求较高的场景。
1. 常见成员方法
add()
用于加法运算,subtract()
用于减法运算,multiply()
用于乘法运算,divide()
用于除法运算(需要指定舍入模式)等。
示例代码
import java.math.BigDecimal;
import java.math.RoundingMode;public class BigDecimalExample {public static void main(String[] args) {BigDecimal num1 = new BigDecimal("10.25");BigDecimal num2 = new BigDecimal("3.75");BigDecimal sum = num1.add(num2);BigDecimal difference = num1.subtract(num2);BigDecimal product = num1.multiply(num2);BigDecimal quotient = num1.divide(num2, 2, RoundingMode.HALF_UP);System.out.println("和: " + sum);System.out.println("差: " + difference);System.out.println("积: " + product);System.out.println("商: " + quotient);}
}
九、正则表达式(regex)
1. 作用
正则表达式用于字符串的匹配、查找、替换和分割等操作。
2. 书写规则
- 字符类:
[abc]
表示匹配a
、b
或c
中的任意一个字符。 - 预定义字符类:
\d
表示匹配数字字符,\w
表示匹配单词字符(字母、数字、下划线)等。 - 数量词:
*
表示匹配前面的元素零次或多次,+
表示匹配前面的元素一次或多次,?
表示匹配前面的元素零次或一次等。
3. 忽略大小写
在正则表达式前面加上 (?i)
可以忽略大小写。
示例代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class RegexExample {public static void main(String[] args) {String input = "Hello, World!";String regex = "(?i)hello";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(input);if (matcher.find()) {System.out.println("匹配成功");} else {System.out.println("匹配失败");}}
}
十、爬虫
1. 本地爬虫
本地爬虫用于在本地文件中查找和提取所需的数据,通常使用正则表达式进行匹配。
2. 网络爬虫
网络爬虫用于从互联网上获取数据,需要使用网络编程相关的知识,如 URL
、HttpURLConnection
等。
3. 带条件的爬虫
使用正则表达式的占位符(如 (?=)
、(?:)
、(?!)
)可以实现带条件的匹配。
4. 贪婪爬取和非贪婪爬取
- 贪婪爬取:尽可能多地匹配字符。
- 非贪婪爬取:尽可能少地匹配字符,在数量词后面加上
?
可以实现非贪婪爬取。
示例代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class WebCrawlerExample {public static void main(String[] args) {try {URL url = new URL("https://www.example.com");BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream()));StringBuilder content = new StringBuilder();String line;while ((line = reader.readLine()) != null) {content.append(line);}reader.close();String regex = "<a href=\"(.*?)\">";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(content.toString());while (matcher.find()) {System.out.println(matcher.group(1));}} catch (IOException e) {e.printStackTrace();}}
}
十一、分组
1. 捕获分组
使用括号 ()
可以创建捕获分组,通过 \组号
可以引用前面的分组内容,通过 $组号
可以在替换操作中引用分组内容。
2. 非捕获分组
使用 (?:)
可以创建非捕获分组,非捕获分组不会被捕获,也不会分配组号。
示例代码
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class GroupExample {public static void main(String[] args) {String input = "abcabc";String regex = "(abc)\\1";Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(input);if (matcher.find()) {System.out.println("匹配成功");} else {System.out.println("匹配失败");}}
}
十二、JDK7 前时间相关类
1. Date 类
Date
类表示特定的瞬间,精确到毫秒。可以使用无参构造方法创建当前时间的 Date
对象,也可以使用带参构造方法指定时间。
2. SimpleDateFormat 类
SimpleDateFormat
类用于格式化和解析日期。可以通过指定日期格式字符串来创建 SimpleDateFormat
对象,然后使用 format()
方法将 Date
对象格式化为字符串,使用 parse()
方法将字符串解析为 Date
对象。
3. Calendar 类
Calendar
类是一个抽象类,用于表示日历信息。可以通过 Calendar.getInstance()
方法获取 Calendar
对象,然后使用 get()
方法获取日历字段的值,使用 set()
方法设置日历字段的值。
示例代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;public class OldTimeExample {public static void main(String[] args) throws ParseException {// Date类示例Date date = new Date();System.out.println("当前时间: " + date);// SimpleDateFormat类示例SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String formattedDate = sdf.format(date);System.out.println("格式化后的时间: " + formattedDate);String dateStr = "2024-12-01 12:00:00";Date parsedDate = sdf.parse(dateStr);System.out.println("解析后的时间: " + parsedDate);// Calendar类示例Calendar calendar = Calendar.getInstance();calendar.set(Calendar.YEAR, 2024);calendar.set(Calendar.MONTH, Calendar.DECEMBER);calendar.set(Calendar.DAY_OF_MONTH, 1);Date calendarDate = calendar.getTime();System.out.println("Calendar设置的时间: " + calendarDate);}
}
十三、JDK8 新增时间相关类
1. 优点
JDK8 新增的时间相关类更加简洁明了、安全,提供了更好的日期和时间处理功能。
2. 常用类
ZonedDateTime
:带时区的日期时间。Instant
:时间戳。DateTimeFormatter
:用于日期时间的格式化和解析。LocalDate
:表示日期。LocalTime
:表示时间。LocalDateTime
:表示日期和时间。Duration
:用于计算两个时间点之间的间隔。Period
:用于计算两个日期之间的间隔。ChronoUnit
:用于计算日期和时间之间的间隔。
示例代码
import java.time.*;
import java.time.format.DateTimeFormatter;public class NewTimeExample {public static void main(String[] args) {// ZonedDateTime示例ZonedDateTime zonedDateTime = ZonedDateTime.now();System.out.println("带时区的日期时间: " + zonedDateTime);// Instant示例Instant instant = Instant.now();System.out.println("时间戳: " + instant);// DateTimeFormatter示例DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime localDateTime = LocalDateTime.now();String formattedDateTime = localDateTime.format(formatter);System.out.println("格式化后的日期时间: " + formattedDateTime);// LocalDate示例LocalDate localDate = LocalDate.now();System.out.println("当前日期: " + localDate);// LocalTime示例LocalTime localTime = LocalTime.now();System.out.println("当前时间: " + localTime);// Duration示例LocalTime startTime = LocalTime.of(9, 0);LocalTime endTime = LocalTime.of(10, 30);Duration duration = Duration.between(startTime, endTime);System.out.println("时间间隔: " + duration.toMinutes() + " 分钟");// Period示例LocalDate startDate = LocalDate.of(2024, 1, 1);LocalDate endDate = LocalDate.of(2024, 12, 31);Period period = Period.between(startDate, endDate);System.out.println("日期间隔: " + period.getMonths() + " 个月 " + period.getDays() + " 天");// ChronoUnit示例long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);System.out.println("日期间隔(天): " + daysBetween);}
}
十四、包装类
1. 概念
包装类是将基本数据类型封装成对象的类,例如 Integer
对应 int
,Double
对应 double
等。
2. 自动拆箱和自动装箱机制
- 自动装箱:将基本数据类型自动转换为包装类对象。
- 自动拆箱:将包装类对象自动转换为基本数据类型。
3. 字符串转换为基本数据类型
可以使用包装类的静态方法(如 Integer.parseInt()
、Double.parseDouble()
等)将字符串转换为对应的基本数据类型。
示例代码
public class WrapperClassExample {public static void main(String[] args) {// 自动装箱Integer num1 = 10; // 自动拆箱int num2 = num1; // 字符串转换为基本数据类型String str = "20";int num3 = Integer.parseInt(str);System.out.println(num1);System.out.println(num2);System.out.println(num3);}
}
十五、综合练习
在实际开发中,经常需要综合运用上述知识来解决各种问题。例如,在处理数据时可能需要使用正则表达式进行数据验证,使用 BigDecimal
进行精确计算,使用时间相关类进行日期和时间的处理等。通过不断的练习和实践,可以更好地掌握这些知识。
以上就是常见的 API 及相关知识的总结,希望对大家有所帮助。在学习过程中,要不断实践,加深对这些知识的理解和掌握。同时,要注意代码的规范性和可读性,提高编程能力。