Mutable对象和Immutable对象之间的区别

Ram*_*ams 102 java terminology

任何人请举例说明Mutable对象和Immutable对象之间的差异.

Ral*_*lph 127

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

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

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
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ike 69

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

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;
 }

}
Run Code Online (Sandbox Code Playgroud)

  • 在@Ralph和更明确地回答之前回答+1 (5认同)

小智 31

不可变对象只是在构造之后状态(对象的数据)不能改变的对象.JDK中的不可变对象的示例包括String和Integer.

例如:( Point是可变的,字符串是不可变的)

     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 );
Run Code Online (Sandbox Code Playgroud)

输出是:

java.awt.Point[0.0, 0.0]
java.awt.Point[1.0, 0.0]
old String
old String
Run Code Online (Sandbox Code Playgroud)

  • @TugrulAsik - 马的朋友,他只是以正确的方式使用它.replace/replaceAll方法将返回值.如果你想把那个商店变成一个字符串并使用它.您可以存储到相同的字符串或创建新的字符串对象并使用它. (4认同)

Jig*_*shi 22

不可变对象的状态不能改变.

例如String.

String str= "abc";//a object of string is created
str  = str + "def";// a new object of string is created and assigned to str
Run Code Online (Sandbox Code Playgroud)


LLS*_*LLS 13

它们与JVM的观点没有什么不同.不可变对象没有可以更改实例变量的方法.实例变量是私有的; 因此,您在创建它后无法更改它.一个着名的例子是String.您没有setString或setCharAt等方法.并且s1 = s1 +"w"将创建一个新字符串,原始字符串被放弃.这是我的理解.

  • ...并且所有实例变量都是私有的!(否则 -> 可变) (2认同)