【Java SE】带你在String类世界中遨游!!!

在这里插入图片描述
🌹🌹🌹我的主页🌹🌹🌹
🌹🌹🌹【Java SE 专栏】🌹🌹🌹
🌹🌹🌹上一篇文章:带你走近Java的抽象类与接口🌹🌹🌹

文章目录

  • 1. String类的重要性
    • 2. String类常用方法
    • 2.1 字符串构造
    • 2.2 String对象的比较
    • 2.3 字符串查找
    • 2.4 转化
    • 2.5 字符串替换
    • 2.6 字符串拆分
    • 2.7 字符串截取
    • 2.8 字符串的不可变性
    • 2.11 字符串修改
      • 3.StringBuilder和StringBuffer
    • 3.1 StringBuilder的介绍

1. String类的重要性

在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而字符串应用又非常广泛,因此Java语言专门提供了String类。

2. String类常用方法

2.1 字符串构造

String类提供的构造方式非常多,常用的就以下三种:
1.使用常量串构造,也称字符串赋值

String str = "hello";

2.直接newString对象

 String str1 = new String("hello,world");

3.使用字符数组进行构造

char[] array = {'1','2','3','4'};
String str2 = new String(array);

将数组名作为形参传到String的构造函数之后,调用了数组的复制方法copyof,然后返回的类型是String类型。
在这里插入图片描述
【注意】

  1. String是引用类型,内部并不存储字符串本身,在String类的实现源码中,String类实例变量如下:
    在这里插入图片描述
    字符串中的内容实际存储在value[]数组当中。

字符串是引用类型,并不直接存储字符串的内容,而是存储的是引用变量的地址。
以下代码和画图演示可以证明:

 public static void main(String[] args) {
        My_String.fun();
        String str1 = new String("1234");
        String str2 = new String("12");
        String str3 = str1;
        System.out.println(str1.length());
        System.out.println(str3.isEmpty());
    }

str1的引用变量的地址赋值给了str3,此时的str3引用变量存储的是str1的地址,这样也可以通过str3引用变量来指向str1中的字符串的内容。
上述的打印结果分别是4,和false则可以证明这个结论。
在这里插入图片描述
结果显示,结论正确。
就接下来看看画图演示:
在这里插入图片描述
2. 在Java中“”引起来的也是String类型对象。

System.out.println(str1.length());
        System.out.println(str3.isEmpty());
        System.out.println("hello".length());

在这里插入图片描述

2.2 String对象的比较

字符串的比较是常见操作之一,比如:字符串排序。Java中总共提供了4中方式:

  1. "== "比较是否引用同一个对象

对于简单类型""是比较数值的大小,而对于引用类型“”是比较引用变量的地址。

  public static void main(String[] args) {
        //简单类型
        int a = 10;
        int b = 10;
        //引用类型
        String str1 = new String("abcdefg");
        String str2 = new String("abcdefg");
        //比较简单类型
        System.out.println(a == b);//true  false
        //比较引用类型
        System.out.println(str1 == str2);
    }
    }

在这里插入图片描述

结果显示:在基本类型中比较的是数值,而在引用类型当中比较的是地址。
2. boolean equals(Object anObject) 方法:按照字典序比较:
比较返回类型为boolean类型,相同则返回true不相同则返回false
字典序:字符大小的顺序,字符大小:字符返回的ASCII值。
String类重写了父类Object中equals方法,Object中equals默认按照==比较:

 public boolean equals(Object obj) {
        return (this == obj);
    }

因为object中equals默认按照==比较,所以我们要在String类中重写equals方法:

//在String中重写的equals方法:
public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

接下来我们来通过str1.equals(str2)比较引用类型的内容:

public static void main(String[] args) {
        String str1 = new String("abcdefg");
        String str2 = new String("abcdefg");
        String str3 = new String("ABCDEFG");
        System.out.println(str1.equals(str2));
        System.out.println(str1.equals(str3));
    }

在这里插入图片描述
通过重写equals方法,我们就可以用字典序来比较字符串的大小了。
在比较字符串的大小的时候:
第一步:我们通过字典序来比较。
第二步:当字典序相同的时候,我们可以通过字符串的长度来比较。
3. int compareTo(String s) 方法: 按照字典序进行比较:
这个和equals不同的是,返回类型不是boolean类型而是int类型,比较方式:

  1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
 public static void main(String[] args) {
        String str1 = new String("abcdefg");
        String str2 = new String("abcdefg");
        String str3 = new String("ABCDEFG");
        System.out.println(str1.compareTo(str2));
        System.out.println(str1.compareTo(str3));
    }

