第6章-第2节-Java中的String类

1、字符串体系:又被称为不可变的字符序列

理解:描述生活中的一句话,内容可长可短,长到没有上限要求,短到可以没有内容

类型:java.lang.String类

特点:
    1)、不可以被别的类继承;
    2)、字符串底层还是一个数组(字节、字符);
    3)、字符串不可变:字符串的数据内容不可以改变,但是引用地址是可以发生变化的;
    4)、字符串常量数据被存储在字符串常量池中,常量池中不会多次创建相同的数据对象,只会创建一份,给所有引用对象所共享 ==> 好处:节省内存资源;

【拓展】:

java6版本:字符串常量池存在于方法区中
java7版本:字符串常量池被移动到了堆中
java8版本:字符串常量池被移动到了meta data区(元数据区)
//...


常用构造方法:8个,具体的可以自行查看API文档,后面两个下一节再讲

String() 
          初始化一个新创建的 String 对象,使其表示一个空字符序列。
String(String original) 
          初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
String(byte[] bytes) 
          通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
String(byte[] bytes, int offset, int length) 
          通过使用平台的默认字符集解码指定的 byte 子数组,构造一个新的 String。
String(char[] value) 
          分配一个新的 String,使其表示字符数组参数中当前包含的字符序列。 
String(char[] value, int offset, int count) 
          分配一个新的 String,它包含取自字符数组参数一个子数组的字符。 
String(StringBuffer buffer) 
          分配一个新的字符串,它包含字符串缓冲区参数中当前包含的字符序列。 
String(StringBuilder builder) 
          分配一个新的字符串,它包含字符串生成器参数中当前包含的字符序列。 

 备注:如果直接打印一个数组,那么会是打印它的地址,此时可以用Arrays.toString()进行转化。

2、常用方法:

/*1、拼接字符串:String concat(String str):将指定字符串连接到此字符串的结尾。
*/
s1.concat(s2);/*2、切割字符串:String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。注意:如果一次都匹配不成功,就将原串作为一个整体存入到String[]中返回
*/
str.split(",");/*3、截取字符串:String substring(int beginIndex):返回一个新的字符串,它是此字符串的一个子字符串。String substring(int beginIndex, int endIndex):返回一个新字符串,它是此字符串的一个子字符串。注意:Java语言而言,方法的参数位置同时定义了起始索引和结束索引,绝大多数情况下,都满足含头不含尾的特点
*/
str.substring(3, 5);/*4、得到传入字符串在原串中首次/最后一次出现的位置int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始。int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引。int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索。注意:如果从头到尾都匹配不成功,则返回-1
*/
str.indexOf("学");
str.lastIndexOf("学");
str.indexOf("学", 5);/*5、将字符串转换为全大写/小写返回String toLowerCase():使用默认语言环境的规则将此 String 中的所有字符都转换为小写。String toUpperCase():使用默认语言环境的规则将此 String 中的所有字符都转换为大写。
*/
str.toUpperCase();
str.toLowerCase();/*6、去除字符串首尾的空白String trim():返回字符串的副本,忽略前导空白和尾部空白。
*/
str.trim();/*7、判断字符串是否以传入的字符串开头/结尾boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始。boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束。
*/
str.startsWith("java");
str.endsWith("web");/*判断原串中是否包含传入的字符串内容boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true。
*/
str.contains("java");

3、关于字符串的总结

1)、关于字符串的总结1:

String s1 = "hello";                       //产生1个对象        在常量池中
String s2 = "hello";                       //不会产生新对象
String s3 = new String("hello");           //产生1个对象        在堆中
String s4 = new String("helloworld");      //产生2个对象        一个在常量池,另一个在堆
String s5 = "helloworld";

注意事项:其它的不多说,第四行代码的意思是new一个String,会在堆里new一个对象出来,然后马上去常量池里面去看看有没有对应的字符串,如果没有,则在常量池创建一个字符串,然后堆里的这个对象指向常量池里的那个字符串,然后等号左边的String变量指向堆里的那个对象。

2)、关于字符串总结2:

