Java基础之字符串总结

不可变字符串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();
  • 18
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值