在这里插入图片描述
4. int compareToIgnoreCase(String str) 方法:与compareTo方式相同,但是忽略大小写比较:

public static void main(String[] args) {
        String str1 = new String("abcdefg");
        String str2 = new String("abcdefg");
        String str3 = new String("ABCDEFG");
        String str4 = new String("zhangsan");
        System.out.println(str1.compareToIgnoreCase(str2));
        System.out.println(str1.compareToIgnoreCase(str3));
        System.out.println(str1.compareToIgnoreCase(str4));
    }

在这里插入图片描述

2.3 字符串查找

字符串查找也是字符串中非常常见的操作,String类提供的常用查找的方法:

  1. public char charAt(int index)从字符串中拿到一个字符。

在String类中的方法是这么实现的。
在这里插入图片描述
自己来实现一下这个方法:

public static void main(String[] args) {
        String str1 = new String("abcdef");
        char ch = str1.charAt(0);//'a'
        char ch1 = str1.charAt(1);//'b'
        char ch2 = str1.charAt(-1);//抛异常
        char ch3 = str1.charAt(6);//抛异常
        System.out.println(ch);
        System.out.println(ch1);
        System.out.println(ch2);
        System.out.println(ch3);
    }
  1. int indexOf(int ch) 返回字符的下标,找不到就返回-1,从头开始一个一个找。
    我们来实现一下这个方法:
public static void main(String[] args) {
        String str1 = new String("abcdef");
        System.out.println(str1.indexOf('a'));
        System.out.println(str1.indexOf('b'));
        System.out.println(str1.indexOf('z'));
    }

在这里插入图片描述
3. int indexOf(int ch, intfromIndex) 从指定位置开始找这个字符,找到返回下标,找不到就返回-1。
我们来实现这个方法:

 public static void main(String[] args) {
        String str = new String("hello");
        System.out.println(str.indexOf('l', 3));
    }

在这里插入图片描述
4. int indexOf(String str) 从头开始在字符串A找字符串B,找到了返回字符串A中字符串B的第一个下标,比如:字符串A"hello",字符串B"llo"则返回"llo"在字符串A的下标,找不到就返回-1.
我们来实现这个方法:|

 public static void main(String[] args) {
        String str = new String("hello");
        System.out.println(str.indexOf("llo"));
        System.out.println(str.indexOf("all"));
    }

在这里插入图片描述
5 . int indexOf(String str, intfromIndex) 在指定位置从字符串A中找字符串B,找到还是一样返回字符串A中字符串B的第一个下标。找不到返回-1.
我们来实现这个方法:

public static void main(String[] args) {
        String str = new String("hello");
        System.out.println(str.indexOf("llo", 2));
        System.out.println(str.indexOf("llo", 4));
    }

在这里插入图片描述
6. int lastIndexOf(int ch) 从字符串最后的位置找目标字符,找到就返回其下标,找不到就返回-1.
我们来实现这个方法:

 public static void main(String[] args) {
        String str = new String("hello");
        System.out.println(str.lastIndexOf('o'));
        System.out.println(str.lastIndexOf('a'));
    }

