存储对象的名称并在代码中引用它

store object's name and reference it in the code

我有两个列表,在找到哪个列表的值最高后,我将另一个列表的名称存储到一个字符串变量中,如下所示:

iterateList = "lstDrives"; //lstDrives

所以,我想在下一行中使用该存储的名称:

for(Integer currentElement : iterateList){
    if((mostExpensiveValue + currentElement) > b){
        result = -1;
    }
}

现在我得到了一个错误,因为我正在尝试迭代 String var 并且我想引用它的内容,我的问题是:我怎样才能做到这一点?

这是整段代码:

if(mostExpensiveKb > mostExpensiveDv ){
    iterateList = "lstDrives"; //lstDrives
    mostExpensiveValue = lstKb.get(keyboards.length-1);
} else{
    iterateList = "lstKb"; //listKb
    mostExpensiveValue = lstDrives.get(keyboards.length-1);
}


for(Integer currentElement : iterateList){
    if((mostExpensiveValue + currentElement) > b){
        result = -1;
    }

}

那不是 java 的工作方式。对象没有名称;变量名在编译过程中不存在。

Object o = new Object();

不是 意味着您的对象名称是 'o'。毕竟:

Object o = new Object();
Object v = o;

这里只有一个对象(要创建一个对象,必须调用new;这里只调用一次,所以不可能有2个对象)。您有 2 个变量都引用同一个对象。这就像有 2 个 post-it 笔记,每个笔记上都写着相同的房屋地址。这并不意味着您有 2 栋房子。

那么,这是否意味着这个对象的名称是 both o and v

Object o = new Object();
Object v = o;
o = null;
v = null;

是不是说这个对象的名字以前是o,后来变成了ov,后来就变成了v ,然后就变得无名了?

希望这能让您了解 为什么 对象没有名称,而 java 现在没有而且永远不会让您做类似 obj.getName().

Java 将代码编译到中间步骤(.class 文件),然后再 运行 它们。在这个中间步骤中,局部变量名消失了;它们可以保留用于调试目的,但 运行 宁 class 文件的实际行为会忽略这一点,您可以在 class 文件中看到这一点:本地变量名称不需要存在首先(取决于您在编译时是否使用 -g 来保存调试变量),如果它们在那里,它位于一个方法的单独附件中,JVM 在读取时完全跳过该方法class 文件。

因此,像 getVar("varName") 这样的东西现在不存在,也永远不会存在于 java 中。更不用说 java 是强类型的,而 getVar 不允许您输入它,因为据您所知,"varName" 可以由用户即时提供。

换句话说,你 'thinking in java' 不在这里。您尝试做的事情没有用,从来没有,也永远不会。

您可以做的只是创建另一个变量。毕竟,所有非原始变量都只是引用(post它指出包含对象的地址,不是对象本身)。便利贴很便宜。这里:

List<String> someList = readTheCollectedWorksOfShakespeare();

让我们在此假设此方法制作了一个巨大的列表,其中包含莎士比亚曾经写过的所有作品的所有台词。这是一个相当大的清单!假设 100MB 的价值,那么您的 VM 的内存负载在该行之后显着增加。然后你做:

List<String> list2 = someList;
List<String> list3 = someList;
List<String> list4 = someList;
List<String> list5 = someList;

再次检查内存负载:无效果。这些是 4 个引用(指针)。上面的 4 行几乎是瞬间执行的,并且不占用内存。只是你现在有 5 个 post 记录,上面都有一些巨大城堡的地址。计算机不必费力地一砖一瓦地复制城堡。您可以在代码中做同样的事情:

List<Integer> iterateList;
if (mostExpensiveKb > mostExpensiveDv) {
    iterateList = lstDrives;
    mostExpensiveValue = lstKb.get(keyboards.length-1);
} else {
    iterateList = lstKb;
    mostExpensiveValue = lstDrives.get(keyboards.length-1);
}


for (Integer currentElement : iterateList) {
    if ((mostExpensiveValue + currentElement) > b) {
        result = -1;
    }
}

您可以使用 hashMap 存储列表名称(如键)和列表对象(如值):

Map<String, List<Integer>> namesAndLists= new HashMap<String, List<Integer>>();
namesAndLists.put("lstDrives",lstDrives);
namesAndLists.put("lstKb",lstKb);