String s1 = "hello";            //s1变量记录了"hello"在常量池中的地址
String s2 = "world";            //s2变量记录了"world"在常量池中的地址
String s3 = "helloworld";       //s3变量记录了"helloworld"在常量池中的地址System.out.println(s1 + "world" == s3);             // 堆 == 常量池     false
System.out.println("hello" + s2 == s3);             // 堆 == 常量池     false
System.out.println(s1 + s2 == s3);                  // 堆 == 常量池     false
System.out.println("hello" + "world" == s3);        //常量池 == 常量池   trueSystem.out.println("*******************************************************");System.out.println(s1 + "world" == s1 + "world");            // 堆 == 堆         false
System.out.println("hello" + s2 == "hello" + s2);            // 堆 == 堆         false
System.out.println(s1 + s2 == s1 + s2);                      // 堆 == 堆         false
System.out.println("hello" + "world" == "hello" + "world");  //常量池 == 常量池   trueSystem.out.println("*******************************************************");/*String intern():返回字符串对象的规范化表示形式。解析方法:jvm会去常量池中查找是否以前存在了该字符串常量数据对象:如果存在,就直接返回该字符串常量数据对象在常量池中的地址;如果不存在,则先在常量池中创建该字符串常量对象,再将地址返回;
*/System.out.println((s1 + "world").intern() == s3);         // 常量池 == 常量池     true
System.out.println(("hello" + s2).intern() == s3);         // 常量池 == 常量池     true
System.out.println((s1 + s2).intern() == s3);              // 常量池 == 常量池     true
System.out.println(("hello" + "world").intern() == s3);    // 常量池 == 常量池     strue

本电子书目录:《Java基础的重点知识点全集》

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

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

相关文章

GC6150 5V低压步进电机驱动芯片,低噪声、低振动 应用于摄像机,机器人 医疗器械等产品中。

GC6150是双通道5V低压步进电机驱动器,具有低噪声、低振动的特点,特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统,该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口,客户可以方使地调整驱…

【SpringBoot3】命令行运行jar包报错可能的一些原因

端口号冲突: 有其他的web程序在运行,占用了8080端口没有主清单属性: 在打包jar包前,没有加入打包的插件spring-boot-maven-plugin,参考1.SpringBoot入门的第一个完整小项目(新手保姆版教会打包)…

【EI会议征稿通知】第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024)

第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024) 2024 5th International Conference on Electrical, Electronic Information and Communication Engineering (EEICE 2024) 第五届电气、电子信息与通信工程国际学术会议 (EEICE 2024)将于20…

docker安装esrally教程

本来用源码安装,首先要安装git,python,jdk,还要配环境特别繁琐,好不容易安装好后运行报如下错误,在官网和github搜不到解决方案,无奈之下只能用docker安装。 [ERROR] Cannot race. Error in load generator [0]Cannot…

redis容灾的方案设计

背景 今年各个大厂的机房事故频繁,其中关键组件Redis是重灾区,本文就来看下怎么做Redis的多机房容灾 Redis多机房容灾方案 1.首先最最直观的是直接利用Redis内部的主从数据同步来进行灾备,但是由于Redis内部的主从实现对机房间的网络延迟等…

基于ssm的剧本杀预约系统+vue论文

摘 要 如今社会上各行各业,都在用属于自己专用的软件来进行工作,互联网发展到这个时候,人们已经发现离不开了互联网。互联网的发展,离不开一些新的技术,而新技术的产生往往是为了解决现有问题而产生的。针对于剧本杀预…

el-table表格动态添加列。多组数据拼接和多层级数据的处理

提示&#xff1a;el-table表格动态添加列 文章目录 前言一、多组数据拼接二、多层级处理三、实际应用中&#xff0c;为避免闪屏&#xff0c;可以表格数据统一渲染总结 前言 需求&#xff1a;富文本编辑器 一、多组数据拼接 <template><div class"test">…

深度确定性策略梯度 DDPG

深度确定性策略梯度 DDPG 深度确定性策略梯度 DDPG模型结构目标函数算法步骤适合场景 深度确定性策略梯度 DDPG A2C、A3C 都是在线策略&#xff0c;在与环境交互时&#xff0c;样本参数更新效率低&#xff0c;所以主要是应用在离散空间&#xff0c;计算量没那么大。 DDPG 专用…

