我想在java中分配一组变量,如下所示:
int n1,n2,n3;
for(int i=1;i<4;i++)
{
n<i> = 5;
}
如何在Java中实现这一目标?
答案 0 :(得分:102)
这不是你用Java做事的方式。 Java中没有动态变量。必须在源代码 1 中声明Java变量。
根据您要实现的目标,您应该使用数组,List
或Map
; e.g。
int n[] = new int[3];
for (int i = 0; i < 3; i++) {
n[i] = 5;
}
List<Integer> n = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
n.add(5);
}
Map<String, Integer> n = new HashMap<String, Integer>();
for (int i = 1; i < 4; i++) {
n.put("n" + i, 5);
}
可以使用反射来动态引用已在源代码中声明的变量。但是, only 适用于类成员的变量(即静态和实例字段)。它不适用于局部变量。请参阅@ fyr的“快速和肮脏”示例。
然而,在Java中不必要地做这种事情是一个坏主意。这是低效的,代码更复杂,并且由于您依赖运行时检查它更脆弱。这不是“动态名称的变量”。最好将其描述为使用静态名称动态访问变量。
1 - 该陈述略有不准确。如果使用BCEL或ASM,则可以“声明”字节码文件中的变量。但是不要这样做!那种方式就是疯狂!
答案 1 :(得分:30)
如果要访问某些动态变量,可以使用反射。但是,Reflection不适用于局部变量。它仅适用于类属性。
这是一个粗略而又肮脏的例子:
public class T {
public Integer n1;
public Integer n2;
public Integer n3;
public void accessAttributes() throws IllegalArgumentException, SecurityException, IllegalAccessException,
NoSuchFieldException {
for (int i = 1; i < 4; i++) {
T.class.getField("n" + i).set(this, 5);
}
}
}
您需要以各种方式改进此代码,这只是一个示例。这也不被认为是好的代码。
答案 2 :(得分:11)
您需要的是命名数组。我想写下面的代码:
int[] n = new int[4];
for(int i=1;i<4;i++)
{
n[i] = 5;
}
答案 3 :(得分:10)
您应该使用List
或array
代替
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
或者
int[] arr = new int[10];
arr[0]=1;
arr[1]=2;
甚至更好
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("n1", 1);
map.put("n2", 2);
//conditionally get
map.get("n1");
答案 4 :(得分:6)
Java中的动态变量名
没有这样的事情。
在您的情况下,您可以使用数组:
int[] n = new int[3];
for() {
n[i] = 5;
}
对于更一般的(name, value)
对,请使用Map<>
答案 5 :(得分:3)
尝试这种方式:
HashMap<String, Integer> hashMap = new HashMap();
for (int i=1; i<=3; i++) {
hashMap.put("n" + i, 5);
}
答案 6 :(得分:2)
你没有。您可以做的最接近的事情是使用Maps来模拟它,或定义您自己的对象来处理。