- String类又称作不可变字符序列
- String位于java.lang包中,Java程序默认导入java.lang包下的所有类。
- Java字符串就是Unicode字符序列,例如字符串“java”就是4个Unicode字符’J’、‘a’、‘v’、'a’组成的。
- Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例。
String类的实例
String e = ""; //空字符串
String greeting = "Hello World";
- Java允许使用符号"+"把两个字符串连接起来。
字符串连接
String s1 = "Hello";
String s2 = "World!";
String s = s1 + s2; //HelloWorld!
符号"+“把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。
当”+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。
"+"连接符
int age = 18;
String str = "age is " + age; //str赋值为"age is 18"
//这种特性通常被用在输出语句中:
System.out.println("age is" + age);
String类和常量池
在 Java的内存分析中,我们会经常听到关于"常量池"的描述,实际上常量池也分为以下三种:
全局字符串常量池(String Pool)
class文件常量池(Class Constant Pool)
运行时常量池(Runtime Constant Pooll)
常量池
public class TestString {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("def");
String str3 = "abc";
String str4 = str2.intern();
String str5 = "def";
System.out.println(str1 == str3);//true
System.out.println(str2 == str4); //false
System.out.println(str4 == str5); //true
}
}
首先经过编译之后,在该类的class常量池中存放一些符号引用,然后类加载之后,将class常量池中存放的符号引用转存到运行时常量池中,然后经过验证,准备阶段之后,在堆中生成驻留字符串的实例对象(也就是上例中str1所指向的"abc"实例对象),然后将这个对象的引用存到全局字符串常量池中,也就是String Pool张红,最后在解析阶段,要把运行时常量池中的符号引用替换成直接引用,那么就直接查询String Pool,保证String Pool里的引用值与运行时常量池中的引用值一致,大概整个过程就是这样了。
现在就很容易解释整个程序的内存分配过程了,首先,在堆中会用一个"abc"实例,全局String Pool 中存放着"abc"的一个引用值,然后在运行第二句的时候会生成两个实例,一个是"def"的实例对象,并且String Pool 中存储一个"def"的引用值,还有一个是new
出来的一个"def"的实例对象,与上面那个是不同的实例,当在解析str3的时候查找String Pool,里面有"abc"的全局驻留字符串引用,所以str3的引用地址与之前的那个已存在的相同,str4是在运行的时候调用intern()函数,返回String Pool 中的"def" 的引用值,如果没有就将str2的引用值添加进去,在这里,String Pool 中已经有了"def"的引用值了,所以返回上面在new str2
的时候添加到String Pool 中的"def"引用值,最后str5在解析的时候也就指向存在于String Pool 中的"def"的引用值,那么这样一分析之后,结果就容易理解了。
String类常用方法
String类是我们最常使用的类。字符串类的方法我们必须非常熟悉!我们列出常用的方法,请大家熟悉。
String常用类方法一
public class StringTest1 {
public static void main(String[] args) {
String s1 = "core Java";
String s2 = "Core Java";
System.out.println(s1.charAt(3));//提取下标为3的字符
System.out.println(s2.length());//字符串的长度
System.out.println(s1.equals(s2));//比较两个字符串是否相等
System.out.println(s1.equalsIgnoreCase(s2));//比较两个字符串(忽略大小写)
System.out.println(s1.indexOf("Java"));//字符串s1中是否包含Java
System.out.println(s1.indexOf("apple"));//字符串s1中是否包含apple
String s = s1.replace(' ', '&');//将s1中的空格替换成&
System.out.println("result is :" + s);
}
}
执行结果如图:
##### String类方法二
public class TestString2 {
public static void main(String[] args) {
String s = "";
String s1 = "How are you?";
System.out.println(s1.startsWith("How"));//是否以How开头
System.out.println(s1.endsWith("you"));//是否以you结尾
s = s1.substring(4);//提取子字符串:从下标为4的开始到字符串结尾为止
System.out.println(s);
s = s1.substring(4, 7);//提取子字符串:下标[4, 7) 不包括7
System.out.println(s);
s = s1.toLowerCase();//转小写
System.out.println(s);
s = s1.toUpperCase();//转大写
System.out.println(s);
String s2 = " How old are you!! ";
s = s2.trim();//去除字符串首尾的空格。注意:中间的空格不能去除
System.out.println(s);
System.out.println(s2);//因为String是不可变字符串,所以s2不变
}
}
执行结果如图: