String类跟关键字final
# String类跟关键字final
# String类简介
String类是Java语言内置的一个类,它是用来表示字符串
的。String类提供了许多有用的方法,可以用来处理字符串的各种操作,比如查找子串、替换子串、分割字符串、连接字符串等等。
以下是一些常见操作
String concat(String str)
将指定字符串连接到此字符串的结尾
boolean endsWith(String suffix)
测试此字符串是否以指定的后缀结束。
boolean equals(Object anObject)
将此字符串与指定的对象比较
boolean equalsIgnoreCase(String anotherString)
将此 String 与另一个 String 比较,不考虑大小写
int indexOf(int ch)
返回指定字符在此字符串中第一次出现处的索引
int length()
返回此字符串的长度
boolean matches(String regex)
告知此字符串是否匹配给定的正则表达式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 不可变特性
String类的一个重要特点是它的不可变性。一旦一个String对象被创建出来,它的值就不能被改变。就是说:在拼接字符串的时候,并没有改变字符串原先的值,而是创建了一个新的字符串对象。
它之所以是不可变,是因为它是被final
修饰的,因此String类也不能被继承。
# 设计成不可变的原因
- 提高效率:比如一个字符串String s1 = "abc","abc"被放到常量池里面去了,继续String s2 = “abc”并不会复制字符串“abc”,只会多个引用指向原来那个常量,这样就提高了效率,而这一前提就是String不可变,如果可变,那么多个引用变量指向同一个字符串常量,我就可以通过一个引用改变字符串,然后其他引用就被影响了
- 安全:String常被用来标识url,文件路径,如果String可变,或存在安全隐患
- 不可变字符串在对象序列化过程中更加安全。当一个对象被序列化时,它的状态被存储在序列化流中。如果对象包含可变字符串,那么在反序列化过程中可能会出现问题,因为原始字符串可能已经发生了变化。使用不可变字符串可以避免这种情况。
- String不可变,那么它的hashCode就一样,不用每次重新计算,同样提高了效率
new String("abc");
使用这种方式一共会创建两个字符串对象(前提是String Pool中还没有“abc”字符串对象)
- “abc”属于字符串字面量,因此编译时期会在String Pool中创建一个字符串对象,指定这个“abc”字符串字面量
- 而使用new的方式会在堆中创建一个字符串对象
String类对equals()
跟hashCode()
方法都进行重写,比较的是对象本身的值
# String、StringBuffer和StringBuilder的区别
# 相同点
- 都是final类,都不允许被继承
# 不同点
String长度是不可变的,如果尝试去修改,会新生成一个字符串对象
StringBuffer、StringBuilder长度是可变的
StringBuffer是线程安全
的,StringBuilder不是线程安全的,但它们两个中的所有方法都是相同的
StringBuffer在StringBuilder的方法之上添加了synchronized修饰,保证线程安全
- 单线程环境下,StringBuilder比StringBuffer拥有更好的性能
# final关键字
final
是一个关键字,它用来修饰变量
、方法或类
。当一个变量、方法或类被声明为final时,它就会具有以下特性:
- 修饰变量:
变量只能被赋值一次
。一旦一个final变量被赋值后,就不能再被重新赋值。在Java中,final变量的值是不可变的,一旦赋值后,就不能改变(只允许赋值一次)。 - 修饰方法:
方法不能被重写
。这意味着当一个类被继承时,不能覆盖父类中的final方法。因为在Java中,final方法的定义是最终的,不能再被修改。 - 修饰类:
类不能被继承
。这意味着当一个类被声明为final时,就不能被其他类继承。final类的定义是最终的,不能再被扩展。
那final修饰的HashMap对象还可以put元素,或者修改其中的元素吗?
final HashMap<String, String> ms = new HashMap<>();
ms.put("key1", "value1");
System.out.println(ms.get("key1"));
ms.put("key1", "this is new");
System.out.println(ms.get("key1"));
ms.put("key2","word");
System.out.println(ms.get("key2"));
ms.remove("key1");
System.out.println("移除操作");
System.out.println(ms.get("key1"));
ms = new HashMap<>(); // Cannot assign a value to final variable 'ms'
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
final修饰的变量,其实是它的引用不能被修改
,里面的内容,比如说map、或者list等,是可以修改其内容的。
上次更新: 2025/03/07, 06:05:43