Java之字符串

STM32接入CH340芯片的升级电路及初始化进入升级模式(死机)问题处理 MCU-REST 在 MCU-BOOT0 处于低电平状态下,进行下拉操作,在MCU-REST 与 MCU-BOOT0 恢复正常电平时,将导致MCU死机,MCU-REST 先于 MCU-BOOT0 下拉可解决该问题;MCU-REST 在 上升沿结束时将判断 MCU-BOOT0 的状态,MCU-BOOT0 处于高电平,MCU死机,MCU-BOOT0 处于低电平 MCU 正常; 阅读详情

类:String、StringBuffer、StringBuilder

1.区分String、StringBuffer、StringBuilder

String:字符串常量

StringBuffer:字符串变量(线程安全)

StringBuilder:字符串变量(非线程安全,速度快)

简要的说, String 类型和StringBuffer 类型的主要性能区别其实在于String 是不可变的对象,因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的String 对象,然后将指针指向新的String 对象,所以经常改变内容的字符串最好不要用String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的。而如果是使用StringBuffer 类则结果就不一样了,每次结果都会对StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用StringBuffer ,特别是字符串对象经常改变的情况下。在对象不需要同步机制支持的情况下,StringBuilder是StringBuffer的良好替代。

在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了StringBuffer 对象的拼接,所以这些时候String 对象的速度并不会比StringBuffer 对象慢,而特别是以下的字符串对象生成中,String效率是远要比StringBuffer 快的。

String S1= “This is only a” + “ simple” + “ test”;

StringBufferSb = new StringBuilder(“This is only a”).append(“simple”).append(“ test”);

你会很惊讶的发现,生成String S1 对象的速度简直太快了,而这个时候StringBuffer 居然速度上根本一点都不占优势。其实这是JVM 的一个把戏,在 JVM 眼里,这个

String S1= “This is only a” + “ simple” + “test”;

其实就是:

String S1= “This is only a simple test”;

所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的String 对象的话,速度就没那么快了,譬如:

String S2= “This is only a”;

String S3= “ simple”;

String S4= “ test”;

String S1= S2 +S3 + S4;

这时候 JVM 会规规矩矩的按照原来的方式去做。

Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。

这三个类都是 final类型,不能被继承。

StringBuilder和StringBuffer常用方法:capacity() length()   append(XX xx)  insert(int offset, XXxx)   delete(int start, int end)  deleteCharAt(int index) charAt(int index) indexOf(String str)indexOf(String str, int fromIndex)lastIndexOf    replace(int start, int end, Stringstr)   reverse()。

2.String常用方法:

trim()   去掉前导和尾部空白

replacerelaceAllreplaceFirst       str.replaceAll("a","b");不会改变str的值,replaceAll返回的是String类型,要改变str值,要写成str=str.replaceAll("a","b");

3.字符串判等之“==”与“equals”

①首先String不属于8种基本数据类型,String是一个对象。因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。

② newString()和newString(“”)都是申明一个新的空字符串,是空串不是null;

③ Stringstr=”kvill”与Stringstr=new String (“kvill”)的区别:

