java中教材说String类不能进行修改、删除、替换,要用StringBuffer。
发布网友
发布时间:2022-04-23 21:30
我来回答
共4个回答
热心网友
时间:2023-09-25 01:11
String 的所有操作都不是更改对象本身,而是返回了新的字符串;就是说,replaceAll之前和之后不是一个对象了!
==================
其实 【遗忘99】 说的有点过了。你现在不要理会网上争论的字符串常量池问题,所有关于几个String对象的问题,都暂时不要理会;JVM不同,其实结论是不同的。而且他说的那个列子,几乎所有现代JVM,都生成2个对象:"abc" 和 "abcabc",不是3个。
总之你记得:两个拼写不一样的String ,一定是不同的对象;两个拼写一样的String,也可能是不同的对象
==================
再给你个例子,跑跑看,根据结果自己想想,很容易就明白了:
String a = "ABC";
String anotherA = a.replaceAll("A", "B");
System.out.println(a);
System.out.println(anotherA);
System.out.println(a==anotherA);
StringBuffer b = new StringBuffer("ABC");
StringBuffer anotherB = b.replace(0, 1, "B");
System.out.println(b);
System.out.println(anotherB);
System.out.println(b==anotherB);
热心网友
时间:2023-09-25 01:11
这是说字符串的“不可改变”是字符串池,例如,
String str1 = "abc";
String str2 = "abc";
str1 += str2; //new obj
现在有了三个对象。
像你说的relpaceAll方法,最终是创建一个新对象,而原理的对象是不变的。追问有创建新对象吗?不是把原来的字符串替换成新的字符串,整个替换过程并没有改变原对象的引用也就是地址吗?
热心网友
时间:2023-09-25 01:12
在实用中:
String 的改变会改变存放这个数据的物理地址,如果程序中需要频繁得改变某一个String变量的话效率很低
StringBuffer如果改变而导致原来的物理地址不够用的时候,会延伸物理地址,相对String的改变更为方便
我曾经做过类似的东西,不断的往一个String中增加新的字符串,大约一万个,用String要运行1分钟多,用StringBuffer只要1秒
再说,replaceAll()不是对String进行修改,是生成新的String,这样用:
String a = "123";String b = "";b = a.replaceAll("1","3");
得到结果是 b是323, a还是那个123追问也就是说,进行替换时是相当于对源对象进行复制一遍,这时有两个占据不同内存的字符串,物理地址不同,源字符串没改变,复制成的字符串进行替换,是这样吗?如果被替换的字符串长度和替换的字符串长度不一样能完成替换吗?帮我讲解一下这个问题,谢谢。
追答我认为应该是将一个字符串逐字逐句的复制到一个新的地址,在复制过程中如果遇到要求替换的就直接替换了,复制出的新的字符串就是replacaAll()生成的新的String变量,原来的String变量没变。
replaceAll("1","1234567890")这样是可行的。
介绍个例子:一般网站发帖的帖子里是不应该有引号的,因为在写入数据库时帖子中的引号会导致错误,甚至可以用来注册攻击,所以一般都会用一个replace("\"","abcdefg......")把要写入数据库的字符串中的引号替换掉,等要读取这个帖子时,会用replace("abcdefg......","\"")把引号换回来
这里顺便说一下,repalaceAll(oldString,newString)是以前的JAVA方法,现在已经用
repalace(oldString,newString)方法代替了,而repalaceAll()方法一般用以正则表达式的替换
热心网友
时间:2023-09-25 01:12
建议楼主去看下源码,就啥都明白了
Java中String和StringBuffer的区别
简单地说,就是一个变量和常量的关系。StringBuffer对象的内容可以修改;而String对象一旦产生后就不可以被修改,重新赋值其实是两个对象。StringBuffer的内部实现方式和String不同,StringBuffer在进行字符串处理时,不生成新的对象,在内存使用上要优于String类。所以在实际使用时,如果经常需要对一个字符串...
String类和StringBuffer类的区别
(1)String类对象为不可变对象,一旦你修改了String对象的值,隐性重新创建了一个新的对象,释放原String对象,StringBuffer类对象为可修改对象,可以通过append()方法来修改值 (2)String类对象的性能远不如StringBuffer类。 关于以上具体解释如下: 在java中有3个类来负责字符的操作。 1.Character 是进行单个字符操作的, ...
JAVA中字符串类型String是不允许改变其内容的,那么请问简要谈谈下列语 ...
确实,Java中的String类型确实是不允许改变其内容的,String类型的对象一旦建立,将在堆内存当中占据一个固定的内存空间,String类型的对象无法改变。但是你在运算的时候又发现,你定义的String类型的s变量又是可以进行连接的,如"abc"+"def"最终得到的s的值是"abcdef",这似乎看着String类型的对象又是可...
请问java中的String类和StringBuffer类有什么区别与联系,谢!
1.Character 是进行单个字符操作的,2.String 对一串字符进行操作。不可变类。3.StringBuffer 也是对一串字符进行操作,但是可变类。String:是对象不是原始类型.为不可变对象,一旦被创建,就不能修改它的值.对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.String 是final类...
经常要修改的字符串,要String,还是要StringBuffer()好呢!
用stringBuffer()好些,因为string就相当于又new 了一个对象,string和stringBuffer的区别是,string是定长,长度不可变的,每次修改就又new 了一个对象,而StringBuffer是的长度是可变的,不会再new一个对象,用append添加
String类中的内容一旦被初始化就不能再改变,那么为什么还有replace和...
String的不可变性是指:在String对象池中具体的String对象一经new出后就不能改变了,但是指向该串的引用仍然可以指向池中其它地方,也就是说值为final的,但引用还是活的.
在java中,说String是不可变的,可是为什么
1. 首先String不属于8种基本数据类型,String是一个对象。因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;3. String str=”kvill”;String str=new ...
String、StringBuffer和StringBuilder类的区别
接着,我们深入探讨String、StringBuffer与StringBuilder类的特点。String类提供了一个安全且不可修改的字符串实例,一旦创建,其内容不能改变。这使得String在需要安全、不可变字符串操作的场景下成为理想选择。StringBuffer类是为了高效地拼接大量字符串而设计的,它提供了append和add方法,允许在已有的字符串...
string和stringBuffer有什么区别?
1、String:用在固定的字符串,不经常对字符串进行更改的情况。2、StringBuffer:经常需要对一个字符串进行修改,例如插入,删除等操作,使用StringBuffer要更加适合一些。三、优势不同 1、String:String类中没有用来改变已有字符串中的某个字符的方法 2、StringBuffer:StringBuffer的类属于一种辅助类,可...
为什么java中的字符串是可修改的,而C++中的字符串不可修改.具体指什么...
java中的String类是不可修改的,你看着能修改,是修改的字符串引用的值,而不是字符串本身,但是java中还有一个类Stringbuffer类,这个是可修改的 C++中的字符串类型,是静态的,所以不能修改,如果想修改的话,把字符串存入数组比较好