具有 ArrayList 成员变量的不可变对象 - 为什么可以更改该变量?

2024-03-27

我有一个包含各种成员变量的类。有一个构造函数,有 getter 方法,但没有 setter 方法。事实上,这个对象应该是不可变的。

public class Example {
   private ArrayList<String> list; 
}

现在我注意到以下内容:当我使用 getter 方法获取变量列表时,我可以添加新值等等 - 我可以更改ArrayList。当我下次打电话时get()对于这个变量,改变了ArrayList被返回。怎么会这样?我没有再设置,我只是努力而已! 与一个String这种行为是不可能的。那么这里有什么区别呢?


只是因为参考资料列表是不可变的并不意味着列表它指的是to 是不可变的。

Even if list被做了final这是允许的

// changing the object which list refers to
example.getList().add("stuff");

但这会not允许:

// changing list
example.list = new ArrayList<String>();   // assuming list is public

为了使列表不可变(也防止第一行),我建议您使用Collections.unmodifiableList http://download.oracle.com/javase/6/docs/api/java/util/Collections.html#unmodifiableList%28java.util.List%29:

public class Example {
    final private ArrayList<String> list;

    Example(ArrayList<String> listArg) {
        list = Collections.unmodifiableList(listArg);
    }
}

(请注意,这会创建一个不可修改的列表视图。如果有人保留原始引用,则仍然可以通过该视图修改列表。)


对于字符串,这种行为是不可能的。那么这里有什么区别呢?

那是因为一个String已经是不可变的(不可修改的),就像将列表变成不可修改的列表一样。

比较:

              String data structure  | List data structure
           .-------------------------+------------------------------------.