在这里插入图片描述
**【注意】**这个找到的下标还是从前往后数的下标,而不是从后往前数的。
7. int lastIndexOf(int ch, intfromIndex) 这个是从指定位置,往后找这个字符,找到返回其下标,找不到就返回-1.
我们来实现这个方法:

 public static void main(String[] args) {
        String str = new String("hello");
        System.out.println(str.lastIndexOf('l', 4));
        System.out.println(str.lastIndexOf('l', 1));

在这里插入图片描述
8. int lastIndexOf(String str) 从后往前在字符串A中找字符串B,找到了返回字符串A中字符串B的第一个下标,找不到就返回-1.
我们来实现这个方法:

 public static void main(String[] args) {
        String str = new String("hello");
        System.out.println(str.lastIndexOf("llo"));
        System.out.println(str.lastIndexOf("lle"));

在这里插入图片描述
9. int lastIndexOf(String str, intfromIndex) 从指定位置从后往前在字符串A中找字符串B,找到了返回字符串A中字符串B的第一个下标,找不到就返回-1.
我们来实现这个方法:

  public static void main(String[] args) {
        String str = new String("hello");
        System.out.println(str.lastIndexOf("llo", 4));
        System.out.println(str.lastIndexOf("llo", 1));

在这里插入图片描述

2.4 转化

1. 数值和字符串转化

public static void main(String[] args) {
        //数字转字符串
        String str = String.valueOf(123);
        System.out.println(str);
        //字符串转数字
        Integer ii = Integer.valueOf("123");
        System.out.println(ii);
    }

字符串转化其他类型,构成了一个重载方法:String.valueOf()
在这里插入图片描述
其他类型转化String类型:
Integer.valueOf()
Float.valueOF()

2. 大小写转换

public static void main(String[] args) {
        String str = new String("abc");
        String str1 = new String("ABC");
        //小写转化为大写
        System.out.println(str.toUpperCase());
        //大写转化小写
        System.out.println(str1.toLowerCase());
    }

在这里插入图片描述
3. 字符串转数组
字符串转化数组
toCharArray()

 public static void main(String[] args) {
        String str ="abc";
        char[] chars = str.toCharArray();
        System.out.println(Arrays.toString(chars));
    }

在这里插入图片描述
数组转化为字符串

 public static void main(String[] args) {
        char[] chars = {'1','2','3'};
        String str = new String(chars);
        System.out.println(str);
    }

4.格式化
String.format()

public static void main(String[] args) {
        String s = String.format("%d-%d-%d", 2019, 9,14);
        System.out.println(s);

    }

2.5 字符串替换

使用一个指定的新的字符串替换掉已有的字符串数据,可用的方法如下:
1.String replaceAll(String regex, String replacement) 替换所有指定的内容
String regex:被替换的内容
String replacement:替换的内容

public static void main(String[] args) {
        String str = "helloworld";
        System.out.println(str.replaceAll("l", "+"));
    }

2.String replaceFirst(String regex, String replacement) 替换首个内容
String regex:在被替换的内容中出现第一次的内容
String replacement:替换的内容

 public static void main(String[] args) {
        String str = "helloworld";
         System.out.println(str.replaceFirst("l", "+"));
}

在这里插入图片描述
注意事项: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

2.6 字符串拆分

可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串。
可用方法如下:
1.String[] split(String regex) 将字符串全部拆分,将字符串拆分,用字符串数组来接收。
String regex:以指定的格式拆分

public static void main(String[] args) {
        String str = "hello world java SE";
        String[] ret = str.split(" ");
        for (String s:ret) {
            System.out.println(s);
        }
    }

2.String[] split(String regex, int limit) 将字符串以指定的格式,拆分为limit组
String regex:以指定的格式拆分
int limit:拆分几组

public static void main(String[] args) {
        String str = "hello world java SE";
        String[] ret = str.split(" "2);
        for (String s:ret) {
            System.out.println(s);
        }
    }

注意事项:

  1. 字符"|“,”*“,”+"都得加上转义字符,前面加上 “\” .
  2. 而如果是 “” ,那么就得写成 “\\” .
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

2.7 字符串截取

从一个完整的字符串之中截取出部分内容。可用方法如下:
1.String substring(int beginIndex) 从指定位置截取到结尾
int beginIndex:指定位置

String str = "helloworld" ;
System.out.println(str.substring(5));

2.String substring(int beginIndex, int endIndex) 截取部分内容
int beginIndex:截取的开始位置
int endIndex: 截取的结束位置

String str = "helloworld" ;
System.out.println(str.substring(0, 5));

注意事项:

  1. 索引从0开始
  2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

2.8 字符串的不可变性

String是一种不可变对象. 字符串中的内容是不可改变。字符串不可被修改,是因为:
1. String类在设计时就是不可改变的,String类实现描述中已经说明了:
在这里插入图片描述
在这里插入图片描述
String类中的字符实际保存在内部维护的value字符数组中,该图还可以看出:

  1. String类被final修饰,表明该类不能被继承
  2. value被修饰被final修饰,只能引用当前初始化好的对象不能引用其他对象,但是其引用空间中的内容可以修改。
    2. 所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

最后总结一下:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。这种说法是错误的。
字符串不可变的原因有两点:
1.String类被final修饰,表明该类不能被继承
2.value被修饰被final修饰,只能引用当前初始化好的对象不能引用其他对象,但是其引用空间中的内容可以修改

2.11 字符串修改

注意:尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。
我们通过拼接符“+”确实可以对字符串进行修改,但是这样的效率太慢了。

public static void main(String[] args) {
String s = "hello";
s += " world";
System.out.println(s); // 输出:hello world
}

但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。
关于这些临时变量怎么可以看到,我们可以通过反汇编的方式可以看到:
在这里插入图片描述
在这里插入图片描述
根据上面的图片我们可以看到有两个新的类:StringBuilder和StringBuffer
在这两个类中字符串是可以改变的。
接下来我们来看看这两个类把!

3.StringBuilder和StringBuffer

3.1 StringBuilder的介绍

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的,这里介绍 StringBuilder常用的一些方法:
在这里插入图片描述
在这里插入图片描述
从上述方法可以看出:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。频繁修改字符串的情况考虑使用StringBuilder。
这些方法我就不一一解释了,和上述String类方法差不多。
结尾:
希望大家可以给我点点关注,点点赞,你们的支持就是我的最大鼓励。🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹🌹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/201434.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C 语言经典100例】C 练习实例9

题目&#xff1a;要求输出国际象棋棋盘。 程序分析&#xff1a;国际象棋棋盘由64个黑白相间的格子组成&#xff0c;分为8行*8列。用i控制行&#xff0c;j来控制列&#xff0c;根据ij的和的变化来控制输出黑方格&#xff0c;还是白方格。 #include<stdio.h>int main() {…

从 Elasticsearch 到 SelectDB,观测云实现日志存储与分析的 10 倍性价比提升

作者&#xff1a;观测云 CEO 蒋烁淼 & 飞轮科技技术团队 在云计算逐渐成熟的当下&#xff0c;越来越多的企业开始将业务迁移到云端&#xff0c;传统的监控和故障排查方法已经无法满足企业的需求。在可观测理念逐渐深入人心的当下&#xff0c;人们越来越意识到通过多层次、…

YOLOv5小目标检测层

目录 一、原理 二、yaml配置文件 一、原理 小目标检测层,就是增加一个检测头,增加一层锚框,用来检测输入图像中像素较小的目标 二、yaml配置文件 # YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters nc: 3 # number of classes depth_multiple: 0.33 # model…

案例,linux环境下OpenCV+Java,实现证件照在线更换背景色

先看效果&#xff08;图片来自网络&#xff0c;如有侵权&#xff0c;请联系作者删除&#xff09; 主要是通过java实现的&#xff0c;linux环境编译安装opencv及证件照背景色更换的核心算法在前面一篇文章中有写到。 目前算法还有瞎呲&#xff0c;当照片光线不均的时候会出现误…

低调使用。推荐一个 GPT4 Turbo、Vision、GPTs、DELL·E3 等所有最新功能同步可用国内网站

在 11 月 6 日&#xff0c;万众期待的 OpenAI DevDay&#xff0c;ChatGPT 发布了一系列新的产品&#xff0c;其中推出了 GPT4 Turbo&#xff0c;并且将GPT4 Vision&#xff0c;DELLE3 等等能力全部集合到一起&#xff0c;不需要再分开使用&#xff0c;原来的局限的文本聊天也进…

创业公司or大厂怎么选?不是凡尔赛,一个技巧让你涨薪10W!

最近总有一些特别“凡尔赛”的发几个 offer 问我选择哪个&#xff1f;其中比较典型的一个问题就是&#xff1a; “一个是处于上升期的创业型公司 &#xff0c;一个行业大厂&#xff0c;薪资待遇差不多&#xff0c;到底该如何进行选择和取舍呢&#xff1f;“ 这个问题不是个别…

Spring---对象的存储和读取

文章目录 Spring对象的存储创建Bean对象将Bean对象存储到spring中添加配置文件存储Bean对象 Spring对象的读取得到Spring上下文对象从Spring中取出Bean对象使用Bean对象 Spring对象的存储 创建Bean对象 Bean对象其实就是一个普通的Java对象。我们按照创建Java对象的方式来创建…

48个代码大模型汇总,涵盖原始、改进、专用、微调4大类

代码大模型具有强大的表达能力和复杂性&#xff0c;可以处理各种自然语言任务&#xff0c;包括文本分类、问答、对话等。这些模型通常基于深度学习架构&#xff0c;如Transformer&#xff0c;并使用预训练目标&#xff08;如语言建模&#xff09;进行训练。 在对大量代码数据的…

配电网重构单时段+多时段(附带matlab代码)

配电网重构单时段多时段 对于《主动配电网最优潮流研究及其应用实例》的基本复现 简介&#xff1a;最优潮流研究在配电网规划运行中不可或缺&#xff0c;且在大量分布式能源接入的主动配电网环境下尤为重要。传统的启发式算法在全局最优解和求解速度上均无法满足主动配电网运行…

什么是计算机病毒?

计算机病毒 1. 定义2. 计算机病毒的特点3. 计算机病毒的常见类型和攻击方式4. 如何防御计算机病毒 1. 定义 计算机病毒是计算机程序编制者在计算机程序中插入的破坏计算机功能或者破坏数据&#xff0c;影响计算机使用并且能够自我复制的一组计算机指令或程序代码。因其特点与生…

【面试】typescript

目录 为什么用TypeScript&#xff1f; TS和JS的区别 控制类成员可见性的访问关键字&#xff1f; public protected&#xff09;&#xff0c;该类及其子类都可以访问它们。 但是该类的实例无法访问。 私有&#xff08;private&#xff09;&#xff0c;只有类的成员可以访问…

什么是媒体发布?媒体发布平台有哪些?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 一&#xff0c;什么是媒体发布&#xff1f; 媒体发布是指利用互联网媒体及移动端媒体和传统媒体发布关于人物、品牌、商业公司等的新闻及推广软文和传记等的行为。媒体平台可以是电视、…

C51--LCD1602显示屏

LCD602显示&#xff1a; 1、概述 LCD602是一种工业字符型液晶&#xff0c;能够同时显示16x02&#xff0c;即32字符&#xff08;16列&#xff0c;2行&#xff09; 2、引脚&#xff1a; VSS&#xff1a;电源地VDD&#xff1a;电源正极——5V电源VO&#xff1a; 液晶显示偏压 …

激光切割机切割工件出现锯齿是什么原因?

金属激光切割机因切割速度快&#xff0c;效率高&#xff0c;切割效果好受到广大金属加工需求的厂家追捧&#xff0c;但在使用时不免出现一些小问题&#xff0c;如&#xff1a;在激光切割加工的时候出现锯齿的问题。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff…

详解Python中httptools模块的使用

httptools 是一个 HTTP 解析器&#xff0c;它首先提供了一个 parse_url 函数&#xff0c;用来解析 URL。这篇文章就来和大家聊聊它的用法吧&#xff0c;感兴趣的可以了解一下 如果你用过 FastAPI 的话&#xff0c;那么你一定知道 uvicorn&#xff0c;它是一个基于 uvloop 和 h…

京东API商品详情接口,通过商品ID获取商品名称,淘宝主图,价格,颜色规格尺寸,库存,SKU数据等调用示例

要接入京东API接口以采集电商平台上的商品数据&#xff0c;可以按照以下步骤进行&#xff1a; 注册并获取API密钥&#xff1a;在使用API接口之前&#xff0c;需要注册并获取API密钥。API密钥是识别身份的唯一标识符。每个API接口都有自己的注册、认证和授权过程&#xff0c;因…

Find My电容笔|苹果Find My技术与电容笔结合,智能防丢,全球定位

随着平板电脑的流行&#xff0c;有不少厂商都投入到了电容笔的开发当中&#xff0c;现在的电容笔不仅在精度上有了提高&#xff0c;甚至在笔触和压感上的研究都有进步。电容笔是利用导体材料制作的具有导电特性、用来触控电容式屏幕完成人机对话操作用的笔&#xff0c;电容笔通…

tsx语法

安装JSX库 安装完之后在vite.config.ts进行插件使用&#xff0c;代码如下&#xff1a; 然后就可以愉快的使用TSX来开发Vue组件了&#xff0c;下面主要说一下SFC和TSX的部分区别。 基本语法对照 defineComponent 和 setup setup中函数的返回值有多种方式&#xff0c;可以直接…

异常数据检测 | Python实现oneclassSVM模型异常数据检测

支持向量机(SVM)的异常检测 SVM通常应用于监督式学习,但OneClassSVM[8]算法可用于将异常检测这样的无监督式学习,它学习一个用于异常检测的决策函数其主要功能将新数据分类为与训练集相似的正常值或不相似的异常值。 OneClassSVM OneClassSVM的思想来源于这篇论文[9],SVM使用…

挑战传统IT:RPA以更低的成本和更高的效率领跑数字化转型

在企业数字化进程中&#xff0c;传统的IT解决方案往往带来高成本和低效率的问题。因此&#xff0c;如何顺利地、平稳地进行数字化转型对企业来说是核心考虑。 为此&#xff0c;本文将深入探讨RPA&#xff08;Robotic Process Automation&#xff09;如何以其独特的优势&#xf…