如何给java足够的时间给变量赋值? [关闭]

2023-12-25

我有一个循环,在循环的末尾有一个String[]被添加到ArrayList(在类中声明而不是方法)并在循环开始时说String[]清除其内容:

String[] a = new String[2];
while(true){
  a[0] = "";
  a[1] = "";
  -----some code----

(that adds to a[0] and a[1])

  -----some code----
  //lets call our ArrayList list
  list.add(a);
}

所以通常情况下,列表中存储的内容是空的String。我认为这是因为java进入下一步的速度太快,但我不确定,有什么帮助吗? 这是我的全部代码:

static ArrayList<String[]> Names = new ArrayList<String[]>();
public static void read(BufferedReader stream){
        String[] aux = new String[2];
        char it = 2;

    try{
        while(it != (char) -1){
            aux[0] = "";
            aux[1] = "";
            it = (char) stream.read();

            while(Character.isLetter(it)){
                aux[0] += it;
                it = (char) stream.read();
            }

            it = (char) stream.read();

            while(Character.isDigit(it)){
                aux[1] += it;
                it = (char) stream.read();
            }
            Names.add(aux);
            stream.read();
        }


    }catch(IOException e){
        System.out.print("IOException(read): ");
        System.err.println(e.getMessage());
    }

}

当您添加引用的数组时a (or aux在第二个示例中)到您的列表中,变量a仍然引用字符串数组。当您将字符串数组元素重新初始化为空字符串时,您还会擦除列表中的条目,因为它们是相同的数据结构。您对同一个数组有多个引用。

您需要为每次循环创建一个新数组,以便列表元素实际上包含单独的数组。移动初始化数组的行

String[] a = new String[2];

到 while 循环内部。这样,数组将被重新分配,以便局部变量不会指向您之前添加到 arrayList 的同一个数组。

这是一个重现该问题的小测试程序:

import java.util.*;

public class DupeArr {
    public void testBad() {
        System.out.println("bad, multiple references to same array");
        List<String[]> list = new ArrayList<String[]>();
        String[] arr = {"a", "b"};
        for (int i = 0; i < 2; i++) {
            arr[0] = "" + i;
            arr[1] = "" + (i * 10);
            list.add(arr);        
        }
        System.out.println(list.get(0)[0]);
        System.out.println(list.get(0)[1]);
        System.out.println(list.get(1)[0]);
        System.out.println(list.get(1)[1]);
        System.out.println(list.get(0)[0].equals(list.get(1)[0]));
        System.out.println(list.get(0)[1].equals(list.get(1)[1]));
        // printing true means these lists point to the same array
        System.out.println("same reference=" + (list.get(0) == list.get(1)));        
    }

    public void testGood() {
        System.out.println("good, new array for each list item");
        List<String[]> list = new ArrayList<String[]>();
        for (int i = 0; i < 2; i++) {
            String[] arr = {"a", "b"};
            arr[0] = "" + i;
            arr[1] = "" + (i * 10);
            list.add(arr);        
        }
        System.out.println(list.get(0)[0]);
        System.out.println(list.get(0)[1]);
        System.out.println(list.get(1)[0]);
        System.out.println(list.get(1)[1]);
        System.out.println(list.get(0)[0].equals(list.get(1)[0]));
        System.out.println(list.get(0)[1].equals(list.get(1)[1]));
        // printing false means these lists point to different arrays
        System.out.println("same reference=" + (list.get(0) == list.get(1)));        
    }
    public static void main(String[] args) {
       DupeArr dupeArr = new DupeArr();
       dupeArr.testBad();
       dupeArr.testGood();
    }
}

其输出是

bad, multiple references to same array
1
10
1
10
true
true
same reference=true
good, new array for each list item
0
0
1
10
false
false
same reference=false
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何给java足够的时间给变量赋值? [关闭] 的相关文章

