【JavaSE】搞定String类

前言

本篇会细致讲解String类的常见用法,让小伙伴们搞定String类~

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

前言

常用的三种字符串构造

字符串长度length

字符串比较

==比较

比较字符串的内容equals

忽略大小写比较equalsIgnoreCase

比较字符串大小compareTo

忽略大小写比较compareToIgnoreCase

 获取字符串中某一个字符

通过字符获取下标indexOf

从指定位置开始找

从后的指定位置开始找lastIndexOf

转化

数值和字符串转化valueOf

字符串转数值parseInt和parseDouble 

大小写转化toLowerCase和toUpperCase

将字符串转数组toCharArray

格式化format

字符串替换replace

替换字符串的第一个replaceFirst和整体替换replaceAll

字符串拆分split

多次拆分

字符串截取substring

去掉字符串左右两边的空格trim

字符串不可变性

字符串拼接

​编辑

String、StringBuffer、StringBuilder的区别


常用的三种字符串构造

    public static void main(String[] args) {//直接赋值的方法, 定义字符串String str1="abcdef";//简写形式String str2=new String("hello Word!");//用字符数组 构造字符串char[]array={'a','b','c'};String str3=new String(array);System.out.println(str1);System.out.println(str2);System.out.println(str3);}

结果

String是引用类型,内部并不存储字符串本身

    // s1和s2引用的是不同对象 s1和s3引用的是同一对象String s1 = new String("hello");String s2 = new String("world");String s3 = s1;

字符串长度length

  • .length用于求字符长度
  • .isEmpty用于判断字符串是否为空
        String str1="abcdef";System.out.println(str1.length());//6String str2=null;System.out.println(str2);//nullSystem.out.println(str1.length());//空指针异常String str3="";System.out.println(str3.length());//0System.out.println(str3.isEmpty());//用于判断字符串是否为空 返回true或false

字符串比较

==比较

注意:

  • 对于内置类型,   ==比较的是变量中的
  • 对于引用类型,   ==比较的是引用中的地址

下面代码结果是true还是false?

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

答案是true,解释如下

只要是双引号引起来的字符串常量,会存在一个字符串常量池中。

存储逻辑:先检查内存(字符串常量池)中是否有这个字符串;如果没有,存进去;如果有,直接去现有对象的即可。

上面代码str1先存在了字符串常量池中,str2不会在生成一个对象了,而是直接指向str1同一个对象。

不同上一题,下面代码结果是true还是false?

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

结果是false

因为这里是强制产生了两个不同的对象,位于两个不同的空间,所以str3和str4是两个不同的字符串,结果是false

比较字符串的内容equals

System.out.println(str1.equals(str2));System.out.println(str3.equals(str4));

这里的结果两个都为true,equals比较的是两者的内容是否一致

忽略大小写比较equalsIgnoreCase

        System.out.println(str3.equalsIgnoreCase(str4));

比较字符串大小compareTo

  1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
  2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
        String str1="abcde";String str2="edf";System.out.println(str1.compareTo(str2));

忽略大小写比较compareToIgnoreCase

        System.out.println(str1.compareToIgnoreCase(str2));

 获取字符串中某一个字符

        String str1="abcde";char ch=str1.charAt(2);System.out.println(ch);

通过字符获取下标indexOf

int index =str1.indexOf('d');
System.out.println(index);

从指定位置开始找

        int index =str1.indexOf('a',2);//从2位置开始找a

从后的指定位置开始找lastIndexOf

        String str3="ababcabcd";int index3=str3.lastIndexOf('a',4);System.out.println(index3);//2

转化

数值和字符串转化valueOf

        String s1=String.valueOf(1234);String s2=String.valueOf(12.34);String s3=String.valueOf(true);System.out.println(s1);System.out.println(s2);System.out.println(s3);

字符串转数值parseInt和parseDouble 

        int data1=Integer.parseInt("1234");//用类调用的方法,说明parseInt是静态方法double data2=Double.parseDouble("23.34");System.out.println(data1+6);System.out.println(data2+6);

 查看parseInt源码,他是被static修饰的

大小写转化toLowerCase和toUpperCase

        String str1="ABCD";//大写转小写String str2=str1.toLowerCase();//不是在原字符串本身进行修改(str1并没有改变,str2是产生的新的对象)System.out.println(str1);System.out.println(str2);String str3=str2.toUpperCase();//小写转大写System.out.println(str3);

 结果如图

 

将字符串转数组toCharArray

        String str1="ABCD";char[]array=str1.toCharArray();System.out.println(Arrays.toString(array));

结果如图

格式化format

String s=String.format("%d-%d-%d",2024,4,15);System.out.println(s);

字符串替换replace

有两种替换(replace的重载)

图中第一种是字符整体替换,第二种是字符串整体替换

        String str1="abcdab";String ret=str1.replace('a','z');String ret2=str1.replace("ab","yiyi");System.out.println(ret);System.out.println(ret2);

结果

替换字符串的第一个replaceFirst和整体替换replaceAll

        //替换字符串的第一个String ret3=str1.replaceFirst("ab","yiyi");System.out.println(ret3);//字符串的整体替换String ret4=str1.replaceAll("ab","ttttt");System.out.println(ret4);

结果

字符串拆分split

        //字符串拆分String s1="abc&tttt&hijk";String []str1=s1.split("&",2);//2表示最多分两组for (String s:str1) {System.out.println(s);}

结果

注意:

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

 代码示例

        String s2="2024.4.15";String []str2=s2.split("\\.");String s3="abc&pppp*hhhh";String []str3=s3.split("&|\\*");//用|表示将&和*分开,有这两个分隔符,用\\表示转义*

多次拆分

//多次拆分String str="name=zhangsan&name=lisi";String[]strings=str.split("&");for (String s:strings) {String []ss=s.split("=");for (String x:ss) {System.out.println(x);}}

结果

字符串截取substring

        //字符串截取String s1="abcdrrrr";//从指定下标开始一直往下截取String s2=s1.substring(1);System.out.println(s2);//截取目标下标下的字符串String s3=s1.substring(2,5);//左闭右开[2,5)System.out.println(s3);

去掉字符串左右两边的空格trim

       String s1="    ab s c   d    f    ";System.out.println(s1);String s2=s1.trim();//去掉字符串左右两边的空格System.out.println(s2);

结果

字符串不可变性

字符串String类的源码中,value的值被final修饰,不能发生改变(value指向不能发生改变),但它指向的对象的内容是可以修改

又因为value被private封装了,源码中有没有get和set方法,使得字符串具有不可变性。

例如下面代码中数组array被final修饰

        final int[]array=new int[]{1,3,4};array=new int[]{1,3,6};//报错array[0]=99;//可以修改

所以字符串实际上是不能被修改的。

尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率 非常低下。

字符串拼接

由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大 部分功能是相同的。以下演示StringBuilder

StringBuilde用于在原字符串上拼接字符串

        StringBuilder stringBuilder=new StringBuilder("abcd");stringBuilder.append("yyyyyyy");

结果

String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可 以修改。频繁修改字符串的情况考虑使用StringBuilder。

String、StringBuffer、StringBuilder的区别

  • String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.
  • StringBuffer与StringBuilder大部分功能是相似的
  • StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操 作。

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

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

相关文章

MySQL DDL 通用语法

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 往期热门专栏回顾 专栏…

libftdi1学习笔记 4 - MPSSE SPI

目录 1. 初始化 2. SCK默认电平设置 3. GPIO控制 4. spi全双工通信 4.1 MSB/LSB 4.2 分配command缓存 4.3 spi0TransferBit 4.3 spi1TransferBit 4.4 spi2TransferBit 4.5 spi3TransferBit 4.6 写命令序列 4.7 读数据 4.8 组合实际数据 5. 验证 5.1 初始化FTDI设…

短视频底层逻辑分析

短视频底层逻辑 1.迭代模型_ev 2.Douyin的本质_ev 3.Douyin的审核机制_ev 4.平台趋势_ev 5.定位_ev 6.建立用户期待_ev 7.好内容的定义_ev 8怎么做好内容_ev 9.如何做好选题_ev 10.如何快速模仿_ev 11.账号拆解的底层逻辑_ev 12选人的重要性_ev 13.内容的包装_ev 14.打造大IP的…

【中间件】ElasticSearch简介和基本操作

一、简介 Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,支持各种数据类型,包括文本、数字、地理、结构化、非结构化 ,可以让你存储所有类型的数据,能够解决不断涌现出的各种用例。其构成如下: 说明&#xff1…

Python数学建模学习-PageRank算法

1-基本概念 PageRank算法是由Google创始人Larry Page在斯坦福大学时提出,又称PR,佩奇排名。主要针对网页进行排名,计算网站的重要性,优化搜索引擎的搜索结果。PR值是表示其重要性的因子。 中心思想: 数量假设&#…

创领“浆”来:三一重工特种砂浆站引领行业绿色高效新纪元

随着我国城市化进程不断加快,国家对城市建设高度关注,国务院办公厅针对城镇老旧小区基础设施匮乏、住房条件落后、环境污染严重等突出问题印发了《关于全面推进城镇老旧小区改造工作的指导意见》,各地积极响应,因此特种砂浆也迎来…

【微信取证篇】微信收藏图片存储记录思维导图

【微信取证篇】微信收藏图片存储记录思维导图 最近在测试微信收发图片和收藏的功能,发现许多有意思的地方,**微信收藏图片缓存的文件目前发现有三个地方,都是在Fav下,名称都一样,有直接原始图片,也有加密的…

2024年nodejs调用小红书最新关注(粉丝)follow接口,api接口分析2004-04-16

一、打开chrome按f12,点击右上角的“关注”按钮,抓包位置如下: (图1 follow接口) 二、follow接口分析 1、请求地址 https://edith.xiaohongshu.com/api/sns/web/v1/user/follow 2、请求方法: POST 3、请求头: :authority: edith…

telnet不是内部或外部命令也不是可运行的程序或批处理文件

出现问题 在Windows命令行运行telnet命令,出现: ‘telnet’ 不是内部或外部命令,也不是可运行的程序,或批处理文件。 问题原因 Windows系统中的telnet客户端是关闭状态。因为Win10默认没有安装telnet功能。 解决方式 将系统中…

FPGA - 以太网UDP通信(一)

一,简述以太网 以太网简介 ​以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。 ​ 以太网类型介绍 以太网是现实世界中最普遍的一种计算机网络。以太网有…

[C++][算法基础]二分图的最大匹配(匈牙利算法)

给定一个二分图,其中左半部包含 n1 个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。 数据保证任意一条边的两个端点都不可能在同一部分中。 请你求出二分图的最大匹配…

Intel显卡驱动导致Qt opengl 渲染YUV时拉伸窗口内存泄漏

最近在使用QOpenGLWidget做YUV视频渲染,发现在拉伸窗口的时候内存暴涨,如果窗口不动则内存不变。 可以得出结论一定是resizeGL出了问题,但是其实这里代码很简单 glViewport(0, 0, w, h); 还有就是变换矩阵计算,根本没资源建立与释…

Sublime Text下载,安装,安装插件管理器,下载汉化插件

SublimeTest官网 © Sublime Text中文网 下载安装 一路点击安装即可 安装插件管理器 管理器官网安装 - 包控制 (packagecontrol.io) 手动安装将3 位置点击网址下载 再打开SublimeTest 点击 选择第一个Browse Packages..... 将会跳转到文件夹中 进入上一个文件夹 在进入…

【读点论文】YOLOX: Exceeding YOLO Series in 2021,无锚框单阶段目标检测方案,解耦检测头的分类和回归分支,优化标签分配策略

YOLOX: Exceeding YOLO Series in 2021 Abstract 在本报告中,我们介绍了YOLO系列的一些经验改进,形成了一种新的高性能探测器—YOLOX。我们将YOLO检测器切换到无锚方式,并进行其他先进的检测技术,即去耦头和领先的标签分配策略S…

4月16号总结

java学习 网络编程 1.网络分层 网络分层是将网络通信划分为不同的逻辑层次,每一层负责特定的功能,从而实现网络通信的模块化和标准化。常用的网络分层模型包括OSI(开放系统互联)模型和TCP/IP模型。 特点和作用: 分…

origin绘图操作合集

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、图例去掉边框二、柱状图单独选中某一柱子修改颜色,柱状图中设置一个柱子的方法 提示:以下是本篇文章正文内容,下面案例可供参…

Java开发从入门到精通(二十):Java的面向对象编程OOP:IO流中的转换流、打印流、数据流、序列流、IO框架

Java大数据开发和安全开发 (一)Java的IO流文件读写1.1 转换流1.1.1 InputStreamReader字符输入转换流1.1.1 OutputStreamWriter字符输出转换流 1.2 打印流1.2.1 PrintStream打印流1.2.2 PrintWriter打印流1.2.3 PrintStream和PrintWriter的区别1.2.4 打印…

获取淘宝京东商品详情API接口返回数据解析说明(可测试,批量获取)

获取淘宝和京东的商品详情API接口返回数据并解析通常需要遵循以下几个步骤: 淘宝商品详情API 淘宝的API接口通常对商家和合作伙伴开放,并且需要经过严格的申请和审核流程。普通用户或未经授权的开发者通常无法直接访问淘宝的商品详情API。 如果你已经…

Innodb之redo日志

Innodb引擎执行流程 redo log ​ MySQL中的redo log(重做日志)是实现WAL(预写式日志)技术的关键组件,用于确保事务的持久性和数据库的crash-safe能力。借用《孔乙己》中酒店掌柜使用粉板记录赊账的故事,…