String类及其常用方法

文章目录

  • 1.String类的特性与使用
    • 1.1 String类的特性
    • 1.2 String对象的创建方式
    • 1.3 String 的使用(不同的拼接操作)
  • 2.String常用方法
    • 2.1 String的常用方法一
    • 2.2 String常用方法二
    • 2.3 String常用方法三

1.String类的特性与使用

1.1 String类的特性

String 代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。
特性:
1.String是声明为final的,不可被继承。
2.String实现了Serializable接口:表示字符串是支持序列化的。
实现了Comparable接口:表示String可以比较大小。
3.String内部定义了final char[] value用于存储字符串数据。
4.String:代表不可变的字符序列。简称:不可变性。
这里的不可变说的是存储在常量池中的字符串常量(字符数组 char value[])的值是不可变的, 而不是String类型的变量的值是不可变的。)
体现:①当对字符串重新赋值时,需要重新指定区域赋值,不能使用原有的value进行赋值。

String s1 = "abc";  //字面量的定义方式
String s2 = "abc";
s1 = "hello";

System.out.println(s1 == s2); //比较s1和s2的地址值
System.out.println(s1);
System.out.println(s2);

测试结果如下:
②当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

String s2 = "abc";
String s3 = "abc";
s3 += "def";

System.out.println(s3); //abcdef
System.out.println(s2); //abc
System.out.println(s2 == s3);  //false

测试结果如下:

③当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。

String s4 = "abc";
String s5 = s4.replace('a', 'z');

System.out.println(s4);
System.out.println(s5);
System.out.println(s4 == s5);

测试结果如下:

5.通过"字面量"的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。
6.字符串常量池中是不会存储相同内容的字符串的。

1.2 String对象的创建方式

  1. 通过字面量定义的方式
    此时定义的数据声明在方法区中的字符串常量池中。
    2.通过new + 构造器的方式
    此时创建的String对象保存的地址值,是数据在堆空间中开辟空间以后对应的地址值。
@Test
public void test2(){
    //通过字面量定义的方式:
    //此时的s1和s2的数据javaEE声明在方法区中的字符串常量池中。
    String s1 = "javaEE";
    String s2 = "javaEE";
    //通过new + 构造器的方式:此时的s3和s4保存的地址值,
    //是数据在堆空间中开辟空间以后对应的地址值。
    String s3 = new String("javaEE");
    String s4 = new String("javaEE");

    System.out.println(s1 == s2);//true
    System.out.println(s1 == s3);//false
    System.out.println(s1 == s4);//false
    System.out.println(s3 == s4);//false

}

测试结果如下:

下面通过这样一段代码来加深一下对String对象创建方式的理解:

Person p1 = new Person("Tom", 12);
Person p2 = new Person("Tom", 12);

System.out.println(p1.name.equals(p2.name));    //true
System.out.println(p1.name == p2.name);        //true

p1.name = "Jerry";
System.out.println(p2.name);        //Tom

思考上述代码段的运行结果是怎么样子的呢?

首先第一个输出是true,因为String类重写了Object类的equals方法,比较的是String对象的值,所以只要字符串的值相同,结果就为true。
第二个也为true,这是因为在用构造器传参的过程中,其实是以字面量的方式声明的p1.name和p2.name,所以p1.name和p2.name是存储在方法区中的字符串常量池中的,且是同一份。只不过p1和p2这两个Person类的对象是声明在了堆中的不同地方而已,p1和p2两对象的name属性值的地址是一样的,都指向方法区的字符串常量池的同 一片地址空间。 内存结构如下图所示:

所以这个时候如果试图改变p1的name值(以字面量的方式),那么就是在常量池中另外开辟了一片空间,p2的name值不会受到影响,还是“Tom”。

1.3 String 的使用(不同的拼接操作)

思考下述关于String对象连接操作的代码段的运行结果。

public void test3(){
    String s1 = "javaEE";
    String s2 = "hadoop";

    String s3 = "javaEEhadoop";
    String s4 = "javaEE" + "hadoop";
    String s5 = s1 + "hadoop";
    String s6 = "javaEE" + s2;
    String s7 = s1 + s2;

    System.out.println(s3 == s4);//true
    System.out.println(s3 == s5);//false
    System.out.println(s3 == s6);//false
    System.out.println(s3 == s7);//false
    System.out.println(s5 == s6);//false
    System.out.println(s5 == s7);//false
    System.out.println(s6 == s7);//false
}

下面给出运行结果:

为什么会这样呢?这是因为String对象的连接操作有下述三条结论:
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量。
2.只要其中有一个是变量,结果就在堆中。
3.如果拼接的结果调用intern()方法,返回值就在常量池中。
由结论1和2,不难验证出上述代码段的运行结果。下面给出内存结构图辅助理解:

