String,也许你并不了解

String,也许你并不了解

不变性(值不可改变): 一旦值初始化了,就不可以再改变。
因为String的不变性,所以对String的大多数操作方法,都会返回一个新的String,因此我们一般都会用一个字符串去接收操作方法返回的新String,如

String str = "\\hello\\";
String str1 = str.replace("l","A");// 用 A 替换 l,替换之后得到的新字符串用str1去接收

注意:如果我们用 str 去接收替换str中某些字符串得到的新字符串,会怎样呢?

String str = "\\hello\\";
//这里用于接收替换得到的新字符串的str与初始化的str,名称虽同,但内存地址不同,所以并不是同一个字符串
str = str.replace("l","A");
System.out.println("str : "+str);

运行结果:

str : \hello\
str : \heAAo\

表面上源字符串的值已经被改变了,实则并不是如此!!!
接下来,我们重点观察:字符串在内存中的的地址变化。
刚开始的时候的 str 的地址为:(将下面的494和507类似看作内存地址)

图片

接收替换得到的新字符串的 str 的地址为:
图片
可以发现初始化的str 和接收替换得到的新字符串的 str 虽然名称相同,但是
存储的内存地址已经发生变化
,所以这两个 str 并不是同一个字符串。(这里就更加验证了:String值的不可变)

换句话说,你内存中494的位置依然可以找到源字符串,此时你会发现源字符串依然为 “\hello” 。

replace方法 和 replaceAll 方法

  • replace方法:用新的字符或者字符串替换匹配到的所有旧字符或者字符串;
  • replaceAll方法:
    • replaceAll(String regex,String replacement) : 如果第一个参数是正则表达式,则表示使用给定的replacement字符串替换此字符串与给定的正则表达式相匹配的每个子字符串;
    • 如果replaceAll 的第一个参数不是正则表达式,则与 replace 方法一样,表示用新的字符串替换匹配到的所有旧字符串。
  • replaceFirst 方法:replaceAll的特殊版,只替换匹配到的第一个子字符串;

注意:
replace、replaceAll、replaceFirst 替换的方法并不能改变源字符串的值

//在Java中"\"表示转义字符,则"\\"实际就表示"\",所以下面的实际字符串就是 \hello\
String str = "\\hello\\";
System.out.println("str : "+str);
/*
(1) 在正则表达式中"\"也表示转义字符,所以要表示例如 "\n", 在Java应使用 "\\n" ;
(2) 所以如果要通过正则表达式中匹配字符串中的 "\\" 则需写成 "\\\\",
要匹配 "\\\\" 则需写成"\\\\\\\\" (8个反斜杠)
\\\\ 先被Java转化为 \\ , 又被正则表达式转化为 \, 表示匹配实际字符串中的 \
\\\\\\\\ 先被Java转化为 \\\\ ,又被正则表达式转化为 \\, 表示匹配实际字符串中的 \\
 */
String str1 = str.replaceAll("\\\\","\\\\\\\\");
System.out.println("str1: "+str1);
/*
replace方法不支持正则表达式,所以只需考虑Java中"\"是转义字符
\\ 被Java转化为 \ ,表示匹配实际字符串中的 \
\\\\ 被Java转化为 \\ ,表示匹配实际字符中的 \\
 */
String str2 = str.replace("\\","\\\\");
System.out.println("str2: "+str2);

//如果replaceAll方法参数不是正则表达式,则和replace方法一样;
String str3 = str.replaceAll("l","Q");
System.out.println("str3: "+str3);

//replaceFirst是replaceAll的特殊版,只替换匹配到的第一个字符串
String str4 = str.replaceFirst("l","A");
System.out.println("str4: "+str4);

System.out.println("str : "+str);//虽然多次执行替换方法,但源字符串str并未改变;

运行结果:

str : \hello\
str1: \\hello\\
str2: \\hello\\
str3: \heQQo\
str4: \heAlo\
str : \hello\
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值