Immutable  | String                  | Collection.unmodifiableList(...)   |
-----------+-------------------------+------------------------------------|
Mutable    | StringBuffer            | ArrayList                          |
           '-------------------------+------------------------------------'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有 ArrayList 成员变量的不可变对象 - 为什么可以更改该变量? 的相关文章

  • 在 Java 中实现排列算法的技巧

    作为学校项目的一部分 我需要编写一个函数 该函数将接受整数 N 并返回数组 0 1 N 1 的每个排列的二维数组 该声明看起来像 public static int permutations int N 该算法描述于http www usn
  • 在tomcat中显示Spring-security的SQL错误

    我使用 spring security 框架创建了一个 Web 应用程序 我设置了一个数据库来存储用户及其角色 但 tomcat 给出以下错误 17 sep 2010 11 56 14 org springframework beans f
  • Java Swing透明JPanel问题

    我有一个 JLayeredPane 其中添加了 3 个 JPanel 我将 JPanel 设为透明 未设置背景并 setOpaque false 我在 JPanel 上绘制线条 只有最后添加的 JPanel 上的线条可见 其他 JPanel
  • 通过 RMI 的服务器,无需注册

    我有一个可以通过 RMI 连接的服务对象 目前我正在这样做 Server Registry r LocateRegistry createRegistry 1234 r bind server UnicastRemoteObject exp
  • “在 arraylist 构造函数中找不到 add(java.lang.String) 合适的方法”?

    import java util ArrayList import java util Random public class College instance variables replace the example below wit
  • 32 位数字中 1 的数量

    我正在寻找一种在 32 位数字中包含 1 数量的方法 之间不使用循环 任何人都可以帮助我并向我提供代码或算法吗 这样做 提前致谢 See Integer bitCount int http java sun com javase 6 doc
  • Encog - 如何加载神经网络的训练数据

    The NeuralDataSet我在实际中看到的对象除了 XOR 之外什么都没有 它只是两个小数据数组 我无法从文档中找出任何内容MLDataSet 似乎所有内容都必须立即加载 但是 我想循环遍历训练数据 直到到达 EOF 然后将其算作
  • Lambda 表达式更慢?

    我有下面这段代码 PriorityQueue
  • Java SWT 用户输入验证

    在 SWT 中进行用户输入验证时 Java 约定是什么 我读到有 FieldEditors 它们是非常方便的字段 但遗憾的是仅适用于首选项和对话框 我还了解到有一个 IValidator 接口 但它经常与数据绑定一起使用 就我而言 我的大多
  • 如何调试内部错误?

    所以我有课Foo最终应该调整并重新加载类 它也有一个方法 private void redefineClass String classname byte bytecode ClassFileLocator cfl ClassFileLoc
  • Spring Data (JPA) 多个存储库,没有很多类

    在我当前的项目中 我使用 Spring Data JPA 并且有 20 多个 Entity类 我想为它们创建存储库 但创建另一个类 每个类适用于任何模型 Repository注释似乎是某种矫枉过正和大量 重复 代码 所有存储库类将如下所示
  • 何时使用 clone() 以及 addAll() 和 add() 的实际工作原理

    我正在使用 Java 和 MySQL 我的项目中有大约 60 个交易屏幕 我曾经用过add and addAll 复制的功能ArrayList 例如 List
  • 如何查找给定字符串中仅出现一次的第一个字符[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • 如果在构造函数中使用 super 调用重写方法会发生什么

    有两个班级Super1 and Sub1 超1级 public class Super1 Super1 this printThree public void printThree System out println Print Thre
  • 具有多个注释的方法上的 AspectJ 切入点

    使用加载时编织 纯 AspectJ 我们有2个注释 Time and Count 以及一些带注释的方法 Time name myMethod1Time Count name myMethod1Count public void myMeth
  • 为什么我们在同一台服务器上使用多个应用程序服务器实例

    我想这是有充分理由的 但我不明白为什么有时我们会在同一物理服务器上放置例如 5 个具有相同 Web 应用程序的实例 这与多处理器架构的优化有关吗 JVM 或其他允许的最大内存限制 嗯 过了很长一段时间我又看到这个问题了 一台机器上的多个 J
  • SWIG C 函数指针和 JAVA

    我有一些 C 代码 其中一个方法有一个函数指针作为参数 我正在尝试在我的 Android 应用程序中使用 C 代码 我决定使用 SWIG 来完成生成我需要的 java 文件的所有工作 一切都适用于常规函数 没有函数指针作为参数的函数 但我不
  • java.lang.OutOfMemoryError:尝试将 Java 对象转换为 Json 字符串时的 Java 堆空间

    我尝试将 csv 文件转换为 200K 对象的 Json 文件 其中对象代表 csv 中的 1 行 我在 32 位上安装了 Java 并且项目配置 VM 参数 Xmx1024m 但是我得到 Exception in thread main
  • 使用基于Optional内容的流

    我从不受我控制的服务获取可能为空的地图 并且想要处理它 比方说 过滤 映射并减少到我需要的单个元素 问题 是否有从Optional到Stream的 链接 我尝试过 除其他外 return Optional ofNullable getMap

随机推荐

  • CodeIgniter 会话 set-cookie 重复 - 如何解决

    UPDATE 我想知道是否有人可以查看我的答案并看看其中是否有任何漏洞 使用 codeigniter 和会话时存在一个有据可查的问题 codeigniter 标头中重复的 set cookie ci session 字段 https sta
  • 具有以字符串开头的属性的元素的 jQuery 选择器

    我需要选择所有具有以给定前缀开头的属性的元素 注意我说的是属性名称 not价值 例如 div div a href a span span 在上面的 HTML 中 我需要获取具有以下属性开头的所有元素data abc 那就是div和a 我怎
  • 如何使用官方Python客户端从Pod中查找同一节点上的所有Kubernetes Pod?

    如何使用官方 Python Kubernetes 客户端获取与我自己的 特权 pod 在同一 Kubernetes 节点上运行的 pod 列表 也就是说 Pod 如何识别其运行的具体 Kubernetes 节点 然后仅查询该节点上的完整 P
  • 尽管访问了正确的广告代码,但 Google DFP 广告素材还是随机显示

    我正在使用 Android 版 Google DFP DoubleClick for Publishers 广告 和 iPhone 设备 我想在特定的屏幕尺寸上展示广告 适用于 iOS 和 Android 中横向模式下的应用程序 我已经创建
  • 如何在Android中截取应用程序屏幕的屏幕截图?

    我正在开发一个应用程序 我必须在其中截取应用程序屏幕的屏幕截图 现在我使用下面的代码它不起作用 我是空位图图像 Process sh Runtime getRuntime exec su null null OutputStream os
  • Python 字典中数组的交集

    我有数组字典 如下所示 y dict 1 np array 5 124 169 111 122 184 2 np array 1 2 3 4 5 6 111 184 3 np array 169 5 111 152 4 np array 0
  • TabControl的SelectionChanged事件问题

    我正在 WPF 上工作 我正在创建一个 userControl 其中包含一个 TabControl 其中有一些 TabItem 当所选选项卡更改时 我需要执行一些操作 因此 我尝试做的是使用该事件myTabControl Selection
  • 如何在 PHP 中查找并打印两个数字之间的所有数字?

    现在我要求用户提供两个号码 我正在尝试打印 one 和 two 之间的数字 假设 one 小于 two range http php net manual en function range php给出一个包含所有数字的数组 您可以迭代它
  • 字符串到整数

    假设你有字符串 Hi 你如何得到一个值8 9 H 是字母表中的第 8 个字母 并且 i 是第 9 个字母 然后说 添加1到这些整数并使其9 10然后可以将其重新放入字符串中 Ij 是否可以 Note卡里 斯沃夫兰 Cary Swovelan
  • 创建独特的页面标题 slugs php

    我有一个为页面标题创建独特的标题的功能 它检查该 slug 在页面表中是否可用 然后通过相应地添加 int 来创建唯一的 slug 该函数对于前三个条目运行良好 例如 输入三次 test slug 将创建 test slug 1 test
  • R:如何组合三个数据帧的A列和B列相同的行,并添加相应的C列[重复]

    这个问题在这里已经有答案了 我有一些数据框 如果它们的前两列相同 我想合并它们 并添加相应的第三列 例如 我有三个数据框 如下所示 gt dump1 a b c q 12 2 w 23 3 e 34 4 gt dump2 a b c q 1
  • 将 ldapjs 与 Bluebird Promise 结合使用

    我在这里发布了类似的内容 使用带有 Promise 的 ldapjs https stackoverflow com questions 30682597 use ldapjs with promise 不幸的是 它仍然没有解决 这次我尝试
  • 查找临时表的列名[重复]

    这个问题在这里已经有答案了 我需要找到列名 of 临时表 如果它是物理表那么我们可以使用sys columns or Information schema columns系统视图来查找列名称 同样 有没有办法找到临时表中存在的列名 SELE
  • 寻找一种简单、简约的方式在云端存储小数据包

    我正在寻找一个非常简单且免费的小数据包云存储 基本上 我想编写一个 Greasemonkey 脚本 用户可以在具有共享数据集的多台计算机上运行该脚本 数据主要只是一个数字 每个用户八个字节就足够了 这一切都归结为以下要求 易于开发 这是一个
  • MATLAB 支持嵌套变量作用域吗?

    MATLAB 可以定义像以下类伪 C 代码那样的变量吗 int a 0 int b c int a 42 b a c a 我们可以使用嵌套函数来 模拟 这一点 我们可以不使用函数来做到这一点吗 我问这个问题是因为我想将一些 C 代码转换为
  • 如何在 MPAndroidChart 中从右向左绘制数据?

    我最近更新了MPAndroid图表 https github com PhilJay MPAndroidChart从1 7 4到2 0 9的库 我忘记了我做了什么自定义折线图以使数据从右到左显示 有人知道吗 我想知道是否有一种方法可以调用来
  • 访客模式示例

    public class Song public string Genre get protected set public string Name get protected set public string Band get prot
  • GUI 被 uibackgroundmodes= voip, audio 困住

    我有基于选项卡栏的应用程序 当我放入 plist UIBackgroundModes 时 我的应用程序应该支持 voip GUI 不会加载 它在启动屏幕上很糟糕 并且不会加载第一个选项卡视图 当我从 info plist 中删除 UIBac
  • UIImage 减少字节大小

    我正在使用以下代码来调整图像大小 一切正常且符合预期 以正确的方式调整 UIImage 的大小 http vocaro com trevor blog 2009 10 12 resize a uiimage the right way 我使
  • 具有 ArrayList 成员变量的不可变对象 - 为什么可以更改该变量?

    我有一个包含各种成员变量的类 有一个构造函数 有 getter 方法 但没有 setter 方法 事实上 这个对象应该是不可变的 public class Example private ArrayList