其中,intern()方法是String类的一个方法,其返回值的内容声明在常量池中。

2.String常用方法

2.1 String的常用方法一

  • **int length():**返回字符串的长度: return value.length
 String s1 = "HelloWorld";
 System.out.println(s1.length());

测试结果如下:
image.png

  • char charAt(int index): 返回某索引处的字符return value[index]
System.out.println(s1.charAt(0));
System.out.println(s1.charAt(9));
System.out.println(s1.charAt(10));

测试结果如下:
image.png
可见,若索引值超过String下标时,会报下标越界的错误。

  • **boolean isEmpty():**判断是否是空字符串:return value.length == 0
String s1 = "HelloWorld";
String s2 = "";
System.out.println(s1.isEmpty());
System.out.println(s2.isEmpty());

测试结果如下:
image.png

  • **String toLowerCase():**使用默认语言环境,将 String 中的所有字符转换为小写
String s1 = "HelloWorld";
String s2 = s1.toLowerCase();
System.out.println(s1);       //s1不可变的,仍然为原来的字符串
System.out.println(s2);       //改成小写以后的字符串

测试结果如下:
image.png

  • **String toUpperCase():**使用默认语言环境,将 String 中的所有字符转换为大写
String s1 = "HelloWorld";
String s2 = s1.toUpperCase();
System.out.println(s1);       //s1不可变的,仍然为原来的字符串
System.out.println(s2);       //改成大写以后的字符串

测试结果如下:
image.png

  • **String trim():**返回字符串的副本,忽略前导空白和尾部空白
String s3 = "   he  llo   world   ";
String s4 = s3.trim();
System.out.println("-----" + s3 + "-----");
System.out.println("-----" + s4 + "-----");

测试结果如下:
image.png

  • **boolean equals(Object obj):**比较字符串的内容是否相同
  • **boolean equalsIgnoreCase(String anotherString):**与equals方法类似,忽略大小写
String s1 = "HelloWorld";
String s2 = "helloworld";
System.out.println(s1.equals(s2));
System.out.println(s1.equalsIgnoreCase(s2));

测试结果如下:
image.png

  • **String concat(String str):**将指定字符串连接到此字符串的结尾。 等价于用“+”
String s3 = "abc";
String s4 = s3.concat("def");
System.out.println(s4);

测试结果如下:
image.png

  • **int compareTo(String anotherString):**比较两个字符串的大小
String s5 = "abc";
String s6 = new String("abe");  //这个时候和字符串是怎样赋的值已经没有关系了,因为比较的是内容
System.out.println(s5.compareTo(s6));//涉及到字符串排序

测试结果如下:
image.png

  • **String substring(int beginIndex):**返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。(即从指定索引位置到结尾)
String s7 = "北京尚硅谷教育";
String s8 = s7.substring(2)
System.out.println(s7);
System.out.println(s8);

测试结果如下:
image.png

  • String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。(左闭右开)
String s7 = "北京尚硅谷教育";
String s9 = s7.substring(2, 5);
System.out.println(s7);
System.out.println(s9);

测试结果如下:
image.png

2.2 String常用方法二

  • **boolean endsWith(String suffix):**测试此字符串是否以指定的后缀结束
String str1 = "hellowworld";
boolean b1 = str1.endsWith("rld"); //形参处可以是单个的字符,也可以是字符串
System.out.println(b1);

测试结果如下:
image.png

  • **boolean startsWith(String prefix):**测试此字符串是否以指定的前缀开始
String str1 = "hellowworld";
boolean b2 = str1.startsWith("He"); //形参处可以是单个的字符,也可以是字符串
boolean b3 = str1.startsWith("he"); //形参处可以是单个的字符,也可以是字符串
System.out.println(b2);
System.out.println(b3);

测试结果如下:
image.png

  • **boolean startsWith(String prefix, int toffset):**测试此字符串从指定索引开始的子字符串是否以指定前缀开始
String str1 = "hellowworld";
boolean b3 = str1.startsWith("ll",2); //从str1的指定toffset处开始的字符串是否以prefix开始
System.out.println(b3);

测试结果如下:
image.png

  • **boolean contains(CharSequence s):**当且仅当此字符串包含指定的 char 值序列时,返回 true
String s1 = "helloworld";
String s2 = "wor";
System.out.println(s1.contains(s2));

测试结果如下:
image.png

  • **int indexOf(String str):**返回指定子字符串在此字符串中第一次出现处的索引
  • **int indexOf(String str, int fromIndex):**返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始
String str1 = "helloworld";
System.out.println(str1.indexOf("lo"));
System.out.println(str1.indexOf("lol"));
System.out.println(str1.indexOf("lo", 5));

测试结果如下:
image.png

  • **int lastIndexOf(String str):**返回指定子字符串在此字符串中最右边出现处的索引
  • **int lastIndexOf(String str, int fromIndex):**返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
