Java 哈希表<;字符串,对象>;找不到字符串

Java 哈希表<;字符串,对象>;找不到字符串,java,string,hashtable,Java,String,Hashtable,我有一个Hashtable类型的Hashtable 我加载了几个字符串作为键,其中一个是“ABCD” 但是,稍后当我查找“ABCD”时,哈希表返回null而不是关联的对象。此外,键集包含“ABCD”,但对containsKey(“ABCD”)的请求返回false 这是因为字符串对象本质上是不同的对象吗 如果是这样,如果我想使用字符串作为键,那么在哈希表中存储信息的写入方式是什么 public class Field { private String name;

我有一个Hashtable类型的Hashtable

我加载了几个字符串作为键,其中一个是“ABCD”

但是,稍后当我查找“ABCD”时,哈希表返回null而不是关联的对象。此外,键集包含“ABCD”,但对containsKey(“ABCD”)的请求返回false


这是因为字符串对象本质上是不同的对象吗

如果是这样,如果我想使用字符串作为键,那么在哈希表中存储信息的写入方式是什么

 public class Field {
        private String name;
        private DataType dataType;

        public Field(String name, DataType dataType) {
            this.name = name;
            this.dataType = dataType;
        }

        public String getName() {
            return name;
        }

        public DataType getDataType() {
            return dataType;
        }

        public String toString() {
            return name;
        }
    }

public class Record {
        private Hashtable<String, Data> content; 

        public Record(Field[] fieldList) {
            this.fieldList = fieldList;     
            content = new Hashtable<String, Data>();

            System.out.println(fieldList.length);

            for(Field f : fieldList) {          
                content.put(f.getName(), new Data());
            }
        }

        public void add(String field, String s) {
                    // ERROR OCCURS HERE IN THIS METHOD !!!

            System.out.println(field);

            for(String ss : content.keySet()) {
                System.out.print(" [ " + ss + " ] ");
            }
            System.out.println();

            System.out.println(content.containsKey(field));     
            System.out.println(content.get(field));

            content.get(field).add(s);
        }
}



public class Data {

    private Vector<String> lines;
    private int index;

    public Data() {
        lines = new Vector<String>();
        index = 0;
    }

    public void add(String s) {
        System.out.println("adding");
        lines.add(s);
    }

    public String nextLine() {
        try {
            return lines.elementAt(index++);
        } catch (ArrayIndexOutOfBoundsException aioobe) {
            return null;
        }
    }
}
公共类字段{
私有字符串名称;
私有数据类型数据类型;
公共字段(字符串名称、数据类型数据类型){
this.name=名称;
this.dataType=数据类型;
}
公共字符串getName(){
返回名称;
}
公共数据类型getDataType(){
返回数据类型;
}
公共字符串toString(){
返回名称;
}
}
公开课记录{
私有哈希表内容;
公共记录(字段[]字段列表){
this.fieldList=字段列表;
内容=新哈希表();
System.out.println(fieldList.length);
对于(字段f:字段列表){
content.put(f.getName(),newdata());
}
}
公共空白添加(字符串字段,字符串s){
//此方法中出现错误!!!
系统输出打印项次(字段);
for(字符串ss:content.keySet()){
系统输出打印(“[”+ss+“]);
}
System.out.println();
System.out.println(content.containsKey(field));
System.out.println(content.get(field));
content.get(字段).add(s);
}
}
公共类数据{
专用矢量线;
私有整数索引;
公共数据(){
直线=新向量();
指数=0;
}
公共无效添加(字符串s){
系统输出打印项次(“添加”);
行。添加(s);
}
公共字符串nextLine(){
试一试{
返回行.elementAt(index++);
}捕获(阵列索引边界外异常aioobe){
返回null;
}
}
}

哈希表是一种Java 1.0数据结构。我想知道你为什么不用地图

如果java.lang.String是密钥类型,我会说你正在被其他一些不发布代码就无法猜到的东西所困扰。

对我来说很有用

import java.util.Hashtable;

public class StrMap {
    public static void main(String[] args) {
        Hashtable<String,Object> map = new Hashtable<String,Object>();
        map.put("ABCD", "value");
        System.err.println(map.containsKey("ABCD"));
    }
}
import java.util.Hashtable;
公共类StrMap{
公共静态void main(字符串[]args){
Hashtable map=新的Hashtable();
映射放置(“ABCD”、“值”);
System.err.println(map.containsKey(“ABCD”);
}
}
你可能犯了一些其他的错误。将问题减少到最小的完整可编译程序,该程序仍能演示问题。你可能会马上发现问题。如果你没有,至少你会有一个问题,我们可以回答


(还有
Map
HashMap
就是这样。
Hashtable
如果您使用的是Java 2之前的API(Java 2现在已经有十多年的历史了!)。

如果没有您的支持,很难找出根本原因

至少,常见的原因是:

  • 您没有使用您认为正在使用的
    哈希表
    System.out.println()
  • 字符串
    实际上是另一种情况,例如
    “ABcD”
    而不是
    “ABcD”
  • 字符串
    周围有一些空格,您需要先删除这些空格

  • 也就是说(与实际问题无关),我强烈建议使用改进的哈希表,而不是传统的
    哈希表

    当字段为“ABCD”时,您是否也可以发布从以下方法获得的准确输出


    字符串对于哈希表键来说很好(因为它们覆盖equals()和hashCode()来解释字符串的长度)。您可以发布一个如何使用它的示例吗?“这是因为字符串对象本质上是不同的对象吗?”。否,因为检查参数是否与任何键匹配是使用equals()完成的,而不是==。如果没有代码显示它正在发生,则不会发生。发布代码并告诉您错误是什么(定义
    字段。toString
    隐藏问题)。再次,我从HashMapI开始,与实际问题无关。遵循三个常见原因。检查
    System.out.println(content)
    的结果在使用它之前,检查字符串的大小写是否正确,并且不包含周围的空格。他们必须是完全匹配的。+1:同意代码看起来不错。这可能是由于不可见的空格、类似的Unicode字符或类似的东西导致表中包含一个看似相同但却是单独字符序列的键。同样是的,一定要使用
    地图
    !由于某种原因,有空白,我很难看到它在哪里。。。我真傻。我确实检查了我的代码/逻辑。我调用的是hashTbl.contains()而不是hashTbl.containsKey()!为什么有三个:contains()containsKey()和containsValue()。我看只需要两个。@Ankit Jain
    containsKey
    containsValue
    来自
    Map
    contains
    是为了与1.2版之前的Java兼容。如果您对
    HashTable
    的问题与对
    HashMap
    的问题相同,那么您最好回到使用
    HashMap
       public void add(String field, String s) {
                    // ERROR OCCURS HERE IN THIS METHOD !!!
    
            System.out.println(field);
    
            for(String ss : content.keySet()) {
                System.out.print(" [ " + ss + " ] ");
            }
            System.out.println();
    
            System.out.println(content.containsKey(field));     
            System.out.println(content.get(field));
    
            content.get(field).add(s);
        }