Java 为什么用HashMap声明相似的对象名没有冲突?

Java 为什么用HashMap声明相似的对象名没有冲突?,java,oop,object,hashmap,Java,Oop,Object,Hashmap,我有个问题。为什么由于变量冲突,下面的代码不能与eclipse一起运行 PdfPTable testObj1 = new PdfPTable(6); PdfPTable testObj1 = new PdfPTable(6); 但如果我将HashMap与循环一起使用,它将起作用: Map<String, PdfPTable> hash = new HashMap<>(); for (i = 1; i <= 1; i++){ hash.pu

我有个问题。为什么由于变量冲突,下面的代码不能与eclipse一起运行

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj1 = new PdfPTable(6);
但如果我将HashMap与循环一起使用,它将起作用:

Map<String, PdfPTable> hash = new HashMap<>();

    for (i = 1; i <= 1; i++){
        hash.put("testObj" + String.valueOf(i), new PdfPTable(6));
        hash.put("testObj" + String.valueOf(i), new PdfPTable(6));
    }
Map hash=newhashmap();

对于(i=1;i在第一种情况下,您在编译时创建了具有特定变量名的变量。因此,如果在同一范围内有两个同名变量,编译器将抛出一个错误

在第二种情况下,实际上使用字符串作为HashMap的键。在HashMap中使用相同的键会导致覆盖为该键存储的旧值。即使如此,这与此处的变量名无关

您也可以编写第二个示例,而不是第二个示例

Map<String, PdfPTable> hash = new HashMap<>();
hash.put("testObj1", new PdfPTable(6));
hash.put("testObj1", new PdfPTable(6));
Map hash=newhashmap();
put(“testObj1”,新的PdfPTable(6));
put(“testObj1”,新的PdfPTable(6));

这应该表明您实际上是在用新的第二个实例覆盖
PdfPTable
的第一个实例。

在第一种情况下,您是在编译时创建具有特定变量名的变量。因此,如果在同一范围内有两个同名变量,则编译器会抛出错误

在第二种情况下,实际上使用字符串作为HashMap的键。在HashMap中使用相同的键会导致覆盖为该键存储的旧值。即使如此,这与此处的变量名无关

您也可以编写第二个示例,而不是第二个示例

Map<String, PdfPTable> hash = new HashMap<>();
hash.put("testObj1", new PdfPTable(6));
hash.put("testObj1", new PdfPTable(6));
Map hash=newhashmap();
put(“testObj1”,新的PdfPTable(6));
put(“testObj1”,新的PdfPTable(6));

这应该表明您实际上正在用新的第二个实例覆盖
PdfPTable
的第一个实例。

这两个示例是不相关的。在第一个示例中,您尝试在同一范围内声明两个名称相同的变量,这是不允许的


在第二个示例中,您尝试将两个相同的键放入
HashMap
,这将导致只添加一个键(因为不允许重复键),第二个
put
语句将用第二个
PdfPTable
值覆盖原始的
PdfPTable
值。

这两个示例是不相关的。在第一个示例中,您尝试在同一范围内声明两个同名变量,这是不允许的


在第二个示例中,您尝试将两个相同的键放入
HashMap
,这将导致只添加一个键(因为不允许重复键),第二个
put
语句将用第二个
PdfPTable
值覆盖原始的
PdfPTable
值。

编译器显示错误,因为存在重复的局部变量


在第二种情况下,您只需将键设置为“testObj”,这是有效的。

编译器显示错误,因为存在重复的局部变量


在第二种情况下,您只需将键设置为“testObj”,这是有效的。

如果您想调用
testObj1.ToString();
您实际会调用什么对象,则此代码将在局部变量中产生歧义

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj1 = new PdfPTable(6);
对于for循环,您创建了两个匿名对象,没有变量名,因此您让hashmap保存对它们的引用,而不是一个变量

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj2 = new PdfPTable(6);

如果要调用
testObj1.ToString();
实际调用的对象是什么,则此代码将在局部变量中产生歧义

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj1 = new PdfPTable(6);
对于for循环,您创建了两个匿名对象,没有变量名,因此您让hashmap保存对它们的引用,而不是一个变量

PdfPTable testObj1 = new PdfPTable(6);
PdfPTable testObj2 = new PdfPTable(6);

这是一个语法问题,不能有两个同名的变量。 编译器不允许这样做,并说“复制局部变量”


看一看。

这是一个语法问题,不能有两个同名变量。 编译器不允许这样做,并说“复制局部变量”


请看一看。

在第一种情况下,您创建了两个同名的变量并为其赋值。因此在编译时会导致名称冲突

在第二种情况下,您只是将值存储到哈希映射中,键为字符串。这里与变量名无关。您也可以这样编写

String testObj1 = "testObj1";
hash.put(testObj1, new PdfPTable(6));
hash.put(testObj1, new PdfPTable(6));
String testObj1 = "testObj1";
String testObj1 = "testObj1";
Map<String, String> hashMap = new HashMap<>();
String previousValue = hashMap.put("key1","value1");
//previousValue would be null.
previousValue = hashMap.put("key1","value2");
//Now previous value would be "value1"
previousValue = hashMap.put("key1","value3");
//Now previous value would be "value2"
很明显,这与变量声明或任何命名约定无关。但是如果以这种方式声明testObj1两次或更多次

String testObj1 = "testObj1";
hash.put(testObj1, new PdfPTable(6));
hash.put(testObj1, new PdfPTable(6));
String testObj1 = "testObj1";
String testObj1 = "testObj1";
Map<String, String> hashMap = new HashMap<>();
String previousValue = hashMap.put("key1","value1");
//previousValue would be null.
previousValue = hashMap.put("key1","value2");
//Now previous value would be "value1"
previousValue = hashMap.put("key1","value3");
//Now previous value would be "value2"
这将再次导致您在编译时出现命名冲突

允许使用相同的键在hashmap中存储值,并替换该值

对于每个未存储的键,都会分配一个值,该值为null。put()方法始终返回相应键的上一个值

假设我们通过这种方式存储要映射的值

String testObj1 = "testObj1";
hash.put(testObj1, new PdfPTable(6));
hash.put(testObj1, new PdfPTable(6));
String testObj1 = "testObj1";
String testObj1 = "testObj1";
Map<String, String> hashMap = new HashMap<>();
String previousValue = hashMap.put("key1","value1");
//previousValue would be null.
previousValue = hashMap.put("key1","value2");
//Now previous value would be "value1"
previousValue = hashMap.put("key1","value3");
//Now previous value would be "value2"
Map hashMap=new hashMap();
String previousValue=hashMap.put(“key1”、“value1”);
//previousValue将为null。
previousValue=hashMap.put(“键1”、“值2”);
//现在,前面的值将是“value1”
previousValue=hashMap.put(“键1”、“值3”);
//现在,前面的值将是“value2”

因此,很明显,使用相同的键存储值是允许的,它只是将以前的值重写为我们提供的值。

在第一种情况下,您创建了两个同名的变量并为其赋值。因此在编译时会导致名称冲突

在第二种情况下,您只是将值存储到哈希映射中,键为字符串。这里与变量名无关。您也可以这样编写

String testObj1 = "testObj1";
hash.put(testObj1, new PdfPTable(6));
hash.put(testObj1, new PdfPTable(6));
String testObj1 = "testObj1";
String testObj1 = "testObj1";
Map<String, String> hashMap = new HashMap<>();
String previousValue = hashMap.put("key1","value1");
//previousValue would be null.
previousValue = hashMap.put("key1","value2");
//Now previous value would be "value1"
previousValue = hashMap.put("key1","value3");
//Now previous value would be "value2"
很明显,这与变量声明或任何命名约定无关。但是如果以这种方式声明testObj1两次或更多次

String testObj1 = "testObj1";
hash.put(testObj1, new PdfPTable(6));
hash.put(testObj1, new PdfPTable(6));
String testObj1 = "testObj1";
String testObj1 = "testObj1";
Map<String, String> hashMap = new HashMap<>();
String previousValue = hashMap.put("key1","value1");
//previousValue would be null.
previousValue = hashMap.put("key1","value2");
//Now previous value would be "value1"
previousValue = hashMap.put("key1","value3");
//Now previous value would be "value2"
这会再次导致你在公司的命名冲突