特点:
-
String类又称作不可变字符序列(StringBuilder---可变字符序列)---源码当中序列就是一个数组,利用数组定义的
-
源码中用了final关键字,所以只能初始化一次
-
-
String位于java.lang包中,Java程序默认导入java.lang包下的所有类
-
Java字符串就是Unicode字符序列,如:"Java" = 'J'、'a'、'v'、'a'四个Unicode字符
-
Java没有内置的字符串类型,在标准的Java类库中提供了一个预定义的类String,每个用双括号引起来的字符串都是String类的一个实例
String类的实例
String e = ""; //空字符串
String greeting = "Hello World";
Java允许使用符号"+"把两个字符串连接起来
String s1 = "Hello";
String s2 = "World!";
String s = s1 + s2;
n-符号"+"把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式
n-当"+"运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后进行连接
实例:
int age = 18;
String str = "age is" + age; //str赋值为"age is 18"
//这种通性通常被用在输出语句中
System.out.println("age is" + age);
String类和常量池
(现阶段没有深入了解虚拟机底层)
常量池分类
全局字符串常量池(String Pool)
特点:
-
存放的内容是在类加载完成后存到String Pool中
-
每个VM中只有一份,存放的是字符串常量的引用之(在堆中生成字符串对象实例)
class文件常量池(Class Constant Pool)
特点:
-
在编译的时候每个class都有
-
存放的是常量(文本字符串、final常量等)和符号引用---方法区
运行时常量池(Runtime Constant Pool)
特点:
-
在类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中
-
每个class都有一个运行时常量池,类在解析之后,将符号引用替换成直接引用,与全局常量池中的引用值保持一致
String基本用法:
package com.cxl;
import com.sun.xml.internal.ws.api.ha.StickyFeature;
/**
* 测试字符串的基本类型
* @author Lucifer
*/
public class TestString {
public static void main(String[] args) {
String str = "abc";
String str2 = new String("defg"); //通过创建对象的方法去创建String变量
String str3 = "abc" + "defgh"; //字符串拼接的方法创建
String str4 = "18" + 19; //返回1819而不是37,这里的"+"号是字符串连接符不是运算符
System.out.println(str4);
System.out.println("########");
String str10 = "Lucifer";
String str11 = "Lucifer";
String str12 = new String("Lucifer"); //因为这个是新建的一个对象,所以str11和str12不是同一个对象
System.out.println(str10 == str11); //比较两个String变量是否是同一个对象---这个是true
System.out.println(str11 == str12); //这个是false]
System.out.println(str11.equals(str12)); //这个是true,因为equals是比较值而不是比较指向的对象是否一致
/*
分析为什么str11 == str12是false
因为在类TestString被加载之后这些用双引号引起的字符串和拼接字符串会被拼接
然后自动的放到常量池中---引用地址放到常量池中
通常比较字符串都是比较值是否相等,所以比较字符串的话都是使用equals---因为比较值是否相等而不是比较地址是否相等
(对象相同equals也会返回true---equals源码)---equals源码比较对象、比较字符
*/
}
}