一、String  

字符串属于对象,Java 提供了 String 类来创建和操作字符串。

1、创建字符串

//1
String name= "Jeffrey";
//2
String name= new String("Jeffrey");
//3
char[] nameChar= { 'J', 'e', 'f', 'f', 'r', 'e', 'y'};
String name= new String(nameChar);

2、字符串长度

String name= "Jeffrey";
 int len = site.length();//访问器方法是 length() 方法,它返回字符串对象包含的字符数

3、连接字符串

string1.concat(string2);  "我的名字是".concat("Jeffrey");
//更常用的是使用'+'操作符来连接字符串
"Hello," + " Jeffrey" + "!

4、创建格式化字符串

String 类的静态方法 format() 能用来创建可复用的格式化字符串,而不仅仅是用于一次打印输出。

System.out.printf("浮点型变量的值为 " + "%f, 整型变量的值为 "+" %d, 
字符串变量的值为 " +"%s", floatVar, intVar, stringVar);
String.format("浮点型变量的值为 " + "%f,整型变量的值为"+" %d,
字符串变量的值为"+"%s", floatVar, intVar, stringVar);

5、常用功能

方法

说明

length()

获取字符串长度

charAt(int index)

获取指定位置的字符

indexOf(int ch)

字符第一次出现的索引

indexOf(String str)

字符串第一次出现的索引

indexOf(int ch,int fromIndex)

字符从指定位置后第一次出现的索引

indexOf(String str,int from)

字符串从指定位置后第一次出现的索引

lastIndexOf()

字符串最后一次出现的索引

subString(int start)

从指定位置开始截取字符串

subString(int start,int end)

截取字符串,包左不包右

Note:索引类似数组也是从0开始;list转换成string会有两个中括号

List<String> strList = new ArrayList<>();
            strList.add("helloworld");
            strList.add("rumoob");
            strList.add("csdn");

 System.out.println(strList.toString());//输出结果[helloworld, rumoob, csdn]
 System.out.println(strList.toString().substring(1,strList.toString().length()-1));//去除前后两个中括号

6、字符串比较

String s1 = new String(“hello”);   String s2 = “hello”;
s1 == s2; // false   
s1.equals(s2); // true

前者创建了2个或1个对象,后者创建了1个或0个对象。

String s3 = “hello”;    String s4 = “world”;   String s5 = “helloworld”;
S5== s3 + s4 ; //fale      
s5 == “hello” + ”world”; //true

字符串如果是变量相加,先开空间,再拼接。

字符串如果是常量相加,是先加,然后到字符串常量池中找,如果有就直接返回,否则就创建。具体分析参考博客

二、String、StringBuffer 和 StringBuilder 的区别

1、String:

  • 字符串常量,字符串长度不可变。Java 中 String 是 immutable(不可变)的。
  • 用于存放字符的数组被声明为 final 的,因此只能赋值一次,不可再更改。

2、StringBuffer:

字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用 StringBuffer,如果想转成 String 类型,可以调用 StringBuffer 的 toString() 方法。

StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。

  • append 方法始终将这些字符添加到缓冲区的末端;
  • insert 方法则在指定的点添加字符。

String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖Object类的equals()方法,具体示例如下:

java string存放的xml信息怎么解析 java string name_数据

3、StringBuilder:

字符串变量(非线程安全)。在内部,StringBuilder 对象被当作是一个包含字符序列的变长数组。

在大部分情况下,StringBuilder > StringBuffer。这主要是由于前者不需要考虑线程安全。

4、三者区别

String 类型和 StringBuffer 的主要性能区别:

  • String 是不可变的对象, 因此在每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后, JVM 的 GC 就会开始工作,性能就会降低。
  • 使用 StringBuffer 类时,每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。所以多数情况下推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。

5、使用策略

  • (1)基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer。
  • (2)不要使用String类的"+"来进行频繁的拼接,因为那样的性能极差的,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。
  • (3)为了获得更好的性能,在构造 StringBuffer 或 StringBuilder 时应尽可能指定它们的容量。当然,如果你操作的字符串长度(length)不超过 16 个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著降低性能。
  • (4)StringBuilder 一般使用在方法内部来完成类似 + 功能,因为是线程不安全的,所以用完以后可以丢弃。StringBuffer 主要用在全局变量中。