一直以为String、Array、Collection、File、I-O是所有编程语言的基础也是重点。
今天简单对String做以简单的小结。
《编程思想》中的开场语:可以证明,字符串操作是计算机程序设计中最常见的行为。尤其是在java大展拳脚的Web系统中。
Java中String的几个要点:
1.String是不可变的
2.String的基本操作
3.StringBuffer & StringBuilder
进击的String:
1.格式化的输出
2.正则表达式
3.扫描输入
1.不可变的String
根据JDK的描述,我们可以看到String类型在从创建之后就是不可变的,只能shared,不能change.
《thinking In java》按:String类中任何看来会修改String值的方法,实际都是创建了一个全新的String对象,以包含修改后的字符串内容。而最初的String对象丝毫未动。
// String abc = "abc"; 两种 char[] data = {'a', 'b', 'c'}; String abc = new String(data); System.out.println(abc.toUpperCase()); //ABC System.out.println(abc); //abc
上面可以看到虽然对abc做了upperCase,但是abc本身并没有做出任何变化。实际上abc.toUpperCase只是返回了一个新的String对象。
2.String类的基本操作
package test; public class TestString { public static void main(String[] args) { String test = new String("hello WORLD! "); String replace = test.replace('o', 'a'); String upperCase = test.toUpperCase(); System.out.println(upperCase);//HELLO WORLD! String lowerCase = test.toLowerCase();//hello world! System.out.println(lowerCase); char index = test.charAt(3); System.out.println(index);//l int codePoint = test.codePointAt(3); System.out.println(codePoint);//108 //compareToIgnoreCase System.out.println(test.compareToIgnoreCase(lowerCase));//0 System.out.println(test.compareToIgnoreCase(upperCase));//0 System.out.println(upperCase.compareToIgnoreCase(lowerCase));//0 //compareTo System.out.println(upperCase.compareTo(lowerCase));//-32 //concat System.out.println(lowerCase.concat(upperCase));//hello world! HELLO WORLD! //substring System.out.println(test.substring(2));//llo WORLD! System.out.println(test.substring(0, 5));//hello //trim System.out.println(test.trim());//hello WORLD!注意这里的空格被去掉了 System.out.println(test);//hello WORLD! 最后一个有空格,test从没改变 } }
3.StringBuffer & StringBuilder
JDK中给出的StringBuffer的解释:
String buffers are safe for use by multiple threads.
The principal operations on a StringBuffer are the append and insert methods, which are overloaded so as to accept data of any type. Each effectively converts a given datum to a string and then appends or inserts the characters of that string to the string buffer.
简单解释一下:
StringBuffer最主要的操作是append和insert接口,这些接口都已经被重写过以便支持各种数据类型。这些方法首先将给定数据转换成String类型,然后再将该string对象appends 或者insert到stringbuffer对象中。事实上,sb.append(x)的效果与sb.insert(sb.length(),x)是一样的。
简单测试一下:
StringBuffer buffer = new StringBuffer("hello world! "); buffer.append("I am me! "); System.out.println(buffer);//hello world! I am me! buffer.insert(5, " my"); System.out.println(buffer);//hello my world! I am me!
可以看粗,StringBuffer的确是像一个String,但是可以修改。
有意思的是JDK文档中给出的最后一段话
上文中提到StringBuffer是有容积的。只要string buffer 中的字符序列不超过buffer的容积,就不会再分配新的array给它,否则溢出的话,会自动扩展。JDK5提供了stringbuffer的一个单线程等价类——StringBuilder。同时JDK建议,应该优先考虑StringBuilder,因为它的接口与StringBuffer完全一样,但是要更快,不过是非线程安全的。
再看StringBuilder:
JDK给的定义:
与上面的StringBuffer后面给出的对比如出一辙,可笑的是,后面的关于接口功能的介绍貌似是从StringBuffer文档中直接copy过来的,由此可见,StringBuilder实际上是单线程情况下高效版StringBuffer,功能几乎完全一样。
来个小结:
String类不可变,在每次对String对象做改变操作的时候总是会生成新的String对象,如果程序中有频繁的改动字符串内容的操作,那么势必会在内存中产生许多无引用对象,导致GC,拖慢速度。
在上面StringBuffer的JDK文档中也说的很明白,StringBuffer最主要的操作就是append,insert等改变string内容的接口,因此如果需要频繁的修改String内容的话,推荐使用StringBuffer(多线程)、StringBuilder(单线程)。
相关推荐
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
铅酸电池失效仿真comsol
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
Java小程序项目源码,该项目包含完整的前后端代码、数据库脚本和相关工具,简单部署即可运行。功能完善、界面美观、操作简单,具有很高的实际应用价值,非常适合作为Java毕业设计或Java课程设计使用。 所有项目均经过严格调试,确保可运行!下载后即可快速部署和使用。 1 适用场景: 毕业设计 期末大作业 课程设计 2 项目特点: 代码完整:详细代码注释,适合新手学习和使用 功能强大:涵盖常见的核心功能,满足大部分课程设计需求 部署简单:有基础的人,只需按照教程操作,轻松完成本地或服务器部署 高质量代码:经过严格测试,确保无错误,稳定运行 3 技术栈和工具 前端:小程序 后端框架:SSM/SpringBoot 开发环境:IntelliJ IDEA 数据库:MySQL(建议使用 5.7 版本,更稳定) 数据库可视化工具:Navicat 部署环境:Tomcat(推荐 7.x 或 8.x 版本),Maven
springboot124中药实验管理系统设计与实现,含有完整的源码和报告文档
解除劳动合同协议书
快速过滤图像融合Matlab代码.rar
强调图像中内核形状(例如直线)的过滤器Matlab代码.rar
在内网linux服务器安装redis 在Linux环境中离线安装Redis是常见的需求,尤其是在内网服务器上,由于无法直接访问公网,我们需要提前下载Redis的源码包并手动安装。下面将详细解释如何进行这一过程。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
微信小程序StartKitw_xapp-startkit
座位选择微信小程序版本
机械臂代码_Mechanical_arm
图像分割测试视频river-light.mp4
前端分析-2023071100789
labview源码参考示例,可供参考学习使用
MPC跟踪轨迹圆形(以后轴为基准)
MATLAB代码:基于主从博弈的智能小区代理商定价策略及电动汽车充电管理 关键词:电动汽车 主从博弈 动态定价 智能小区 充放电优化 参考文档:《基于主从博弈的智能小区代理商定价策略及电动汽车充电管理》基本复现 仿真平台:MATLAB+CPLEX gurobi平台 优势:代码具有一定的深度和创新性,注释清晰,非烂大街的代码,非常精品 主要内容:代码主要做的是一个电动汽车充电管理和智能小区代理商动态定价的问题,将代理商和车主各自追求利益最大化建模为主从博弈,上层以代理商的充电电价作为优化变量,下层以电动汽车的充电策略作为优化变量,通过优化得出最优电价策略以及动态充电策略,代码出图效果非常好,店主已经对代码进行了深入的加工和处理,出图效果非常好,代码质量非常高,保姆级的注释以及人性化的模块子程序,所有数据均有可靠来源,联系后会直接发您资料,保证您学得会,用的起来,简直是萌新福利
springboot154基于Spring Boot智能无人仓库管理,含有完整的源码和报告文档
Matlab领域上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作