不可变字符串String
不可变字符串也就是我们经常使用的String类型变量,那么为什么String类型的字符串被设计为不可变字符串呢?下面我来解释一下这样设计的可能原因:
字符串不可变的优点:
- 1、安全性:不可变对象的状态在创建后不会改变,降低了对象被恶意修改的风险。例如,字符串常用于网络连接、文件路径等安全敏感的信息,不可变性确保了这些信息不会被篡改。
- 2、节省空间:Java在内存中维护一个字符串池(string pool),相同的字符串字面量在池中只存储一份。不可变字符串可以安全地在字符串池中共享,减少了内存使用和垃圾回收的开销。
字符串不可变的缺点:
- 1、复杂性:每次对字符串进行修改操作(如拼接、替换、截取)时,都会创建一个新的字符串对象。
- 2、效率低:在需要进行大量字符串修改操作的场景下,不可变字符串的性能较低。
创建不可变字符串可以避免频繁创建和销毁字符串,以及方便在方法区中共享,java设计者认为,共享带来的高效率远远胜过于提取、拼接字符串所带来的低效率。
String常用方法
- 1、获取字符串长度
int len = str.length();
- 2、获取指定索引的字符
char c = str.charAt(0);
- 3、截取子串
String substring(int beginIndex, int endIndex);
- 4、拼接字符串
String s1 = "Hello";
String s2 = s1.concat(", world!"); // s2 = "Hello, world!"
- 5、字符串比较
boolean isEqual = s1.equals("Hello");
- 6、查找字符串
String str = "Hello, world!";
int index = str.indexOf('o'); // index = 4
int lastIndex = str.lastIndexOf('o'); // lastIndex = 8
int strIndex = str.indexOf("world"); // strIndex = 7
- 7、字符串替换
String replacedStr = str.replace('o', 'a'); // replacedStr = "Hella, warld!"
String replacedAllStr = str.replaceAll("o", "a"); // replacedAllStr = "Hella, warld!"
- 8、字符串拆分
String[] parts = str.split(", "); // parts = ["Hello", "world!"]
- 9、字符串转换
String lowerStr = str.toLowerCase(); // lowerStr = "hello, world!"
String upperStr = str.toUpperCase(); // upperStr = "HELLO, WORLD!"
String trimmedStr = str.trim(); // 去掉首尾空格
- 10、字符串判空
boolean isEmpty = str.isEmpty(); // false
- 11、字符串是否包含子串
boolean contains = str.contains("world"); // contains = true
字符串与数组的转化
- 字符串转化为数组:toCharArray()方法。
- 数组转化为字符串:new String(ch)
可变字符串
如果需要频繁地修改字符串内容,使用不可变的String对象会导致大量临时对象的创建,效率较低。为了解决这个问题,Java提供了两个用于处理可变字符串的类:StringBuilder和StringBuffer。
StringBuilder
StringBuilder是一个可变字符串类,用于在不创建新对象的情况下对字符串进行修改。它提供了多种方法来对字符串进行追加、插入、删除和修改操作。StringBuilder是非线程安全的,适用于单线程环境。
StringBuffer
StringBuffer与StringBuilder类似,也是一个可变字符串类。StringBuffer是线程安全的,每个方法都被sychronized修饰,适用于多线程环境。由于线程安全的开销,StringBuffer在单线程环境中的性能不如StringBuilder。
StringBuilder和StringBuffer的常用方法
StringBuilder与StringBuffer常用的方法相同,如下:
- 1、末尾拼接
stringBuffer.append("abc");
- 2、指定位置插入
stringBuffer.insert(7, "beautiful "); // stringBuffer= "Hello, beautiful world!123"
- 3、删除(指定索引区间、指定字符)
stringBuffer.delete(5, 14); // stringBuffer= "Hello world!123"
stringBuffer.deleteCharAt(5); // stringBuffer= "Helloworld!123"
- 4、修改
stringBuffer.replace(5, 10, "Java"); // stringBuffer= "HelloJava!123"
- 5、反转字符串
stringBuffer.reverse(); // stringBuffer= "321!avaJolleH"
- 6、转换为不可变字符串String
String result = stringBuffer.toString();