String类
- 一、String类的特点
- 二、String 类的常见构造方法
- 三、String常见的面试题
- 1.字符串常量池
- 2.String s = "abc"与String s = new String("abc")区别
- 3.字符拼接+
- 4.常量优化机制
- 四、String常用方法
- 1. 比较字符串内容
- 2. 遍历字符串
- 3.截取字符串
- 4.替换字符串
- 5.切割字符串
一、String类的特点
- String是一个类,属于引用数据类型,不属于基本数据类型。
- Java 程序中所有双引号字符串, 都是 String 类的对象
/*
* 这里的"abc",就是一个String类对象
* 所以可以调用类里面的方法
* */
System.out.println("abc".length());
System.out.println("abc".toUpperCase());
- 字符串在创建之后, 其内容不可更改
例子如下:
String s="abc";
s="def";
System.out.println(s);//打印结果def
上面的例子相当于:
char data1[] = {'a', 'b', 'c'};
String s = new String(data1);
char data2[] = {'d', 'e', 'f'};
s=new String(data2);//使用新的对象进行替换
System.out.println(s);//打印结果def
结论:字符串对象一旦被创建,其内容就不能更改。要更改就只能使用新的字符串对象进行替换。后面会给出内存图。
- 字符串虽然不可改变, 但是可以被共享
String s1="abc";
String s2="abc";
System.out.println(s1==s2);//true
结论:String是引用数据类型,所以==号比较的是地址,也就是说,s1和s2共享同一份地址。
这是什么原因呢?
在JDK当中双引号括起来的字符串,例如:“abc” "def"都是直接存储在“方法区”的“字符串常量池”当中的。
字符串常量池:
当我们使用双引号创建字符串对象时,会检查字符串常量池中是否存在该数据
存在:复用(共享)
不存在:创建
二、String 类的常见构造方法
//最常用的方式,不使用构造器
String s1 = "abc";
System.out.println(s1);//abc
//构造方法1:public String()
String s2=new String();
System.out.println(s2);//空白字符串
//构造方法2:public String(String original)
String s2 = new String("abc");//根据传入的字符串,创建字符串对象
System.out.println(s2);//abc
//构造方法3:public String(char[] chs)
char[] c = {'a' , 'b', 'c'};
String s3 = new String(c);//根据字符数组,创建字符串对象
System.out.println(s3);//abc
三、String常见的面试题
1.字符串常量池
2.String s = "abc"与String s = new String(“abc”)区别
3.字符拼接+
4.常量优化机制
//Main.java
String s1="abc";
String s2="a"+"b"+"c";
System.out.println(s1==s2);//true
//Main.class
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
分析:与上一道题不同的是,这里字符串拼接符+左右都是字符串常量,没有变量。所以,常量优化机制吧它拼接成“abc”。因此,在字节码文件中,s1与s2一样,变为第一道面试题了。
四、String常用方法
1. 比较字符串内容
public boolean equals方法(要比较的字符串) : 比较内容
public boolean equalsIgnoreCase(要比较的字符串) : 比较内容, 忽略大小写
String s1="abc";
String s2=new String("abc");
String s3="AbC";
System.out.println(s1==s2);//false
System.out.println(s1.equals(s2));//true
System.out.println(s1.equals(s3));//false
System.out.println(s1.equalsIgnoreCase(s3));//true
2. 遍历字符串
public char[] toCharArray () : 将字符串转换为字符数组
public char chatAt (int index) : 根据索引找字符
public int length() : 返回字符串的长度
方法一:
String s="abcdefgh";
char[] data=s.toCharArray();
for (int i = 0; i < data.length; i++) {
System.out.println(data[i]);
}
方法二:
String s="abcdefg";
for (int i = 0; i < s.length(); i++) {
System.out.println(s.charAt(i));
}
推荐使用方法一,就只调用了一次toCharArray()。而方法二,每次循环都调用了一次length()和charAt(),开销大。
3.截取字符串
public String substring(int beginIndex) 截取到末尾
public String substring(int beginIndex, int endIndex) 根据开始和结束索引做截取, 包含头不包含尾
案例:截取手机号,隐藏中间四位
String s="12345678901";
String start=s.substring(0,4);//截取前四位
String end=s.substring(7);//截取后四位
System.out.println(start+"****"+end);//1234****8901
4.替换字符串
public String replace(旧值,新值) : 替换
案例:敏感词替换(仅为案例)
String s="你TMD真是个小可爱";
s=s.replace("TMD","***");
System.out.println(s);//你***真是个小可爱
5.切割字符串
public String[] split(String regex) :根据给出的标识切割字符串
String s="192.168.0.0";
String[] splits = s.split("\\.");
for (int i = 0; i < splits.length; i++) {
System.out.println(splits[i]);// 192 168 0 0
}
注意:如果根据指定标识符无法进行切割,则加上\\