【JavaSE】String类详解

目录

前言

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类型,让我们可以更加方便的操作字符串,同时也提供了很多方法。今天介绍的都是一些常用方法,除此之外还有字符串反转、字符串扩容、删除字符等等,大家可以根据需求自行查阅文档。

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

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

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

相关文章

日赚2000万的短剧,还能火多久?

沈瑶初十年前就义无反顾地爱上高禹川&#xff0c;当他们两人再次相遇&#xff0c;她主动靠近高禹川&#xff0c;不料&#xff0c;她却意外怀孕&#xff0c;高禹川为了负责选择领证&#xff0c;但不公布两人的关系...... 这是一部情绪稳定女航医与傲娇疯批男机长的虐恋剧。在这个…

【MongoDB】一问带你深入理解什么是MongDB,MongoDB超超详细保姆级教程

目录 1、MongoDB概述2、MongoDB 主要特点2.1、文档2.2、集合2.3、数据库2.4、数据模型 3、Windows安装MongoDB3.1、下载MongoDB3.2、安装MongoDB3.3、配置MongoDB 4、Linux安装MongoDB4.1、下载MongoDB4.2、解压安装4.3、安装一个可视化工具 5、MongoDB基本操作及增删改查5.1、…

【案例·增】获取当前时间、日期(含,SQL中DATE数据类型)

问题描述&#xff1a; 需要使用当前时间、日期&#xff0c;可以使用 SQL 中的 CURDATE() 、NOW()、CURTIME()运算符 案例&#xff1a; INSERT INTO table_name(current_time, column_name2,...) VALUES (NOW(),, ...)规则(Date 相关函数)&#xff1a; 规则(Date数据类型)

构建一个包含mvn命令的Java 17基础镜像

前言 官方提供的openjdk基础镜像&#xff0c;不包含mvn命令&#xff0c;无法用容器来打包代码。 在官方提供的镜像基础上安装maven。 前期准备&#xff0c;需要安装好docker。 一、安装maven 1、下载openjdk基础镜像&#xff0c;执行如下代码。 docker pull openjdk:17-j…

19. 变量

文章目录 一、变量二、变量的定义格式 一、变量 变量&#xff1a;程序中临时存储数据的容器&#xff0c;在程序执行过程中&#xff0c;其值有可能发生改变的量&#xff08;数据&#xff09;。但是这个容器中只能存一个值。 应用场景&#xff1a;在我们登录页面的时候&#xf…

JavaSE day14笔记

第十四天课堂笔记 课上: 适当做笔记课下 : 总结 , 读代码 , 反复敲代码 , 做练习 数组★★★ 数组 : 存储多个 同一类型 的容器格式 :数组类型 : 引用数据类型, new运算符在堆中 分配一块连续的存储空间 , 系统会给数组元素默认初始化 , 将该数组的引用赋值给数组名 引用数据…

3月28号总结

java学习 1.this关键字 this关键字可以代表当前对象的引用。它可以在类的方法中使用&#xff0c;用于引用调用该方法的对象。通过this关键字&#xff0c;可以访问类的成员变量和方法&#xff0c;以及调用其他构造函数。 举一个实例来学习一下this关键字的作用。 比如&#…

【unity】如何汉化unity Hub

相信大家下载安装unity后看着满操作栏的英文&#xff0c;英文不好的小伙伴们会一头雾水。但是没关系你要记住你要怎么高速运转的机器进入中国&#xff0c;请记住我给出的原理&#xff0c;不懂不代表不会用啊。现在我们就来把编译器给进行汉化。 第一步&#xff1a;我们打开Uni…

QT控件之显示控件

Qt Designer显示窗口部件提供的面板中&#xff0c;提供了10种显示小部件 &#xff08;1&#xff09; Label标签 &#xff08;2&#xff09; Text Browser文本浏览器 &#xff08;3&#xff09; Graphics View图形视图 &#xff08;4&#xff09; Calendar Widget日历 &…

IU5507低功耗DC-DC降压稳压器

IU5507T是一款由基准电压源、振荡电路、比较器、PWM/PFM 控制电路等构成的 CMOS 降压DC/DC调整器。利用 PWM/PFM 自动切换控制电路达到可调占空比&#xff0c;具有全输入电压范围(3-18V)内的低纹波、高效率和大输出电流等特点。 IU5507T内置功率MOSFET&#xff0c;使用过压、过…

