一直以为String、Array、Collection、File、I-O是所有编程语言的基础也是重点。
今天简单对String做以简单的小结。
《编程思想》中的开场语:可以证明,字符串操作是计算机程序设计中最常见的行为。尤其是在java大展拳脚的Web系统中。
Java中String的几个要点:
1.String是不可变的
2.String的基本操作
3.StringBuffer & StringBuilder
进击的String:
1.格式化的输出
2.正则表达式
3.扫描输入
1.不可变的String
根据JDK的描述,我们可以看到String类型在从创建之后就是不可变的,只能shared,不能change.
《thinking In java》按:String类中任何看来会修改String值的方法,实际都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象丝毫未动。
// String abc = "abc"; 两种 char[] data = {'a', 'b', 'c'}; String abc = new String(data); System.out.println(abc.toUpperCase()); //ABC System.out.println(abc); //abc
上面可以看到虽然对abc做了upperCase,但是abc本身并没有做出任何变化。实际上abc.toUpperCase只是返回了一个新的String对象。
2.String类的基本操作
package test; public class TestString { public static void main(String[] args) { String test = new String("hello WORLD! "); String replace = test.replace('o', 'a'); String upperCase = test.toUpperCase(); System.out.println(upperCase);//HELLO WORLD! String lowerCase = test.toLowerCase();//hello world! System.out.println(lowerCase); char index = test.charAt(3); System.out.println(index);//l int codePoint = test.codePointAt(3); System.out.println(codePoint);//108 //compareToIgnoreCase System.out.println(test.compareToIgnoreCase(lowerCase));//0 System.out.println(test.compareToIgnoreCase(upperCase));//0 System.out.println(upperCase.compareToIgnoreCase(lowerCase));//0 //compareTo System.out.println(upperCase.compareTo(lowerCase));//-32 //concat System.out.println(lowerCase.concat(upperCase));//hello world! HELLO WORLD! //substring System.out.println(test.substring(2));//llo WORLD! System.out.println(test.substring(0, 5));//hello //trim System.out.println(test.trim());//hello WORLD!注意这里的空格被去掉了 System.out.println(test);//hello WORLD! 最后一个有空格,test从没改变 } }
3.StringBuffer & StringBuilder
JDK中给出的StringBuffer的解释:
String buffers are safe for use by multiple threads.
The principal operations on a StringBuffer are the append and insert methods, which are overloaded so as to accept data of any type. Each effectively converts a given datum to a string and then appends or inserts the characters of that string to the string buffer.
简单解释一下:
StringBuffer最主要的操作是append和insert接口,这些接口都已经被重写过以便支持各种数据类型。这些方法首先将给定数据转换成String类型,然后再将该string对象appends 或者insert到stringbuffer对象中。事实上,sb.append(x)的效果与sb.insert(sb.length(),x)是一样的。
简单测试一下:
StringBuffer buffer = new StringBuffer("hello world! "); buffer.append("I am me! "); System.out.println(buffer);//hello world! I am me! buffer.insert(5, " my"); System.out.println(buffer);//hello my world! I am me!
可以看粗,StringBuffer的确是像一个String,但是可以修改。
有意思的是JDK文档中给出的最后一段话
上文中提到StringBuffer是有容积的。只要string buffer 中的字符序列不超过buffer的容积,就不会再分配新的array给它,否则溢出的话,会自动扩展。JDK5提供了stringbuffer的一个单线程等价类——StringBuilder。同时JDK建议,应该优先考虑StringBuilder,因为它的接口与StringBuffer完全一样,但是要更快,不过是非线程安全的。
再看StringBuilder:
JDK给的定义:
与上面的StringBuffer后面给出的对比如出一辙,可笑的是,后面的关于接口功能的介绍貌似是从StringBuffer文档中直接copy过来的,由此可见,StringBuilder实际上是单线程情况下高效版StringBuffer,功能几乎完全一样。
来个小结:
String类不可变,在每次对String对象做改变操作的时候总是会生成新的String对象,如果程序中有频繁的改动字符串内容的操作,那么势必会在内存中产生许多无引用对象,导致GC,拖慢速度。
在上面StringBuffer的JDK文档中也说的很明白,StringBuffer最主要的操作就是append,insert等改变string内容的接口,因此如果需要频繁的修改String内容的话,推荐使用StringBuffer(多线程)、StringBuilder(单线程)。
相关推荐
在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、StringBuffer和StringBuilder进行深入分析,了解它们之间...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的类,它们之间存在一些重要的区别,主要涉及到性能和线程安全性。 首先,`String`类代表的是字符串常量,一旦创建,其内容就不能改变。...
String:字符串常量 StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段...
Java 中 String, StringBuffer 与 StringBuilder 的区别 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别...
String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`是处理字符串的三个重要类,它们各自有特定的使用场景和优缺点。理解它们的差异对于编写高效的代码至关重要。 **String类** `String`是不可变的类,...
String、StringBuffer 和 StringBuilder 是 Java 语言中三种不同类型的字符串处理方式,它们之间存在着明显的性能和线程安全性差异。 String String 类型是不可变的对象,每次对 String 对象进行改变时都会生成一...
在Java编程语言中,`String`、`StringBuffer`和`StringBuilder`都是用来处理字符串的类,但它们之间存在显著的差异,主要体现在性能、线程安全性和使用场景上。 首先,`String`是最基本的字符串类,它代表的是不可...
stringbuilder用法 String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String、StringBuilder、StringBuffer 用法比较String...
在 Java 中,String、StringBuilder 和 StringBuffer 三者都是字符串处理类,但是它们之间存在着本质的区别。本文将从执行速度、线程安全性、字符串处理方式等方面对这三者进行比较和分析。 首先,从执行速度方面来...
根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...
"Java 中 String、StringBuffer 和 StringBuilder 的区别及用法" Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,了解它们之间的区别对 Java 开发者来说非常重要。本文将详细介绍这三者...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的对象,但它们之间存在显著的区别。String是最常见的字符串类型,它的特点是不可变性。这意味着一旦一个String对象被创建,就不能进行...
Java 中 String 和 StringBuffer 与 StringBuilder 的区别及使用方法 Java 中 String、StringBuffer 和 StringBuilder 是三个常用的字符串操作类,每个类都有其特点和使用场景。在开发过程中,正确选择合适的字符串...
在Java编程语言中,String、StringBuffer和StringBuilder都是用来处理字符串的重要类,它们各自有特定的使用场景和特性。理解这三个类的区别对于任何Java开发者,无论是初学者还是经验丰富的程序员,都是非常重要的...
Java中的字符串处理是编程中常见的任务,涉及到三个关键类:String、StringBuffer和StringBuilder。它们在功能上相似,但有着重要的区别,主要体现在字符串的可变性、线程安全性和性能方面。 1. 可变性 - String类...
在Java编程语言中,String、StringBuilder和StringBuffer都是用来处理字符串的重要类,它们各有特点,适用于不同的场景。这里我们将深入探讨这三个类的区别、特性和使用策略。 首先,String类是不可变的,这意味着...
string,stringbuffer,stringbuilder