【Java SE】超详细讲解String类

🥰🥰🥰来都来了,不妨点个关注叭!
👉博客主页:欢迎各位大佬!👈

在这里插入图片描述

文章目录

  • 1. 初步认识String
  • 2. String类的常用方法
    • 2.1 字符串构造
    • 2.2 String对象比较
      • 2.2.1 ==比较是否引用同一个对象
      • 2.2.2 boolean equals(Object anObject) 方法
      • 2.2.3 int compareTo(String s) 方法
      • 2.2.4 int compareToIgnoreCase(String str) 方法
    • 2.3 字符串查找
    • 2.4 字符串转化
      • 2.4.1 数字与字符串之间的转化
      • 2.4.2 大小写转换
      • 2.4.3 字符串转数组
      • 2.4.4 格式化
    • 2.5 字符串替换
    • 2.6 字符串拆分
    • 2.7 字符串截取
    • 2.8 字符串去掉左右空格

1. 初步认识String

我们要区分一个概念,尽管C语言中可以表示"字符串",但只能用字符数组或者字符指针,没有"字符串"直接表示的方法
而Java语言中专门提供String类表示字符串,是十分方便的

2. String类的常用方法

2.1 字符串构造

(1) 使用常量串构造

//使用常量串构造
String s1 = "hi new classmate";
System.out.println(s1);

(2) 直接new String对象

//直接new String对象
String s2 = new String("hi new classmate");
System.out.println(s2); 

(3) 使用字符数组进行构造

//使用字符数组进行构造
char[] array = {'h','i'};
String s3 = new String(array);
System.out.println(s2);

注意
(1) 在Java中""被双引号引起来的也是String类型对象,可以直接调用String类的方法

public class Test2 {public static void main(String[] args) {//"hi new classmate"是一个String类型对象System.out.println("hi new classmate");//"hi new classmate"是String类型对象的话,可以调用String类中的方法System.out.println("hi new classmate".length());}
}

打印结果如下:
为什么"hi new classmate"字符串长度为16?因为中间空格也算字符~
在这里插入图片描述
(2) String类为引用类型内部存储对象地址,并不存储字符串本身
(关于内存指向等,画图能够帮助我们更好了解)
通过String类的实现源码,更好了解String类实例变量,如下图:
在这里插入图片描述
在JDK1.8中,字符串实际保存在char类型的数组中(hash部分将在数据结构专栏中讲解,敬请期待)

public class Test2 {public static void main(String[] args) {String s1 = new String("hi");String s2 = new String("lou");String s3 = s2;System.out.println(s1);System.out.println(s2);System.out.println(s3);}
}

打印结果如下:
在这里插入图片描述
上述代码内存图如下:
在这里插入图片描述

2.2 String对象比较

字符串的比较是常见操作之一,在字符串排序中需要进行字符串比较,Java中提供以下4种方式:

2.2.1 ==比较是否引用同一个对象

注意!!!对于内置类比较的是变量中的值,对于引用类型比较的是引用中的地址

public class Test3 {public static void main(String[] args) {String s1 = new String("hi");String s2 = new String("hi");String s3 = new String("ha");String s4 = s1;System.out.println(s1 == s2); //falseSystem.out.println(s2 == s3); //falseSystem.out.println(s1 == s4); //true}
}

打印结果如下:
在这里插入图片描述
解释说明
(1) 尽管字符串s1与字符串s2内容一样,但是比较的是引用变量是否为同一个对象
(2) 字符串s2与字符串s3,这两个变量指向的引用不一样所以返回false
(3) 字符串s1与字符串s4,由于String s4 = s1,这两个变量指向的引用一样,返回true

2.2.2 boolean equals(Object anObject) 方法

String类重写父类Object中equals方法,Object类中equals默认按照==比较,String重写equals方法后按照如下规则进行比较,即String类的对象调用equals按照如下规则:按照字典序比较,字典序即为字符大小的顺序,以下给出代码

public class Test4 {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;}
}

解释说明
(1) 首先判断this和anObject 是否为同一个对象比较,如果是同一个对象则返回true
(2) 检测anObject是否为String类型的对象,如果是String类型对象则继续比较,并将anObject向下转型为String类型对象,否则返回false
(3) this和anObject两个字符串的长度是否相同,长度是相同则继续比较,否则返回false
(4) 按照字典序,从前往后逐个字符进行比较

2.2.3 int compareTo(String s) 方法

同样是按照字典序进行比较,返回的是int类型
equals与compareTo的区别
(1) equals返回的是boolean类型
(2) compareTo返回的是int类型
具体比较方式如下:
(1) 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个不等字符的大小差值(大小理解为ASCII码值)
即如果两个字符串的第一个字符不等,结束比较,返回这两个字符串第一个字符的ASCII码差值
如果两个字符串的第一个字符相等,则比较两个字符串的第二个字符,以此类推,直至不等为止,返回该字符的ASCII码差值
(2) 如果前k个字符相等(k为两个字符长度中的最小值),返回值为两个字符串的长度差值

public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("abc");String s4 = new String("abcdefgh");//s1和s2不同输出字符差值-1,b、c两个字符的ASCII差值为-1System.out.println(s1.compareTo(s2)); //相同输出0  System.out.println(s1.compareTo(s3)); //前k个字符完全相同,s1和s4前3个字符为abc相同,输出长度差值-5  System.out.println(s1.compareTo(s4));   
}

