文章目录
一、String类
在C语言中要表示字符串只能使用字符数组或者字符指针,但java是一种面对对象的语言,所以Java语言中专门提供了一种string类。string类中有一些重要的字符串不同用法,比如String、StringBuff和StringBulider等。
- 我们要学习就是运用和区别这些用法
- 需要熟悉java中字符串的new 字符串的内部结构组成
二、字符串的相关用法
2.1 书写方式
public class demo1 {
public static void main(String[] args) {
//第一种
String s1 = "xuexi";
//第二种
String s2 = new String("blue");
//第三种
char[] chars = {'a','b','c','d'};
String s3 = new String(chars);
}
}
图示分析String的内部结构组成
注意:在java中没有/0表示字符串,判断字符串是否结束根据字符串费长度进行判断 ,
2.2 String对象比较
1.== 比较,String类是引用数据类型,对于这类数据类型这里比较的是引用中的地址,且Java中字符串是字符串常量,不能被修改;
public class demo1 {
public static void main(String[] args) {
String s1 = new String("blue");
String s3 = new String("blue");
String s2 = s1;
System.out.println(s3 == s1);
System.out.println(s2 == s1);
运行结果
而字符串s4所引用的对象指向的依旧是s2的引用对象,并没有new开辟新的空间
图例分析:
2. equals比较,String类中重写了equals()方法,这里比较的是字符串数组内的数据是否相同;
3. int compareTo(String s)比较;
4. int compareToIgnoreCase(String str)比较,这里的比较与第三同理,只是忽略了字母大小写来比较;
public class demo1 {
public static void main(String[] args) {
String s1 = new String("blue");
String s3 = new String("blue");
String s4 = new String("Blue");
String s2 = s1;
System.out.println(s3 == s1);
System.out.println(s2 == s1);
System.out.println(s3.equals(s1));
System.out.println(s3.compareTo(s1));
System.out.println(s4.compareToIgnoreCase(s4));
}
}
运行结果
三、 字符串的各种方法
3.1 查找方法
- int indexOf(int ch) 返回ch第一次出现的位置,没有返回-1;
- int indexOf(String str) 返回str第一次出现的位置,没有返回-1;
- char charAt(int index) 返回index位置上字符,index为负数或越界则抛异常;
- int lastIndexOf(int ch) 从后往前找,返回ch第一次出现的位置,没有返回-1;
- int lastIndexOf(String str) 从后往前找,返回str第一次出现的位置,没有返回-1;
- int indexOf(int ch, int fromIndex) 从fromindex位置开始找ch第一次出现的位置,没有返回-1;
- int indexOf(String str, int fromIndex) 从fromIndex位置开始找str第一次出现的位置,没有返回-1;
- int lastIndexOf(int ch, int fromIndex) 从fromIndex位置开始找,从后往前找ch第一次出现的位置,没有返回-1;
- int lastIndexOf(String str, int fromIndex) 从fromIndex位置开始找,从后往前找str第一次出现的位置,没有返回-1;
代码示例
public class demo1 {
public static void main(String[] args) {
String str = "aaaabbbcccdedeffg";
System.out.println(str.indexOf('c'));
System.out.println(str.indexOf("ab"));
System.out.println(str.charAt(10));
System.out.println(str.lastIndexOf('f'));
System.out.println(str.lastIndexOf("de"));
System.out.println(str.indexOf('b',6));
System.out.println(str.indexOf("de",3));
System.out.println(str.lastIndexOf('c',4));
System.out.println(str.lastIndexOf("ab",5));
}
}
运行结果
3.2 字符串转换、替换、拆分、截取
1、 转换
- 数值和字符转换 使用String.valueOf()进行转换,字符创装换成数字用包装类型.pare包装类型
public class demo2 {
public static void main(String[] args) {
//数值转化成字符串
String str1 = String.valueOf(456);
String str2 = String.valueOf(23.1);
String str3 = String.valueOf(true);
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
//字符创转换成数字
int d = Integer.parseInt("234");
double c = Double.parseDouble("45.45");
System.out.println(d);
System.out.println(c);
}
}
- 大小写转换
public class demo3 {
public static void main(String[] args) {
//大小写转换
String str1 = "happy";
String str2 = "HEPPY";
System.out.println(str1.toUpperCase(Locale.ROOT)); //小写转换成大写
System.out.println(str2.toLowerCase(Locale.ROOT)); //大写转换成小写
}
}
- 字符串转数组
public class demo4 {
public static void main(String[] args) {
String str = "happy";
// 字符串转数组
char[] arr = str.toCharArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
System.out.println();
// 数组转字符串
String str1 = new String(arr);
System.out.println(str1);
}
}
- 字符串格式化
public class demo5 {
public static void main(String[] args) {
String s1 = String.format("%d-%d-%d", 2022,8,05);
System.out.println(s1);
}
2、 替换
public class demo2 {
public static void main(String[] args) {
String str = "tiantiankaixin";
System.out.println(str.replaceFirst("i", "e")); //替换首个内容
System.out.println(str.replaceAll("i", "e")); //替换所有内容
}
}
3、 拆分
public class demo2 {
public static void main(String[] args) {
String str = "tian_tian_kai_xin" ;
String[] result = str.split("_",3); //按照自己设置的格式部分拆分
for(String str1: result) {
System.out.println(str1);
}
String[] result1 = str.split("_") ; // 全部拆分、按照空格拆分
for(String str2: result1) {
System.out.println(str2);
}
}
}
注意事项:
- 对于字符"|","*","+"都得加上转义字符,前面加上 “\” ;
- 如果是 “” ,那么就得写成 “\\” ;
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
4、 截取
四、字符串常量池
4.1 字符串常量池(StringTable)
StringTable相当于一个哈希表,只要是双引号括起来的元素都放在常量池中,且只有一份,在存放的时候,先检查常量池中是否有这个变量,当常量池没有时就手动入池。
为了节省存储空间,Java为八种数据类型和字符串都提供了常量池。并且引入了
- Class文件常量池:每个.Java源文件编译后生成.Class文件中会保存当前类中的字面常量以及符号信息;
- 运行时常量池:在.Class文件被加载时,.Class文件中的常量池被加载到内存中称为运行时常量池,运行时常量池每个类都有一份;
- 字符串常量池
4.2 字符串的修改
在描述字符串时就明确表示字符串是不能改变的,它们的内容在创建好了之后就是不能被修改的,因此字符串具有不可变性。
注意
- 被final修饰的String类表明该类不能被继承;
- 被final修饰的value表明value自身的值不能改变,虽然不能引用其它字符数组,但是其引用空间中的内容可以修改;
- . 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象。
尽量避免直接对String类型对象进行修改,如果需要修改,我们可以使用StringBuffer或者StringBuilder。
4.3 常用的gStringBuilder方法
StringBuilder和StringBuffer这两个类大部分功能是相同的,所以我们只要认识其中一个类的一些常用方法就可以了,如果想了解更多可以参考https://docs.oracle.com/javase/8/docs/api/
public class demo2 {
public static void main(String[] args) {
StringBuilder str = new StringBuilder("haohaoxuexi");
StringBuilder str1 = str;
//1.尾部追加 在str后+=,可以是:boolean、char、char[]、
// double、float、int、long、Object、String、StringBuff的变量
str1.append("ch");
str1.append(" ");
str1.append(12);
System.out.println(str1);
System.out.println(str1 == str);
// 2.获取指定位置长度
System.out.println(str.charAt(3));
// 获取字符串有效长度
System.out.println(str.length());
// 3.获取底层保存字符串空间总的大小
System.out.println(str.capacity());
// 4.返回str第一次出现的位置
System.out.println(str.indexOf("ha"));
// 5.从指定位置位置开始查找str第一次出现的位置
System.out.println(str.indexOf("ha",4));
// 6.返回最后一次出现str的位置
System.out.println(str.lastIndexOf("xu"));
// 从指定位置开始找str最后一次出现的位置
System.out.println(str.lastIndexOf("ha",3));
// 7.在指定的位置插入:八种基类类型 & String类型 & Object类型数据
System.out.println(str.insert(1,"ch"));
System.out.println(str.insert(2,1));
// 8.删除指定位置字符
System.out.println(str.deleteCharAt(5));
// 9.删除[start, end)区间内的字符
System.out.println(str.delete(3,5));
// 10.将[start, end)位置的字符替换为str
System.out.println(str.replace(4,6,"wc"));
// 11.从start开始一直到末尾的字符以String的方式返回
System.out.println(str.substring(5));
// 12.将[start, end)范围内的字符以String的方式返回
System.out.println(str.substring(2,5));
// 13.反转字符串
System.out.println(str.reverse());
// 14.将所有字符按照String的方式返回
System.out.println(str.toString());
}
}
运行结果
结论
由上述结果我们可以知道String和StringBuilder的区别在于前者不能修改,后者可以修改,但两者之间不能直接转换。如果要想互相转换,可以采用如下原则:
- String——StringBuilder: 利用StringBuilder的构造方法或append()方法;
- StringBuilder——String: 调用toString()方法。
五、 总结
以上就是今天所学习的关于字符串的知识,在学习字符串的途中难免会有混淆字符串的时候,也认识到了String类和StringBuilder类的区别的相应的使用方法。