String str3 = "hellorworld";
System.out.println(str3.lastIndexOf("or"));
System.out.println(str3.lastIndexOf("or", 6));

测试结果如下:
image.png

2.3 String常用方法三

  • **String replace(char oldChar, char newChar):**返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
String str1 = "北京尚硅谷教育北京";
String str2 = str1.replace('北', '东');
System.out.println(str1);
System.out.println(str2);

测试结果如下:
image.png

  • **String replace(CharSequence target, CharSequence replacement):**使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。
String str1 = "北京尚硅谷教育北京";
String str3 = str1.replace("北京", "上海");
System.out.println(str3);

测试结果如下:
image.png

  • **String replaceAll(String regex, String replacement):**使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。(regex:全称为:regular expression(正则表达式))
String str = "12hello34world5java7891mysql456";
//把字符串中的数字替换成',',如果结果中开头和结尾有','的话去掉
String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", "");
System.out.println(string);

测试结果如下:
image.png

  • **String replaceFirst(String regex, String replacement):**使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
  • **boolean matches(String regex):**告知此字符串是否匹配给定的正则表达式。
String str = "12345";
//判断str字符串中是否全部有数字组成,即有1-n个数字组成
boolean matches = str.matches("\\d+");
System.out.println(matches);
String tel = "0571-4534289";
//判断这是否是一个杭州的固定电话
boolean result = tel.matches("0571-\\d{7,8}");
System.out.println(result);

测试结果如下:
image.png

  • **String[] split(String regex):**根据给定正则表达式的匹配拆分此字符串。
  • **String[] split(String regex, int limit):**根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
String str = "hello|world|java";
String[] strs = str.split("\\|");
for (int i = 0; i < strs.length; i++) {
    System.out.println(strs[i]);
}
System.out.println("***********************");
str2 = "hello.world.java";
String[] strs2 = str2.split("\\.");
for (int i = 0; i < strs2.length; i++) {
    System.out.println(strs2[i]);
}

测试结果如下:
image.png

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

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

相关文章

使用Barrier共享鼠标键盘,通过macos控制ubuntu系统

之前文章写过如何使用barrrier通过windows系统控制ubuntu系统&#xff0c;该文章将详细介绍如何使用barrier通过macos系统控制ubuntu系统 一、macOS安装barrier macOS版本barrier链接 1、双击点开安装包 2、将安装包里的barrier拷贝到macOS的达达->应用程序中 3、在达达…

Spring启动“--”设置参数没生效

现象 在idea中启动SpringBoot项目时&#xff0c;使用“--”设置的启动参数没有生效&#xff0c;如修改端口号“--server.port8082” 原因 排查发现是因为在使用SpringApplication.run启动项目时&#xff0c;没有将args参数传入run方法。 修复方案 SpringApplication.run参数中…

当matplotlib遇见“赛博朋克”

本次分享一个Python可视化工具cyberpunk,轻松让图表变得“赛博朋克”。 案例1 import matplotlib.pyplot as plt import mplcyberpunkplt.style.use("cyberpunk") #调用cyberpunk styleplt.plot([1, 3, 9, 5, 2, 1, 1], marker=o) plt.plot([4, 5, 5, 7, 9, 8, 6…

Linux系统——Nginx脚本拦截拓展

可能会有些无聊的人对服务器的Nginx服务进行恶意访问网站、API接口&#xff0c;会影响到用户的体验&#xff0c;我们可以做一个简单的脚本对恶意访问的IP做一个有效的拦截&#xff0c;揪出这些IP地址&#xff0c;然后将其进行禁用。 在Nginx的conf目录下新建一个blockip.conf文…

Redis第8讲——Cluster集群模式详解

前面两篇文章介绍了Redis主从和哨兵模式&#xff0c;不难发现&#xff0c;它们都有一些共同的缺点&#xff0c;首先在主从切换的过程中会丢失数据&#xff1b;另一个就是只有一个master&#xff0c;只能单点写&#xff0c;并没有水平扩容能力。而且每个节点都保存了所有的数据&…

sqlite3——数据库——day2

今天学习了sqlite3数据库 sqlite3_open sqlite3_openint sqlite3_open(const char *filename, /* Database filename (UTF-8) */sqlite3 **ppDb /* OUT: SQLite db handle */); 功能:打开数据库文件(创建一个数据库连接) 参数:filename:数据库文件路径 ppDb:操作数…

Python使用lxml解析XML格式化数据

Python使用lxml解析XML格式化数据 1. 效果图2. 源代码参考 方法一&#xff1a;无脑读取文件&#xff0c;遇到有关键词的行再去解析获取值 方法二&#xff1a;利用lxml等库&#xff0c;解析格式化数据&#xff0c;批量获取标签及其值 这篇博客介绍第2种办法&#xff0c;以菜鸟教…