libVLC 捕获鼠标、键盘事件

在实现播放器的时候&#xff0c;我们需要捕获键盘、鼠标事件进行视频快进、快退&#xff0c;或者双击全屏/退出全屏窗口、鼠标右键弹出菜单栏。默认情况下&#xff0c;在使用libVLC库的时候&#xff0c;我们无法捕获这些事件&#xff0c;因为我们将Qt的视频窗口传递给了libVLC。…

损坏的RAID5csp

1.解题思路 这道题太抽象了&#xff0c;一开始都没太搞懂在讲啥。。。解决该题需要了解条带、磁盘号的定义。 下图以样例2&#xff0c;输入编号为5的块为例&#xff1a; 请务必加上ios::sync_with_stdio(false),否则会超时只有30分 2.满分代码 #include<iostream> us…

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本&#xff1a; HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前&#xff0c;需要首先启动Hadoop&#xff0c;然后再启动HBase&#xff0c;并且启动HBase Shell&#xff0c;进入Shell命令提示符状态&#xff0c;具体命令如下&#xff1a; $ cd /usr/local…

Hello算法2:复杂度分析

Hello算法2&#xff1a;复杂度分析 本文是基于k神的Hello 算法的读书笔记&#xff0c;请支持实体书。 https://www.hello-algo.com/chapter_paperbook/ 算法效率 算法效率评估 设计算法时&#xff0c;我们追求以下两个目标&#xff1a; 找出解法找出最优解 最优解通常包含…

Douyin视频详情数据API接口(视频详情,评论)

抖音官方并没有直接提供公开的视频详情数据采集API接口给普通用户或第三方开发者。抖音的数据采集通常受到严格的限制&#xff0c;以保护用户隐私和平台安全。 请求示例&#xff0c;API接口接入Anzexi58 如果您需要获取抖音视频详情数据&#xff0c;包括评论、点赞等&#xff…

VMware虚拟机更换引导顺序

前言 我用wmware装了黑群晖测试&#xff0c;将img转成vmdisk的格式之后发现系统引导盘之后1G&#xff0c;有点太小了 我准备把wmware的黑群晖系统迁移到新添加的虚拟磁盘里 1.登录黑群晖的SSH 请先在黑群晖的控制面板中的终端机和SNMP里面启用SSH功能&#xff0c;才能使用ss…

创新指南|如何将人工智能应用于未来的创新管理——并不断付诸实践

ChatGPT 的推出加剧了围绕人工智能的炒作&#xff0c;现在我们看到了前所未有的巨大进展。对于我们这些热衷于创新的人来说&#xff0c;这是一个激动人心的时刻。他们正在共同采取措施&#xff0c;充分利用人工智能进行创新管理。本文将阐述人工智能能为创新管理做什么&#xf…

《米小圈动画汉字》—“动起来”汉字就能轻松记住啦!

为了迎合孩子们的兴趣&#xff0c;市面上推出了许多类型的动画片&#xff0c;所谓“动画”是让角色动起来&#xff0c;感染孩子&#xff0c;给孩子带来欢乐。但是&#xff0c;并不是所有动画片都对孩子有益&#xff0c;市面上的大多良莠不齐&#xff0c;孩子分辨不了还可能影响…

2020年天津市二级分类土地利用数据(矢量)

天津市&#xff0c;位于华北平原海河五大支流汇流处&#xff0c;东临渤海&#xff0c;北依燕山。地势以平原和洼地为主&#xff0c;北部有低山丘陵&#xff0c;海拔由北向南逐渐下降&#xff0c;地貌总轮廓为西北高而东南低。天津有山地、丘陵和平原三种地形&#xff0c;平原约…

代码随想录算法训练营三刷day37 | 贪心 之 738.单调递增的数字 968.监控二叉树

三刷day37 738.单调递增的数字968.监控二叉树确定遍历顺序如何隔两个节点放一个摄像头情况1&#xff1a;左右节点都有覆盖情况2&#xff1a;左右节点至少有一个无覆盖的情况情况3&#xff1a;左右节点至少有一个有摄像头情况4&#xff1a;头结点没有覆盖 738.单调递增的数字 题…