【JavaSE】String类详解

news2024/11/15 20:01:43

目录

前言

1. 什么是String类

1.1 String的构造

1.2 String类的基本操作:打印、拼接、求字符串长度

2. String类的常用方法

2.1 字符串查找

2.2 字符串替换

2.3 字符串拆分

2.4 字符串截取

2.5 字符串和其他类型的转换

2.6 去除字符串左右两边的空格

3. String对象的比较

3.1 比较字符串是否相等

3.2 比较字符串大小 

4. 字符串不可变性

5. StringBuilder和StringBuffer:字符串修改

结语


前言

在C语言中,字符串单纯是字符数组的另一种叫法,我们是通过指针去操作它;而在Java中,却是有实打实的字符串类型,那就是String类,我们可以用String直接创建一个字符串出来。今天就让我们一起来学习一下Java中的String类以及它的一些常用方法吧

1. 什么是String类

概述:字符串是由多个字符组成的一串数字,也就是字符序列。在Java中所有的字符串变量都可以看作是字符串对象

1.1 String的构造

字符串有很多构造方式,常用的有以下三种:直接构造、使用new String构造、使用字符数组帮忙构造,我们最常用的还是第一种直接构造

    public static void main(String[] args) {
        //第一种:直接构造
        String str1 = "hello";

        //第二种:使用new String构造
        String str2 = new String("hello");

        //第三种:使用字符数组帮忙构造
        char[] chars = {'h','e','l','l','o'};
        String str3 = new String(chars);
    }

1.2 String类的基本操作:打印、拼接、求字符串长度

打印:直接打印

        String str = "hello";
        System.out.println(str);//hello

拼接:直接+=

        String str = "hello";
        str += "world";
        System.out.println(str);//helloworld

但是此类方法有瑕疵,在每次拼接的时候都会创建一个新的字符串,导致效率低下,关于这个问题,我们在下面会讲解到怎么高效拼接字符串


求字符串长度:和数组类似,数组求长度是用array.length,字符串求长度使用str.lengtg( )

        //求数组长度
        int[] array = {1,2,3,4,5};
        System.out.println(array.length);//5
        //求字符串长度
        String str = "hello";
        System.out.println(str.length());//5


2. String类的常用方法

2.1 字符串查找

(1)char charAt(int index):返回index位置上的字符,如果index为负或者越界,就返回异常。我们可以用它来拆分一个字符串

        String str = "hello";
        char ch = str.charAt(4); //从零开始
        System.out.println(ch); //o

如果index是违法的,就会返回异常

我们可以用它来将字符串拆解成一个个字符存入字符数组,此时得到的字符数组ch就存放了字符串的所有字符

        String str = "hello";
        char[] ch = new char[str.length()];
        for (int i = 0; i < str.length(); i++) {
            ch[i] = str.charAt(i);
        }

(2)int indexOf(int ch):返回ch第一次出现的位置,没有就返回-1

        String str = "hello";
        int ret = str.indexOf('o');
        System.out.println(ret);//4

(3)int indexOf(int ch,int fromIndex):从fromIndex位置开始找ch第一次出现的位置,没有就返回-1

        String str = "hello";
        int ret1 = str.indexOf('l',3);
        System.out.println(ret1);//3
        int ret2 = str.indexOf('l',4);
        System.out.println(ret2);//-1

(4)int indexOf(String str):返回str第一次出现的位置,没有就返回-1

        String str = "helloworld";
        int ret = str.indexOf("world");
        System.out.println(ret);//5

(5)int indexOf(String str,int fromIndex):从fromIndex位置开始找str第一次出现的位置,没有就返回-1

        String str = "helloworld";
        int ret1 = str.indexOf("world",5);
        System.out.println(ret1);//5
        int ret2 = str.indexOf("world",6);
        System.out.println(ret2);//-1

(6)int lastIndexOf(int ch):从后往前找,返回ch第一次出现的位置,没有就返回-1

        String str = "hello";
        int ret = str.lastIndexOf('e');
        System.out.println(ret);//1