如何实现Git Push之后自动部署到服务器?

在平时个人开发的过程中是不是有这样的烦恼&#xff1a; 项目开发完成&#xff0c;Push之后 登录服务器&#xff0c;手动git pull&#xff0c;然后运行部署命令 这真的很烦诶&#xff01; 那么能不能Git push之后&#xff0c;远端服务器自动 Git pull 然后运行部署命令呢&a…

信息系统项目管理师002:信息系统(1信息化发展—1.1信息与信息化—1.1.2 信息系统)

文章目录 1.1.2 信息系统1.信息系统及其特性2.信息系统生命周期 记忆要点总结 1.1.2 信息系统 信息系统是由相互联系、相互依赖、相互作用的事物或过程组成的具有整体功能和综合行为的统一体。在经济与社会活动中&#xff0c;经常使用“系统”的概念&#xff0c;例如&#xff0…

python的函数与类的定义

目录 1.函数 1.函数的定义 2.输入参数与输出参数的类型 3.输入和输出多个参数 1.普通参数 2.含有任意数量的参数 3.关键字参数 4.普通参数与多个参数的结合 2.类 1.类的定义 2.类的实例化 3.继承 1.函数 1.函数的定义 def 函数名(输入参数): 文档字符串 函数体 …

Ubuntu20下C/C++编程开启TCP KeepAlive

1、在linux下&#xff0c;测试tcp保活&#xff0c;可以使用tcp自带keepalive功能。 2、几个重要参数&#xff1a; tcp_keepalive_time&#xff1a;对端在指定时间内没有数据传输&#xff0c;则向对端发送一个keepalive packet&#xff0c;单位&#xff1a;秒 tcp_keep…

HTML静态网页成品作业(HTML+CSS+JS)——体育足球介绍设计制作(3个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;使用Javacsript代码实现图片轮播&#xff0c;共有3个页面。 二、作品…

借助ChatGPT提高编程效率指南

PS: ChatGPT无限次数&#xff0c;无需魔法&#xff0c;登录即可使用,网页打开下面 一、借助ChatGPT提高编程效率指南 随着计算机技术的飞速发展&#xff0c;编程已经成为了现代社会中一个非常重要的技能。对于许多人来说&#xff0c;编程不仅是一项工作技能&#xff0c;而且是…

HCIP —— BGP 路径属性 (上)

目录 BGP 路径属性 1.优选Preferred-Value属性值最大的路由 2.优选Local-preference 属性数值大的路由 3.本地始发的BGP路由优先于其他对等体处学习到的路由。 4..优选AS_PATH属性值最短的路由 BGP 路径属性 BGP的路由选路是存在优选规则的&#xff0c;下图为华为官网提供…

【MySQL探索之旅】MySQL数据表的增删查改(初阶)

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 |《MySQL探索之旅》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &…

Mac使用自动操作(Automator)发送文件到Android设备

需求场景 在Android开发调试的过程中&#xff0c;当需要把电脑上的文件传输到连接的Android设备时&#xff0c;通常的做法是通过adb push命令。那既然是通过命令操作&#xff0c;是否可以通过可视化的工具来操作呢&#xff1f;例如在Finder中&#xff0c;右击某一个文件或者目…

上海亚商投顾:沪指缩量调整 传媒、游戏股逆势大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 三大指数昨日震荡调整&#xff0c;上证50指数跌近1%&#xff0c;保险等权重板块走低&#xff0c;中国太保跌超…

【Java/Image】给指定路径下图片反色并加上当前日期形式的水印

【需求】 从通达信软件截屏下来的K线图&#xff0c;在打印前需要反色&#xff0c;打印后需要手动加上当前日期&#xff0c;这些都可以由程序代替手工完成。 以下是期待的效果。 【关键点】 给图片反色用的是梯度法&#xff0c;这个在网络上已有成型代码&#xff1b; 给图片…

职场中的“刺猬”与“狐狸”:如何找到你的竞争优势?

职场如战场&#xff0c;竞争激烈。每个人都试图找到自己的竞争优势&#xff0c;以在职场中脱颖而出。在寻找竞争优势的过程中&#xff0c;我们可以从"刺猬"和"狐狸"的角度来思考。那么&#xff0c;什么是"刺猬"和"狐狸"呢&#xff1f;…

《汇编语言》- 读书笔记 - 第17章-外传之 DOSBox-X 调用 int 13 读写磁盘

《汇编语言》- 读书笔记 - 第17章-外传之 DOSBox-X 调用 int 13 读写磁盘 总结dosbox-x.conf 不完美读取成功写入成功参考资料 总结 DOSBox 中访问 int 13h 始终没反应。网上查了下有人说是没支持&#xff0c;建议使用 DOSBox-X 经过无数遍尝试后&#xff1a; 环境状态Win11…
最新文章