这可能是有史以来最愚蠢的问题,但我认为这对新手来说完全是一个混乱.
String不可改变的?StringBuilder比首字母和副词更受欢迎?一个很好的例子(在Java中)将非常感激.
请考虑以下示例.
String str = new String();
str = "Hello";
System.out.println(str); //Prints Hello
str = "Help!";
System.out.println(str); //Prints Help!
Run Code Online (Sandbox Code Playgroud)
现在,在Java中,String对象是不可变的.那么为什么对象str可以赋值"帮助!".这与Java中字符串的不变性相矛盾吗?任何人都可以向我解释一下不变性的确切概念吗?
编辑:
好.我现在得到它,但只是一个后续问题.以下代码如何:
String str = "Mississippi";
System.out.println(str); // prints Mississippi
str = str.replace("i", "!");
System.out.println(str); // prints M!ss!ss!pp!
Run Code Online (Sandbox Code Playgroud)
这是否意味着再次创建了两个对象("Mississippi"和"M!ss!ss!pp!"),并且引用str指向replace()方法之后的另一个对象?
为什么他们决定在Java和.NET(以及其他一些语言)中使字符串不可变?他们为什么不让它变得可变?
我一直在研究Java String.以下问题基于以下帖子
Java String是java中特殊
的String不可变性
不可变性:现在,通过不变性,String类被设计为公共池中的值可以在其他位置/变量中重用.如果String被创建为, 则这很好
String a = "Hello World!";
但是,如果我创建String之类的
String b = new String("Hello World!");
为什么这也是不变的?(或者是吗?).由于这有一个专用的堆内存,我应该能够修改它而不影响任何其他变量.因此,通过设计,还有其他任何原因,为什么String整体被认为是不可改变的?或者我的上述假设是错误的?
我想问的第二件事是关于常见的字符串池.如果我创建一个字符串对象为
String c = "";
是在池中创建的空条目?
这些帖子上已经有帖子吗?如果是这样,有人可以分享链接吗?
据我所知,
可以更改可变字符串,并且不能更改不可变字符串.
在这里,我想像这样更改String的值,
String str="Good";
str=str+" Morning";
Run Code Online (Sandbox Code Playgroud)
和其他方式是,
StringBuffer str= new StringBuffer("Good");
str.append(" Morning");
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,我试图改变其价值str.任何人都可以告诉我,这两种情况有什么不同,并给我清晰的可变和不可变对象的图片.
public class StackOverFlow {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("A");
al.add("B");
markAsNull(al);
System.out.println("ArrayList elements are "+al);
String str = "Hello";
markStringAsNull(str);
System.out.println("str "+ str);
}
private static void markAsNull(ArrayList<String> str){
str.add("C");
str= null;
}
private static void markStringAsNull(String str){
str = str + "Append me";
str = null;
}
}
Run Code Online (Sandbox Code Playgroud)
ArrayList elements are [A, B, C]
str Hello
Run Code Online (Sandbox Code Playgroud)
在这种情况下ArrayList,添加的元素将被检索.如果String方法调用对传递的String没有影响.JVM到底在做什么?谁能详细解释一下?
我想详细了解Enhanced For Loop如何在Java中工作(假设我确实了解了这个循环的基本用法以及它是如何工作的).
给出以下代码:
String[] a = {"dog", "cat", "turtle"};
for (String s : a) {
out.println("String: " + s);
s = in.readLine("New String? ");
}
Run Code Online (Sandbox Code Playgroud)
它实际上并没有修改原始列表'a'.为什么不?内存管理如何工作?这不是'a [i]'的同一个存储单元的引用吗?
我在oracle文档中读到,增强for循环不能用于从原始数组中删除元素,这是有道理的.修改值是否相同?
提前致谢
String a = "abc";
Run Code Online (Sandbox Code Playgroud)
这会"abc"在字符串池中创建文字.
String b = "abc";
Run Code Online (Sandbox Code Playgroud)
没有创建新的文字.b指向现有的"abc".
String c = new String("abc");
Run Code Online (Sandbox Code Playgroud)
现在,对象在堆中创建并c指向堆.文字也在字符串池中创建.
但是,如果池已经有文字,会发生什么"abc"?池中会有重复的文字吗?
我正在学习字符串概念,所以写了一个代码,期望一个不同的输出,但有一些非常意外的事情.
class stringmute
{
public static void main(String[] args)
{
String s1="Hello "; //string one.
System.out.println("Str1:"+s1);
String s2= s1+"world"; //New String.
System.out.println("Str2="+s2);
s1=s1+"World!!"; //This should produce only Hello right?
System.out.println("Str1 modified:"+s1);
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行上面的代码时,我得到的输出为:
Str1:Hello
Str2=Hello world
Str1 modified:Hello World!!
Run Code Online (Sandbox Code Playgroud)
如果我做错了什么,请告诉我.由于字符串是不可变的,这意味着我们应该将"Str1 Modified"的输出作为"HELLO"而不是"HELLO WORLD !!".
java ×10
string ×8
immutability ×5
mutable ×2
.net ×1
for-loop ×1
padding ×1
parameters ×1
stringbuffer ×1