一、String类型的特点
1、不可变性
String类型是不可变的。一旦String对象被创建,它的值就不能改变。任何对于String的修改,其实都是返回了一个新的String对象。
String str = "Java"; str.concat(" is great!"); System.out.println(str); //输出结果为"Java"
2、常量池
String类型在Java中有一个常量池,用来存储一些预定义的String对象。在Java中使用双引号定义的String对象,如果该字符串在常量池中已经存在,则不会创建新的String对象,而是直接返回该字符串在常量池中的引用。
String str1 = "hello"; String str2 = "hello"; System.out.println(str1 == str2); //输出结果为true
二、String类型的操作
1、字符串的拼接
在Java中可以通过“+”操作符或者concat()方法来拼接字符串。当使用“+”操作符时,会自动调用StringBuilder的append()方法来完成拼接操作。
String str1 = "hello"; String str2 = "world"; String str3 = str1 + " " + str2; String str4 = str1.concat(" ").concat(str2); System.out.println(str3); //输出结果为"hello world" System.out.println(str4); //输出结果为"hello world"
2、字符串的比较
在Java中,字符串的比较需要使用equals()方法或者compareTo()方法。其中,equals()方法比较的是字符串的内容是否相同,而compareTo()方法则比较的是字符串的字典序。
String str1 = "hello"; String str2 = "world"; String str3 = "hello"; System.out.println(str1.equals(str2)); //输出结果为false System.out.println(str1.equals(str3)); //输出结果为true System.out.println(str1.compareTo(str2)); //输出结果为-15 System.out.println(str1.compareTo(str3)); //输出结果为0
3、字符串的提取
在Java中可以使用substring()方法来提取子字符串。该方法有两个参数,参数一表示起始索引(包括该索引),参数二表示结束索引(不包括该索引)。
String str = "hello world"; String sub1 = str.substring(0, 5); String sub2 = str.substring(6); System.out.println(sub1); //输出结果为"hello" System.out.println(sub2); //输出结果为"world"
三、常见问题解答
1、String为何是不可变的?
这是由于String的底层实现使用final修饰的字符数组,同时String重写了Object中的equals()方法,因此为了保证equals()方法的正确性,String对象是不可变的。
2、String str = new String("hello");和String str = "hello";有什么区别?
前者会在堆中创建一个新的String对象,而后者则会先在常量池中查找是否已经存在"hello"字符串,如果存在,则直接返回该字符串的引用,否则在常量池中创建一个新的String对象。
3、为什么在使用“+”操作符拼接字符串时会创建很多不必要的String对象?
因为每次使用“+”操作符拼接字符串时,都会创建一个新的StringBuilder对象,并在其中执行多次append()方法。最后将StringBuilder对象转换为String对象时,又会创建一个新的String对象。
以上是对Java中String类型一些基础的介绍,了解了String类型的特点和操作方法,对于Java程序的优化和错误调试都会有很大的帮助。