String详解

本文详细探讨了Java中的String类,强调了其在编程中的重要性。文章介绍了String的构造方法、比较(如`equals`和`compareTo`)、查找、转换、不可变性以及如何在需要修改字符串内容时使用`StringBuffer`和`StringBuilder`。同时,还涵盖了字符串的数组转换、格式化、替换、拆分等操作,并讨论了字符串不可变性的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 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);
}

注意事项:

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
    多次拆分
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是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:

  1. 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对象内部都可以修改的
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值