(7)int lastIndexOf(int ch,int fromIndex):从fromIndex位置开始,从后往前找ch第一次出现的位置,没有就返回-1

        String str = "hello";
        int ret1 = str.lastIndexOf('e',3);
        System.out.println(ret1);//1
        int ret2 = str.lastIndexOf('e',0);
        System.out.println(ret2);//-1

(8) int lastIndexOf(String str):从后往前找,返回str第一次出现的位置,没有就返回-1

        String str = "hello";
        int ret = str.lastIndexOf("ll");
        System.out.println(ret);//2

(9) int lastIndexOf(String str,int fromIndex):从fromIndex位置开始,从后往前找str第一次出现的位置,没有就返回-1

        String str = "hello";
        int ret1 = str.lastIndexOf("ll",4);
        System.out.println(ret1);//2
        int ret2 = str.lastIndexOf("ll",1);
        System.out.println(ret2);//-1

关于字符串查找:

  1. 当我们要提取字符串中某个索引位置的字符时,可以使用charAt方法
  2. 当我们想要查找某个字符或者某个字符串的位置时,从前往后的使用indexOf方法,从后往前的使用lastIndexOf方法

2.2 字符串替换

(1)String replace(char oldChar,char newChar):字符整体替换

(2)String replace(String target,String replacement):字符串整体替换

(3)String replaceFirst(String regex,String replacement):替换字符串首个内容

(4)String replaceAll(String regex,String replacement):替换字符串所有指定内容

        String str = "abcab";
        String ret1 = str.replace('a','h');
        String ret2 = str.replace("ab","hh");
        String ret3 = str.replaceFirst("ab","hh");
        String ret4 = str.replaceAll("ab","hh");
        System.out.println(ret1);//hbchb
        System.out.println(ret2);//hhchh
        System.out.println(ret3);//hhcab
        System.out.println(ret4);//hhchh

我们可以发现,第二个和第四个方法的功能是重合的,它们都能将字符串中的某个字符串整体替换掉


2.3 字符串拆分

(1)String[ ] split(String regex):将字符串全部拆分

(2)String[ ] split(String regex, int limit):将字符串拆分成limit组

        String str1 = "hello world";
        String[] ret1 = str1.split(" ");
        for (String s : ret1) {
            System.out.println(s);
        }
        System.out.println("=========");
        String str2 = "hello world hello life";
        String[] ret2 = str2.split(" ",2);
        for (String s : ret2) {
            System.out.println(s);
        }

 

我们常用来拆分一些字符,如邮箱123456@qq.com,但是有一些特殊字符作为分割符无法正确切分,需要在它的前面加上转义

        String str = "123456.abc.654321";
        String[] ret = str.split("\\.");
        for (String s : ret) {
            System.out.println(s);
        }

注意事项:

  • 字符 “ . ”,“ | ”,“ * ”," + "都是特殊字符,都得在前面加上“ \\ ”才能转义并正确切分
  • 如果是字符“ \ ”,那就需要写成“ \\ ”,因为它本身也是需要转义的
  • 如果需要多个分隔符,那就可以在中间加上“ | ”作为连字符,“ | ”作为连字符时不需要转转义
        String str = "123456@qq.com";
        String[] ret = str.split("@|\\.");
        for (String s : ret) {
            System.out.println(s);
        }


2.4 字符串截取

(1)String substring(int beginIndex):从指定索引截取到结尾

(2)Stirng snbString(int beginIndex, int endIndex):截取部分内容(左闭右开)

        String str = "hello";
        System.out.println(str.substring(1));
        System.out.println(str.substring(1,4)); //左闭右开


2.5 字符串和其他类型的转换

(1)数值和字符串的转换(在转换对象时记得重写toString方法)

String String.valueOf(数值)

        String str1 = String.valueOf(1234);
        System.out.println(str1);
        String str2 = String.valueOf(new Student("张三",18));
        System.out.println(str2); //对象也可以转换

 


(2)大小写转换:

小写转大写——str.toUpperCase( )

大写转小写——str.toLowerCase( )

        String str = "hello";
        String str1 = str.toUpperCase();//小写转大写
        System.out.println(str1);
        String str2 = str.toLowerCase();//大写转小写
        System.out.println(str2);

 


