我一直在研究Java String.以下问题基于以下帖子
Java String是java中特殊
的String不可变性
不可变性:现在,通过不变性,String类被设计为公共池中的值可以在其他位置/变量中重用.如果String被创建为, 则这很好
String a = "Hello World!";
但是,如果我创建String之类的
String b = new String("Hello World!");
为什么这也是不变的?(或者是吗?).由于这有一个专用的堆内存,我应该能够修改它而不影响任何其他变量.因此,通过设计,还有其他任何原因,为什么String整体被认为是不可改变的?或者我的上述假设是错误的?
我想问的第二件事是关于常见的字符串池.如果我创建一个字符串对象为
String c = "";
是在池中创建的空条目?
这些帖子上已经有帖子吗?如果是这样,有人可以分享链接吗?
我知道C#获得了很多并行编程支持,但是AFAIK仍然没有副作用验证的构造,对吧?
我认为现在C#已经布局了,现在更棘手了.但是有计划将其纳入其中吗?或者F#是唯一具有副作用验证结构的.NET语言吗?
private[this]object MMMap extends HashMap[A, Set[B]] with MultiMap[A, B]
Run Code Online (Sandbox Code Playgroud)
如何将其转换为不可变?
在Dave Thomas的书"编程Elixir"中,他指出"Elixir强制执行不可变数据"并继续说:
在Elixir中,一旦变量引用了诸如[1,2,3]之类的列表,您就会知道它将始终引用那些相同的值(直到您重新绑定变量).
这听起来像"除非你改变它,否则它不会改变"所以我对可变性和重新绑定之间的区别感到困惑.突出差异的一个例子非常有用.
我担心这是一个非常愚蠢的问题,但我必须遗漏一些东西.
为什么可能要使用String.Copy(string)?
文档说明了这种方法
使用与指定String相同的值创建String的新实例.
由于字符串在.NET中是不可变的,我不确定使用此方法的好处是什么,正如我所想的那样
string copy = String.Copy(otherString);
Run Code Online (Sandbox Code Playgroud)
出于所有实际目的,似乎会产生与之相同的结果
string copy = otherString;
Run Code Online (Sandbox Code Playgroud)
也就是说,除了正在进行的任何内部簿记,以及副本不是ReferenceEqualsotherString 的事实,没有可观察到的差异 - 字符串是一个不可变的类,其相等性基于值,而不是身份.(感谢@Andrew Hare指出我的原始措辞不够精确,表明我意识到Copying和not 之间存在差异,但是担心缺乏有用的差异.)
当然,当传递null参数时,Copy会抛出一个ArgumentNullException,而"new instance"可能会占用更多内存.后者几乎不是一个好处,我不确定无效检查是一个足够大的奖金来保证整个复制方法.
谢谢.
有没有一种简单的方法来创建不可变的NumPy数组?
如果必须从中派生出一个类ndarray,那么为了实现不变性,必须覆盖的最小方法集是什么?
我的目标是使Java对象不可变.我上课了Student.我用以下方式对其进行编码以实现不变性:
public final class Student {
private String name;
private String age;
public Student(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public String getAge() {
return age;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,实现Student课堂不变性的最佳方法是什么?
最近遇到了不可变对象的概念,我想知道控制状态访问的最佳实践.即使我的大脑的面向对象部分让我想要在公众成员的视线中畏缩,但我认为没有类似这样的技术问题:
public class Foo {
public final int x;
public final int y;
public Foo( int x, int y) {
this.x = x;
this.y = y;
}
}
Run Code Online (Sandbox Code Playgroud)
我觉得更适合声明字段private并为每个字段提供getter方法,但是当状态明确只读时,这似乎过于复杂.
提供对不可变对象状态的访问的最佳实践是什么?
我知道值类型应该是不可变的,但这只是一个建议,而不是一个规则,对吧?那么为什么我不能做这样的事情:
struct MyStruct
{
public string Name { get; set; }
}
public class Program
{
static void Main(string[] args)
{
MyStruct[] array = new MyStruct[] { new MyStruct { Name = "1" }, new MyStruct { Name = "2" } };
foreach (var item in array)
{
item.Name = "3";
}
//for (int i = 0; i < array.Length; i++)
//{
// array[i].Name = "3";
//}
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
代码中的foreach循环不会编译,而注释for循环工作正常.错误消息:
无法修改'item'的成员,因为它是'foreach迭代变量'
这是为什么?
我最近一直在阅读有关不可变字符串的原因为什么字符串在Java和.NET中不可变?而为什么.NET字符串是不可改变的?以及为什么D选择不可变字符串的一些东西.似乎有很多好处.
更不用说大多数新语言都有不可变的字符串,D2.0,Java,C#,Python等.
C++会从不可变字符串中受益吗?
是否有可能在c ++(或c ++ 0x)中实现具有所有这些优点的不可变字符串类?
更新:
在不可变字符串const_string和fix_str上有两次尝试.五年内都没有更新.它们甚至被使用过吗?为什么const_string没有进入boost?