解释说明
为什么s1.compareTo(s2)的返回结果是-1,不是它们俩第一个字符相同嘛~不应该返回-2嘛!
注意这里前k个字符相等需要满足k为两个字符长度中的最小值,s1长度为3,s2长度为2,即k为2,必须满足前两个字符相等,才可以返回字符串长度的差值

2.2.4 int compareToIgnoreCase(String str) 方法

与compareTo方式一致,但不区分字母的大小写!(即忽略大小写比较)

public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("ABC");String s4 = new String("abcdefGH");//s1和s2不同输出字符差值-1System.out.println(s1.compareToIgnoreCase(s2));   //相同输出0  System.out.println(s1.compareToIgnoreCase(s3));  //前k个字符完全相同,s1和s4前3个字符为abc相同,输出长度差值-5  System.out.println(s1.compareToIgnoreCase(s4)); }

2.3 字符串查找

字符串查找是字符串中很常见的操作,String类提供的常用查找的方法:
在这里插入图片描述
下面通过代码,使用使用,进一步了解String类提供的常用查找方法

public static void main(String[] args) {String s = "aaabbbcccaaabbbccc";System.out.println(s.charAt(2));                             //找下标为2的字符结果为'a'System.out.println(s.indexOf('c'));                          //找s字符串中第一次出现'c'的下标值结果为6System.out.println(s.indexOf('c', 10));                   //找字符串s下标10开始第一次出现'c'的下标值结果为15System.out.println(s.indexOf("bbb"));                        //找字符串s第一次出现"bbb"的下标值结果为3System.out.println(s.indexOf("bbb", 10));                   //找字符串s下标10开始第一次出现"bbb"的下标值结果为12System.out.println(s.lastIndexOf('c'));                      //找字符串s从后往前第一次出现'c'的下标值结果为17System.out.println(s.lastIndexOf('c', 10));                  //找字符串s从下标10开始从后往前第一次出现'c'的下标值结果为8System.out.println(s.lastIndexOf("bbb"));                   //找字符串s从后往前第一次出现"bbb"的下标值结果为12System.out.println(s.lastIndexOf("bbb", 10));               //找字符串s下标10开始从后往前第一次出现"bbb"的下标值结果为12

2.4 字符串转化

2.4.1 数字与字符串之间的转化

  1. 数字转字符串 String valueOf()
  2. 字符串转数字
    转化为int类型 int data1 = Integer.parseInt(String s1);
    转化为double类型 double data2 = Double.parseDouble(String s2);
    转化为float类型 flaot data3 = Float.parseFloat(String s3);
public class Person {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}
}
public class Test {public static void main(String[] args) {//数字转字符串String s1 = String.valueOf(100);String s2 = String.valueOf(99.00);String s3 = String.valueOf(true);//对象转化为字符串String s4 = String.valueOf(new Person("张三", 20));System.out.println(s1);System.out.println(s2);System.out.println(s3);System.out.println(s4);//字符串转数字int data1 = Integer.parseInt("100");double data2 = Double.parseDouble("99.00");System.out.println(data1);System.out.println(data2);}
}

打印结果如下:
在这里插入图片描述解释说明】 Integer、Double等是Java中的包装类型(在后续会讲解到~)

2.4.2 大小写转换

