equals(str): 比较字符串是否相等(内容相同)。
substring(beginIndex, endIndex): 返回从指定开始索引到结束索引之间的子字符串。
charAt(index): 返回指定索引处的字符。
split(String regex): 根据正则表达式来分割字符串,并返回分割后的字符串数组。
如果你只需要将字符串拆分为单个字符,可以使用String类的toCharArray()方法:
String str = "Hello";
char[] chars = str.toCharArray(); // 返回['H', 'e', 'l', 'l', 'o']
replace(char oldChar, char newChar): 将字符串中所有的指定字符 oldChar 替换为新的字符 newChar。
String str = "Hello World";
String newStr = str.replace('o', 'a'); // 返回 "Hella Warld"
replace(CharSequence target, CharSequence replacement): 将字符串中所有的指定字符序列 target 替换为新的字符序列replacement。
String str = "Hello World";
String newStr = str.replace("World", "Universe"); // 返回 "Hello Universe"
toLowerCase(): 将字符串转换为小写形式。
toUpperCase(): 将字符串转换为大写形式。
trim()方法来去除字符串首尾的空格。
如果你想去除字符串内部的所有空格,可以使用replaceAll()方法配合正则表达式来实现,在正则表达式中,“\s” 是用来匹配空白字符的特殊字符组合,包括空格、制表符、换行符等。
String str = " Hello World ";
String trimmedStr = str.replaceAll("\\s", ""); // 返回 "HelloWorld"
BigDecimal 类型在处理精确的十进制数值计算时非常有用。它提供了高精度的数值运算和控制,适用于需要精确计算的场景,如金融、货币计算、税务计算等。
加法(add):
BigDecimal num1 = new BigDecimal("10.25");
BigDecimal num2 = new BigDecimal("5.75");
BigDecimal sum = num1.add(num2); // 返回 16.00
减法(subtract)
乘法(multiply)
除法(divide)
比较(compareTo):
BigDecimal num1 = new BigDecimal("10.25");
BigDecimal num2 = new BigDecimal("5.75");
int comparison = num1.compareTo(num2); // 返回 1(num1 > num2)
浮点数的舍入误差是由于二进制和十进制之间的转换以及浮点数的内部表示方式引起的。浮点数在计算机中以二进制形式表示,而十进制数无法精确地转换为二进制表示,因此在进行浮点数运算时可能会引起舍入误差。
例如:0.1 + 0.2 不等于 0.3
double result = 0.1 + 0.2;
System.out.println(result); // 输出 0.30000000000000004
“==” 运算符用于比较两个对象的引用是否相等。它比较的是对象在内存中的地址,即对象是否指向同一个内存位置。例如:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // 输出 true
System.out.println(str1 == str3); // 输出 false
//在上述示例中,str1 和 str2 引用的是同一个字符串常量,所以它们的地址相同,而 str3 引用的是通过 new 创建的新对象,所以其地址与 str1 不同。
“equals()” 方法用于比较两个对象的内容是否相等。它比较的是对象的内容,即根据对象的具体实现来判断是否相等。通常情况下,equals() 方法被子类重写以提供自定义的相等比较逻辑。例如:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1.equals(str2)); // 输出 true
System.out.println(str1.equals(str3)); // 输出 true
//在上述示例中,虽然 str1 和 str2 引用的是不同的对象,但它们的内容是相同的,所以通过 equals() 方法比较返回 true。同样,str1 和 str3 的内容也相同,所以 equals() 方法比较同样返回 true。
注意事项:
重写 equals() 方法时通常需要同时重写 hashCode() 方法,以保持 hashCode() 和 equals() 之间的一致性。如果两个对象根据 equals() 方法比较相等,则它们的 hashCode() 方法应返回相同的哈希码。
对象的哈希码是一个整数值,用于标识对象的散列值。它是根据对象的内部状态计算而来的,用于快速定位对象在哈希表等数据结构中的位置。对象的哈希码在创建对象时计算,并在对象的生命周期中保持不变(前提是对象的内部状态不发生变化)。
哈希表是一种常见的数据结构,用于实现快速查找和存储。它基于哈希函数(hash function)将键(key)映射到特定的存储位置,称为哈希桶(hash bucket)或槽(slot)。哈希表使用哈希码来确定对象在哈希桶中的位置,从而实现高效的数据访问。
例:考虑一个存储学生信息的系统,每个学生对象包含姓名和学号两个属性。为了快速查找学生信息,可以使用哈希表来存储学生对象。
throw:
“throw” 关键字用于在程序中手动抛出一个异常对象。
当使用 throw 关键字时,需要提供一个异常对象作为参数,该异常对象可以是 Java 内置的异常类(如 IllegalArgumentException、NullPointerException 等),也可以是自定义的异常类。
throw 关键字通常用于在方法内部检测到错误或异常情况,并主动抛出异常,使得程序的执行流程中断,并将控制权交给异常处理机制。
public void divide(int dividend, int divisor) {
if (divisor == 0) {
throw new ArithmeticException("Divisor cannot be zero");
}
int result = dividend / divisor;
System.out.println("Result: " + result);
}
throws:
“throws” 关键字用于在方法声明中指定该方法可能抛出的异常类型。
当一个方法可能抛出异常时,可以使用 throws 关键字在方法声明中列出可能的异常类型,以通知调用者需要处理这些异常。
throws 关键字后面跟着一个异常类或多个异常类,用逗号分隔。
如果一个方法声明使用了 throws 关键字,那么在方法的实现中,必须要处理或进一步传递这些异常。
public void readFile() throws FileNotFoundException, IOException {
// 读取文件的代码逻辑
// 可能抛出 FileNotFoundException 或 IOException 异常
}
总结:
在 try-catch-finally 块中,当 catch 块中执行了 return 语句时,finally 块仍然会执行。不论是否发生异常,finally 块中的代码都会执行,除非在执行 finally 块之前发生了 System.exit() 方法调用或虚拟机崩溃。
注意事项:
将 JSON 数据转换为对象使用 Fastjson 库,使用 Fastjson 的静态方法 parseObject将 JSON 字符串转换为 Java 对象。Fastjson 还支持将对象转换为 JSON 字符串的功能,你可以使用 toJSONString`方法实现。
使用 JAXB 将 XML 转换为对象的示例:
JAXBContext jaxbContext = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
String xmlString = "John 30 ";
StringReader reader = new StringReader(xmlString);
try {
Person person = (Person) unmarshaller.unmarshal(reader);
System.out.println(person.getName()); // 输出: John
System.out.println(person.getAge()); // 输出: 30
} catch (JAXBException e) {
e.printStackTrace();
}
总的来说,接口用于定义类的行为规范,强调类与类之间的协作关系;而抽象类用于创建类的模板,强调类的继承关系和共享的属性和行为。在设计类和接口时,需要根据具体的需求和设计目标来选择使用接口还是抽象类。
final 关键字:
final 可以用来修饰类、方法和变量。
当用于修饰类时,表示该类是最终的,不可被继承。
当用于修饰方法时,表示该方法是最终的,不可被子类重写。
当用于修饰变量时,表示该变量是一个常量,只能被赋值一次,无法修改其值。
finally 关键字:
finally 是一个关键字,用于定义一个代码块,在异常处理时提供一种确保某些代码总是执行的机制。
finally 块中的代码无论是否发生异常,都会被执行。
finally 常用于资源释放,例如关闭打开的文件、释放数据库连接等。无论是否发生异常,finally 块中的代码都能保证执行,以确保资源的正确释放。
以下是示例代码,演示了 final 和 finally 的用法:
// final 关键字示例
public final class MyClass { // final 修饰类,表示该类不可被继承
public final int myMethod() { // final 修饰方法,表示该方法不可被重写
final int x = 10; // final 修饰变量,表示该变量是一个常量
// x = 20; // 编译错误,无法修改常量的值
return x;
}
}
// finally 关键字示例
public class Main {
public static void main(String[] args) {
try {
int result = divide(10, 0); // 调用一个除法方法,可能发生除以零的异常
System.out.println(result);
} catch (ArithmeticException e) {
System.out.println("除法运算异常");
} finally {
System.out.println("finally 块中的代码");
}
}
public static int divide(int dividend, int divisor) {
try {
return dividend / divisor;
} finally {
System.out.println("finally 块中的代码,无论是否发生异常都会执行");
}
}
}
//在上述代码中,MyClass 类被声明为 final,表示不可被继承。myMethod 方法被声明为 final,表示不可被重写。在 Main 类中,divide 方法中的 finally 块中的代码无论是否发生异常都会执行。
//总结:final 关键字用于修饰类、方法和变量,提供了不可修改的特性;finally 关键字用于定义一个代码块,在异常处理时提供确保执行的机制。
List集合:
List 是 Collection 子接口,最大的特点是允许保存有重复数据
List本身也是一个接口,对于接口要想使用一定要使用它的子类来完成具体的操作,在List 子接口有三个常用子类:ArrayList、Vector、LinkedList。
ArrayList 子类:
**LinkedList子类:**在List接口里面还有另外一个比较常用的子类:LinkedList,这个类通过名称就可以发现它的特点:基于链表的实现
Vector子类:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2GEC7muj-1687195170438)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YzeVAdXB-1687195170440)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
set集合
Set集合最大的特点就是不允许保存重复元素,也是Collection的子接口。
需要注意的是Set集合并不像List集合那样扩充了许多新的方法,所以无法使用 List 集合中提供的 get()方法,也就是说它无法实现指定索引获取数据
**HashSet子类:**HashSet是Set接口里面使用最多的一个子类,最大的特点就是保存的数据是无序的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-teXjr1xK-1687195170440)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
TreeSet:
Set接口的另外一个子类就是 TreeSet,与HashSet最大的区别在于Treeset集合里面保存的数据是有序的。
TreeSet 子类之中保存的数据是允许排序的,但是这个类必须要实现Comparable接口,只有实现了此接口才能确认出对象的大小关系。
提示:TreeSet本质是利用 TreeMap子类实现的集合数据的存储,而TreeMap(树)需要根据Comparable来确定大小关系
集合输出
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0DknQRtW-1687195170441)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNMLNOed-1687195170442)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hIZvODtr-1687195170443)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vwmb9Axo-1687195170443)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EE3WOxfU-1687195170444)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-baM50qXC-1687195170444)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
**HashMap子类:**HashMap是Map接口中最为常见的一个子类,这个类主要特点就是无序存储
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pA4DTFgK-1687195170445)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
通过 HashMap 实例化的Map接口可以针对于key和value保存null数据,同时也可以发现即便保存数据的key有重复也不会发生错误,而是出现内容的替换。
但是对于Map接口提供的put()方法本身是提供有返回值的,那么这个返回值指的是在重复key的情况下返回旧的value。
在设置了相同的key的内容的时候put()方法会返回原来的数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8FZ2I78v-1687195170445)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvjq9CM8-1687195170446)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r56tXUhQ-1687195170446)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]编辑 使[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TAKSQxfW-1687195170447)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3lQ23hql-1687195170447)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]
定义数组:
// 一维数组
<元素类型>[] <数组名> = new <元素类型>[<数组长度>];
// 多维数组
<元素类型>[][] <数组名> = new <元素类型>[<行数>][<列数>];
int[] numbers = new int[5];
int[][] matrix = new int[2][3];
初始化数组:
// 一维数组初始化
<数组名>[<索引>] = <值>;
// 多维数组初始化
<数组名>[<行索引>][<列索引>] = <值>;
numbers[0] = 10;
matrix[1][2] = 5;
访问数组元素:
// 一维数组访问
<数组名>[<索引>];
// 多维数组访问
<数组名>[<行索引>][<列索引>];
int firstNumber = numbers[0];
int value = matrix[1][2];
数组长度:
<数组名>.length;
int length = numbers.length;
int[] numbers = new int[5];
int[][] matrix = new int[2][3];
初始化数组:
// 一维数组初始化
<数组名>[<索引>] = <值>;
// 多维数组初始化
<数组名>[<行索引>][<列索引>] = <值>;
numbers[0] = 10;
matrix[1][2] = 5;
访问数组元素:
// 一维数组访问
<数组名>[<索引>];
// 多维数组访问
<数组名>[<行索引>][<列索引>];
int firstNumber = numbers[0];
int value = matrix[1][2];
数组长度:
<数组名>.length;
int length = numbers.length;