String类的介绍
String类是字符串操作类,String对象由0或多个包含在""下的字符组成,Java中把String类用final声明即创建后就不可修改。
创建字符串
方式一:直接赋值
String str = "abc";
方式二:通过构造方法产生对象
String str1 = new String("abc");
方式三:通过字符数组产生对象
char[] data = new char[]{'a','b','c'};
String str2 = new String(data);
方式四:通过String的静态方法valueOf(任意数据类型)转变为字符串
String str3 = String.valueOf(123);
字符串字面
字面量:直接写出来的数值就称为字面量
10 -> int字面量
10.1 -> double字面量
true -> boolean字面量
“abc” -> String字面量(也是一个字符串对象)
当写出如下代码:
String str = "abc";//字符串字面量,同时也是字符串对象
String str1 = str;
str = "A";
System.out.println(str);
System.out.println(str1);
输出:
A
abc
当前堆和栈中的操作为:
字符串比较相等
所有引用类型在比较相等时,都使用equals方法比较,JDK常用类都已经覆写了equals方法,可以直接使用。
注:引用数据类型使用"=="比较的是地址。
public class Stringtest {
public static void main(String[] args) {
String str = "abc";//字符串字面量,同时也是字符串对象
String str1 = str;
System.out.println(str.equals(str1));
}
}
输出:
true
此处插入一个小细节:
String str = "abc";
System.out.println(str.equals("abc"));//方式一
System.out.println("abc".equals(str));//方式二
此处方式一和方式二都可以判断两个字符串是否相等,但是此时str对象若是一个空对象就会出错,所以我们推荐使用方式二
字符串常量池
在产生字符串对象时:出现字符串字面量,若该字面量是第一次出现(常量池中不存在),则新建一个该对象加入常量池;若出现new关键字,则在堆中开辟一个新内存并复制该实例对象的内容,该引用指向堆中新开辟出来的对象
String str = new String("abc");
String str1 = "abc";
这两行代码产生的具体操作如下:
手工入池
String类提供了intern方法,调用intern啊方法会将当前字符串引用指向的对象保存到字符串常量池中 ,规则如下:
1.若当前常量池中已经存在了该对象,则不再产生新的对象,返回常量池中的String对象。
2.若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址
常量池存在该对象:
public class Stringtest {
public static void main(String[] args) {
String str1 = new String("hello");
str1.intern();
String str2 = "hello";
System.out.println(str1 == str2);
}
}
输出:
false
此时常量池中已经存在了"hello",不再产生新的对象,返回常量池中字符串对象地址,但str1并没有接受该地址,所以str1并没有改变指向对象。
public class Stringtest {
public static void main(String[] args) {
String str1 = new String("hello");
str1 = str1.intern();
String str2 = "hello";
System.out.println(str1 == str2);
}
}
输出:
true
此时str1接收了返回的地址,所以和str2指向同一个对象,地址相等。
常量池不存在该对象:
public class Stringtest {
public static void main(String[] args) {
char[] data = new char[]{'a','b','c'};
String str = new String(data);
str.intern();
String str1 = "abc";
System.out.println(str == str1);
}
}
输出:
true
这里new String后面括号里的是字符数组,没有字符串对象,所以常量池中没有"abc",使用str的intern方法入池返回入池后的地址
字符串的不可变性
所谓字符串的不可变性指的是字符串对象的内容不可变,而不是字符串引用不可变。
比如:
这里的不可变指的是:
“hello”,“world”,“!!!”,"hellowworld!!!"不可变
那么为何字符串对象无法修改内容呢?
字符串其实就是一个字符数组 -> char[],字符串保存的值实际上在数组中保存,这个字符数组用final修饰,String类的外部拿不到这个数组,因此字符串对象的内容无法改变。
如何修改字符串内容
1.在运行时通过反射破坏数组的封装
2.更换使用StringBuilder或者StringBuffer类(使用StringBuilder性能更高,使用StringBuffer线程更安全)
若需要频繁的进行字符串的拼接,使用StringBuilder类的append方法
这里需要注意:StringBuilder和StringBuffer是两个独立的类,StringBuilder就是为了解决字符串的拼接问题产生的。
String和StringBuilder之间的转换
1.StringBuilder -> Staring
使用StringBuilder的toString方法:
String st = sb.toString();
2.String -> StringBuilder
使用StringBuilder的构造方法或者append方法:
StringBuilder sb = new StringBuilder("abc");
sb.append("abc");
字符串的相关操作
字符串的反转操作
先把String类转变为StringBuilder类,使用StringBuilder类的reverse方法进行字符串反转
public class StringBuilderTest {
public static void main(String[] args) {
String str = "abc";
StringBuilder sb = new StringBuilder(str);
sb.reverse();
System.out.println(str);
System.out.println(sb);
}
}
输出:
abc
cba
删除字符串指定范围的数据
先把String类转变为StringBuilder类使用StringBuilder类的delete方法进行删除
public class StringBuilderTest {
public static void main(String[] args) {
String str = "abcabc";
StringBuilder sb = new StringBuilder(str);
sb.delete(3,6);
System.out.println(str);
System.out.println(sb);
}
}
输出:
abcabc
abc
字符串的插入操作
同样也是先把String类转变为StringBuilder类,使用StringBuilder类的insert方法进行插入
public class StringBuilderTest {
public static void main(String[] args) {
String str = "abcabc";
StringBuilder sb = new StringBuilder(str);
sb.insert(3,"&&");
System.out.println(str);
System.out.println(sb);
}
}
输出:
abcabc
abc&&abc
字符串的比较操作
方法
public boolean equals(Object anObject); //区分大小写
public boolean equalsIanoreCase(String anotherString); //不区分大小写的比较
public int comparaTo(String anotherString); //比较两个字符串大小关系(按ASCII比较)
String str1 = "abc";
String str2 = "Abc";
System.out.println(str1.equals(str2));
System.out.println(str1.equalsIgnoreCase(str2));
System.out.println(str1.compareTo(str2));
输出:
false
true
32
字符和字符串的相互转换
1char -> String
通过构造方法:
public String(char);
public String(char,value[],int offset,int count); //将部分字符数组中的内容变为字符串
char[] data = new char[]{'a','b','c'};
String str = new String(data);
String str1 = new String(data,1,2);
System.out.println(str);
System.out.println(str1);
输出:
abc
bc
2.String -> char
方法
1.取出字符串中指定索引的字符
public char charAt(int index);
2.将字符串中的内容转为字符数组
public char toCharArray(); //此时产生了一个新的字符数组,将字符串的内容复制过去
public class Stringtest {
public static void main(String[] args) {
String str = "abcdefg";
char data1 = str.charAt(1);
char[] data2 = str.toCharArray();
System.out.println(data1);
System.out.println(data2);
}
}
输出:
b
abcdefg
判断字符串是否是由纯数字组成
具体步骤如下:
方法一:
1.将字符串转变为字符数组
2.使用for-each循环遍历字符数组
3.若遇到小于’0‘或者大于’9’的字符就判定错误反之则对
public class StringIsNumber {
public static void main(String[] args) {
String str1 = "123";
String str2 = "123a";
System.out.println(isNumber(str1));
System.out.println(isNumber(str2));
}
public static boolean isNumber(String str){
//先把字符转转换为字符数组
char[] data = str.toCharArray();
//再遍历整个字符数组看看是否全为数字
for (char c : data) {
if (c < '0' || c > '9') {
return false;
}
}
return true;
}
}
输出:
true
false
方法二:
1.将字符串转变为字符数组
2.使用for-each循环遍历字符数组
3.使用char的包装类Character类中的isDigit方法判断是否为纯数字
public class StringIsNumber {
public static void main(String[] args) {
String str1 = "123";
String str2 = "123a";
System.out.println(isNumber(str1));
System.out.println(isNumber(str2));
}
public static boolean isNumber(String str){
//先把字符转转换为字符数组
char[] data = str.toCharArray();
//再遍历整个字符数组看看是否全为数字
for (char c : data) {
if(!Character.isDigit(c)){
return false;
}
}
return true;
}
}
输出:
true
false
字符串和字节的相互转换
意义:将字符串保存到文件中或是通过网络传输都要用到字节数组
1.字符串转为字节:
String -> byte[]
方法
public byte[] getBytes() //将字符串以及字节数组的形式返回
public byte[] getBytes(String charsetName) //按照指定的编码格式转为字节数组
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class Stringtest {
public static void main(String[] args) {
String str1 = "你好中国!";
byte[] bytes = str1.getBytes(StandardCharsets.UTF_8);
System.out.println(Arrays.toString(bytes));
}
}
输出:
[-28, -67, -96, -27, -91, -67, -28, -72, -83, -27, -101, -67, -17, -68, -127]
2.字节转换为字符串
byte[] -> String
方法:
public String(byte bytes[]) // 将字节数组变为字符串
public String(byte bytes[],int offset,int length) //将部分字节数组中的内容变为字符串
public class Stringtest {
public static void main(String[] args) {
byte[] bytes = new byte[]{97,98,99};
String str = new String(bytes);
System.out.println(str);
}
}
输出:
abc
字符串查找操作
1.public boolean contains(CharSequence s) //判断一个子字符串是否存在
2. public int indexOf(String str) //从字符串开头查找自定字符串的位置,找到返回该字符串第一次出现的索引,没找到返回-1
3.public boolean startsWith(String prefix) //判断是否以指定字符串开头
4.public boolean endsWith(String suffix) //判断是否以指定字符串结尾
public class Stringtest {
public static void main(String[] args) {
String str = "hellow world";
System.out.println(str.contains("he"));
System.out.println(str.indexOf("l"));
System.out.println(str.startsWith("h"));
System.out.println(str.endsWith("w"));
}
}
输出:
true
2
true
false
字符串的替换操作
1.public String replaceAll(String regex,String replacement) //替换所有指定内容
2.public String replaceFrist(String regex,String replacement) //替换首个内容
public class Stringtest {
public static void main(String[] args) {
String str = "hellow world";
System.out.println(str.replaceAll("l"," "));
System.out.println(str.replaceFirst("l"," "));
}
}
输出:
he ow wor d
he low world
字符串的拆分操作
1.public String[] split(String regex) //将字符串全部拆分
2.public String[] split(String regex,int limit) //将字符串部分拆分,该数字组长度就是limit极限
import java.util.Arrays;
public class Stringtest {
public static void main(String[] args) {
String str = "hello java hellow world";
System.out.println(Arrays.toString(str.split(" ")));
System.out.println(Arrays.toString(str.split(" ",3)));
}
}
输出:
[hello, java, hellow, world]
[hello, java, hellow world]
字符串的截取处理
1.public String substring(int beginIndex) //从指定索引截取到结尾
2.public String substring(int beginIndex,int endIndex) //截取部分内容
注:产生了新的字符串,原字符串不变
public class Stringtest {
public static void main(String[] args) {
String str = "hellow world";
System.out.println(str.substring(7));
System.out.println(str.substring(0,6));
}
}
输出:
world
hellow
其他常用方法
1.public String trim() //去掉字符串中的左右空格,保留中间空格
2.public String toUpperCase() //字符串大写
3.public String toLowerCase() //字符串小写
4.public int length() //取得字符串长度
5.public boolean isEmpty() //判断是否为空字符串,但不是null,是长度为0
public class Stringtest {
public static void main(String[] args) {
String str = " hellow world ";
String str1 = "AbCd";
System.out.println(str.trim());
System.out.println(str.toUpperCase());
System.out.println(str1.toLowerCase());
System.out.println(str.isEmpty());
System.out.println(str.length());
}
}
输出:
hellow world
HELLOW WORLD
abcd
false
14
总结
一定记住,所有针对字符串的操作均无法修改原字符串的内容,都是产生了新的字符串做处理!!