  1. 小写转大写 String toUpperCase()
  2. 大写转小写 String toLowerCase()
public class Test {public static void main(String[] args) {String s1 = "hi new classmates";String s2 = "HI NEW CLASSMATES";//小写转大写System.out.println(s1.toUpperCase());//大写转小写System.out.println(s2.toLowerCase());}
}

打印结果如下:
在这里插入图片描述

2.4.3 字符串转数组

  1. 字符串转字符数组 String toCharArray()
  2. 字符数组转为字符串 String s = new String(ch);
public class Test {public static void main(String[] args) {String s = "hello";    //字符串转数组char[] ch = s.toCharArray();for (int i = 0; i < ch.length; i++) {System.out.print(ch[i]);} //数组转字符串String s2 = new String(ch);System.out.println(s2);}
}

提醒
字符串转字符数组,toCharArray()方法在刷题中会经常用到,比较方便,这样可以直接访问该字符中的某一个字符~(在刷题中就能体会到啦!)

2.4.4 格式化

字符串格式化 String format()

public class Test {public static void main(String[] args) {String s = String.format("%d-%d-%d", 2024,5,27);System.out.println(s);}
}

打印结果如下:
在这里插入图片描述

2.5 字符串替换

如果想要将字符串的某个字符替换成别的,该如何做呢~以下有两个方法:

  1. 替换掉所有指定内容 String replaceAll()
  2. 替换字符串出现第一次出现的指定字符 String replaceFirst()
public class Test {public static void main(String[] args) {String str = "hello,world!" ;System.out.println(str.replaceAll("l", "*"));System.out.println(str.replaceFirst("l", "*"));}
}

打印结果如下:
在这里插入图片描述
注意事项
因为字符串是不可变对象,替换不修改当前字符串,是产生一个新的字符串

2.6 字符串拆分

字符串拆分是一个很常用操作,需重点掌握
字符串拆分是可以将一个完整的字符串按照指定的分隔符划分为若干个子字符串

  1. 将字符串全部拆分 String[] split(String regex)
  2. 将字符串以指定的格式拆分为limit组 String[] split(String regex, int limit)
public class Test11 {public static void main(String[] args) {String str1 = "hello1 new1 classmates1";String[] result1 = str1.split(" ") ; // 按照空格拆分for(String x: result1) {System.out.println(x);}System.out.println("-------------------------------------------------");String str2 = "hello2 new2 classmates2";String[] result2 = str2.split(" ",2) ; // 按照空格拆分,成两组for(String x: result2) {System.out.println(x);}}
}

打印结果如下:
在这里插入图片描述
下面再举两个栗子~帮助我们理解字符串拆分的应用!
(1)拆分IP地址

public class Test {public static void main(String[] args) {String str = "192.168.2.12" ;String[] result = str.split("\\.") ;for(String s: result) {System.out.println(s);}}
}

打印结果如下:
在这里插入图片描述
我们需要按照"." 拆分IP地址,为什么这里前面加上\呢!这就需要注意加上转义字符啦
注意事项
(以下字符均省略双引号)
1)字符 | * + . 都需要在前面加上转义字符\\
2)如果是\ ,需写成 \\\\
3)如果一个字符串中有多个分隔符,可以用|作为连字符

(2)多次拆分

public class Test {public static void main(String[] args) {String str = "name=泡泡&age=21" ;String[] result = str.split("&") ;for (int i = 0; i < result.length; i++) {String[] s = result[i].split("=") ;System.out.println(s[0]+" = "+s[1]);}}
}

打印结果如下:
在这里插入图片描述
解释说明
先按照 “&” 拆分字符串,再遍历该拆分字符串数组,每个元素再以 “=” 划分,最后调整一下输出格式

2.7 字符串截取

字符串截取是从一个完整的字符串之中截取出部分内容,非常常用的操作

