String对象

在 Java 中,字符串是一种常见的数据类型,经常用于存储一些文本信息。而String类则是Java提供的专门用于字符串操作的类,在Java标准库中,它位于java.lang包中。

String类是不可被继承的final类,即它不能被其他类所继承,也就是说它不能被修改。String类是通过使用Unicode字符集来表示字符串的,这使得Java支持多语言字符集。由于String类的不可变性(immutable),所以它可以作为安全的参数发送给诸如网络连接或数据库链接之类的方法,而不必担心其被篡改。

String类的构造函数

在 Java 中,String类提供了多种构造函数,可以用于创建字符串对象。下面是String类的一些常用构造函数:

  • String(char[] value):根据字符数组value来创建String对象。
  • String(char[] value, int offset, int count):根据字符数组value的指定部分(offset开始的count个字符)来创建String对象。
  • String(byte[] bytes):根据字节数组bytes来创建String对象,使用平台默认的字符集。
  • String(byte[] bytes, Charset charset):根据字节数组bytes来创建String对象,使用指定的字符集charset。
  • String(String original):根据原始字符串original来创建String对象。

String类的常用方法

  • String concat(String str):连接指定的字符串参数到此字符串的末尾。
  • char charAt(int index):返回指定索引处的 char 值。
  • int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
  • int indexOf(int ch, int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
  • int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。
  • int lastIndexOf(int ch):返回指定字符在此字符串中最后一次出现处的索引。
  • int lastIndexOf(int ch, int fromIndex):返回指定字符在此字符串中从指定位置前最后一次出现处的索引。
  • int lastIndexOf(String str):返回指定子字符串在此字符串中最后一次出现处的索引。
  • String substring(int beginIndex):返回一个新的字符串,它是此字符串的一个子字符串。
  • String substring(int beginIndex, int endIndex):返回一个新的字符串,它是此字符串的一个子字符串。
  • String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
  • String replace(CharSequence target, CharSequence replacement):使用指定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

字符串分割

  • String[] split(String regex):根据指定的正则表达式拆分此字符串。
  • String[] split(String regex, int limit):根据指定的正则表达式拆分此字符串,最多拆分出limit个子字符串。

大小写转换

  • String toLowerCase():使用默认语言环境的规则将此 String 所有字符都转换为小写。
  • String toUpperCase():使用默认语言环境的规则将此 String 所有字符都转换为大写。

字符串创建

  • 字符串可以通过直接赋值、使用字符串构造函数、使用StringBuffer、StringBuilder等方式创建。

String类的不可变性原理及优缺点

String类在Java中是不可变的(immutable)的,这意味着一旦创建了一个String对象,它的值就不能被修改。String类的不可变性主要由以下两个方面造成:

String类的存储结构

在Java中,String对象实际上是一个包含字符数组的引用和一个表示字符串长度的整数。因此,在进行字符串操作时,String对象的引用和长度是不会变化的,只有字符数组才会被修改。而由于Java数组是一个固定长度的数据结构,因此String对象的不可变性就被保证了。

String类的操作方法

在Java中,String对象提供了很多用于字符串操作的方法(例如substring、concat等)。这些方法都是返回一个新的String对象,而不会在原有的String对象上进行修改,这也保证了String对象的不可变性。

String对象的不可变性带来了

优点:
  • 线程安全:由于String对象的不可变性,多个线程可以对同一个String对象进行访问操作,而不必担心数据的安全问题。
  • 安全性:由于String对象不可变,它不能被篡改,从而可以避免一些恶意攻击。
  • 性能优化:由于String对象是不可变的,因此可以进行一些性能方面的优化。例如,String类实现了字符串池这个概念。
缺点:
  • 内存占用:由于每次使用String类进行字符串操作时,都会创建一个新的String对象,并且原有的String对象不会被修改,这样就会占用更多的内存空间。
  • 创建大量垃圾对象:由于String对象的不可变性,每进行一次字符串操作就会创建一个新的String对象,如果进行大量的字符串操作,就会创建大量的垃圾对象,导致垃圾回收器的频繁运行。
  • 字符串拼接效率低:由于每进行一次字符串拼接操作,就会创建一个新的String对象,效率较低。

字符串池的工作原理

Java中有一种称为字符串池(String Pool)的机制,它的主要作用是避免创建重复的String对象,从而节省内存空间。

当创建一个字符串时,JVM首先会在字符串池中查找该字符串是否已经存在。如果存在,则返回该字符串在字符串池中的引用;否则,在字符串池中创建该字符串,并返回该字符串在字符串池中的引用。

String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");

System.out.println(str1 == str2); // true,因为str1和str2都指向字符串池中的同一个对象
System.out.println(str1 == str3); // false,因为str3指向堆内存中新创建的String对象

因此,如果需要创建多个相同的字符串对象,可以直接使用字符串池中已有的对象,这样可以节省内存空间。

String、StringBuilder、StringBuffer的比较

在进行字符串操作时,Java中常用的有String、StringBuilder和StringBuffer三种类。

  • String:String类是不可变的,每次进行字符串操作时都会创建一个新的String对象。因此,在需要大量字符串操作时,使用String类效率较低。
  • StringBuilder:StringBuilder是可变的,它可以在原有的字符数组上进行修改,而不用每次都创建一个新的字符数组。因此,在需要大量字符串操作时,使用StringBuilder类可以提高效率。
  • StringBuffer:StringBuffer也是可变的,并且是线程安全的,因此适用于多个线程对同一字符串进行操作的场景。

总之,在进行大量的字符串操作时,应该尽量使用StringBuilder或StringBuffer,避免使用String类导致效率低下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值