(3) 数组和字符串的转换:

字符串转数组——char[ ] String.toCharArray()

数组转字符串——直接new String(charName)

        String str1 = "world";
        char[] ch1 = str1.toCharArray();
        for (int i = 0; i < ch1.length; i++) {
            System.out.print(ch1[i]+" ");
        }
        System.out.println();
        System.out.println("==========");
        char[] ch2 = {'h','e','l','l','o'};
        String str2 = new String(ch2);
        System.out.println(str2);


2.6 去除字符串左右两边的空格

String String.trim()

        String str = "    a b c   ";
        System.out.println(str.trim());
        System.out.println("["+str.trim()+"]");

 


3. String对象的比较

String是引用类型,它的内部存储的并不是字符串本身,而是地址

正是因为这样,所有我们没办法直接比较两个字符串的谁大谁小,是否相等

3.1 比较字符串是否相等

(1)直接用“ == ”比较

        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1 == str2);

        String str3 = new String("cba");
        String str4 = new String("cba");
        System.out.println(str3 == str4);

可以猜猜看,两个打印的结果是多少?

为什么会这样呢?实际上这就是String类的特殊之处了。

  • 我们直接构造str1时,它会在字符串常量池中存入“abc”,str1就指向这个地址,而在构造str2的时候,由于是直接构造,且内容一致,字符串常量池就不会再重现创建一份,str2也指向了同一地址。
  • 但是str3和str4是使用new对象出来的,它们会各自在堆中开辟空间存放字符串的内容,str3和str4指向的地址就不一样了 

(2)使用boolean equals(Object anObject)方法来判断字符串是否相等

        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1.equals(str2));
        
        String str3 = new String("cba");
        String str4 = new String("cba");
        System.out.println(str3.equals(str4));

运行结果如下

由此我们可以看出,equal方法跟直接比较不同,它可以根据对象中的内容来判断是否相等,当两字符串内容相等时,就会返回true,反之返回false


3.2 比较字符串大小 

(字符串比较大小是根据每个位置上的字符的ASCII码值大小来比较的)

(1)int compareTo(String str):用来判断字符串的大小,大于返回大于零,小于返回小于零,相等返回零

(2)int compareToIgnoreCase(String str):功能跟上面的一样,但是它可以忽略大小写比较

        String str1 = "abc";
        String str2 = "cba";
        String str3 = "ABC";
        System.out.println(str1.compareTo(str2));
        System.out.println(str1.compareToIgnoreCase(str3));

 


4. 字符串不可变性

String是一种不可变对象,字符串在初始化后里面的内容就是不可改变的

我们之前对字符串进行的操作都会创建一个新的对象,我们改变的是新对象,所以我们需要尽量避免直接对String类型的对象进行修改,所有的修改都会创建对象,效率非常低

例如:String str = “abc”;

           System.out.println(str + “def”);

5. StringBuilder和StringBuffer:字符串修改

由于String不可更改的性质,Java又给我们提供给了方法来修改字符串,也就是StringBuilder和StringBuffer。在这里我们简单演示一下StringBuilder该怎么使用:

        StringBuilder str = new StringBuilder("abc");
        System.out.println(str.append("def"));

StringBuilder也是一种引用类型,我们可以像String一样创建对象,然后使用str.append(“xxx”)在str尾部追加,用来拼接其他字符串,这样的好处在于:它不会产生额外的对象,效率非常高。

要注意的是:String和StringBuilder类不能直接转换,要想转换得使用特殊方法

  • String >>> StringBuilder:利用StringBuilder的构造方法或者是append()方法
  • StringBuilder >>> String:调用toString()方法

StringBuffer和StringBuilder功能十分相似,差别在于StringBuffer采用同步处理,属于线程安全操作,但是效率相对较低;而StringBuilder则未采用同步处理,属于线程不安全操作,但效率相对较高

结语

关于String类,今天就介绍到这里。总的来说,Java中的字符串跟C语言中的字符串完全不同,Java是直接提供了一种String类型,让我们可以更加方便的操作字符串,同时也提供了很多方法。今天介绍的都是一些常用方法,除此之外还有字符串反转、字符串扩容、删除字符等等,大家可以根据需求自行查阅文档。