「2023年终总结,这就是我的成长见证」有奖征集活动!

2023年已去&#xff0c;2024年已至。总结这一年的成绩&#xff0c;大家都想到了什么呢&#xff1f;是在工作中取得了长足的进步&#xff0c;还是在生活中喜结良缘&#xff1b;是离梦想挥挥手变得更近&#xff0c;还是在现实的道路上更上一层楼。 一叶荣华春秋意&#xff0c;年月…

封装(static的性质、代码块)

目录 前言&#xff1a; 封装&#xff1a; 包&#xff1a; 什么是包&#xff1f; 导入包中的静态方法&#xff1a; 定义包&#xff1a; 访问修饰限定符&#xff1a; private&#xff1a; default&#xff1a; static&#xff1a; static成员变量&#xff1a; sta…

C#(winform)button去掉边框

地址&#xff1a;C#(winform)button去掉各种边框 - 清枫林 - 博客园 (cnblogs.com)

MongoDB CRUD 概述

当本地安装完mongodb数据库后&#xff0c;或拿到一个新的数据库连接字符串时。对于新手来说&#xff0c; 避免不了手痒难耐&#xff0c;想对数据库大肆折腾一番。看到数据库当中存在自己定制化的数据后&#xff0c;心中的成就感油然而生。 本文介绍mongodb简单的crud操作&#…

[UUCTF 2022 新生赛]ez_rce

[UUCTF 2022 新生赛]ez_rce wp 在做这道题时&#xff0c;我参考了这篇博客&#xff1a; https://www.cnblogs.com/bkofyZ/p/17594549.html 认识到了自己的一些不足。 题目代码如下&#xff1a; <?php ## 放弃把&#xff0c;小伙子&#xff0c;你真的不会RCE,何必在此纠…

突显网页设计优势:不可忽视的四项关键要素

网页网站设计要点 一、主题清晰 在明确目标的基础上&#xff0c;完成网站的创意是整体设计方案。定位网站的整体风格和特点&#xff0c;规划网站的组织结构。网站应根据不同的服务对象&#xff08;机构或人员&#xff09;有不同的形式。有些网站只提供简单的文本信息&#xf…

springboot(ssm码头船只货柜管理系统Java系统

springboot(ssm码头船只货柜管理系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#xff09; 数据库工具&…

路径搜索算法 A* 算法 和 Dijkstra 算法

A*算法和Dijkstra算法是两种常用的路径搜索算法&#xff0c;用于在图形结构中寻找最短路径。它们都属于单源最短路径算法&#xff0c;可以用于解决各种寻路问题。 A算法是一种启发式搜索算法&#xff0c;同时考虑了实际移动代价和估计距离代价&#xff0c;通过估计代价来指导搜…

C语言操作符(简单解释版)

算术操作符&#xff1a; &#xff1a;用于将两个数值相加。例如&#xff1a;3 5 8。-&#xff1a;用于从一个数值中减去另一个数值。例如&#xff1a;5 - 3 2。*****&#xff1a;用于将一个数值乘以另一个数值。例如&#xff1a;6 * 5 30。/&#xff1a;用于将第一个数值除…

【程序员的自我修养08】精华!!!动态库的由来及其实现原理

绪论 大家好&#xff0c;欢迎来到【程序员的自我修养】专栏。正如其专栏名&#xff0c;本专栏主要分享学习《程序员的自我修养——链接、装载与库》的知识点以及结合自己的工作经验以及思考。编译原理相关知识本身就比较有难度&#xff0c;我会尽自己最大的努力&#xff0c;争…

穷举vs暴搜vs深搜vs回溯vs剪枝

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;题目大解析&#xff08;3&#xff09; 目录 &#x1f449;&#x1f3fb;全排列&#x1f449;&#…

微信小程序使用echarts报错 ReferenceError: Image is not defined 解决

报错 ReferenceError: Image is not defined 在用uni-app开发微信小程序时&#xff0c;使用到了echarts&#xff08;V4.6.0&#xff09;配置项中的icon属性&#xff0c;微信开发者工具报错如下&#xff1a; 定位问题 定位问题到了压缩echarts文件中的new Image 使用非压缩…