存储对象的名称并在代码中引用它
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
,后来变成了o
和v
,后来就变成了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);
我有两个列表,在找到哪个列表的值最高后,我将另一个列表的名称存储到一个字符串变量中,如下所示:
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
,后来变成了o
和v
,后来就变成了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);