目录
字符串 String
String 基础
String 类和常量池
String 类常用的方法
String 类常用方法一
String 类常用方法二
字符串相等的判断
字符串 String
String 是我们开发中最常用的类,我们不仅要掌握 String 类常见的方法,对于 String 的 底层实现也需要掌握好,不然在工作开发中很容易犯错。
String 基础
- 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 的内存分析中,我们会经常听到关于“常量池”的᧿述,实际上常量池也分了 以下三种:
1. 全局字符串常量池(String Pool)
全局字符串常量池中存放的内容是在类加载完成后存到 String Pool 中的,在每个 VM 中只有一份,存放的是字符串常量的引用值(在堆中生成字符串对象实例)。
2. class 文件常量池(Class Constant Pool)
class 常量池是在编译的时候每个 class 都有的,在编译阶段,存放的是常量(文本字符 串、final 常量等)和符号引用。
3. 运行时常量池(Runtime Constant Pool)
运行时常量池是在类加载完成之后,将每个 class 常量池中的符号引用值转存到运行时 常量池中,也就是说,每个 class 都有一个运行时常量池,类在解析之后,将符号引用替换 成直接引用,与全局常量池中的引用值保持一致。
常量池
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,保证 String Pool 里的引用值与运行时常量池中的引用值一致,大概整个过程就是这样了。
String 类常用的方法
方法 | 解释说明 |
char charAt(int index) | 返回字符串中第 index 个字符 |
boolean equals(String other) | 如果字符串与 other 相等,返回 true;否则,返回 false |
boolean equalsIgnoreCase(String other) | 如果字符串与 other 相等(忽略大小写),则返回 true;否则, 返回 false。 |
int indexOf(String str) | 返回从头开始查找第一个子字符串 str 在字符串中的索引位 置。如果未找到子字符串 str,则返回-1。 |
lastIndexOf() | 返回从末尾开始查找第一个子字符串 str 在字符串中的索引位 置。如果未找到子字符串 str,则返回-1。 |
int length() | 返回字符串的长度。 |
String replace(char oldChar,char newChar) | 返回一个新串,它是通过用 newChar 替换此字符串中出现的 所有 oldChar 而生成的。 |
boolean startsWith(String prefix) | 如果字符串以 prefix 开始,则返回 true。 |
boolean endsWith(String prefix) | 如果字符串以 prefix 结尾,则返回 true。 |
String substring(int beginIndex) | 返回一个新字符串,该串包含从原始字符串beginIndex到串尾。 |
String substring(int beginIndex,int endIndex) | 返回一个新字符串,该串包含从原始字符串 beginIndex 到串尾 或 endIndex-1 的所有字符。 |
String toLowerCase() | 返回一个新字符串,该串将原始字符串中的所有大写字母改成 小写字母。 |
String toUpperCase() | 返回一个新字符串,该串将原始字符串中的所有小写字母改成 大写字母。 |
String trim() | 返回一个新字符串,该串删除了原始字符串头部和尾部的空 格。 |
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 StringTest1 {
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 不变
}
}
字符串相等的判断
- equals 方法用来检测两个字符串内容是否相等。如果字符串 s 和 t 内容相等,则 s.equals(t)返回 true,否则返回 false。
- 要测试两个字符串除了大小写区别外是否是相等的,需要使用 equalsIgnoreCase 方 法。
- 判断字符串是否相等不要使用"=="。
忽略大小写的字符串比较
"Hello".equalsIgnoreCase("hellO");//true
字符串的比较:"= ="与 equals()方法
public class StringTest1 {
public static void main(String[ ] args) {
String g1 = "学习Java!";
String g2 = "学习Java!";
String g3 = new String("学习Java!");
System.out.println(g1 == g2); // true 指向同样的字符串常量对象
System.out.println(g1 == g3); // false g3 是新创建的对象
System.out.println(g1.equals(g3)); // true g1 和 g3 里面的字符串内容是一样的
}
}
内存分析如下: