可变对象和不可变对象之间的区别[重复]

Posted

技术标签:

【中文标题】可变对象和不可变对象之间的区别[重复]【英文标题】:Difference between Mutable objects and Immutable objects [duplicate] 【发布时间】:2011-06-07 04:55:18 【问题描述】:

任何人请举例说明可变对象和不可变对象之间的差异。

【问题讨论】:

String 类是不可变对象的一个​​很好的例子。 另见Mutable vs immutable objects(不是Java特定的) 顺便说一句,看看com.jcabi.aspects.Immutable注解 【参考方案1】:

可变对象可以在构造后更改其字段。不可变对象不能。

public class MutableClass 

 private int value;

 public MutableClass(int aValue) 
  value = aValue;
 

 public void setValue(int aValue) 
  value = aValue;
 

 public getValue() 
  return value;
 



public class ImmutableClass 

 private final int value;
 // changed the constructor to say Immutable instead of mutable
 public ImmutableClass (final int aValue) 
  //The value is set. Now, and forever.
  value = aValue;
 

 public final getValue() 
  return value;
 


【讨论】:

+1 正如你在@Ralph 之前的回答,更明确【参考方案2】:

Immutable 对象的状态无法更改。

例如String

String str= "abc";//a object of string is created
str  = str + "def";// a new object of string is created and assigned to str

【讨论】:

【参考方案3】:

可变对象具有可以更改的字段,不可变对象在创建对象后没有可以更改的字段。

一个非常简单的不可变对象是一个没有任何字段的对象。 (例如一个简单的比较器实现)。

class Mutable
  private int value;

  public Mutable(int value) 
     this.value = value;
  

  //getter and setter for value


class Immutable 
  private final int value;

  public Immutable(int value) 
     this.value = value;
  

  //only getter

【讨论】:

【参考方案4】:

从 JVM 的角度来看,它们没有什么不同。不可变对象没有可以更改实例变量的方法。并且实例变量是私有的;因此,您在创建后无法更改它。一个著名的例子是字符串。您没有 setString 或 setCharAt 之类的方法。并且 s1 = s1 + "w" 将创建一个新字符串,而原来的字符串将被丢弃。 这是我的理解。

【讨论】:

... 所有实例变量都是私有的! (否则 -> 可变) @Andreas_D - 谢谢你的提醒。我想我认为这是理所当然的。 赞成“它们与 JVM 的观点没有什么不同”【参考方案5】:

不可变对象只是其状态(对象的数据)在构造后无法更改的对象。 JDK 中不可变对象的示例包括 String 和 Integer。

例如:(点可变,字符串不可变)

     Point myPoint = new Point( 0, 0 );
    System.out.println( myPoint );
    myPoint.setLocation( 1.0, 0.0 );
    System.out.println( myPoint );

    String myString = new String( "old String" );
    System.out.println( myString );
    myString.replaceAll( "old", "new" );
    System.out.println( myString );

输出是:

java.awt.Point[0.0, 0.0]
java.awt.Point[1.0, 0.0]
old String
old String

【讨论】:

好'ol有效的Java。 这就是我要找的...谢谢 myString.replaceAll("old", "new"); -- 这段代码一定是这样 myString=myString.replaceAll( "old", "new" ); -- 我觉得你用错了。 @TugrulAsik - 我的朋友,他只是以正确的方式使用它。 replace/replaceAll 方法将返回值。如果您希望将该商店存储为字符串并使用它。您可以存储到相同的字符串或创建一个新的字符串对象并使用它。 myString.replaceAll( "old", "new" ); 时到底发生了什么。那是什么都没做,还是创建了一个值为“new String”的新字符串,但由于我们没有存储它,所以它丢失了。发生了什么?

以上是关于可变对象和不可变对象之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

可变对象和不可变对象

Python 可变对象和不可变对象

python中的可变参数和不可变参数

可变对象(immutable)和不可变对象(mutable)

python可变对象和不可变对象

Python 面试高频问题:可变数据类型和不可变数据类型的区别