Java 之String

229 阅读6分钟

「这是我参与11月更文挑战的第5天,活动详情查看:2021最后一次更文挑战」。

String

该String类代表字符串。 在Java程序中,如所有字符串文字"abc" ,实现为这个类的实例。 字符串是常量; 创建文件后,它们的值不能改变。 字符串缓冲区支持可变的字符串。 因为字符串对象是不可变的,他们可以共享。 例如: String str = "abc";

相当于: char data[] = {'a', 'b', 'c'}; String str = new String(data);

下面是字符串如何使用一些例子: System.out.println("abc"); String cde = "cde"; System.out.println("abc" + cde); String c = "abc".substring(2,3); String d = cde.substring(1, 2);

类String包括用于检查序列的单个字符,比较字符串,搜索字符串,提取子,以及创建与转换为大写或小写所有字符的复制方法。 案例映射基于由指定的Unicode标准版本Character类。 Java语言提供对字符串连接运算符(+)的特殊支持,以及对其他对象的字符串转换。 字符串连接是通过实现StringBuilder (或StringBuffer )类及其append的方法。 字符串转换是通过方法来实现toString ,通过定义Object和继承由在Java中的所有类。 有关字符串串联和转换的更多信息,请参阅高斯林,喜悦,和Steele,Java语言规范 。 除非另有说明,将null参数传递到构造函数或方法在这个类会导致NullPointerException被抛出。 甲String表示,其中补充字符由代理对表示的UTF-16格式的字符串(见节的Unicode字符表示在Character类的更多信息)。 指数值是指char代码单元,因此增补字符用在两个位置String 。 的String类提供使用Unicode代码点(即,字符)处理,除了那些用于处理Unicode代码单元(即,方法char值)。

  • String 是final类,不能被继承。是不可变对象。当我们修改 String 的值的时候,实际上会生成一个新的对象,然后将指针指向这个对象,所以,当我们要频繁改变 String 的值的时候最好不要用String。

StringBuffer

字符的线程安全的,可变的序列。 一个字符串缓冲区是像String ,而是可以被修改。 在任何时间点上,包含的字符的一些特定序列,但该序列的长度和内容可以通过某些方法调用来改变。 字符串缓冲区用于多个线程的使用安全。 该方法是同步的必要,使所有在任何特定实例的行为的操作,就好像它们发生在是与所涉及的每个单独的线程进行的方法调用顺序一致的一些串行顺序。 上的主操作StringBuffer是append和insert的方法,其被重载,以便接受任何类型的数据。 每个有效转换给定的基准为字符串,并然后附加或插入该字符串的字符串缓冲区中的字符。 的append方法总是添加这些字符在缓冲区的末尾; 所述insert的方法在指定的点添加字符。 例如,如果z指字符串缓冲区对象,其当前内容是"start" ,则该方法调用z.append("le")将导致字符串缓冲区包含"startle" ,而z.insert(4, "le")会改变字符串缓冲区包含"starlet" 。 一般情况下,如果某人是指的一个实例StringBuffer ,然后sb.append(x)具有相同的效果sb.insert(sb.length(), x) 每当发生涉及源序列(例如追加或从源序列插入)的操作时,这个类同步仅在字符串缓冲区执行操作,而不是在源。 请注意,虽然StringBuffer被设计为安全地从多个线程同时使用,如果构造或append或insert操作传递一个跨线程共享源序列,调用代码必须确保操作具有一致的和不变的看法为操作的持续时间源序列。 这可以通过调用者操作的调用期间持有锁来满足,通过使用一个不变的源序列,或不能跨线程共享源序列。 每个字符串缓冲区的容量。 只要包含在字符串缓冲区中的字符序列的长度不超过所述容量,没有必要分配一个新的内部缓冲器阵列。 如果内部缓冲区溢出,则自动变大。 除非另有说明,传递一个null参数构造函数或方法在这个类会导致NullPointerException被抛出。 由于释放的JDK 5,这类已补充了由单个线程,设计用于使用等价类StringBuilder 。 所述StringBuilder类通常应优先使用这一个,因为它支持所有相同的操作,但它是快的,因为它不执行同步。

  • 类似 String 的字符串缓冲区,对它的修改不会像 String 那样重新创建对象。
  • 使用 append() 方法修改 StringBuffer 的值,使用 toString() 方法转换为字符串。
  • 线程安全
  • 不能通过赋值符号赋值

StringBuilder

一个可变的字符序列。 这个类提供兼容的API StringBuffer ,但不保证同步。 此类设计用作简易替换为StringBuffer在正在使用由单个线程字符串缓冲区的地方(如通常是这种情况)。 如有可能,建议,这个类优先使用StringBuffer ,因为它会根据大多数实现更快。 上的主操作StringBuilder是append和insert的方法,其被重载,以便接受任何类型的数据。 每个有效转换给定的基准为字符串,并然后附加或插入该字符串字符串生成器的字符。 的append方法总是添加这些字符在构建器的端部; 所述insert的方法在指定的点添加字符。 例如,如果z指字符串生成器对象,其当前内容是“ start ”,则该方法调用z.append("le")将导致字符串生成器含有“ startle ”,而z.insert(4, "le")会改变字符串生成器包含” starlet ”。 一般情况下,如果某人是指的一个实例StringBuilder ,然后sb.append(x)具有相同的效果sb.insert(sb.length(), x) 每个字符串生成器都有一个容量。 只要包含在字符串生成字符序列的长度不超过所述容量,没有必要分配一个新的内部缓冲器。 如果内部缓冲区溢出,则自动变大。 实例StringBuilder是用于多个线程是不安全的。 如果需要这样的同步然后建议StringBuffer使用。 除非另有说明,传递一个null参数构造函数或方法在这个类会导致NullPointerException被抛出。

  • 非线程安全
  • StringBuffer 类似,在单线程下使用的时候效率更高