- String类的重要性
在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。
简单来说String必须会!!!!!
常用方法
2.1 字符串构造
String类提供的构造方式非常多,常用的就以下三种:
public static void main(String[] args) {
// 1.使用常量串构造
String s1 = "hello king";
System.out.println(s1);
// 2.通过字符串的构造方法产生字符串对象
String s2 = new String("hello king");
System.out.println(s1);
// 使用字符数组进行构造
char[] array = {'h','e','l','l','o','k','i','n','g'};
String s3 = new String(array);
System.out.println(s1);
//4.调用字符串的静态方法valueOf
String str=String.valueOf(obj:"abc");
}
其中最常用的就是方式一和方式四
String对象的比较
1."==“比较的是两个字符串对象是否指向相同的地址!(注意:对于内置类型,”=="比较的是变量中的值;对于引用类型==比较的是引用中的地址。)
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 10;
// 对于基本类型变量,==比较两个变量中存储的值是否相同
System.out.println(a == b); // false
System.out.println(a == c); // true
// 对于引用类型变量,==比较两个引用变量引用的是否为同一个对象
String s1 = new String("hello");
String s2 = new String("hello");
String s3 = new String("world");
String s4 = s1;
System.out.println(s1 == s2); // false
System.out.println(s2 == s3); // false
System.out.println(s1 == s4); // true
}
String s1=new String("hello");
String s2=new String("hello");
String s3=s1;
String s4=new String("HELLO");
//true
System.out.println(s1.equals(s2));
//false
System.out.println(s1.equals(s4));
//ture
System.out.println(s1.equalsIgnoreCase(s4));
注意equals大小写敏感,区分大小写的比较
但是equalsIngoreCase不区分大小写比较
compareTo方法
使用compareTo方法进行两个字符串的大小比较 默认区分大小写
a.先按照连个字符串对应的字符进行比较,若碰见第一个不相等的字符,直接返回编码差值
b.若前k个字符完全相等(k是两个字符串中的最小值),返回值为两个字符串的长度差!
String s1=new String("ABC");
String s3=s1;
String s4=new String("ABCGT");
System.out.println(s1.compareTo(s3));
System.out.println(s6.compareTo(s7));
字符串查找
字符串的查找,其本质就是在字符数组上进行遍历寻找
char charAt(int index):返回字符串上指定索引位置的字符(注意索引的合法性);
取出任意一个字符串的每一个字符并输出?
循环+charAt
任意字符串对象.length()——>取得该字符串的长度
boolean contains(String regex):查找当前字符串中是否包括指定格式的字符串regex(自身也算子串)
String str ="abcdef";
//true
System.out.println(str.contains("abc"));
//true
System.out.println(str.contains("bcd"));
//false
System.out.println(str.contains("bce"));
字符串和其它类的转换
字符串和数值的互相转换
不管什么类型转字符串对象
统一使用String.valueOf(任意类型),当传入的是自定义的类时,会默认调用toString进行转换,要求我们在自定义的类型中覆写toString方法~
//将任意的数值转换字符串,字符串的几种构造方式
//int——》str
String s1 = String.valueOf(1234);
//double->str
String s2 = String.valueOf(12.34);
//str->boolean
String s3 = String.valueOf(true);
String s4 = String.valueOf(new Student("jklove", 18));
//将字符串对象转换为相应的基本类型:使用哥哥包装类的parseXXX方法来进行转换,这个转换可能会报错,当字符串出现非数字时会报错
大小写的转换---->仅限于英文字母,中文不存在大小写
String s1="hello";
String s2="HELLO";
//s1转大写
System.out.println(s1.toUpperCase());
//s2转小写
System.out.println(s2.toLowerCase());
字符串转数组
//将字符串s1转化为数组
char [] ch=s1.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]+" ");
字符串格式化---->类似于prinf的格式输出这不过此时不输出,只是将字符串按照指定的格式进行转换
String.format(格式)
//按照年月日的格式输入当前时间
String str=String.format("%d-%d-%02d",2022,11,02);
System.out.println(str);
字符串的替换
String str="hello,world";
//替换所有内容
System.out.println(str.replaceAll("l","-"));
//替换第一个内容
System.out.println(str.replaceFirst("l","L"));
//结果
he--o,wor-d
heLlo,world
字符串的拆分
tring str="helloworld";
//从第6个字符串开始截取到结束,包含第6个字符
//world
System.out.println(str.substring(5));
//从开始位置索引0,截取到结束索引5之前
//[start,end]
System.out.println(str.substring(0,5));
//结果
world
hello
//实现字符串的拆分
String str = "hello world hello king" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
System.out.println(s);
}
//字符串的部分拆分
String str = "hello world hello king" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}
拆分是特别常用的操作. 一定要重点掌握. 另外有些特殊字符作为分割符可能无法正确切分, 需要加上转义.
拆分IP地址
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
for(String s: result) {
System.out.println(s);
}
注意事项:
- 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
- 而如果是 “” ,那么就得写成 “\\” .
- 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
多次拆分
String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) {
String[] temp = result[i].split("=") ;
System.out.println(temp[0]+" = "+temp[1]);
}
字符串的不可变性
String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
- String类在设计时就是不可改变的,String类实现描述中已经说明了
以下来自JDK1.8中String类的部分实现:
String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:
2. String类被final修饰,表明该类不能被继承
3. value被修饰被final修饰,表明value自身的值不能改变,即不能引用其它字符数组,但是其引用空间中的内容可以修改。
4. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
字符串修改
若在某些场景下需要频繁修改字符的内容,JDk提供了两个新的类,专门用来处理字符串内容修改的
StringBuffer和StringBulider---->所有方法名称,具体使用都一样StringBuffer线程安全,效率较低StringBuilder线程不安全,效率较高,不考虑线程安全问题,优先使用Stringbuilder类
StringBuilder和String是两个独立的类,字符串常量池保存的都是String对象 int和double的关系StringBuilder对象内部都可以修改的