栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

java不可变对象问题

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java不可变对象问题

您将对象的可变性/不可变性与引用值的复制混淆了。

在这些图中,

[var/index]
是参考变量,
{{an Object}}
是对象。

String abc[]={"abc"};String def[]={};   [abc] ------> {{a String[1]}}      [0] --------------> {{a String "abc"}}   [def] ------> {{a String[0]}}

现在,您将

def
参考变量指向与参考变量相同的对象
abc

def=abc;   [abc] ------> {{a String[1]}}   /  [0] --------------> {{a String "abc"}}  /   [def] ---/    {{a String[0]}}

在这一点上,长度为零的数组是未引用的,应该是垃圾回收的。我们可以将讨论范围缩小到长度为1的数组。请注意,a

String[]
是引用数组。在下一行中,您更改了一个数组指向的长度中唯一的元素。

def[0]=def[0]+"changed";   [abc] ------> {{a String[1]}}   /  [0] ---------      {{a String "abc"}}  /         [def] ---/        --> {{a String "abcchanged"}}

请注意,

{{a String "abc"}}
它本身并未突变。
[abc]
[def]
现在指向相同的
{{aString[1]}}
,这是可变的(例如,你可以让数组的元素,这是引用
String
对象,以点到任何东西)。


为了防止

abc
改变我改变
def
,我必须做
def = abc.clone()
;

实际上,这不是很准确。让我们看看如果您

clone()
对可变类型的引用的数组
StringBuilder

    StringBuilder[] abc = new StringBuilder[] { new StringBuilder("Hello") };    StringBuilder[] def = abc.clone();    def[0].append(" world!");    System.out.println(abc[0]); // prints "Hello world!"

这次我不会为您绘制图表,但是您可以轻松地将其绘制在纸上。这里发生的是,即使使用它自己的元素(即)

clone()
创建了第二个
{{aStringBuilder[1]}}
对象
def != abc
,该元素仍指向同一
{{a StringBuilder}}
对象(即
def[0] ==abc[0]
)。


简而言之:

  • 不变性意味着某种类型的对象不能以任何有意义的方式改变给外部观察者
    • Integer
      String
      等是不可变的
    • 通常,所有值类型应为
  • 数组对象是可变的
    • 它可能是对不可变类型的引用的数组,但是数组本身是可变的
    • 意味着您可以将这些引用设置为所需的任何内容
    • 对于基本数组也是如此
    • 一成不变的数组将不切实际
  • 可以共享对对象的引用
    • 如果对象是可变的,则通过所有这些引用都可以看到突变


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/498272.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号