  1. 指定索引截取到字符串结尾 String substring(int beginIndex)
  2. 截取部分内容 String substring(int beginIndex,int endIndex)
public class Test14 {public static void main(String[] args) {String str = "helloclassmates";//从索引5截到字符串末尾System.out.println(str.substring(5));//从下标0截到字符串索引5,不包括索引5的字符!!! 截取区间为[0,5)System.out.println(str.substring(0, 5));}
}

注意事项
String substring(int beginIndex,int endIndex) 这是前闭后开区间的写法,
包含beginIndex下标的字符,不包含 endIndex 下标,在上述例子中,substring(0, 5) 表示包含 0 下标的字符,不包含 5 下标

2.8 字符串去掉左右空格

String trim() 去掉字符串中的左右空格,换行,制表符,保留中间的空格

public class Test10 {public static void main(String[] args) {String str = "    hello world classmate    " ;System.out.println(str.trim());}
}

打印结果如下:
在这里插入图片描述

其它方法需要用到的时候,可以参考Java在线文档:Java在线文档

💛💛💛本期内容回顾💛💛💛
在这里插入图片描述

✨✨✨本期内容到此结束啦~下期内容将继续讲解String类(期待ing)

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

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

相关文章

【Pandas】深入解析`pd.read_json()`函数

【Pandas】深入解析pd.read_json()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#x…

unity开发Hololens,使用unity自带的UGUI

hololens 使用UGUI 新建画布&#xff0c;添加组件&#xff0c; 画布模式改成WorldSpace&#xff0c;这样在能在3D场景里 随意的移动位置&#xff0c; 添加NearIteractionTouchaBleUnityUI、CanvasUtility组件 EaventsToReceive改成Pointer&#xff0c; 这样&#xff0c;UGUI的…

TC3xx分析--如何提高系统运行效率(2)

目录 1.概述 2.限定符对于代码的影响 3.小结 1.概述 上文TC3xx分析--如何提高系统运行效率(1)-CSDN博客讲解了Tasking中lsl的某些关键定义&#xff0c;简述了Tricore寻址模式&#xff0c;接下来我们继续看&#xff0c;不同memory限定符对于代码的影响。 2.限定符对于代码的…

振弦式位移计在各类工程中的应用

振弦式位移计&#xff0c;作为一种高精度、高可靠性的测量工具&#xff0c;在各类工程中发挥着至关重要的作用。它通过测量弦的振动频率来间接得出结构的位移变化&#xff0c;为工程师和科学家们提供了精确的数据支持&#xff0c;从而确保工程的安全性和稳定性。 点击输入图片描…

ASTRONEER异星探险家服务器开服多人联机

1、购买后登录服务器 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、获取数字IP地址 使用IP 地址查询网站将服务器IP地址填入后点击查询&#xff08;查询的时候将地址冒号后方的数字以及冒…

五种不寻常的身份验证绕过技术

身份验证绕过漏洞是现代web应用程序中普遍存在的漏洞&#xff0c;也是隐藏最深很难被发现的漏洞。 为此安全防护人员不断在开发新的认证方法&#xff0c;保障组织的网络安全。尽管单点登录(SSO)等工具通常是对旧的登录用户方式的改进&#xff0c;但这些技术仍然可能包含严重的…

Java 阻塞队列与生产者消费者模型

一、阻塞队列 阻塞队列是⼀种特殊的队列&#xff0c;其也遵守队列 "先进先出" 的原则&#xff1b; 阻塞队列是⼀种线程安全的数据结构&#xff0c;并且具有以下特性&#xff1a; 当队列满的时候&#xff0c;继续入队列就会阻塞&#xff0c;直到有其他线程从队列中…

JWT身份验证相关安全问题

前言&#xff1a;工作中需要基于框架开发一个贴近实际的应用&#xff0c;找到一款比较合适的cms框架&#xff0c;其中正好用到的就是jwt做身份信息验证&#xff0c;也记录一下学习jwt相关的安全问题过程。 JWT介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行…

如何遍历并处理不平衡的Python数据集

目录 一、引言 二、不平衡数据集的概念与影响 三、处理不平衡数据集的策略 重采样策略 集成学习方法 代价敏感学习 一分类方法 四、Python工具与库 五、案例分析与代码实现 案例一&#xff1a;使用imbalanced-learn库进行上采样 案例二&#xff1a;使用scikit-learn…

基于L1范数惩罚的稀疏正则化最小二乘心电信号降噪方法(Matlab R2021B)

L1范数正则化方法与Tikhonov正则化方法的最大差异在于采用L1范数正则化通常会得到一个稀疏向量&#xff0c;它的非零系数相对较少&#xff0c;而Tikhonov正则化方法的解通常具有所有的非零系数。即&#xff1a;L2范数正则化方法的解通常是非稀疏的&#xff0c;并且解的结果在一…

vue 笔记02

目录 01 事件修饰符 02 按键修饰符 03 v-bind属性 04 vue-axios的基本使用 05 vue的生命周期 06 vue生命周期涉及到的其他的知识点 01 事件修饰符 vue的事件修饰符 事件名称.修饰符1.修饰符2...事件驱动函数 stop 阻止冒泡修饰符 prevent 阻止默认行为 once 当前事件只触…

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 输入一个字典&#xff0c;要求将该字典的键和值对换。&#xff08;注意&#xff0c;字典中有键的值是重复的&#xff09; 输入&#xff1a; 一行&#xff0…

信息系统项目管理师0137:输出(8项目整合管理—8.9结束项目或阶段—8.9.3输出)

点击查看专栏目录 文章目录 8.9.3 输出8.9.3 输出 项目文件(更新)可在结束项目或阶段更新所有项目文件,并标记为最终版本。特别值得注意的是,经验教训登记册的最终版本要包含阶段或项目收尾的最终信息。最终版本的经验教训登记册可包含:效益管理、项目评估的准确性、项目和…

修改vuetify3的开关组件v-switch在inset模式下的大小

<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch>使用方式1&#xff1a;本页面使用 本页面中使用&#xff0c;必须要含有lang“scss” scoped&#xff0c;才会生效 <style lang"scss"…

基础漏洞系列——CSRF跨站请求伪造

简介&#xff1a; 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack或者 session riding&#xff0c;通常缩写为 CSRF或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操…

【会议征稿,JPCS出版】2024年航空航天与力学国际学术会议(ICAM 2024)

2024年航空航天与力学国际学术会议&#xff08;ICAM 2024&#xff09;将于2024年7月12-14日在中国沈阳举办。会议由东北大学机械工程与自动化学院主办&#xff0c;吉林大学机械与航空航天工程学院承办&#xff0c;大连理工大学、沈阳航空航天大学、沈阳建筑大学、沈阳工业大学、…

适合源代码的加密系统

在信息化高度发展的今天&#xff0c;源代码的安全问题日益受到重视。源代码是企业或组织的核心资产&#xff0c;一旦泄露或被篡改&#xff0c;将会对其造成巨大的经济损失和声誉风险。因此&#xff0c;如何有效防止源代码的泄露和算改成为了企业和组织急需解决的问题。沙盒技术…

代码随想录算法训练营第四十三天 | 343. 整数拆分、96.不同的二叉搜索树

343. 整数拆分 代码随想录 视频讲解&#xff1a;动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分_哔哩哔哩_bilibili 解题思路 1. dp[i]对i进行拆分&#xff0c;得到的最大的乘积为dp[i] 2.递推公式 一个是j * (i - j) 直接相…

架构(十七)翻译监控

一、引言 作者最近做的一个功能是需要监控一个翻译转换&#xff0c;根据国家和语言进行分组&#xff0c;然后定时把监控情况放到ck里面。为什么是分组和定时监控呢&#xff1f;因为调用比较高的系统的qps在单机一万多&#xff0c;70台机器&#xff0c;可怕的高频调用注定他不能…

【喜报】科大睿智多家服务企业上榜2024年第四批DCMM名单

近日&#xff0c;DCMM官方平台发布通知公告&#xff0c;根据《数据管理能力成熟度评估工作管理办法(暂行)》的有关规定&#xff0c;经单位自愿申请&#xff0c;评估机构评估、专家评审及公示&#xff0c;下列27单位获得数据管理能力成熟度等级证书。小编祝贺多家服务企业上榜20…