希望大家能喜欢这篇文章,有总结不到位的地方还请多多谅解,若有出现纰漏,希望大佬们看到错误之后能够在私信或评论区指正,博主会及时改正,共同进步!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大模型 智能体 智能玩具 智能音箱 构建教程 wukong-robot

视频演示 10:27 一、背景 继上文《ChatGPT+小爱音响能擦出什么火花?》可以看出大伙对AI+硬件的结合十分感兴趣,但上文是针对市场智能音响的AI植入,底层是通过轮询拦截,算是hack兼容,虽然官方有提供开发者接口,也免不了有许多局限性(比如得通过特定指令唤醒),不利于我…

计算机网络——29ISP之间的路由选择:BGP

ISP之间的路由选择&#xff1a;BGP 层次路由 一个平面的路由 一个网络中的所有路由器的地位一样通过LS&#xff0c;DV&#xff0c;或者其他路由算法&#xff0c;所有路由器都要知道其他所有路由器&#xff08;子网&#xff09;如何走所有路由器在一个平面 平面路由的问题 …

JavaEE初阶Day 4:多线程(2)

目录 Day4&#xff1a;多线程&#xff08;2&#xff09;1. catch语句2. sleep的处理3. Thread3.1 Thread构造方法3.2 Thread的属性3.2.1 ID3.2.2 优先级3.2.3 后台线程3.2.4 存活3.2.5 start3.2.6 中断3.2.6.1 控制线程结束代码3.2.6.2 interrupt和isInterrupted Day4&#xff…

学习笔记——微信小程序读取当前时间

<view class"box"><text>日期:</text><view class"date">{{obtaindate}}</view></view> wxml中定义了一个文本元素&#xff0c;通过{{obtaindate}}获取js页面传递的日期数据 data:{obtaindate:"" }, onlo…

公链角逐中突围,Solana 何以成为 Web3 世界的流量焦点?

在众多区块链公链中&#xff0c;Solana 凭借其创纪录的处理速度和极低的交易费用&#xff0c;成为了众多开发者和投资者的宠儿。就像网络上流行的那句话所说&#xff1a;“Why slow, when you can Solana?”&#xff0c;Solana 正以它的速度和强大的生态系统&#xff0c;重新定…

nacos的各种类型的配置文件 yml 、json、 Properties、 text 等文件类型 发生变化怎么热更新,实现实时监听nacos配置文件变化

本文用的是 Nacos作为配置中心注册监听器方法 实现热更新 nacos 配置文件 从而不用重启项目 依赖、工具类 这边就不写了 因为项目用的是 Json 类型的配置文件 所以下文 主要是对json文件进行实现 别的文件大同小异 先说扯淡的东西 在nacos 的配置文件中 dataId 这两种声明 是…

Postman传对象失败解决

文章目录 情景复现解决方案总结 情景复现 postman中调用 debug发现pId传入失败 分析解释&#xff1a; 实体类中存在pId、uid和num字段 controller层将GoodsCar作为请求体传入 解决方案 当时觉得很奇怪&#xff0c;因为uid和num可以被接收&#xff0c;而pId和num的数据类型相…

图腾柱PFC:HP1010为您的电动两轮车之旅提供绿色,高效,安全的动力

电动两轮车不仅为当今生活提供了便利&#xff0c;更是一种健康和绿色的出行方式。想象一下&#xff0c;在经过一整晚的充分休息&#xff0c;骑上爱车&#xff0c;满血复活的准备开始新的一天。您会愿意带着如何给心爱的两轮车充电的担心开始这一天吗&#xff1f; 随着越来越…

HackTheBox-Machines--Legacy

文章目录 1 端口扫描2 测试思路3 445端口漏洞测试4 flag Legacy 测试过程 1 端口扫描 nmap -sC -sV 10.129.227.1812 测试思路 目标开启了135、139、445端口&#xff0c;445 SMB服务存在很多可利用漏洞&#xff0c;所以测试点先从445端口开始。而且在Nmap扫描结果中&#xff0c…

