Java:存储和访问对象列表的最佳方式

时间:2013-09-26 19:42:52

标签: java performance

我想要做的是将我班级的一些实例存储在列表中,并从该列表中获取特定实例。

这是自定义类的示例

public class Person
{
    private String name;
    //Several unrelevant fields here

    public Person(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    //Several unrelevant methods here
}

这是我正在使用的代码,用于获取列表中的一个实例,即主类上的实例。

public class Main
{
    private List<Person> people = new ArrayList<Person>();
    //More unrelevant fields here

    public Person getPerson(String name)
    {
        for (Person p : people)
            if (p.getName().equalsIgnoreCase(name))
                return p;
        return null;
    }
    //More unrelevant methods here
}

我的问题是,是否还有其他方法可以写这个以提高性能。

3 个答案:

答案 0 :(得分:14)

使用一个地图,其键是名称,其值是人。

答案 1 :(得分:3)

HashMap区分大小写。如果您想要不区分大小写的查找,可以使用TreeMap。我的例子表明,具有相同名称(不区分大小写)的人会相互覆盖。

import java.util.Map;
import java.util.TreeMap;

public class SoMain {
    Map<String, Person> nameToPersonMap = 
            new TreeMap<String, Person>(String.CASE_INSENSITIVE_ORDER);

    public static void main(String[] args) {
        new SoMain().run(args);
    }

    private void run(String[] args) {
        addPerson(new Person("Jim McDonald", 1));
        addPerson(new Person("Jim Mcdonald", 2));
        addPerson(new Person("John Smith", 3));

        System.out.println("Number of people: " 
                    + nameToPersonMap.entrySet().size());
        System.out.println("Jim McDonald id: " 
                    + getPerson("Jim McDonald").getPersonId());
        System.out.println("John Smith id: " 
                    + getPerson("john smith").getPersonId());
    }

    private void addPerson(Person p) {
        nameToPersonMap.put(p.getName(), p);
    }

    private Person getPerson(String name) {
        return nameToPersonMap.get(name);
    }

    public static class Person {
        private String name;
        private int personId;

        public Person(String name, int personId) {
            this.name = name;
            this.personId = personId;
        }

        public int getPersonId() {
            return personId;
        }

        public String getName() {
            return name;
        }
    }
}

答案 2 :(得分:1)

正如Eric提到的那样,你应该使用HashMap,这样做的原因是你可以很快(平均)查找和添加数据。

以下是如何使用HashMap作为关键字使用Person.name的代码示例,这假设从未有过具有相同名称的人

public class Main
{
    private HashMap<String, Person> people = new HashMap<String, Person>();

    public void addPerson(Person person)
    {
        people.put(person.getName(), person);
    }

    public Person getPerson(String name)
    {
        // get returns null when not found
        return people.get(name);
    }
}