随机推荐

  • 未解析的对象 [INFORMATION_SCHEMA] 引用。[表]

    我创建了一个 UDF 来访问 INFORMATION SCHEMA TABLES view CREATE FUNCTION dbo CountTables name sysname RETURNS INT AS BEGIN RETURN S
  • data.table::fread 一个 `integer64` 类型,仅手动重写一列的 colClass

    我有一个 csv 其中一列 ID 包含一个带有前导零的长整数 fread将其转换为integer64类型 我如何指定一列的类 然后让fread自动猜测剩余列的类 不确定这是否是一种 全有或全无 的情况 我有 50 多列 并且不想仅仅因为必须
  • Storybook 全局 Scss 变量

    CLI 工具 故事书 框架 Vue Nuxt 问题 我试图将全局 SCSS 变量引入 Storybook Stories 以便它们以与 Nuxt 中相同的方式运行组件 我已经尝试使用 sass resources loader 进行自定义
  • 在 Ansible 中组合多个循环的输出

    我正在使用 Ansible 在我的剧本中运行以下任务 其中有多个循环 以便从特定 xml 检索不同的标签 name Retrieve multiple xml tags valuei xml xmlstring item string xp
  • 如何在Gradle中使用pom类型依赖

    我需要从我的 pom java 库中生成传递依赖 这是我如何做的一个例子 plugins java library maven publish repositories some maven repo dependencies This i
  • 给定一些移动规则,如何枚举从棋盘左下角(a1)方块开始到达右上角(h8)方块的唯一路径?

    几周前 我被要求找到所有不同且独特的方法来到达棋盘的右上角 其中 x y gt 3 从 0 0 开始 知道你只能增加 x 和 y通过 1 我仍然无法找到可以解释如何在棋盘上导航的算法 所以我想知道你们是否有什么可以推荐的 换句话说 您会如何
  • 活动预订不会重新安排/取消

    我可以使用 gMail 标记安排活动 但是 如果我尝试重新安排活动 它只会在新时间制作第二个副本 并保持原始活动不变 如果我尝试取消某个活动 则什么也不会发生 我的确认示例如下 div div div div
  • Android 共享首选项不起作用

    我有一项服务 其中有4个全局静态int变量我有一个启动完成和呼叫事件的接收器 我想做的是每当执行 Call 事件接收器时保存这 4 个变量 并在执行 BOOT 接收器时检索它们 当然当我重新启动手机时 但两者都不起作用 另一件事设备重新启动
  • Powershell使用ODBC DSN而不是连接字符串从数据库读取

    我知道如何使用连接字符串从数据库读取值 即 建立数据库连接进行读取 conn New Object System Data SqlClient SqlConnection conn ConnectionString Server 10 10
  • GitHub Pages:如何将文本环绕在图像周围?

    我有一个 GitHub 博客页面 在博客页面中间的某个位置 我有一张图像 其中显示了以下 Markdown 内容 My Image pathto myimage png 这可以很好地显示图像 但我还想添加一个段落 包裹在图像的右侧 来描述图
  • bigquery 使用嵌套字段进行旋转

    我有一个带有架构的 bigquery 表 我想要这样的结果 flow timestamp channel name number of digits 2019 10 31 15 31 15 channel name 1 3 2019 10
  • Azure AD 在有效访问令牌上返回 Authentication_ExpiredToken

    我越来越Your access token has expired Please renew it before submitting the request 当我打电话时https graph windows net myorganiza
  • frisby 的 Get 方法不适用于 https

    我是弗里斯比测试的新手 今天发现无法访问https ip https ip来自 friby api 的地址 例如 frisby create my test get https 199 59 148 20 output connect er
  • Eclipse/MySQL 集成插件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 我的顺风滚动 snap x 无法工作,您能找到解决方案吗?

    所以我使用 Tailwind CSS 但遇到了问题 所以我正在学习如何在顺风 CSS 上进行滚动捕捉 滚动对齐 y 有效 但滚动对齐 x 不起作用 我尝试了一切让我的代码滚动 snap x 但它不起作用 你们中的任何人都可以修复我的顺风代码
  • 霍夫变换 C# 代码 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 让我们看一下这个 C 实现 https github com andrewkirillov AForge NET blob a9453
  • iOS 中自定义 UIStatusBar

    有没有办法自定义UIStatusBar class 有关可以使用状态栏 或围绕状态栏 执行的操作的示例 请查看此 Github 项目 https github com myell0w MTStatusBarOverlay https git
  • 枚举构造函数(创建成员的成员)

    在 D 中 我试图创建一个成员有成员的枚举 我可以通过一个例子更好地解释我想要做什么 其中s and i代表我试图创建的子成员 在Python中 我可以这样做 class Foo enum Enum A A string 0 B B str
  • 在 VSCode 中禁用 Javascript 的特定错误消息?

    我在 JavaScript 中使用类属性 静态和普通 和装饰器 有没有办法启用其他 ES 阶段的代码突出显示或禁用它们的特定错误消息 VSCode 告诉我只能在 TypeScript 中使用类属性 因此它似乎可以识别它们 您可以使用以下命令
  • 如何给java足够的时间给变量赋值? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个循环 在循环的末尾有一个String 被添加到ArrayList 在类中声明而不是方法 并在循环开始时说Stri