我在不可变字符串上编写了以下代码.
public class ImmutableStrings {
public static void main(String[] args) {
testmethod();
}
private static void testmethod() {
String a = "a";
System.out.println("a 1-->" + a);
a = "ty";
System.out.println("a 2-->" + a);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
a 1-->a
a 2-->ty
Run Code Online (Sandbox Code Playgroud)
这里变量的值a已经改变(许多人说不可变对象的内容不能改变).但究竟是什么意思说String是不可改变的?你能否为我澄清一下这个话题?
来源:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
众所周知,String是不可变的.String不可变的原因是什么,StringBuilder类的引入是可变的?
我最近一直在阅读有关不可变字符串的原因为什么字符串在Java和.NET中不可变?而为什么.NET字符串是不可改变的?以及为什么D选择不可变字符串的一些东西.似乎有很多好处.
更不用说大多数新语言都有不可变的字符串,D2.0,Java,C#,Python等.
C++会从不可变字符串中受益吗?
是否有可能在c ++(或c ++ 0x)中实现具有所有这些优点的不可变字符串类?
更新:
在不可变字符串const_string和fix_str上有两次尝试.五年内都没有更新.它们甚至被使用过吗?为什么const_string没有进入boost?
为此选择了几种语言,例如C#,Java和Python.如果它旨在为比较等操作节省内存或提高效率,它对连接和其他修改操作有什么影响?
StringBuilder类是如何实现的?每次追加时它是否在内部创建新的字符串对象?
这与此问题相反:为什么字符串在Java和.NET中不可变?
这种选择是否仅仅因为操作(追加等)在可变字符串上有效,或者是否有其他原因而在Ruby中进行?
(如果它只是效率,那似乎很奇怪,因为Ruby的设计似乎不会高度重视促进有效的实施.)
我是Java的新手,在学习的时候,我发现了一个String不可变的事实.当我阅读其背后的原因时,出现了一些原因,例如性能提升,因为它的值无法修改,并且可以由多个线程共享.这些理由我明白了.
但我不知道它与安全性有什么关系.如何String在Java安全性中提供不可变的帮助?
请帮助我理解.提前致谢.
这是我上一次采访的方式:
问题:字符串存储在哪里?
答:堆是因为它是参考类型
问题:请解释以下代码:
static void Main(string[] args)
{
string one = "test";
string two = one;
one = one + " string";
Console.WriteLine("One is {0}" , one);
Console.WriteLine("Two is {0}", two);
}
Run Code Online (Sandbox Code Playgroud)
答案:画了两张如下图:
(代表声明, string two = one;

(代表语句, one = one + " string";.在堆上创建一个新字符串并分配)

问题:正确.为下面的代码片段绘制类似的内容:
class Program
{
static void Main(string[] args)
{
Test one = new Test { someString = "test" };
Test two = one;
one.someString = "test String";
Console.WriteLine("One …Run Code Online (Sandbox Code Playgroud) 我不明白为什么System.out.println(name)输出Sam而不受方法的concat函数的影响,而System.out.println(names)输出Sam4作为方法的append方法的结果.为什么StringBuilder受影响而不是String?通常,在对对象的引用上调用方法会影响调用者,所以我不明白为什么String结果保持不变.提前致谢
public static String speak(String name) {
name = name.concat("4");
return name;
}
public static StringBuilder test(StringBuilder names) {
names = names.append("4");
return names;
}
public static void main(String[] args) {
String name = "Sam";
speak(name);
System.out.println(name); //Sam
StringBuilder names = new StringBuilder("Sam");
test(names);
System.out.println(names); //Sam4
}
Run Code Online (Sandbox Code Playgroud) 我想知道Java中的String数组是否可变?我知道字符串是不可变的,但字符串数组怎么样?
如果我有一个字符串数组,并更改内容,是否会创建一个新的字符串对象?或者实际值是否会改变?
提前致谢