Java StringBuffer 和 StringBuilder 类
Java String 类
字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。
创建字符串创建字符串最简单的方式如下:
Stringstr = "Runoob";
在代码中遇到字符串常量时,这里的值是 "Runoob",编译器会使用该值创建一个 String 对象。
和其它对象一样,可以使用关键字和构造方法来创建 String 对象。
用构造函数创建字符串:
Stringstr2=newString("Runoob");
String 创建的字符串存储在公共池中,而 new 创建的字符串对象在堆上:
Strings1 = "Runoob"; // String 直接创建Strings2 = "Runoob"; // String 直接创建Strings3 = s1; // 相同引用Strings4 = newString("Runoob"); // String 对象创建Strings5 = newString("Runoob"); // String 对象创建

String 类有 11 种构造方法,这些方法提供不同的参数来初始化字符串,比如提供一个字符数组参数:
StringDemo.java 文件代码:
publicclassStringDemo{publicstaticvoidmain(Stringargs[]){char[]helloArray = {'r', 'u', 'n', 'o', 'o', 'b'}; StringhelloString = newString(helloArray); System.out.println(helloString); }}
以上实例编译运行结果如下:
runoob注意:String 类是不可改变的,所以你一旦创建了 String 对象,那它的值就无法改变了(详看笔记部分解析)。
如果需要对字符串做很多修改,那么应该选择使用 StringBuffer & StringBuilder 类。
字符串长度用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是 length() 方法,它返回字符串对象包含的字符数。
下面的代码执行后,len 变量等于 14:
StringDemo.java 文件代码:
publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringsite = ""; intlen = site.length(); System.out.println("菜鸟教程网址长度 : " + len); }}
以上实例编译运行结果如下:
菜鸟教程网址长度 : 14 连接字符串String 类提供了连接两个字符串的方法:
string1.concat(string2);
返回 string2 连接 string1 的新字符串。也可以对字符串常量使用 concat() 方法,如:
"我的名字是 ".concat("Runoob");更常用的是使用'+'操作符来连接字符串,如:
"Hello," + " runoob" + "!"结果如下:
"Hello, runoob!"下面是一个例子:
StringDemo.java 文件代码:
publicclassStringDemo{publicstaticvoidmain(Stringargs[]){Stringstring1 = "菜鸟教程网址:"; System.out.println("1、" + string1 + ""); }}
以上实例编译运行结果如下:
1、菜鸟教程网址: 创建格式化字符串我们知道输出格式化数字可以使用 printf() 和 format() 方法。
String 类使用静态方法 format() 返回一个String 对象而不是 PrintStream 对象。
String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。
如下所示:
System.out.printf("浮点型变量的值为 " + "%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + "is %s", floatVar, intVar, stringVar);
你也可以这样写
Stringfs; fs = String.format("浮点型变量的值为 " + "%f, 整型变量的值为 " + " %d, 字符串变量的值为 " + " %s", floatVar, intVar, stringVar);
String 方法下面是 String 类支持的方法,更多详细,参看 Java String API 文档:
SN(序号) 方法描述
AI 思考中...
Java Character 类
Java StringBuffer 和 StringBuilder 类
9 篇笔记 写笔记
#0
tianqixin
429***967@qq.com
449
String 类是不可改变的解析,例如:
String s = "Google"; System.out.println("s = " + s); s = "Runoob"; System.out.println("s = " + s);输出结果为:
Google Runoob从结果上看是改变了,但为什么说 String 对象是不可变的呢?
原因在于实例中的 s 只是一个 String 对象的引用,并不是对象本身,当执行 s = "Runoob"; 创建了一个新的对象 "Runoob",而原来的 "Google" 还存在于内存中。

tianqixin tianqixin 429***967@qq.com
#0
豆妮的小奴隶
861***743@qq.com
162
length() 方法,length 属性和 size() 方法的区别:
1、length() 方法是针对字符串来说的,要求一个字符串的长度就要用到它的length()方法;
2、length 属性是针对 Java 中的数组来说的,要求数组的长度可以用其 length 属性;
3、Java 中的 size() 方法是针对泛型集合说的, 如果想看这个泛型有多少个元素, 就调用此方法来查看!
这个例子来演示这两个方法和一个属性的用法:
import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { String array[] = { "First", "Second", "Third" }; String a = "HelloWorld"; List<String> list = new ArrayList<String>(); list.add(a); System.out.println("数组array的长度为" + array.length); System.out.println("字符串a的长度为" + a.length()); System.out.println("list中元素个数为" + list.size()); } }输出的值为:
数组array的长度为3 字符串a的长度为10 list中元素个数为1豆妮的小奴隶 豆妮的小奴隶 861***743@qq.com
#0
Helen
109***2166@qq.com
参考地址
69
1.对整数进行格式化:%[index$][标识][最小宽度]转换方式
格式化字符串由4部分组成,特殊的格式常以%index$开头,index从1开始取值,表示将第index个参数拿进来进行格式化,[最小宽度]的含义也很好理解,就是最终该整数转化的字符串最少包含多少位数字。剩下2个部分的含义:
标识:
'-' 在最小宽度内左对齐,不可以与"用0填充"同时使用
'#' 只适用于8进制和16进制,8进制时在结果前面增加一个0,16进制时在结果前面增加0x
'+' 结果总是包括一个符号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
' ' 正值前加空格,负值前加负号(一般情况下只适用于10进制,若对象为BigInteger才可以用于8进制和16进制)
'0' 结果将用零来填充
',' 只适用于10进制,每3位数字之间用","分隔
'(' 若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(同'+'具有同样的限制)
转换方式:
d-十进制 o-八进制 x或X-十六进制
上面的说明过于枯燥,我们来看几个具体的例子。需要特别注意的一点是:大部分标识字符可以同时使用。
System.out.println(String.format("%1$,09d", -3123)); System.out.println(String.format("%1$9d", -31)); System.out.println(String.format("%1$-9d", -31)); System.out.println(String.format("%1$(9d", -31)); System.out.println(String.format("%1$#9x", 5689)); //结果为: //-0003,123 // -31 //-31 // (31) // 0x16392.对浮点数进行格式化:%[index$][标识][最少宽度][.精度]转换方式
我们可以看到,浮点数的转换多了一个"精度"选项,可以控制小数点后面的位数。
标识:
'-' 在最小宽度内左对齐,不可以与"用0填充"同时使用
'+' 结果总是包括一个符号
' ' 正值前加空格,负值前加负号
'0' 结果将用零来填充
',' 每3位数字之间用","分隔(只适用于fgG的转换)
'(' 若参数是负数,则结果中不添加负号而是用圆括号把数字括起来(只适用于eEfgG的转换)
转换方式:
'e', 'E' -- 结果被格式化为用计算机科学记数法表示的十进制数
'f' -- 结果被格式化为十进制普通表示方式
'g', 'G' -- 根据具体情况,自动选择用普通表示方式还是科学计数法方式
'a', 'A' -- 结果被格式化为带有效位数和指数的十六进制浮点数
3.对字符进行格式化:
对字符进行格式化是非常简单的,c表示字符,标识中'-'表示左对齐,其他就没什么了。
Helen 109***2166@qq.com 参考地址
#0
hunter
hun***es@126.com
97
关于 String 为啥是不可改变的
这里可以根据 jdk 的源码来分析。
字符串实际上就是一个 char 数组,并且内部就是封装了一个 char 数组。
并且这里 char 数组是被 final 修饰的:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[];并且 String 中的所有的方法,都是对于 char 数组的改变,只要是对它的改变,方法内部都是返回一个新的 String 实例。
hunter hun***es@126.com
#0
hunter
hun***es@126.com
59
java 中的字符串的加算法
String a = "a"; String b = "b"; String c = a + b;相当于:
String c = new StringBuffer().append(a).append(b).toString();对于字符串的加运算,当编译成 class 文件时,会自动编译为 StringBuffer 来进行字符串的连接操作。
同时对于字符串常量池:
当一个字符串是一个字面量时,它会被放到一个常量池中,等待复用。
String a = "saff"; String b = "saff"; String c = new String("saff"); System.out.println(a.equal(b)); // true System.out.println(a.equal(c)); // true这个就是字符串的常量池。
hunter hunter hun***es@126.com
#0
惊梦
135***65476@163.com
参考地址
173
String 类的常见面试问题
面试题一:
String s1 = "abc"; // 常量池 String s2 = new String("abc"); // 堆内存中 System.out.println(s1==s2); // false两个对象的地址值不一样。 System.out.println(s1.equals(s2)); // true面试题二:
String s1="a"+"b"+"c"; String s2="abc"; System.out.println(s1==s2); System.out.println(s1.equals(s2));java 中常量优化机制,编译时 s1 已经成为 abc 在常量池中查找创建,s2 不需要再创建。
面试题三:
String s1="ab"; String s2="abc"; String s3=s1+"c"; System.out.println(s3==s2); // false System.out.println(s3.equals(s2)); // true先在常量池中创建 ab ,地址指向 s1, 再创建 abc ,指向 s2。对于 s3,先创建StringBuilder(或 StringBuffer)对象,通过 append 连接得到 abc ,再调用 toString() 转换得到的地址指向 s3。故 (s3==s2) 为 false。
惊梦 135***65476@163.com 参考地址
#0
惊梦
135***65476@163.com
参考地址
100
Java:String、StringBuffer 和 StringBuilder 的区别
String:字符串常量,字符串长度不可变。Java中String 是immutable(不可变)的。用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。
StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。Java.lang.StringBuffer 线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。
StringBuilder:字符串变量(非线程安全)。在内部 StringBuilder 对象被当作是一个包含字符序列的变长数组。
基本原则:
如果要操作少量的数据用 String ;
单线程操作大量数据用StringBuilder ;
多线程操作大量数据,用StringBuffer。
惊梦 135***65476@163.com 参考地址
#0
阿颖
553***793@qq.com
66
public class Main { public static void main(String[] args) { String str1 = "hello world"; String str2 = new String("hello world"); String str3 = "hello world"; String str4 = new String("hello world"); System.out.println(str1==str2); System.out.println(str1==str3); System.out.println(str2==str4); } }
执行结果为:
false true false解析:
String str1 = "hello world"; 和 String str3 = "hello world"; 都在编译期间生成了字面常量和符号引用,运行期间字面常量 "hello world" 被存储在运行时常量池(当然只保存了一份)。通过这种方式来将 String 对象跟引用绑定的话,JVM 执行引擎会先在运行时常量池查找是否存在相同的字面常量,如果存在,则直接将引用指向已经存在的字面常量;否则在运行时常量池开辟一个空间来存储该字面常量,并将引用指向该字面常量。
众所周知,通过 new 关键字来生成对象是在堆区进行的,而在堆区进行对象生成的过程是不会去检测该对象是否已经存在的。因此通过 new 来创建对象,创建出的一定是不同的对象,即使字符串的内容是相同的。
阿颖 553***793@qq.com
#0
GritHub
147***6963@qq.com
70
String 类中 concat() 方法和 + 号的区别:
pubic class Demo{ pulic satic void main(String[] args){ String str1 = "a".concat("b").concat("c"); String str2 = "a"+"b"+"c"; String str3 = "abc"; String str4 = new String("abc"); System.out.println(str1 == str2); //运行结果为false System.out.println(str1 == str3); //运行结果为false System.out.println(str2 == str3); //运行结果为ture System.out.println(str2 == str4); //运行结果为false System.out.println(str1.equals(str4)); //运行结果为true } }执行结果为:
false false true false true解析:
首先关于 new 出来的对象和 String s = "字符串" 的 == 执行结果为 false 就不多赘述了,因为 == 比较的是两个对象的地址值,equals() 比较的是字面值。那么 concat 方法和 + 号的区别在这里有体现了,我们查看concat方法的源码可以看到,它是通过复制数组在通过 char 数组进行拼接生成一个新的对象,所以地址值会有变动,而 + 号不会。(作者很菜,初来乍到,前辈多包涵)
GritHub GritHub 147***6963@qq.com