在这里,我们不谈堆,也不谈栈,只先简单引入常量池这个简单的概念。常量池(constantpool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。常量池实际上是堆中一小块空间,对基本数据类型和String等在编译期间就能确定值的变量进行存储,具体参考:百度百科常量池http://baike.baidu.com/view/8680346.htm。
。

看例1:

Strings0=”kvill”;

Strings1=”kvill”;

Strings2=”kv” + “ill”;

System.out.println(s0==s1 );

System.out.println(s0==s2 );

结果为:

true

true

首先,我们要知道Java会确保一个字符串常量只有一个拷贝。因为例子中的s0和s1中的”kvill”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”kv”和”ill”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”kvill”的一个引用。所以我们得出s0==s1==s2;用newString() 创建的字符串不是常量,不能在编译期就确定,所以newString()创建的字符串不放入常量池中,它们有自己的地址空间。

看例2:

Strings0=”kvill”;

Strings1=new String(”kvill”);

Strings2=”kv” + new String(“ill”);

System.out.println(s0==s1 );

System.out.println(s0==s2 );

System.out.println(s1==s2 );

结果为:

false

false

false

例2中s0还是常量池中”kvill”的应用,s1因为无法在编译期确定,所以是运行时创建的新对象”kvill”的引用,s2因为有后半部分newString(“ill”)所以也无法在编译期确定,所以也是一个新创建对象”kvill”的应用;明白了这些也就知道为何得出此结果了。

4. String.intern()

再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;看例3就清楚了。

例3:

Strings0= “kvill”;

Strings1=new String(”kvill”);

Strings2=new String(“kvill”);

System.out.println(s0==s1 );

s1.intern();

s2=s2.intern();//把常量池中“kvill”的引用赋给s2

System.out.println(s0==s1);

System.out.println(s0==s1.intern() );

System.out.println(s0==s2 );

结果为:

false

false //虽然执行了s1.intern(),但它的返回值没有赋给s1

true //说明s1.intern()返回的是常量池中”kvill”的引用

true

最后我再破除一个错误的理解:有人说,“使用String.intern()方法则可以将一个String类的保存到一个全局String表中,如果具有相同值的Unicode字符串已经在这个表中,那么该方法返回表中已有字符串的地址,如果在表中没有相同值的字符串,则将自己的地址注册到表中“如果我把他说的这个全局的String表理解为常量池的话,他的最后一句话,“如果在表中没有相同值的字符串,则将自己的地址注册到表中”是错的。

看例4:

Strings1=new String("kvill");

Strings2=s1.intern();

System.out.println(s1==s1.intern() );

System.out.println(s1+" "+s2 );

System.out.println(s2==s1.intern() );

结果:

false

kvillkvill

true

在这个类中我们没有声名一个”kvill”常量,当我们调用s1.intern()后就在常量池中新添加了一个”kvill”常量,原来的不在常量池中的”kvill”仍然存在,也就不是“将自己的地址注册到常量池中”了。s1==s1.intern()为false说明原来的“kvill”仍然存在;s2现在为常量池中“kvill”的地址,所以有s2==s1.intern()为true。

5. 关于equals()和==

  这个对于String简单来说就是比较两字符串的Unicode序列是否相当,如果相等返回true;而==是比较两字符串的地址是否相同,也就是是否是同一个字符串的引用。

6. 关于String是不可变的

  这一说又要说很多,大家只要知道String的实例一旦生成就不会再改变了,比如说:Stringstr=”kv”+”ill”+” “+”ans”; 就是有4个字符串常量,首先”kv”和”ill”生成了”kvill”存在内存中,然后”kvill”又和” “生成 ”kvill “存在内存中,最后又和生成了”kvillans”;并把这个字符串的地址赋给了str,就是因为String的“不可变”产生了很多临时变量,这也就是为什么建议用StringBuffer的原因了,因为StringBuffer是可改变的。

7. 不同操作系统下的换行符

java中写入文件时换行符是用"\r\n"还是"\n"?

\r 叫回车Carriage Return ;

\n 叫新行New Line 。

但是都会造成换行,使用System.getProperty("line.separator")来获取当前OS的换行符,可以在调试的情况下看到!

各系统换行符应当是:

\r Mac

\nUnix/Linux

\r\nWindows

可以用replaceAll方法转换:str =str.replaceAll("\n", "\r\n");

 

参考:http://www.cnblogs.com/tjuximo/archive/2011/03/25/1995458.html

 

C#上位机多PLC多协议开发思路:10年老工控师拆解实战方案,避坑90%的问题(附代码框架) 是否连接成功数据地址(如“DB1.DBW0”“D100”“4x0001”) 阅读详情

相关推荐

特斯拉数字孪生4.0体系解析:从“数字镜像“到“持续进化“的造车革命

当每一辆汽车都拥有自己的“数字分身”,我们正见证的不仅是技术革新,更是整个制造业文明形态的跃迁。其数字孪生体已超越“数字镜像”的被动属性,成为。特斯拉年服务收入超1200美元/车的业绩表明,数字孪生正在将汽车从“交通工具”转变为“持续增值的智能终端”。构建起覆盖设计、制造、使用、服务全链条的虚拟镜像体系,将物理世界与数字世界的融合推向新高度。:特斯拉的实践证明,数字孪生已从“技术选项”升级为“战略必选项”。不仅重塑了汽车产品的价值创造逻辑,更预示着整个制造业向“元宇宙工业”演进的新范式。

beige888的博客 1608

java字符串删除字符串_Java从字符串中删除字符

java字符串删除字符串Sometimes we have to remove character from String in java program. But java String class doesn’t have remove() method. So how would you achieve this? 有时我们必须在Java程序中从String中删除字符。 但是java Str...

从零开始的教程世界 2万+

Quanto option期权公式推导(更新中)

Quanto期权不同于以标的股票或资产的计价货币支付最终收益的普通欧式期权,它以另一种货币以预先确定的汇率支付最后的收益。以股票B的计价货币来计价的quanto看涨期权的收益为F0×max⁡(Sa(T)−K,0)×Sb(T)F_0 \times \max(S_a(T)-K, 0) \times S_b(T)F0​×max(Sa​(T)−K,0)×Sb​(T) 其中SaS_aSa​以货币A计价,SbS_bSb​以货币B计价,F0F_0F0​是预先固定的汇率. 假设上述股票均遵循几何布朗运动,可以得到以下恒等式

qq_41782124的博客 3683

【Java基础】Java字符串的处理

在Java中定义一个字符串最简单的方法是用双引号把它包围起来。这种用双引号括起来的一串字符实际上都是String对象,如字符串"Hello"在编译后即成为String对象。因此也可以通过创建String类的实例来定义字符串。不论使用哪种形式创建字符串,字符串对象一旦被创建,其值是不能改变的,但可以使用其他变量重新赋值的方式进行更改。1.直接定义字符串直接定义字符串是指使用双引号表示字符串中的内容,例如"HelloJava"、"Java编程"等。或者注意2.{............

wang_qiu_hao的博客 7328

进阶数据结构——链式前向星

链式前向星是一种进阶的数据结构,主要用于图的存储。我希望大家先看这个视频(蓝色字体点进去) 不然你很难理解的。在图论中,图的存储方式主要有邻接矩阵和邻接表两种。邻接矩阵虽然建图简单方便,但占内存较大,节点数量稍微大点的题目就难以使用(适合稠密图);而邻接表虽然节省空间,但其指针形式难写易错,且vector形式的读取速度较慢,易导致大数据下的超时(TLE)。针对上述问题,链式前向星作为一种折中的方式应运而生。链式前向星本质上是一种静态链表,它将数据以链表形式连接在一起。

ycs66的博客 2136

R语言实战:非正态数据下的Scheirer–Ray–Hare检验全流程解析

本文详细解析了在R语言中执行Scheirer–Ray–Hare检验的全流程。当数据不满足正态分布假设时,该非参数检验是传统双因素方差分析的有效替代方案。文章从原理、R环境配置、数据准备、代码实现、结果解读到事后比较与可视化,提供了完整的实战指南,帮助研究者稳健地分析多因素实验设计中的主效应和交互效应。

cc789的博客 406

Java——字符串

前言字符串详解。

weixin_73551991的博客 2087

不止于HTTPS请求:用VS2022编译的libcurl玩转文件上传和代理设置

本文详细介绍了如何使用VS2022编译的libcurl库实现文件上传和高级代理配置。通过实战代码示例,展示了多部分表单上传、二进制数据上传以及各种代理设置技巧,帮助C++开发者提升网络编程能力。

weixin_28595749的博客 206

Java字符串

Java中的字符串是表示一个字符序列的对象。在Java中,字符串是作为对象出现的,由类和或类实现。

曾续缘的博客 785

用python提取PDF中各类文本内容的方法

用python提取PDF中各类文本内容的方法

安静的软件工程师 6086

4、LTE无人机认证:保障通信安全的新方案

本文针对LTE网络中无人机通信存在的安全风险,提出了一种基于可信第三方GCS的新型认证协议。该协议通过非对称加密和哈希函数保护IMSI等敏感信息,防止身份泄露、中间人攻击、拒绝服务攻击和位置追踪等威胁。利用Scyther工具对协议进行形式化分析,验证了其在机密性、一致性和活性等方面的安全属性,证明该方案能有效提升无人机在LTE网络中的通信安全性与隐私保护能力。

pink的博客 61

java 字符串

Java字符串的核心特性是不可变性,创建后无法修改,任何修改操作都会生成新对象。字符串常量池优化内存,字面量创建的字符串会复用常量池对象。创建方式包括字面量(推荐)和new关键字。常用方法包括获取长度、判断内容、查找位置、截取子串等。注意区分==和equals(),以及空字符串与null。频繁拼接字符串时建议使用StringBuilder或StringBuffer以提高性能。String适用于固定文本,StringBuilder用于单线程频繁修改,StringBuffer用于多线程环境。

Giants2024的博客 2126

OpenCASCADE完整教程专栏完整目录

OpenCASCADE完整教程专栏完整目录

希望我的博客,能帮上你解决学习中工作中所遇到的问题 9701

java字符串

对java字符串的中的String进行了简要的介绍其他内容后续会补充

weixin_67746739的博客 1402

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java基础——字符串

了解Java基础——字符串:String,字符串比较,StringBuliser,StringJoiner。

Lxqhuifeideyu的博客 2303

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java字符串总结

近期在学习Java字符串,梳理总结一下,更多是关于内存角度去分析,希望对你有帮助。

Byragon的博客 820

java 字符串 复制_Java字符串复制

java 字符串 复制Sometime back I was asked how to copy a String in java. As we know that String is an immutable object, so we can just assign one string to another for copying it. If the original string val...

从零开始的教程世界 2万+

什么是java字符串_java 字符串

作业一:请运行以下实例代码StringPool.java,查看其输出结果。如何解释这样的输出结果?从中你能总结出什么?结论:在Java中,内容相同的字串常量(“Hello”)只保存一份以节约内存,所以s0,s1,s2实际上引用的是同一个对象。编译器在编译s2一句时,会去掉“+”号,直接把两个字串连接起来得一个字串(“Hello”)。这种优化工作由Java编译器自动完成。当直接使用new关键字创建字...

weixin_39786850的博客 262

java中字符串怎么表示_Java中的字符串

字符串的本质是char类型的数组,但在java中,所有用双引号""声明的字符串都是一个String类的对象。这也正体现了Java完全面向对象的语言特点。String 类1、String类对象表示的是一个常量字符串。它是不可变长度的。也就是说,一旦创建了一个String类的实例,那么这个实例所表示的串是不可改变的。类似于str = str + "Hello";这样的操作,实质上是将 str 和 "H...

weixin_36387104的博客 2586

Java 字符串

Java 字符串

weixin_71219171的博客 979

java 字符串 对象_Java中字符串对象

标签:Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new String("droid");,这两种方式我们在代码编写时都经常使用,尤其是字面量的方式。然而这两种实现其实存在着一些性能和内存占用的差别。这一切都是源于JVM为了减少字符串对象的重复创建,其维护了一个特殊的内...

weixin_35851482的博客 1416

java字符串下标替换_java字符串下标替换

Java将字符串中的空格换为逗号_计算机软件及应用_IT/计算机_专业资料。Java将字符串中的空格换为逗号 import java.util.regex.Matcher; import java.util.regex.......java将字符串中的空格换为逗号_计算机软件及应用_IT/计算机_专业资料。少年易学老难成,一寸光阴不可轻 - 百度文库 import java.util.regex....

weixin_32256355的博客 4280

java——字符串

空串:指的是长度为 0 的字符串,它是一个实际存在的字符串对象,只是其中不包含任何字符。在 Java 中,可以用双引号""来表示空串。Null串null并不是一个字符串对象,而是一个特殊的值,它表示变量没有引用任何对象。当一个字符串变量被赋值为null时,意味着这个变量没有指向任何有效的字符串对象。// 定义空串// 定义 Null 串// 输出空串的长度System.out.println("空串的长度: " + emptyString.length());try {

m0_61261153的博客 922

JAVA中截取字符串中指定字符串

JAVA中截取字符串中指定字符串 举个例子,需要截取“abcdef”中的“cde”。 场景1:获取该字符串的下标。输出“cde”。 public static void main(String[] args) { // TODO Auto-generated method stub String data = "abcdef"; String out = data.substring(...

lanfengyong的博客 1万+

java字符串_Java字符串

java字符串Java String is one of the most widely used class. Java String class is defined in java.lang package. Java String是使用最广泛的类之一。 Java String类在java.lang包中定义。 Java字符串 (Java String) Basically, string...

从零开始的教程世界 375

java怎么输出字符串_java输出字符串,怎么样输出字符串?

下面要给大家讲的就是java输出字符串的问题,那么java怎样输出字符串呢?具体要怎样操作?一起来了解一下。一般在java编程的过程当中,经常会使用System.out.println();来输出字符串。来看一下System.out.println();首先是System,System是一个类,它继承于根类Object。其次是out,out的话是类PrintStream类实例化的一个对象,并且还是...

weixin_39965490的博客 1万+

Java String字符串

我们可以将Java字符串定义为Java中的对象,用于按顺序存储字符。现在我们已经学习了Java字符串的定义及其示例,接下来我们将了解如何在实际应用中创建Java字符串。不可变性String类是不可变的,一旦创建了一个String对象,其内容就不能改变。每次对字符串进行修改(如拼接、替换等)都会创建一个新的String对象。线程安全:由于String是不可变的,因此它是线程安全的,多个线程可以共享同一个String对象而不会发生数据不一致的问题。

疯一样的码农 1139
上一篇: Java之正则表达式
下一篇: Java之多线程
fsz521
博客等级 码龄16年 33粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值