Unity 窗口化设置

在Unity中要实现窗口化&#xff0c;具体设置如下&#xff1a; 在编辑器中&#xff0c;选择File -> Build Settings。在Player Settings中&#xff0c;找到Resolution and Presentation部分。取消勾选"Fullscreen Mode"&#xff0c;并选择"Windowed"。设…

Unity2018发布安卓报错 Exception: Gradle install not valid

Unity2018发布安卓报错 Exception: Gradle install not valid Exception: Gradle install not valid UnityEditor.Android.GradleWrapper.Run (System.String workingdir, System.String task, System.Action1[T] progress) (at <c67d1645d7ce4b76823a39080b82c1d1>:0) …

通用指南-营销和设计中的增强现实(AR)

原文作者&#xff1a;Superside 翻译&#xff1a;数字化营销工兵 --- 经典万字长文&#xff0c;权威解读&#xff0c;分享经典&#xff0c;预计阅读完需要30分钟&#xff0c;建议收藏&#xff01; 目录 一、引言 为什么要尝试AR AR到底是什么&#xff1f;营销人员和创意人…

网络工程师实验命令(华为数通HCIA)

VRP系统的基本操作 dis version #查看设备版本信息 sys #进入系统视图 system-name R1 #改设备名字为R1进入接口配置IP地址 int g0/0/0 ip address 192.168.1.1 255.255.255.0 #配置接口地址为192.168.1.1/255.255.255.0 ip address 192.168.1.2 24 sub #此…

Intellij IDEA安装配置Spark与运行

目录 Scala配置教程 配置Spark运行环境 编写Spark程序 1、包和导入 2、定义对象 3、主函数 4、创建Spark配置和上下文 5、定义输入文件路径 6、单词计数逻辑 7、输出结果 8、完整代码&#xff1a; Scala配置教程 IDEA配置Scala&#xff1a;教程 配置Spark运行环境 …

持续集成流程主要系统构成介绍(CI)

目录 一、概述 二、版本控制系统 2.1 概述 2.2 版本控制系统使用流程示意图 2.3 版本控制软件划分 2.3.1 集中式版本控制软件 2.3.2 分布式版本控制软件 2.3.3 总结 2.4 常用版本控制软件介绍 三、编译构建系统 3.1 概述 3.2 编译构建流程示意图 3.3 列举Java 源码…

uniApp使用XR-Frame创建3D场景(5)材质贴图的运用

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这篇我们讲解在xr-frame中如何给几何体赋予贴图材质。 先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"><xr-node><xr-assets><xr-asse…

向量法求点在直线上的投影

已知直线上两点a、b和直线外一点p&#xff0c;求p在直线ab上的投影点。 根据《计算几何之 点在直线上的投影 代码模板与证明》一文中所述&#xff0c;p的投影点p’就是a x ⃗ \vec x x &#xff08;直线的点向式&#xff09;&#xff0c;所以我们只要求出 x ⃗ \vec x x 就能…

基于单片机的二维码LCD显示控制设计

**单片机设计介绍&#xff0c;基于单片机的二维码LCD显示控制设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的二维码LCD显示控制设计是一个集硬件、软件与通信于一体的综合性项目。此设计的主要目标是实现单片机…

AI新工具 又一个开源大模型DBRX击败GPT3.5;根据音频和图像输入生成会说话、唱歌的动态视频

✨ 1: AniPortrait 腾讯开源&#xff1a;根据音频和图像输入生成会说话、唱歌的动态视频 AniPortrait 是个先进的框架&#xff0c;专门用来生成高质量的、由音频和参考肖像图片驱动的动画。如果你有视频&#xff0c;也可以用来实现面部的再现&#xff08;Face reenactment&am…

Windows 最佳文件管理器:快速、简单、直观、自由 | 开源日报 No.175

files-community/Files Stars: 30.6k License: MIT Files 是为 Windows 构建的最佳文件管理器应用程序。该项目解决了在 Windows 上进行文件管理时的困难。 它具有以下主要功能和优势&#xff1a; 采用直观设计&#xff0c;使浏览文件变得更加简单支持标签、预览和自定义背景…